Логирование
В рамках системы реализовано логирование, логирование осуществляется с помощью таких сторонних компонентов как:
- Filebeat - компонент для сбора логов из контейнеров приложения
- ElasticSearch - СУБД для хранения логов
- Kibana - Средство визуализации собранных логов и интерфейс к ElasticSearch
В рамках системы собираются аудит логи. Просмотр логов доступен с помощью Kibana. Аудит логи создаются на каждое действие пользователя.
Логи ADCP
Система ADCP поддерживает 2 типа событий:
- чтение (query)
- редактирование (mutation)
Далее представлен список всех логируемых событий:
№ пп | Наименование события | Тип события | Описание события |
---|---|---|---|
1 | account.buildInvitationLink | query | Создание ссылки на приглашение нового пользователя в систему |
2 | account.create | mutation | Создание новой организации (аккаунта) |
3 | account.currentAccount | query | Запрос информации о текущем аккаунте |
4 | account.get | query | Запрос на получение информации об аккаунте |
5 | account.getAllowedByDatasetProviders | query | Запрос списка организаций, которые позволили запрашивать их наборы данных (список организаций в маркетплейсе) |
6 | account.getAllowedToDatasetProviders | query | Запрос списка организаций, которым позволено запрашивать наши наборы данных (список организаций в настройках интеграций) |
7 | account.getDataProviderByName | query | Получение информации об организации по имени |
8 | account.getDatasetProviders | query | Получение списка возможных партнеров для обмена данными |
9 | account.getGlobalOrgInfo | query | Получение основной информации о собственной организаций |
10 | account.getInteractionMatchingRules | query | Получение списка разрешений на взаимодействие всех организаций |
11 | account.getInteractionMatchingRulesByProvider | query | Получение списка предоставленных разрешений на взаимодействие (кто мне разрешил) |
12 | account.getInteractionMatchingRulesToProvider | query | Получения списка предоставляемых разрешений на взаимодействие (кому я разрешил) |
13 | account.list | query | Запрос на получение списка всех организаций инстанса |
14 | account.merge | mutation | Изменение информации об организации |
15 | account.selectAccount | mutation | Смена текущей организации |
16 | account.sendInvitationCodeToEmail | mutation | Отправка приглашения в систему по Email |
17 | account.setUserRoles | mutation | Изменение роли у пользователя в организации |
18 | account.updateGlobalOrgInfo | mutation | Изменение внешней информации об организации |
19 | dataLabVM.create | mutation | Запрос на создание Виртуальной машины |
20 | dataLabVM.list | query | Запрос на получение списка виртуальных машин |
21 | dataLabVM.merge | mutation | Запрос на изменение виртуальных машин |
22 | dataLabVM.runDataLabVM | mutation | Запрос на запуск виртуальной машины |
23 | dataLabVM.upload | mutation | Запрос на загрузку данных в виртуальную машину |
24 | dataset.get | query | Получение информации о датасете |
25 | dataset.list | query | Получение списка датасетов |
26 | datasetLogs.list | query | Получение списка истории запроса на данные |
27 | datasetMatchingGroup.changeStatus | mutation | Изменение статуса матчинг группы |
28 | datasetMatchingGroup.checkDatasetsForMatching | query | Проверка возможности матчинга датасетов |
29 | datasetMatchingGroup.create | mutation | Создание группы матчинга |
30 | datasetMatchingGroup.get | query | Получение информации о группе мачтчинга |
31 | datasetMatchingGroup.hide | mutation | Скрытие группы матчинга (soft-delete) |
32 | datasetMatchingGroup.list | query | Получение списка матчинг групп |
33 | datasetMatchingGroup.merge | mutation | Редактирование матчинг группы |
34 | datasetMatchingGroup.runMatching | mutation | Факт запуска Матчинга |
35 | datasetMatchingGroup.runUpload | mutation | Факт загрузки сматченного датасета на vm |
36 | datasetMatchingGroup.stopMatching | mutation | Факт остановки матчинга |
37 | datasetMatchingGroup.stopUpload | mutation | Факт остановки загрузки на VM |
38 | datasetMatchingGroup.unhide | mutation | Факт отмены скрытия матчинг группы |
39 | datasetRequest.changeStatus | mutation | Изменение статуса запроса на данные (согласование) |
40 | datasetRequest.create | mutation | Создание запроса на данные |
41 | datasetRequest.createAndMoveToReview | mutation | Создание запроса на данные с последующей передачей на ревью |
42 | datasetRequest.get | query | Запрос детальной информации о запросе на данные |
43 | datasetRequest.incomingList | query | Запрос списка запросов на данные на согласование организацией |
44 | datasetRequest.list | query | Запрос списка запросов на данные |
45 | datasetRequest.merge | mutation | Изменение запроса на данные |
46 | datasetRequest.upload | mutation | Загрузка сматченных данных на VM |
47 | glossaryTerm.get | query | Получение одного бизнес термина |
48 | glossaryTerm.list | query | Получение списка бизнес терминов |
49 | job.abort | mutation | Остановка исполнения модели CleanRoom |
50 | job.debug | mutation | Запуск модели CleanRoom в Debug режиме |
51 | job.list | query | Получение списка выполненных и не выполненных запуска моделей в CleanRoom |
52 | job.run | mutation | Запуск модели в Production режиме |
53 | jobSetting.changeStatus | mutation | Изменение статуса модели CleanRoom |
54 | jobSetting.create | mutation | Создание модели CleanRoom |
55 | jobSetting.get | query | Получение информации о модели CleanRoom |
56 | jobSetting.list | query | Получение списка моделей CleanRoom |
57 | jobSetting.merge | mutation | Изменение модели CleanRoom |
58 | jobSetting.setSchedule | mutation | Создание / изменение расписания модели CleanRoom |
59 | metadataSeed.seedExcelData | query | Загрузка Excel шаблона семантического слоя |
60 | metadataTerm.get | query | Получение одного бизнес-терминов |
61 | metadataTerm.list | query | Получение списка бизнес-терминов |
62 | metadataTerm.create | mutation | Создание бизнес-термина |
63 | metadataTerm.merge | mutation | Изменение бизнес-термина |
64 | metadataTable.get | query | Получение метаописания одной таблицы |
65 | metadataTable.list | query | Получение списка таблиц |
66 | metadataTable.merge | mutation | Изменение информации о таблице |
67 | metadataInstance.get | query | Получение описания одного инстанса |
68 | metadataInstance.list | query | Получение описания списка инстансов |
69 | metadataDatabase.get | query | Получение описания одной БД |
70 | metadataDatabase.list | query | Получение описания списка БД |
71 | metadataField.get | query | Получение одного поля |
72 | metadataField.list | query | Получение списка полей таблицы |
73 | metadataField.merge | mutation | Изменение идентификатора привязанного бизнес-термина |
74 | metadataDataset.get | query | Получение метаописания одного датасета |
75 | metadataDataset.list | query | Получение метаописания списка датасетов |
76 | metadataDataset.create | mutation | Создание датасета |
77 | metadataDataset.merge | mutation | Изменение метаописания датасета |
78 | metadataDataset.merge | mutation | Изменение метаописания датасета |
79 | notification.list | query | Получение списка нотификаций |
80 | project.addMember | mutation | Добавление пользователя в проект |
81 | project.create | mutation | Создание проекта |
82 | project.get | query | Получение информации о проекте |
83 | project.incomingList | query | Получение списка проектов приходящих на модерацию |
84 | project.list | query | Получение списка проектов |
85 | project.merge | mutation | Изменение проекта |
86 | project.removeProject | mutation | Скрытие проекта (soft-delete) |
87 | script.create | mutation | Создание скрипта |
88 | script.get | query | Получение скрипта |
89 | script.list | query | Получение списка скриптов |
90 | script.makeReview | mutation | Проведение ревью скрипта |
91 | script.merge | mutation | Редактирование скрипта |
92 | script.setExecutableFile | mutation | Указание файла для исполнения |
93 | user.login | mutation | Авторизация пользователя |
94 | user.sendPasswordResetCode | mutation | Отправка письма на сброс пароля |
95 | user.setLanguage | mutation | Изменение языка пользователя |
96 | user.setNewPassword | mutation | Установка нового пароля |
97 | vcs.getBranches | query | Получения списка доступных веток репозитория |
98 | vcs.getFiles | query | Получение списка доступных файлов репозитория |
99 | vcs.getRepositories | query | Получение списка репозиториев |
Каждое лог сообщение имеет следующие атрибуты:
Наименование поля | Пример содержания | Описание |
---|---|---|
_id | M5zt-IIByrvfZYSDKZXt | Уникальный идентификатор лог записи |
_index | cdp-audit-2022.09.01 | Индекс (Таблица) в которой хранится запись |
_type | _doc | Тип документа в ElasticSearch |
@timestamp | Sep 1, 2022 @ 15:01:06.576 | Дата добавления записи |
accountId | 5bqcyjp2lqpd | Id инстанса участника обмена данными |
container.image.name | registry.aggregion.com/dmp-backend:feature-DMPD-918-story-6c6079a9-1225 | Ссылка на образ системы |
duration | 747 | Длительность исполнения задачи |
fields.log_type | audit | Тип лога |
hostname | aggregion-cdp-backend-cdp-dev1-678cdc4c98-vhscj | Имя хоста создавшего запись |
ip | 94.180.208.40 | IP клиента инициатора события |
kubernetes.container.name | backend-api | Имя контейнера |
kubernetes.labels.app_kubernetes_io/component | backend-api | Имя компонента |
kubernetes.labels.app_kubernetes_io/instance | cdp-dev1 | Имя среды |
kubernetes.labels.app_kubernetes_io/name | aggregion-cdp-backend-cdp-dev1 | Имя пода |
kubernetes.namespace | cdpstage-dmpd-918-dev | Имя неймспейса в котором работает контейнер |
kubernetes.pod.ip | 10.42.7.43 | Внутренний IP сервиса создавшего лог |
kubernetes.pod.name | aggregion-cdp-backend-cdp-dev1-678cdc4c98-vhscj | Наименование пода создавшего лог |
level | 100 | Уровень лога |
login | atl@aggregion.com | Имя пользователя инициировавшего действие |
msg | vcs.getBranches | Имя события |
name | dmp | Наименование платформы |
operationType | query | Тип операции |
pid | 18 | ID процесса |
requestId | 589850080baa6c45cde33f52d141c96c | ID запроса |
success | ИСТИНА | Успешность операции |
time | 1,662,033,666,576 | Unixtimestamp события |
userId | debu3k2x4umj | ID пользователя инициатора события |
Так-же каждое лог сообщение имеет дополнительный набор полей, характерный для каждого события, более детальный разбор представлен в разделах далее.
Логирование событий аутентификации пользователей
Логирование событий аутентификации пользователей заносится в лог audit и находится в контейнере keycloak. События аутентификации, связанные с регистрацией нового пользователя, блокировкой/удалением пользователя, неуспешном входе логируются на уровне провайдера аутентификации.
Типы логируемых событий:
- Успешный вход пользователя (login) - вход пользователя с использованием Identity Provider.
- Выход пользователя (logout) - не логируются события истечения токена. Т.к. это не является выходом.
- Обновление токена (Refresh token) - обновление токена по имеющемуся refresh token.
- Неуспешный вход пользователя (login error) - возникает при ошибке аутентификации стороннего провайдера. Как правило, логин пользователя не записывается, т.к. информация не приходит от Identity Provider.
Сообщение содержит информацию о входе пользователя через стороннего провайдера аутентификации:
Наименование поля | Пример содержания | Описание |
---|---|---|
_id | rj-0xIUBosQ-Sp5Lc2M_ | Уникальный идентификатор лог записи |
_index | cdp-audit-2023.01.18 | Индекс (Таблица) в которой хранится запись |
_type | _doc | Тип документа в ElasticSearch |
@timestamp | Jan 18, 2023 @ 14:47:17.335 | Дата добавления записи |
container.image.name | registry.aggregion.com/keycloak:dcp-master-e32f1b74-10 | Ссылка на образ системы |
fields.log_type | audit | Тип лога |
hostname | keycloak19-dev1-0 | Имя хоста создавшего запись |
ip | 94.180.208.40 | IP клиента инициатора события |
kubernetes.container.name | keycloak | Имя контейнера |
kubernetes.labels.app_kubernetes_io/component | keycloak | Имя компонента |
kubernetes.labels.app_kubernetes_io/instance | keycloak19-dev1 | Имя среды |
kubernetes.labels.app_kubernetes_io/name | keycloak | Имя пода |
kubernetes.labels.controller-revision-hash | keycloak19-dev1-57799c87f6 | Hash ревизии |
kubernetes.labels.helm_sh/chart | keycloak-10.1.0 | Образ чарта |
kubernetes.namespace | cdpstage-dmpd-918-dev | Имя неймспейса в котором работает контейнер |
kubernetes.pod.ip | 192.168.214.159 | Внутренний IP сервиса создавшего лог |
kubernetes.pod.name | keycloak19-dev1-0 | Наименование пода создавшего лог |
level | 20 | Уровень лога |
level_text | DEBUG | Название уровня логирования в текстовом виде от Keycloak. Отдельно собирается keycloak.events, который доступен только из уровня DEBUG. Общий уровень логирования Keycloak=INFO. |
module | org.keycloak.events | Модуль лога Keycloak. В audit используется только keycloak.events. |
msg | type=LOGIN, realmId=e8de6d9f-0492-40fb-aa75-42ba3065baa4, clientId=dcp, userId=fe9a6a10-d3f6-482f-8af7-ca165b1f4a16, ipAddress=176.52.98.94, identity_provider=aggregion-oidc, response_type=code, redirect_uri=https://dev1.dcp.bm.dev.aggregion.com/oauth/callback, consent=no_consent_required, identity_provider_identity=dev1@aggregion.com, code_id=e9d1772e-47b7-4658-a9a8-4e32a9dbb6cd, username=dev1@aggregion.com, response_mode=query, authSessionParentId=e9d1772e-47b7-4658-a9a8-4e32a9dbb6cd, authSessionTabId=1iLsHoNbB8M | Имя события |
timestamp | Jan 18, 2023 @ 14:47:17.334 | Unixtimestamp события |
Содержание msg от Keycloak:
Наименование поля | Пример содержания | Описание |
---|---|---|
type | LOGIN | Тип события Keycloak: Login - Пользователь вошел в систему. Logout - Пользователь вышел (не учитывается событие истечения токена). Code to Token - Обмен кода на токен в Identity Provider. Refresh Token - Приложение или клиент обновило токен. |
realmId | e8de6d9f-0492-40fb-aa75-42ba3065baa4 | Id realm в который произведен вход |
clientId | dcp | Клиент, через который осуществляется вход. Для dcp, atlas, kibana и grafana отдельные клиенты. |
userId | fe9a6a10-d3f6-482f-8af7-ca165b1f4a16 | Идентификатор пользователя в Keycloak. |
ipAddress | 176.52.98.94 | Ip-адрес с которого произведен вход. |
identity_provider | aggregion-oidc | Identity Provider, использованный для входа в систему. |
response_type | code | Тип ответа при успешном логине |
redirect_uri | https://dev1.dcp.bm.dev.aggregion.com/oauth/callback | URI на который перешел пользователь после успешной аутентификации в стороннем провайдере. |
consent | no_consent_required | Используется ли consent auth flow. То есть информация о необходимости согласия пользователя об использовании данных, передаваемых от провайдера аутентификации. |
identity_provider_identity | dev1@aggregion.com | Идентификатор пользователя в identity provider использованном при входе |
code_id | e9d1772e-47b7-4658-a9a8-4e32a9dbb6cd | Id полученного от провайдера аутентификации кода |
username | dev1@aggregion.com | Имя авторизовавшегося пользователя |
response_mode | query | Тип ответа |
authSessionParentId | e9d1772e-47b7-4658-a9a8-4e32a9dbb6cd | Id родительской сессии |
authSessionTabId | 1iLsHoNbB8M | Id сессии |
Логирование событий обращения к данным
Обращение к данным в полной мере логируется в blockchain. Доступ к информации по обращению к данным есть через:
- Интерфейс системы - описание в руководстве пользователя.
- Просмотр сообщений об истории обращения к данным - описание в руководстве администратора, раздел Смарт-контракты
- Просмотр информации от Data-service о факте записи лога обращения к данным в blockchain - пример приводится ниже.
Пример лога:
Поле | Содержимое | Комментарий |
---|---|---|
_id | NKSHEYYBosQ-Sp5Lg6AE | |
_index | cdp-log-2023.02.02 | |
_score | 1 | |
_type | _doc | |
@timestamp | Feb 2, 2023 @ 12:48:51.832 | |
container.image.name | registry.aggregion.com/dataservice:dcp-master-2297e450-128 | |
datasetLogs._ id | 63db86f8b27dc70011040156 | |
datasetLogs.availableTo | Jun 2, 2023 @ 12:48:40.380 | |
datasetLogs.businessGoal | Проект для оценки покупательской способности клиентов | Наименование бизнес-цели обращения к данным |
datasetLogs.dataset | 43qbpyznywtr | Id датасета к которому произошло обращение |
datasetLogs.downloadedAt | Feb 2, 2023 @ 12:48:40.380 | Время загрузки датасета для обработки |
datasetLogs.operation | cleanroom | Вид обращения matching - матчинг, upload - выгрузка на VM, cleanroom - запуск модели с использованием данных |
datasetLogs.project | 63aace849cf72100195017d3 | |
datasetLogs.providedBy | 23hatqocqlnd | Id владельца данных |
datasetLogs.providedTo | 23hatqocqlnd | Id получателя данных |
hostname | aggregion-cdp-dataservice-cdp-test1-6b9b4f84df-fsj4g | |
kubernetes.container.name | dataservice-api | |
kubernetes.labels.app_kubernetes_io/component | dataservice | |
kubernetes.labels.app_kubernetes_io/instance | cdp-test1 | |
kubernetes.labels.app_kubernetes_io/name | aggregion-cdp-dataservice-cdp-test1 | |
kubernetes.namespace | cdpstage-dmpd-918-test | |
kubernetes.pod.ip | 192.168.129.224 | |
kubernetes.pod.name | aggregion-cdp-dataservice-cdp-test1-6b9b4f84df-fsj4g | |
level | 10 | |
module | TokenService | |
msg | DatasetLogs were sent to 23hatqocqlnd, 23hatqocqlnd successfully | Сообщение в логе |
name | dataservice-api | |
pid | 17 | |
time | 1,675,331,331,832 |