Skip to content

Commit 461de34

Browse files
AvtandilkoNikita Velgin
andcommitted
Audit logs to csv (#193)
* add audit logs export docs * fix lint * fix lint * fix lint * add new release notes entries * fix quotes * fix quotes * add-templating-and-datasources-to-release-notes * Update types.ru.md Signed-off-by: Nikita Velgin <direct.vegas@gmail.com> * Update types.ru.md Signed-off-by: Nikita Velgin <direct.vegas@gmail.com> * Update audit-logs.ru.md Signed-off-by: Nikita Velgin <direct.vegas@gmail.com> --------- Signed-off-by: Nikita Velgin <direct.vegas@gmail.com> Co-authored-by: Nikita Velgin <nikita.velgin@flant.com>
1 parent e2462a5 commit 461de34

4 files changed

Lines changed: 142 additions & 45 deletions

File tree

content/documentation/admin/datasources/types.ru.md

Lines changed: 60 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,7 @@ FIELDS:
595595

596596
## GenericAPI
597597

598-
Источник данных типа **GenericAPI** позволяет подключаться к любому REST API и получать данные в формате JSON. Поддерживает различные типы пагинации и настраиваемые параметры запроса.
598+
Источник данных типа **GenericAPI** позволяет подключаться к любому REST API и получать данные в формате JSON. Поддерживаются различные типы пагинации и настраиваемые параметры запроса.
599599

600600
### Авторизация
601601

@@ -619,11 +619,33 @@ Authorization: Basic <base64-encoded-credentials>
619619
X-API-Key: <ключ>
620620
```
621621

622+
### Конфигурация
623+
624+
* `URL` — базовый URL API в формате `https://api.example.com`.
625+
* `Method` — HTTP-метод (GET, POST, PUT, PATCH, DELETE).
626+
* `Query` — дополнительные query параметры (например, для фильтрации или поиска).
627+
628+
### Параметры
629+
630+
| Название | Обязательность | Описание | Возможные значения | Примеры | По умолчанию |
631+
|---------------------|----------------|-------------------------------------------------------------------------------------------|---------------------------------------------------|---------------------------------------|--------------|
632+
| `paginationType` | Опционально | Тип пагинации для обработки больших объемов данных | `none`, `offset`, `cursor`, `page`, `link_header` | `none` | `none` |
633+
| `path` | Опционально | Путь к эндпоинту API, который будет добавлен к базовому URL | Любая строка, начинающаяся с `/` | `/api/v1/users`, `/projects` | `""` |
634+
| `dataPath` | Опционально | Путь к данным в ответе (цепочка ключей через точку) | Любая строка | `data`, `results.items`, `.` | `.` |
635+
| `responseFormat` | Опционально | Формат ответа | `array`, `map` | `array`, `map` | `array` |
636+
| `mapKeyField` | Опционально | При `responseFormat` равном `map`: название поля, в которое записать ключ из JSON-объекта | Любая строка | `slug`, `externalId` | `""` |
637+
| `pageParam` | Опционально | Название параметра для номера страницы (для offset- и page- пагинации) | Любая строка | `page`, `_page`, `pageNumber` | `page` |
638+
| `limitParam` | Опционально | Название параметра для количества элементов на странице (для offset-пагинации) | Любая строка | `limit`, `per_page`, `_limit`, `size` | `limit` |
639+
| `sizeParam` | Опционально | Название параметра для размера страницы (для page-пагинации) | Любая строка | `size`, `pageSize`, `_size` | `size` |
640+
| `cursorParam` | Опционально | Название параметра для курсора (для cursor-пагинации) | Любая строка | `cursor`, `after`, `next` | `cursor` |
641+
| `pageSize` | Опционально | Количество элементов на странице для пагинации | Положительное целое число | `10`, `20`, `50`, `100` | `100` |
642+
| `requestBody` | Опционально | Тело запроса для POST/PUT/PATCH-методов | Любая строка | `{"query": "example"}` | `""` |
643+
622644
### Спецификация ответа
623645

624-
GenericAPI возвращает массив объектов JSON. Структура данных зависит от конкретного API, к которому происходит подключение.
646+
Формат ожидаемого ответа задаётся параметром `responseFormat` (по умолчанию `array`).
625647

626-
Пример типичного ответа:
648+
Пример ответа для `responseFormat: array`:
627649

628650
```json
629651
[
@@ -642,49 +664,58 @@ GenericAPI возвращает массив объектов JSON. Структ
642664
]
643665
```
644666

645-
### Конфигурация
667+
Пример ответа для `responseFormat: map`:
646668

647-
* **URL** — базовый URL API в формате `https://api.example.com`.
648-
* **Method** — HTTP-метод (GET, POST, PUT, PATCH, DELETE).
649-
* **Query** — дополнительные query параметры (например, для фильтрации или поиска).
669+
```json
670+
{
671+
"billing": { "title": "Billing", "owner": "team-a" },
672+
"shipping": { "title": "Shipping", "owner": "team-b" }
673+
}
674+
```
650675

651-
### Параметры
676+
Перед обработкой ответ с `responseFormat: map` преобразуется в массив с учетом значения параметра `mapKeyField`.
652677

653-
| Название | Обязательность | Описание | Возможные значения | Примеры | По умолчанию |
654-
|---------------------|----------------|--------------------------------------------------------------------------------|---------------------------------------------------------|--------------------------------------------------|--------------|
655-
| `paginationType` | опционально | Тип пагинации для обработки больших объемов данных | `none`, `offset`, `cursor`, `page`, `link_header` | `none` | `none` |
656-
| `path` | опционально | Путь к эндпоинту API, который будет добавлен к базовому URL | Любая строка, начинающаяся с `/` | `/api/v1/users`, `/projects` | `""` |
657-
| `dataPath` | опционально | JSONPath для извлечения массива данных из ответа API | Любая строка | `data`, `results.items`, `.` | `.` |
658-
| `pageParam` | опционально | Название параметра для номера страницы (для offset- и page- пагинации) | Любая строка | `page`, `_page`, `pageNumber` | `page` |
659-
| `limitParam` | опционально | Название параметра для количества элементов на странице (для offset-пагинации) | Любая строка | `limit`, `per_page`, `_limit`, `size` | `limit` |
660-
| `sizeParam` | опционально | Название параметра для размера страницы (для page-пагинации) | Любая строка | `size`, `pageSize`, `_size` | `size` |
661-
| `cursorParam` | опционально | Название параметра для курсора (для cursor-пагинации) | Любая строка | `cursor`, `after`, `next` | `cursor` |
662-
| `pageSize` | опционально | Количество элементов на странице для пагинации | Положительное целое число | `10`, `20`, `50`, `100` | `100` |
663-
| `requestBody` | опционально | Тело запроса для POST/PUT/PATCH-методов | Любая строка | `{"query": "example"}` | `""` |
678+
При **`mapKeyField: example`** в обработку передаётся массив с добавленным полем `example` со значением, взятым из ключа объекта:
679+
680+
```json
681+
[
682+
{ "example": "billing", "title": "Billing", "owner": "team-a" },
683+
{ "example": "shipping", "title": "Shipping", "owner": "team-b" }
684+
]
685+
```
686+
687+
Если **`mapKeyField`** не задан (пустая строка), в обработку передаётся массив без добавления нового поля:
688+
689+
```json
690+
[
691+
{ "title": "Billing", "owner": "team-a" },
692+
{ "title": "Shipping", "owner": "team-b" }
693+
]
694+
```
664695

665696
### Типы пагинации
666697

667-
- **none** — без пагинации, получает все данные одним запросом.
698+
- `none` — без пагинации, получает все данные одним запросом.
668699

669-
- **offset** — пагинация по номеру страницы и количеству элементов:
700+
- `offset` — пагинация по номеру страницы и количеству элементов:
670701
- Использует параметры `pageParam` и `limitParam`.
671702
- Пример: `?page=1&limit=20`.
672703

673-
- **page** — пагинация по номеру страницы и размеру:
704+
- `page` — пагинация по номеру страницы и размеру:
674705
- Использует параметры `pageParam` и `sizeParam`.
675706
- Пример: `?page=1&size=20`.
676707

677-
- **cursor** — пагинация по курсору:
708+
- `cursor` — пагинация по курсору:
678709
- Использует параметр `cursorParam`.
679710
- Пример: `?cursor=eyJpZCI6MTIzfQ==`.
680711

681-
- **link_header** — пагинация через заголовок Link:
712+
- `link_header` — пагинация через заголовок Link:
682713
  - Использует заголовок `Link` в ответе для определения следующей страницы.
683714
  - Стандарт RFC 5988.
684715

685716
### Примеры конфигурации
686717

687-
**JSONPlaceholder API (без пагинации):**
718+
JSONPlaceholder API (без пагинации):
688719

689720
```yaml
690721
url: https://jsonplaceholder.typicode.com
@@ -693,7 +724,7 @@ paginationType: none
693724
dataPath: .
694725
```
695726

696-
**GitLab API (offset пагинация):**
727+
GitLab API (offset пагинация):
697728

698729
```yaml
699730
url: https://gitlab.example.com
@@ -706,7 +737,7 @@ headers:
706737
Authorization: Bearer <token>
707738
```
708739

709-
**GitHub API (link header пагинация):**
740+
GitHub API (link header пагинация):
710741

711742
```yaml
712743
url: https://api.github.com
@@ -717,7 +748,7 @@ headers:
717748
Accept: application/vnd.github.v3+json
718749
```
719750

720-
**API с вложенными данными:**
751+
API с вложенными данными:
721752

722753
```yaml
723754
url: https://api.example.com
@@ -729,7 +760,7 @@ limitParam: limit
729760
query: "filter=active&sort=name"
730761
```
731762

732-
**POST-запрос с телом:**
763+
POST-запрос с телом:
733764

734765
```yaml
735766
url: https://api.example.com

content/documentation/admin/security/audit-logs.ru.md

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,47 +10,57 @@ weight: 40
1010

1111
В формировании и хранении аудит-логов участвуют следующие компоненты:
1212

13-
- **DDP Backend** — формирует записи аудит-логов.
14-
- **PostgreSQL** — обеспечивает хранение данных.
13+
- DDP Backend — формирует записи аудит-логов.
14+
- PostgreSQL — обеспечивает хранение данных.
1515

1616
## Содержимое аудит-логов
1717

18-
Для каждого HTTP-запроса (кроме GET) создается запись аудит-лога, содержащая:
18+
Для каждого HTTP-запроса (кроме GET) создаётся запись аудит-лога, содержащая:
1919

20-
- **Email** — адрес электронной почты пользователя, выполнившего запрос.
21-
- **IP** — IP-адрес клиента.
22-
- **Endpoint** — путь API, к которому был выполнен запрос.
23-
- **Method**HTTP-метод запроса (POST, PUT, DELETE, PATCH).
24-
- **Status** — HTTP-код ответа.
25-
- **Body**тело HTTP-запроса.
26-
- **Timestamp**время выполнения запроса.
20+
- «Email» — адрес электронной почты пользователя, выполнившего запрос.
21+
- «IP» — IP-адрес клиента.
22+
- «Тело запроса» — тело HTTP-запроса.
23+
- «Путь»путь API, к которому был выполнён запрос.
24+
- «Метод» — HTTP-метод запроса (POST, PUT, DELETE, PATCH).
25+
- «Статус» — HTTP-код ответа.
26+
- «Дата»дата выполнения запроса.
2727

2828
## Принцип работы
2929

3030
Аудит-логи формируются автоматически в DDP Backend с использованием промежуточного слоя обработки запросов (middleware) для всех HTTP-запросов, кроме GET.
3131

3232
Для снижения нагрузки на базу данных используется буферизация записей со следующими параметрами:
33-
- Размер батча — 40 записей.
34-
- Интервал записи — 20 секунд.
35-
- Размер буфера в памяти — 4 записи.
33+
34+
1. Размер батча — 40 записей.
35+
1. Интервал записи — 20 секунд.
36+
1. Размер буфера в памяти — 4 записи.
3637

3738
## Хранение
3839

39-
Аудит-логи хранятся в таблице audit_logs базы данных PostgreSQL. Таблица партиционирована на основе поля `timestamp` с разделением по дням.
40+
Аудит-логи хранятся в таблице `audit_logs` базы данных PostgreSQL. Таблица партиционирована на основе поля `timestamp` с разделением по дням.
4041

4142
Структура таблицы поддерживается автоматически: ежедневно в 00:00 по серверному времени подготавливается пространство для записи логов на следующие 7 дней.
4243

4344
Логи хранятся неограниченно долго. Автоматическая очистка старых записей не выполняется. Для управления временем хранения необходимо настроить автоматическое удаление старых групп логов через внешние инструменты (например, cron-задачи или скрипты очистки базы данных).
4445

4546
## Просмотр логов
4647

47-
Аудит-логи доступны через веб-интерфейс в разделе «Администрирование» → «Аудит». Логи можно фильтровать по следующим параметрам:
48+
Аудит-логи доступны через веб-интерфейс в разделе «Администрирование» → «Аудит». Логи можно фильтровать по следующим
49+
параметрам:
50+
51+
- Период (дата и время начала и окончания).
4852
- Email пользователя.
4953
- IP-адрес.
50-
- Эндпоинт.
54+
- Путь.
5155
- Метод запроса.
5256
- Статус ответа.
5357

58+
## Выгрузка в CSV
59+
60+
На странице просмотра аудит-логов доступна кнопка **«Скачать .csv»**. Выгрузка выполняется только при наличии разрешения на чтение аудит-логов.
61+
62+
В файл попадают **все** записи, соответствующие текущим фильтрам и сортировке. Если число подходящих событий превышает лимит в 100 000 записей, выгрузка не выполняется.
63+
5464
## Настройка
5565

5666
Механизм аудит-логирования включён по умолчанию и не требует дополнительной настройки. Для управления временем хранения логов необходимо настроить автоматическое удаление старых партиций базы данных.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
title: v1.6.0
3+
weight: 910
4+
---
5+
6+
{{< alert level="info" >}}
7+
Выпуск релиза планируется 22.06.2026
8+
{{< /alert >}}
9+
10+
## Новые возможности
11+
12+
### Аудит-логи
13+
14+
Добавлена выгрузка аудит-логов в CSV. Подробнее — в разделе [«Аудит-логи»](../../admin/security/audit-logs/#выгрузка-в-csv).
15+
16+
### Источники данных
17+
18+
В источник данных типа [«GenericAPI»](../../admin/datasources/types/#genericapi) добавлена поддержка JSON-ответов в формате map.
19+
20+
### Шаблонизация
21+
22+
Добавлена функция шаблонизации [«toSlug»](../../user/templating/#toslug).
23+
24+
## Улучшения интерфейса
25+
26+
- Добавлена возможность создания новых действий, либо редактирования существующих, из окна конфигурации элемента процесса.
27+
- Добавлена возможность создания новых учетных данных из окна конфигурации внешних сервисов, действий, виджетов и источников данных.
28+
- Добавлено поле «Дата окончания» для элементов процессов и действий.
29+
30+
## Исправления
31+
32+
- Удалена возможность создания параметра типа «Entities» для ресурсов.

0 commit comments

Comments
 (0)