Руководство по системному администрированию#
Термины и определения#
Термин/Аббревиатура |
Определение |
|---|---|
CPU |
Central Processing Unit |
gRPC (GRPC) |
Google Remote Procedure Call |
ID |
Идентификатор |
АС |
Автоматизированная система |
JSON |
JavaScript Object Notation |
MQ |
Message Queue |
Pod |
Набор контейнеров внутри узла кластера Kubernetes |
Deployment |
Набор инструкций для запуска приложения в кластере Kubernetes |
Artemis |
Программный продукт Apache ActiveMQ Artemis |
Граничный прокси |
Компонент Граничный прокси Platform V Synapse Service Mesh (IGEG) |
Сервисный прокси |
Компонент Сервисный прокси Platform V Synapse Service Mesh (SVPX) |
Листенер |
Обработчик, который срабатывает при появлении сообщения во входящей очереди |
Программный компонент Шлюз ActiveMQ Artemis (далее – Шлюз) не имеет собственного пользовательского интерфейса для администрирования. Все действия по управлению им производятся с использованием интерфейсов предоставляемых Платформой Kubernetes.
Ниже приведены возможные сценарии администрирования компонента Шлюз с использованием консоли клиента Kubernetes (kubectl).
Предусловие:
Для работы утилиты kubectl необходим файл конфигурации кластера kubeconfig, в котором прописаны реквизиты подключения к кластеру. Файл генерируется при создании кластера.
На рабочей станции администратора файл размещается в каталоге ~/.kube и имеет название config.
Для АРМ под управлением ОС Windows установлен эмулятор командной оболочки bash (например git-bash. Для запуска надо выполнить команду "C:\Program Files\Git\git-bash.exe" --cd-to-home).
Сценарии администрирования#
Авторизация пользователя#
Шаг |
Действия |
Примечания |
|---|---|---|
Настройте доступ к кластеру Kubernetes |
В консоли выполните команды: |
- |
Установите рабочий context |
В консоли выполните команду: |
- |
Правила применения паролей изложены в разделе «Идентификация и аутентификация» документа «Руководство по безопасности»
Запуск#
Шаг |
Действия |
Примечание |
|---|---|---|
Установите нужный проект в текущем контексте пользователя |
Введите команду: |
- |
Запустите Шлюз |
В консоли выполните команду: |
N>0 — требуемое количество запущенных Pod Шлюза |
Остановка#
Шаг |
Действие |
Примечание |
|---|---|---|
Установите нужный проект в текущем контексте пользователя |
Введите команду: |
- |
Остановите Шлюз |
В консоли выполните команду: |
- |
Проверка работоспособности#
Шаг |
Действие |
Примечание |
|---|---|---|
Установите нужный проект в текущем контексте пользователя |
Введите команду: |
- |
Проверьте работоспособность |
В консоли выполните команду: |
|
Настройка выделения ресурсов#
Шаг |
Действие |
Примечание |
|---|---|---|
Установите нужный проект в текущем контексте пользователя |
Введите команду: |
- |
Сохраните Deployment |
В консоли выполните команду: |
- |
Скорректируйте параметры |
Откройте файл, полученный на предыдущем шаге в текстовом редакторе (например, Notepad++), найдите в нем параметры: |
- |
Загрузите Deployment |
В консоли выполните команду: |
- |
Настройка подключений к MQ#
Внимание! Новая конфигурация вступит в действие только после перезапуска Pod.
Шаг |
Действие |
Примечание |
|---|---|---|
Установите нужный проект в текущем контексте пользователя |
Введите команду: |
- |
Сохраните конфигурации |
В консоли выполните команду: |
Артефакт содержащий application.yml, либо environment.yml (подробнее описаны в разделе Подключение и конфигурирование документа Руководство прикладного разработчика) |
Скорректируйте параметры |
Откройте файл, полученный на предыдущем шаге в текстовом редакторе (например, Notepad++), найдите в нем параметры: |
- |
Загрузите Deployment |
В консоли выполните команду: |
- |
Правила работы с сертификатами ключей шифрования изложены в разделе «Управление ключами и сертификатами» документа «Руководство по безопасности»
Изменение количества Pod#
Шаг |
Действия |
Примечание |
|---|---|---|
Установите нужный проект в текущем контексте пользователя |
Введите команду: |
- |
Увеличьте/уменьшите количество Pod |
В консоли выполните команду: |
N>0 — требуемое количество запущенных pods шлюза |
Выгрузка системного журнала#
Шаг |
Действия |
Примечание |
|---|---|---|
Установите нужный проект в текущем контексте пользователя |
Введите команду: |
- |
Выгрузите лог |
В консоли выполните команду: |
- |
Просмотр метрик мониторинга#
Шаг |
Действия |
Примечание |
|---|---|---|
Установите нужный проект в текущем контексте пользователя |
Введите команду: |
- |
Получите метрики мониторинга |
В консоли выполните команду: |
- |
Просмотр прикладных логов и метрик мониторинга может быть выполнен администратором в АС Журналирование (LOGA) и АС Мониторинг (MONA) в соответствии с документацией на эти системы.
Контроль срока действия сертификатов#
Шаг |
Действия |
Примечание |
|---|---|---|
Установите нужный проект в текущем контексте пользователя |
Введите команду: |
- |
Получите значение метрики срока действия сертификата |
В консоли выполните команду: |
- |
При необходимости запустите процедуру обновления сертификатов |
Если срок действия сертификатов меньше минимального срока установленного внутренними нормативными документами, необходимо выполнить установленную внутренними нормативными документами процедуру обновления |
- |
События системного журнала#
Системный лог выводится в консоль контейнера приложения.
Уровень логирования задается в дистрибутиве и может быть изменен установкой параметра logging.level конфигурации Шлюза. Подробнее указано в разделе «Полное описание настроек» документа «Руководство прикладного разработчика».
Рекомендуется устанавливать уровень логирования info (используется по-умолчанию) или выше (warn, error).
В системном логе фиксируются следующие события приложения:
Сообщения в логе
Настройки подключения к MQ
time="2023-05-02 10:52:58.371" level=info msg="Создан контекст для отправки сообщений для менеджера { 0 artemis_ssl_ecdsa amqps://<IP хоста брокера>:61619 }"
time="2023-05-02 10:52:58.786" level=info msg="Созданы контексты для получений ответов на синхронные запросы сообщений для менеджера { 0 artemis_ssl_ecdsa amqps://<IP хоста брокера>:61619 }"
time="2023-05-02 10:52:58.457" level=trace msg="AsyncКонсьюмер &{amqps://<IP хоста брокера>:61619 amqps://<IP хоста брокера>:61619 0 { [ ... ] [49195] 771 false [CN=<Common name брокера>] true} 100 0 0xc0003ae500} создан"
Запуск сервера gRPC
time="2023-05-02 10:52:46.349" level=info msg="Grpc сервер запущен на порту :5454"
Запуск сервера HTTP
time="2023-05-02 10:52:46.351" level=info msg="Запущен эндпоинт /test для синхронных запросов"
time="2023-05-02 10:52:46.351" level=info msg="Запущен эндпоинт /test/sync для синхронных запросов"
time="2023-05-02 10:52:46.351" level=info msg="Запущен эндпоинт /test/async для асинхронных запросов"
Режим работы шлюза
time="2023-05-02 10:52:46.349" level=info msg="Шлюз поставщика работает в синхронном и асинхронном режиме: Принимает запросы по GRPC/HTTP и отправляет в MQ. Принимает асинхронные запросы из mq очереди"
Сообщение получено
time="2023-05-02 10:55:21.053" level=info msg="Логирование события Сообщение получено от АС: SYSTEM. RqUID: d6e3fd28ab2f4f51968c9c7423f99fff"
Сообщение отправлено
time="2023-05-02 10:55:21.067" level=info msg="Логирование события Сообщение отправлено в АС: SYSTEM. RqUID: d6e3fd28ab2f4f51968c9c7423f99fff"
Таймаут
time="2023-05-02 14:08:09.839" level=error msg="Ответ на сообщение ID:afd55329-e8f2-11ed-b913-0a58c0a85a60 не был получен за 35000 из менеджера очереди UB.TEST.OUT"
time="2023-05-02 14:08:09.840" level=info msg="Логирование события Ошибка при вычитке сообщения из MQ. Ответ на сообщение ID:afd55329-e8f2-11ed-b913-0a58c0a85a60 не был получен за 35000 из менеджера очереди UB.TEST.OUT. RqUID: "
Ошибка отправки
time="2023-05-02 13:57:24.254" level=error msg="Произошла ошибка при вызове асинхронного интерфейса : rpc error: code = Unavailable desc = no healthy upstream"
time="2023-05-02 13:57:24.254" level=info msg="Логирование события Произошла ошибка: ARTEMIS-GO-GATEWAY. Произошла ошибка при вызове асинхронного интерфейса : rpc error: code = Unavailable desc = no healthy upstream. RqUID: d6e3fd28ab2f4f51968c9c7423f99fff"
Выполнение исходящего вызова
time="2023-05-02 10:55:21.054" level=debug msg="Метадата исходящего вызова: map[x-b3-parentspanid:[0755ff1071bc4252] x-b3-sampled:[1] x-b3-spanid:[0755ff1071bc4252] x-b3-traceid:[0755ff1071bc4252ad68ee286fadc715] x-synapse-from:[system] x-synapse-from-pod-name:[artemis-go-gateway] x-synapse-messageid:[ID:d527ef34-e8d7-11ed-ac9c-d81265b35a2b] x-synapse-operationname:[ServiceRq] x-synapse-override-jmstype:[mcd://jms_type] x-synapse-rquid:[d6e3fd28ab2f4f51968c9c7423f99fff] x-synapse-type-message:[RS]]"
time="2023-05-02 10:55:21.054" level=info msg="Логирование события Сообщение отправлено в: ARTEMIS-GO-GATEWAY. RqUID: d6e3fd28ab2f4f51968c9c7423f99fff"
Обработка входящего вызова
time="2023-05-02 10:55:21.062" level=info msg="Логирование события Сообщение получено от: ARTEMIS-GO-GATEWAY. RqUID: d6e3fd28ab2f4f51968c9c7423f99fff"
time="2023-05-02 10:55:21.062" level=debug msg="Метадата входящего вызова: map[:authority:[artemis-go-gateway:5454] content-type:[application/grpc] user-agent:[grpc-go/1.41.0] x-b3-parentspanid:[2e08c38d724835a8] x-b3-sampled:[1] x-b3-spanid:[ba6458530f5a3539] x-b3-traceid:[0755ff1071bc4252ad68ee286fadc715] x-envoy-attempt-count:[1] x-forwarded-client-cert:[By=spiffe://cluster.local/ns/tribe-sy-asgt-dev-01/sa/default;Hash=80803fd3ceb2814f6cf3e59659b5e538dfdd7fb9b0da7000798578ebfeb6f9ee;Subject=\"\";URI=spiffe://cluster.local/ns/tribe-sy-asgt-dev-01/sa/default] x-forwarded-proto:[http] x-request-id:[133e2358-8aee-9ab2-b217-e20c76aa8374] x-synapse-from:[system] x-synapse-from-pod-name:[artemis-go-gateway] x-synapse-messageid:[ID:d527ef34-e8d7-11ed-ac9c-d81265b35a2b] x-synapse-operationname:[ServiceRq] x-synapse-override-jmstype:[mcd://jms_type] x-synapse-rquid:[d6e3fd28ab2f4f51968c9c7423f99fff] x-synapse-type-message:[RS]]"
Ошибка подключения к MQ
time="2023-05-02 10:52:46.433" level=error msg="dial tcp <IP хоста брокера>:61619: connect: connection refused"
time="2023-05-02 10:52:46.433" level=warning msg="Проверка подключения № 1 к серверу amqps://<IP хоста брокера>:61619 завершилась ошибкой!"
time="2023-05-02 10:52:46.433" level=warning msg="Подключение к серверу потеряно - {errorCode=, reason=dial tcp <IP хоста брокера>:61619: connect: connection refused, linkedErr=dial tcp <IP хоста брокера>:61619: connect: connection refused} amqps://<IP хоста брокера>:61619"
time="2023-05-02 10:52:46.433" level=warning msg="Удаление сервера amqps://<IP хоста брокера>:61619 из балансировки, доступных: 0, отключенных: 1"
Восстановление подключения к MQ
time="2023-05-02 10:53:00.381" level=info msg="Проверка подключения № 1 к серверу amqps://<IP хоста брокера>:61619 прошла успешна!"
time="2023-05-02 10:53:00.381" level=info msg="Подключение к серверу восстановлено - amqps://<IP хоста брокера>:61619"
time="2023-05-02 10:53:00.381" level=warning msg="Возврат сервера amqps://<IP хоста брокера>:61619 в балансировку, доступных: 1, отключенных: 0"
События прикладного журнала#
Прикладной журнал фиксируется в файлах /opt/synapse/logs/messages*.log в формате JSON.
В прикладном журнале фиксируются события:
получения сообщения;
отправки сообщения;
возникновения ошибки.
Каждая запись о событии в журнале содержит:
Имя поля |
Требование к заполнению |
Обязательность |
|---|---|---|
|
Имя проекта в Kubernetes. Заполняется автоматически |
1 |
|
Имя pod в Kubernetes, залогировавшего событие. Заполняется автоматически |
1 |
|
Время фиксации события в pod. Заполняется автоматически |
1 |
|
Тело передаваемого сообщения в формате MQ |
1 |
|
Информация о логируемом событии |
0 |
|
Уникальный идентификатор запроса. Основной идентификатор для поиска записей в логе. |
1 |
|
Имя вызываемого сервиса (получателя) или имя брокера и очереди для внешней АС (получателя). |
0 |
|
Название операции (корневого тега сообщения) |
0 |
|
Статус операции |
0 |
Пример записи в прикладной лог
{
"projectName": "Имя проекта",
"podSource": "Имя pod",
"event_timestamp": 1611911783399,
"message": "<MSG_CONTENT>тело сообщения</MSG_CONTENT>",
"information": "Сообщение получено от АС: АС",
"rqUID": "abcdef00000001212669000134159445",
"operationName": "Имя операции",
"status": "SUCCESS"
}
{
"projectName": "Имя проекта",
"podSource": "Имя pod",
"event_timestamp": 1611911786396,
"message": "<MSG_CONTENT>тело сообщения</MSG_CONTENT>",
"information": "Сообщение отправлено в: Имя сервиса",
"rqUID": "abcdef00000001925071162918237829",
"serviceReceiver": "Имя сервиса",
"operationName": "Имя операции",
"status": "SUCCESS"
}
{
"projectName": "Имя проекта",
"podSource": "Имя pod",
"event_timestamp": 1683101186999,
"message": "",
"information": "Произошла ошибка: ИМЯ СЕРВИСА. Произошла ошибка при вызове асинхронного интерфейса : rpc error: code = Unavailable desc = no healthy upstream",
"serviceReceiver": "имя сервиса",
"operationName": "Имя операции",
"rqUID": "abcdef00000002509572495095446810",
"status": "ERROR"
}
Коды ошибок:
Код ошибки |
Сообщение в логе |
Описание |
|---|---|---|
601 |
Общая ошибка в шлюзе |
|
602 |
Код ошибки: 602. Сообщение не может быть отправлено |
Ошибка конфигурации шлюза |
603 |
Код ошибки: 603. <текст MQ ошибки> |
Ошибки взаимодействия с MQ |
604 |
Код ошибки: 604. Сообщение не соответствует схеме <ID> |
Ошибка валидации сообщения (при работе с валидатором сообщений) |
605 |
Код ошибки: 605. Ошибка вызова валидатора <ID> |
Ошибка вызова валидатора (при работе с валидатором сообщений) |
606 |
Код ошибки: 606. Сообщение не соответствует конфигурации <ID> |
Параметры полученного сообщения не соответствуют конфигурации шлюза |
701 |
Код ошибки: 701. Ошибка при вызове по GRPC ID: StackTrace: … |
Ошибка вызова по gRPC |
События мониторинга#
Шлюз MQ выставляет HTTP-endpoint (actuator/prometheus), на котором публикует метрики мониторинга в формате Prometheus:
Полный список приведен в таблице:
№ |
Метрика |
Описание |
Показатель/Тип |
Измерение |
|---|---|---|---|---|
1 |
Продолжительность паузы сборки мусора |
Суммарная продолжительность паузы циклов сборки мусора. |
|
|
2 |
Количество Goroutines |
Количество существующих в настоящее время Goroutines. |
|
|
3 |
Информация |
Информация о среде Go. |
|
|
4 |
Выделено байтов |
Количество выделенных и все еще используемых байтов. |
|
|
5 |
Общее количество выделенных байтов |
Общее количество выделенных байтов, даже если они были освобождены. |
|
|
6 |
Число байтов хеш-таблицы |
Число байтов, используемых хеш-таблицей сегмента профилирования. |
|
|
7 |
Высвобождения |
Общее количество высвобождений. |
|
|
8 |
Количество байтов системы сбора мусора. |
Количество байтов, используемых для метаданных системы сбора мусора. |
|
|
9 |
Количество выделенных байтов heap |
Количество байтов heap, выделенных и все еще используемых. |
|
|
10 |
Количество ожидающих байтов heap |
Количество байтов heap, ожидающих использования. |
|
|
11 |
Количество используемых байтов heap |
Количество байтов heap, которые используются. |
|
|
12 |
Количество объектов |
Количество выделенных объектов. |
|
|
13 |
Количество возвращенных байтов heap |
Количество байтов heap, возвращенных ОС. |
|
|
14 |
Количество байтов heap |
Количество байтов heap, полученных от системы. |
|
|
15 |
Время последней сборки мусора |
Количество секунд с 1970 года до последней сборки мусора. |
|
|
16 |
Количество операций поиска |
Общее количество операций поиска указателя. |
|
|
17 |
Количество выделений памяти |
Общее количество выделений памяти (malloc). |
|
|
18 |
Количество используемых байтов mcache |
Количество байтов, используемых структурами mcache. |
|
|
19 |
Количество полученных байтов mcache |
Количество байтов, используемых для структур mcache, полученных из системы. |
|
|
20 |
Количество используемых байтов mspan |
Количество байтов, используемых структурами mspan. |
|
|
21 |
Количество полученных байтов mspan |
Количество байтов, используемых для структур mspan, полученных из системы. |
|
|
22 |
Следующая сборка мусора |
Количество байтов heap, когда будет происходить следующая сборка мусора. |
|
|
23 |
Другие системные распределения |
Количество байтов, используемых для других системных распределений. |
|
|
24 |
Количество байтов стека |
Количество байтов, используемых распределителем стека. |
|
|
25 |
Количество байтов системы для распределителя стека |
Количество байтов, полученных от системы для распределителя стека. |
|
|
26 |
Количество байтов системы |
Количество байтов, полученных от системы. |
|
|
27 |
Количество потоков |
Количество созданных потоков ОС. |
|
|
28 |
Время обработки HTTP-вызова |
Время обработки HTTP-вызова в разрезе метода, URI, статуса, исключения |
|
|
29 |
Максимальное время обработки HTTP-вызова |
Максимально время обработки HTTP-вызова в разрезе метода, URI, статуса, исключения |
|
|
30 |
Размер сообщений |
Размер сообщений в разрезе интерфейсов и процентилей |
|
|
31 |
Временные задержки на шлюзе |
Среднее время обработки сообщений в разрезе направлений и этапов обработки. |
|
|
32 |
Количество mq-консьюмеров |
Количество консьюмеров выполняющих чтение из входящих очередей, в разрезе очередей и подключений. Выводит количество активных потоков, для конкретного подключения и конкретной очереди. Если активных потоков для данного подключения и очереди нет - для них будет выведено значение 0 |
|
|
33 |
Минимальное количество mq-консьюмеров |
Минимальное количество mq-консьюмеров. Показывает значение параметра |
|
|
34 |
Максимальное количество mq-консьюмеров |
Максимальное количество mq-консьюмеров. Показывает значение параметра |
|
|
35 |
Наполнение очереди запросов |
Количество gRPC вызовов, превысивших ограничение и ожидающих в очереди на обработку |
|
|
36 |
Размер очереди запросов |
Максимальное количество запросов, которые могут быть помещены в очередь на ожидание (последующие будут отклонены) |
|
|
37 |
Состояние listeners MQ |
Показывает, включены или выключены listeners, читающие сообщения из MQ |
|
|
38 |
Количество серверов |
Количество настроенных брокеров MQ |
|
|
39 |
Неактивные подключения с параметрами MQ |
Количество сбойных брокеров MQ |
|
|
40 |
Количество доступных брокеров MQ |
Количество доступных подключений к брокерам MQ в разрезе статусов |
|
|
41 |
Активные подключения с параметрами MQ |
Количество активных брокеров MQ |
|
|
42 |
Время выполнения операции |
|
|
|
43 |
Максимальное время выполнения операции |
|
|
|
44 |
ТПС |
Количество сообщений в секунду в разрезе направлений и статусов |
|
|
45 |
Версия Шлюза |
Версия выводится в измерении |
|
|
46 |
Общее процессорное время |
Общее пользовательское и системное процессорное время, в секундах. |
|
|
47 |
Максимальное количество файлов |
Максимальное количество открытых дескрипторов файлов. |
|
|
48 |
Количество файлов |
Количество открытых дескрипторов файлов. |
|
|
49 |
Резидентная память |
Размер резидентной памяти в байтах. |
|
|
50 |
Время начала процесса |
Время начала процесса с unix-эпохи в секундах. |
|
|
51 |
Виртуальная память |
Размер виртуальной памяти в байтах. |
|
|
52 |
Доступная виртуальная память |
Максимальный объем доступной виртуальной памяти в байтах. |
|
|
53 |
Обрабатываемые запросы |
Текущее количество обрабатываемых запросов. |
|
|
54 |
Обработанные запросы по коду состояния HTTP. |
Общее количество обработанных запросов по коду состояния HTTP. |
|
|
55 |
Максимальное количество потоков gRPC |
Максимальное количество потоков на обработку gRPC вызовов |
|
|
56 |
Используемое количество потоков gRPC |
Используемое количество потоков обработки gRPC вызовов |
|
|
57 |
Сроки истечения используемых сертификатов SSL |
Количество дней до истечения срока действия сертификатов в разрезе сертификатов |
|
|
Часто встречающиеся проблемы и пути их устранения#
Проблема |
Влияние |
Причина |
Решение |
|---|---|---|---|
Не стартует pod приложения |
Снижение нагрузочной способности |
Недостаточно ресурсов |
Увеличить limits/requests для приложения |
Не стартует pod приложения |
Снижение нагрузочной способности |
Нет доступного node для запуска |
Зарегистрировать обращение в поддержку инфраструктуры |
Не стартует pod приложения |
Снижение нагрузочной способности |
Ошибка в конфигурации |
Выгрузить лог, провести анализ, скорректировать конфигурацию |
Частый рестарт контейнера приложения |
Снижение нагрузочной способности |
Медленная загрузка приложения |
Увеличить задержку и/или интервал опроса Liveness пробы |
Частый рестарт контейнера приложения |
Снижение нагрузочной способности |
Недостаточно ресурсов |
Увеличить limits/requests для приложения |
Ошибка при вызове по gRPC |
Снижение нагрузочной способности |
Нет доступных подов сервиса, которому направлен вызов |
Проверить состояние сервиса — получателя вызова |
Ошибка при вызове по gRPC |
Снижение нагрузочной способности |
Ошибки в конфигурации Сервисного прокси |
Выгрузить лог Сервисного прокси, проанализировать, устранить ошибки |
Ошибка при вызове брокера Artemis |
Снижение нагрузочной способности |
Недоступен брокер Artemis |
Проверить и устранить недоступность |
Ошибка при вызове брокера Artemis |
Снижение нагрузочной способности |
Отсутствует очередь |
Проверить наличие очереди, при необходимости создать |
Ошибка при вызове брокера Artemis |
Снижение нагрузочной способности |
Ошибка в конфигурации шлюза |
Проверить и скорректировать конфигурацию |
Ошибка при вызове брокера Artemis |
Снижение нагрузочной способности |
При соединении через Граничный прокси — ошибки в его конфигурации |
Выгрузить лог Граничного прокси, провести анализ, устранить ошибки |