Перейти к содержанию

Руководство по установке аналитики на основе ELK

Новое локальное решение для аналитики, которое будет использоваться в NEOMSA APIM . Аналитические данные будут сохраняться в лог-файле, который станет источником для системы аналитики на базе ELK (Elasticsearch, Logstash, Kibana).

Архитектура этого решения включает четыре основных компонента:

  1. Filebeats

  2. Logstash

  3. Elasticsearch

  4. 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, .... (список доступных аппендеров)

  1. Добавьте следующую конфигурацию после аппендеров:

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

  1. Добавьте репортера в список логгеров:

loggers = reporter, ...(list of other available loggers)

  1. Добавьте следующие конфигурации после логгеров:

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

  1. Установите Elasticsearch в соответствии с вашей операционной системой.

  2. Убедитесь, что Elasticsearch запущен и работает .

Примечание: Согласно рекомендациям ELK, для производственной среды требуется кластер из минимум трех нод.

Установка Filebeat

  1. Установите Filebeat в соответствии с вашей операционной системой.

  2. Настройте Filebeats для чтения файла журнала в папке repository/logs.

  3. filebeat.inputs:

    • type: log
  4. enabled: true

  5. paths:

    • {apim-home}/repository/logs/apim_metrics.log
  6. include_lines: ['(apimMetrics):']

  7. output.logstash:

  8. The Logstash hosts

  9. hosts: ["{LOGSTASH_URL}:5044"]

Установка Logstash

  1. Установите 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

  1. Установите Kibana в соответствии с вашей операционной системой.

  2. Запустите веб-интерфейс Kibana.

  3. Войдите в панель управления Kibana.

  4. Перейдите в Stack Management > index pattern. Если у вас уже есть какие-либо шаблоны индексов, созданные под следующими именами, удалите их перед импортом сохраненных артефактов.

apim_event*

apim_event_faulty

apim_event_response

  1. Загрузите файл артефакта ниже.
    Артефакты v1 - здесь
    Артефакты v2 - здесь

  2. Перейдите в Stack Management > Saved Object и нажмите Import . Добавьте загруженный файл артефакта в качестве импортируемого объекта и выполните импорт.