Руководство по установке аналитики на основе ELK¶
Новое локальное решение для аналитики, которое будет использоваться в NEOMSA APIM . Аналитические данные будут сохраняться в лог-файле, который станет источником для системы аналитики на базе ELK (Elasticsearch, Logstash, Kibana).
Архитектура этого решения включает четыре основных компонента:
-
Filebeats
-
Logstash
-
Elasticsearch
-
Kibana
Далее будут описаны шаги, необходимые для настройки NEOMSA APIM и его интеграции с внешним кластером ELK.
| Примечание: Решение разработано на базе ELK 8.1.0 и совместимо только в версиях Kibana 8.0.0 и выше. |
|---|
Настройка APIM¶
Настройка файла deployment.toml¶
Аналитика на основе Choreo включена по умолчанию. Чтобы активировать аналитику ELK, откройте файл deployment.toml, который находится в каталоге neomsa-apim-4.x.x/repository/conf, и измените параметр type на elk. Это позволит системе использовать ELK для аналитики.
[apim.analytics]
enable = true
type = "elk"
Примечание: В версии NEOMSA APIM 4.6.0, размер ответа будет автоматически публиковаться, если в заголовках ответа присутствует content-length. Если вы хотите, чтобы это происходило для каждого ответа, установите свойство properties.'build_response_message' = true.
Включение логирования¶
Примечание: Обратите внимание, что следующие настройки добавлены по умолчанию, начиная с версии NEOMSA APIM 4.6.0.
Откройте каталог neomsa-apim-4.x.x/repository/conf. Чтобы включить логирование, отредактируйте файл log4j2.properties, следующим образом:
Добавьте APIM_METRICS_APPENDER в список аппендеров:
appenders = APIM_METRICS_APPENDER, .... (список доступных аппендеров)
- Добавьте следующую конфигурацию после аппендеров:
appender.APIM_METRICS_APPENDER.type = RollingFile
appender.APIM_METRICS_APPENDER.name = APIM_METRICS_APPENDER
appender.APIM_METRICS_APPENDER.fileName = ${sys:carbon.home}/repository/logs/apim_metrics.log
appender.APIM_METRICS_APPENDER.filePattern = ${sys:carbon.home}/repository/logs/apim_metrics-%d{MM-dd-yyyy}-%i.log
appender.APIM_METRICS_APPENDER.layout.type = PatternLayout
appender.APIM_METRICS_APPENDER.layout.pattern = %d{HH:mm:ss,SSS} [%X{ip}-%X{host}] [%t] %5p %c{1} %m%n
appender.APIM_METRICS_APPENDER.policies.type = Policies
appender.APIM_METRICS_APPENDER.policies.time.type = TimeBasedTriggeringPolicy
appender.APIM_METRICS_APPENDER.policies.time.interval = 1
appender.APIM_METRICS_APPENDER.policies.time.modulate = true
appender.APIM_METRICS_APPENDER.policies.size.type = SizeBasedTriggeringPolicy
appender.APIM_METRICS_APPENDER.policies.size.size=1000MB
appender.APIM_METRICS_APPENDER.strategy.type = DefaultRolloverStrategy
appender.APIM_METRICS_APPENDER.strategy.max = 10
- Добавьте репортера в список логгеров:
loggers = reporter, ...(list of other available loggers)
- Добавьте следующие конфигурации после логгеров:
logger.reporter.name = org.wso2.am.analytics.publisher.reporter.elk
logger.reporter.level = INFO
logger.reporter.additivity = false
logger.reporter.appenderRef.APIM_METRICS_APPENDER.ref = APIM_METRICS_APPENDER
Примечание: Файл apim_metrics.log будет обновляться каждый день или когда его размер достигнет предела в 1000 МБ (по умолчанию). Кроме того, будут сохраняться только последние 10 ревизий файла, а более старые будут автоматически удаляться. Вы можете изменить эти настройки, обновив параметры конфигурации, приведенные выше.
Ниже приведены данные, доступные в событиях логов аналитики:
apim_event_response - Это событие будет вызываться при каждом успешном вызове API. Даже если бэкенд возвращает ошибку, это событие всё равно будет зафиксировано.
apim_event_response:
{
"apiName": "PizzaShackAPI",
"proxyResponseCode": 200,
"destination": "https://localhost:9443/am/sample/pizzashack/v1/api/",
"apiCreatorTenantDomain": "carbon.super",
"platform": "Mac OS X",
"apiMethod": "GET",
"apiVersion": "1.0.0",
"gatewayType": "SYNAPSE",
"apiCreator": "admin",
"responseCacheHit": false,
"backendLatency": 625,
"correlationId": "14c17fef-48cb-4344-8a23-c30983121e46",
"requestMediationLatency": 122,
"keyType": "PRODUCTION",
"apiId": "34b539a6-330a-41cd-ae81-fd081910fd2e",
"applicationName": "SampleAPI",
"targetResponseCode": 200,
"requestTimestamp": "2024-08-01T13:15:10.561Z",
"applicationOwner": "admin",
"userAgent": "Edge",
"userName": "admin@carbon.super",
"apiResourceTemplate": "/menu",
"regionId": "default",
"responseLatency": 766,
"responseMediationLatency": 19,
"userIp": "127.0.0.1",
"apiContext": "/pizzashack/1.0.0",
"applicationId": "07c7833d-06ba-48a2-bd24-df4fa71ee21e",
"apiType": "HTTP",
"properties": {
"responseContentType": "application/json",
"apiContext": "/pizzashack/1.0.0",
"responseSize": 2210,
"userName": "admin@carbon.super"
}
}
apim_event_faulty — это событие будет срабатывать при каждом неудачном и ограниченном вызове API.
apim_event_faulty:
{
"apiCreator": "admin",
"apiCreatorTenantDomain": "carbon.super",
"apiId": "43d030dc-427f-4678-98e3-87b7d9882b5f",
"apiName": "SampleAPI",
"apiType": "HTTP",
"apiVersion": "1.0.0",
"applicationId": "0b5ccc91-30e2-4ee5-9355-d1698075c028",
"applicationName": "SampleApp3",
"applicationOwner": "admin",
"correlationId": "ccf2196f-9db8-429b-aaae-98f4c6edf6d7",
"errorCode": 900803,
"errorMessage": "APPLICATION_LEVEL_LIMIT_EXCEEDED",
"errorType": "THROTTLED",
"eventType": "fault",
"gatewayType": "SYNAPSE",
"keyType": "PRODUCTION",
"proxyResponseCode": 429,
"regionId": "default",
"requestTimestamp": "2022-02-01T04:18:48.023Z",
"responseCacheHit": false,
"targetResponseCode": -1
}
| Параметр | Тип | Описание |
|---|---|---|
| "apiCreator" | string | Создатель API. |
| "apiCreatorTenantDomain" | string | Домен арендатора создателя API. |
| "apiId" | string | Уникальный идентификатор API. |
| "apiMethod" | string | Метод HTTP, используемый API (например, GET, POST). |
| "apiName" | string | Имя API. |
| "apiResourceTemplate" | string | Шаблон API-ресурса, к которому осуществляется доступ. |
| "apiType" | string | Тип API (например, HTTP, REST). |
| "apiVersion" | string | Версия API. |
| "applicationId" | string | Уникальный идентификатор приложения, выполняющего вызов API. |
| "applicationName" | string | Имя приложения, выполняющего вызов API. |
| "applicationOwner" | string | Владелец приложения, выполняющего вызов API. |
| "backendLatency" | long | Время, необходимое бэкенду для обработки запроса. |
| "correlationId" | string | Уникальный идентификатор для отслеживания вызовов API. |
| "destination" | string | URL бэкенда, на который был перенаправлен вызов API. |
| "eventType" | string | Тип события. |
| "gatewayType" | string | Тип API-шлюза. |
| "keyType" | string | Указывает, использовался ли ключ API для SANDBOX или PRODUCTION среды |
| "platform" | string | Операционная система, использованная для доступа к API. |
| "properties" | object | Свойства события. |
| "apiContext" | string | Контекст вызова API. |
| "userName" | string | Имя пользователя, выполнившего вызов API. |
| "proxyResponseCode" | int | Код ответа HTTP, возвращаемый шлюзом API. |
| "regionId" | string | Идентификатор региона для вызова API. |
| "requestMediationLatency" | int | Время, затраченное на медиацию запроса. |
| "requestTimestamp" | long | Временная метка, когда был сделан запрос. |
| "responseCacheHit" | bool | Указывает, был ли ответ получен из кэша. |
| "responseLatency" | long | Общее время, затраченное на ответ на запрос |
| "responseMediationLatency" | long | Время, затраченное на медиацию ответа. |
| "targetResponseCode" | int | Код HTTP-ответа, полученный от серверной части |
| "userAgent" | string | User agent клиента, выполняющего вызов API. |
| "userIp" | string | IP-адрес пользователя, выполняющего вызов API. |
| "errorCode" | int | Код ошибки, сгенерированный в случае сбоя. |
| "errorMessage" | string | Сообщение об ошибке, связанное со сбоем. |
| "errorType" | string | Тип ошибки (например, THROTTLED). |
Настройка ELK¶
Установка Elasticsearch¶
-
Установите Elasticsearch в соответствии с вашей операционной системой.
-
Убедитесь, что Elasticsearch запущен и работает .
Примечание: Согласно рекомендациям ELK, для производственной среды требуется кластер из минимум трех нод.
Установка Filebeat¶
-
Установите Filebeat в соответствии с вашей операционной системой.
-
Настройте Filebeats для чтения файла журнала в папке repository/logs.
-
filebeat.inputs:
-
- type: log
-
enabled: true
-
paths:
-
- {apim-home}/repository/logs/apim_metrics.log
-
include_lines: ['(apimMetrics):']
-
output.logstash:
-
The Logstash hosts¶
-
hosts: ["{LOGSTASH_URL}:5044"]
Установка Logstash¶
- Установите Logstash в соответствии с вашей операционной системой.
input {
beats {
port => 5044
}
}
filter {
grok {
match => ["message", "%{GREEDYDATA:UNWANTED}\ apimMetrics:%{GREEDYDATA:apimMetrics}\, %{GREEDYDATA:UNWANTED} \:%{GREEDYDATA:properties}"]
}
json {
source => "properties"
}
}
output {
if [apimMetrics] == " apim:response" {
elasticsearch {
hosts => ["http://{ELK_URL}:9200"]
index => "apim_event_response"
user => "elastic"
password => "Admin1234"
}
} else if [apimMetrics] == " apim:faulty" {
elasticsearch {
hosts => ["http://{ELK_URL}:9200"]
index => "apim_event_faulty"
user => "elastic"
password => "Admin1234"
}
}
}
Установка Kibana¶
-
Установите Kibana в соответствии с вашей операционной системой.
-
Запустите веб-интерфейс Kibana.
-
Войдите в панель управления Kibana.
-
Перейдите в Stack Management > index pattern. Если у вас уже есть какие-либо шаблоны индексов, созданные под следующими именами, удалите их перед импортом сохраненных артефактов.
apim_event*
apim_event_faulty
apim_event_response