Настройка Okagent


Настройка встроенных плагинов

Настройка NGINX

Для корректной работы Okagent требуется определенный формат логов доступа NGINX. Для настройки необходимо выполнить следующие действия:

  • Добавьте: log_format (или измените существующий) в /etc/nginx/nginx.conf:
http {
        ...
        log_format combined_plus '$remote_addr - $remote_user [$time_local]'
                                 ' "$request" $status $body_bytes_sent "$http_referer"'
                                 ' "$http_user_agent" $request_time $upstream_cache_status'
                                 ' [$upstream_response_time]';
        ...
} 
  • Используйте этот формат для каждой директивы access_log в конфигурационных файлах NGINX. Как правило, изменения достаточно внести только в /etc/nginx/nginx.conf:
http {
        ...
        access_log /var/log/nginx/access.log combined_plus;
        ...
}           
  • Перезапустите NGINX: sudo /etc/init.d/nginx reload

Обратите внимание: разные форматы для одного и того же файла логов использовать не рекомендуется. Если формат не указан, будет использоваться формат по умолчанию combined. Данный формат не содежит переменные $request_time, $upstream_cache_status, и $upstream_response_time. Необходимо найти все директивы access_log и указать формат, содержащий все необходимые переменные.

PostgreSQL

При использовании облачного PostgreSQL (Amazon AWS RDS, AWS Aurora Postgres, Google Cloud SQL, Azure Database, Yandex Cloud Postgres) проведите предварительную настройку, после чего вернитесь к данному разделу и выполните все действия, описанные ниже.

Для мониторинга PostgresSQL необходимо создать отдельного пользователя. Okagent будет использовать этого пользователя для подключения к инстансу базы данных. Кроме того, необходимо создать дополнительные функции в базе данных postgres, необходимые для сбора мониторинговых данных. Чтобы создать пользователя и добавить функции, выполните следующие команды:

$ sudo su postgres -c "psql -d postgres"
CREATE ROLE okagent WITH LOGIN PASSWORD 'EXAMPLE_PASSWORD_DONT_USE_THAT_please_!)';
CREATE SCHEMA okmeter;
GRANT USAGE ON SCHEMA okmeter TO okagent;
CREATE OR REPLACE FUNCTION okmeter.pg_stats(text)
RETURNS SETOF RECORD AS
$$
DECLARE r record;
BEGIN
    FOR r IN EXECUTE 'SELECT r FROM pg_' || $1 || ' r' LOOP RETURN NEXT r;  -- To get pg_settings, pg_stat_activity etc.
    END loop;
    RETURN;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

Далее необходимо разрешить подключение Okagent к инстансу базы данных. Для этого отредактируйте файл pg_hba.conf (pg_hba.conf docs) и добавьте в него следующие строки:

host all okagent 127.0.0.1/32 md5
local all okagent md5 

Для облачных PostgreSQL (Yandex Cloud Postgres, Amazon AWS RDS, AWS Aurora Postgres, Google Cloud SQL, Azure Database, и прочих) измените 127.0.0.1 в pg_hba.conf на IP адрес сервера, где запущен Okagent. Чтобы применить изменения в pg_hba.conf, выполните следующие команды:

$ sudo su postgres -c "psql -d postgres"
SELECT pg_reload_conf();

Все готово!

Статистка запросов PostgreSQL

Для сбора статистики SQL-запросов в реальном времени и статистики выполнения запросов необходимо включить расширение pg_stat_statements. Это стандартное расширение разработано сообществом Postgres. На данный момент оно хорошо протестировано, стабильно работает и доступно в большинстве облачных баз данных. При использовании Postgres версии 9.6 и старше установите пакет postgres-contrib с помощью менеджера пакетов вашего дистрибутива Linux. Также его можно скачать с сайта postgresql.org. Далее расширение необходимо настроить в Postgres. Для этого добавьте следующие строки в postgresql.conf:

shared_preload_libraries = 'pg_stat_statements'   # change requires DB restart.
pg_stat_statements.max = 500
pg_stat_statements.track = top
pg_stat_statements.track_utility = true
pg_stat_statements.save = false

Также можно включить тайминг для операций ввода/вывода (прежде ознакомьтесь с документацией Postgres по настройке статистики времени выполения. Для этого добавьте следующие строки в postgresql.conf:

track_io_timing = on

Для применения настроек необходимо перезапустить Postgres:

$ sudo /etc/init.d/postgresql restart

Теперь необходимо активировать расширение. Для этого выполните следующие команды:

$ sudo su postgres -c "psql -d postgres"
CREATE EXTENSION pg_stat_statements;

PgBouncer

Для мониторинга PgBouncer необходимо добавить пользователя okagent в /etc/pgbouncer/userlist.txt (или в файл, указанный в директиве auth_file в pgbouncer.ini):

"okagent" "EXAMPLE_PASSWORD_DONT_USE_THAT_please_!)"

Далее необходимо добавить stats_user в pgbouncer.ini:

; comma-separated list of users who are just allowed to use SHOW command
stats_users = okagent

Для применения настроек перезапустите PgBouncer:

$ /etc/init.d/pgbouncer reload

JVM

Для мониторинга JVM необходимо включить JMX. Для этого добавьте следующие аргументы к аргументам запуска JVM:

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.host=127.0.0.1 -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=9099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false 

Q: Что, если на сервере запущено больше одного JVM?

A: Можно указать разные порты JMX для каждого JVM процесса. Если JVM запускается с параметрами authenticate=false и ssl=false, Okagent будет автоматически собирать данные мониторинга.

Php-fpm

Для мониторинга php-fpm необходимо включить status page для всех php-fpm pool. Раскомментируйте директиву pm.status_path для всех php-fpm pool во всех файлах .conf и установите URL для status page:

pm.status_path = /status ;you can use /status or any other url, okagent will work with that

Перезапустите php-fpm, чтобы применить настройки: ``service php-fpm restartилиdocker restart some-php-container`. После этого Okmeter начнет собирать статистику по php-fmp pools.

RabbitMQ

Для мониторинга RabbitMQ необходимо включить плагин rabbitmq_management и создать пользователя для Okagent. Чтобы сделать это, выполните следующие команды на всех серверах RabbitMQ:

rabbitmq-plugins enable rabbitmq_management
rabbitmqctl add_user okagent EXAMPLE_PASSWORD_DONT_USE_THAT_please_!)
rabbitmqctl set_user_tags okagent monitoring

И предоставьте права пользователю okagent на доступ к vhosts:

rabbitmqctl set_permissions -p / okagent ".*" ".*" ".*"
rabbitmqctl set_permissions -p /vhost1 okagent ".*" ".*" ".*"

Список vhosts можно вывести следующей командой:

$ rabbitmqctl list_vhosts

Mysql

Для мониторига Mysql необходимо создать отдельного пользователя для подключения к инстансу базы данных. Для этого выполните следующие команды:

CREATE USER 'okagent'@'%' IDENTIFIED BY 'EXAMPLE_PASSWORD_DONT_USE_THAT_please_!)';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'okagent'@'%';
GRANT SELECT ON `performance_schema`.* TO 'okagent'@'%';
FLUSH PRIVILEGES;

Для сбора статистики по запросам MySQL Okmeter использует таблицу events_statements_summary_by_digest в схеме performance_schema, которая есть во всех современных версиях MySQL, Percona и MariaDB. Для проверки совместимости выполните команду:

mysql> SELECT 'OK' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='performance_schema' AND TABLE_NAME='events_statements_summary_by_digest';
+----+
| OK |
+----+
| OK |
+----+

Если результат выполнения запроса “OK”, необходимо проверить, что performance_schema включена и инициализирована. Для этого выполните команды:

mysql> SHOW VARIABLES LIKE 'performance_schema';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| performance_schema | ON    |
+--------------------+-------+

Если результат запроса “OFF”, необходимо включить performance_schema в my.conf и перезапусить MySQL:

[mysqld]
performance_schema=ON

Если используется облачная разновидность MySQL (Yandex Cloud MySQL, Amazon AWS RDS, AWS Aurora Postgres, Google Cloud SQL, Azure Database, и прочих), воспользуйтесь данной инструкцией.

Внешние и облачные базы данных

Для мониторинга облачных и внешних баз данных (т.е. баз данных, которые находятся на хостах, на которых не установлен Okagent), можно установить Okagent на отдельный хост и настроить его соответствующим образом.

На настоящий момент поддерживаются следующие внешние и облачные базы данных: ElasticSearch, Redis, MySQL, PostgreSQL

На хосте, на котором установлен Okagent и у которого есть сетевой доступ к базе данных, необходимо для каждого инстанса базы данных создать конфигурационный файл в директории /usr/local/okagent/etc/config.d/ (например /usr/local/okagent/etc/config.d/remote_db.yaml) со следующим содержимым:

Для базы данных MySQL или PostgreSQL:

plugin: postgresql # или mysql
config:
  host: db_ip # замените на IP удаленного инстанса БД или endpoint кластера
  #port: db_port # раскомментируйте и замените на порт удаленного инстанса БД, если тот нестандартный
  user: db_user # замените на имя мониторинг-пользователя удаленного инстанса БД
  password: db_password # замените на пароль мониторинг-пользователя удаленного инстанса БД
  #database: mydb # замените на имя базы данных, которую вы подключили при создании схемы okmeter, пользователя и функции в PostgreSQL, 
если оно отличается от "postgres" 

Для базы данных Redis:

plugin: redis
config:
  host: db_ip # замените на IP удаленного инстанса БД или endpoint кластера 
  #port: db_port # раскомментируйте и замените на порт удаленного инстанса БД, если тот нестандартный
  #password: db_password # раскомментируйте и замените на пароль мониторинг-пользователя удаленного инстанса БД
Для базы данных ElasticSearch

plugin: elasticsearch

config:
  host: elasticserch_url # замените на URL Elasticsearch в формате: http(s)://elasticsearch
  #port: db_port # раскомментируйте и замените на порт удаленного инстанса Elasticsearch, если тот нестандартный (9200)
  #user: db_user # раскомментируйте и замените на имя мониторинг-пользователя удаленного инстанса Elasticsearch
  #password: db_password # раскомментируйте и замените на пароль мониторинг-пользователя удаленного инстанса Elasticsearch
  #insecureTls: true # раскомментируйте, если Elasticsearch настроена на использование самоподписанного сертификата

Для применения настроек перезапустите Okagent:

$ sudo /etc/init.d/okagent restart

или

$ sudo systemctl restart okagent.service)

Убедитесь, что для базы данных произведены все необходимые дополнительные настройки (см. документацию Mysql или Postgresql).

Zookeeper

Для мониторига Zookeeper версии 3.4.10 и выше необходимо добавить команды stat и mntr в список разрешенных. Для этого включите следующую строку в конфигурационный файл zoo.cfg:

4lw.commands.whitelist=stat, mntr

Для Zookeeper версий ниже 3.4.10 дополнительные настройки не требуются.

Пользовательские метрики

В дополнение к встроенным метрикам Okagent может отправлять кастомные метрики. Есть несколько способов генерации таких метрик :

  • Написать SQL запрос, который возвращает цифровые значения, воспользовавшись плагином SQL query.
  • Производить парсинг файлов логов с помощью плагина Logparser.
  • Написать скрипт, который генерирует метрики, и вызывать его с помощью плагина Execute.
  • Производить парсинг ответа на HTTP-запрос с помощью плагина HTTP.
  • Генерировать метрики на основе вывода Redis-команд, воспользовавшись плагином Redis query.
  • Собирать метрики с приложения с помощью Statsd.
  • Собирать метрики с Promethus-совместимых экспортеров, воспользовавшись плагином Prometheus

Эти плагины требуют дополнительной настройки с помощью конфигурационных файлов. Okagent при запуске читает все конфигурационные файлы в каталоге /usr/local/okagent/etc/config.d/. Имя конфигурационного файла может быть любым, расширения всегда должно быть .yaml, формат файла — YAML.

Проверка конфигурационных файлов | режим dry run

Синтаксис кофигурационного файла можно проверить с помощью следующей команды (замените PLUGIN_CONFIG_FILE на свой файл):

$ /usr/local/okagent/okagent -dry-run=/usr/local/okagent/etc/config.d/PLUGIN_CONFIG_FILE

Если в результате выполения комманды не возникло ошибок, примените конфигурационный файл, перезапустив Okagent:

$ sudo /etc/init.d/okagent restart

или

$ sudo systemctl restart okagent.service

Плагин SQL query

Плагин SQL query отправляет метрики, собирая необходимую информацию с помощью периодических запросов в базу данных. На настоящий момент этот плагин совместим с PostgreSQL, MySQL, Microsoft SQL Server и ClickHouse.

Пример. Допустим, в базе данных имеется таблица article_updates

    update_type | character varying(16)
    updated     | timestamp without time zone
    ...

И нужно отслеживать количество новых update_type. Это можно сделать с помощью следующего запроса:

SELECT COUNT(*) AS value, update_type FROM labels WHERE updated BETWEEN NOW() - INTERVAL '60 seconds' AND NOW() GROUP BY update_type

Внимание: Предварительно проверьте план выполения запроса. Ежеминутные запросы могут оказать дополнительную нагрузку на базу данных.

Okagent будет периодически запрашивать необходимую информацию у базы данных.

Внимание: Okmeter использует поле value в результате запроса как значение метрики (floating point). Все остальные значения из результата запроса будут добавлены к метрике как лейблы с соотвествующими именами.

Примеру выше соответствует конфигурационный YAML-файл плагина /usr/local/okagent/etc/config.d/article_updates.yaml следующего содержания:

plugin: postgresql_query # или mssql_query или mysql_query или clickhouse_query
config:
  host: '127.0.0.1'
  port: 5432
  db: some_db
  user: some_user
  password: secret
  query: "SELECT COUNT(*) AS value, update_type FROM labels WHERE updated BETWEEN NOW() - INTERVAL '60 seconds' AND NOW() GROUP BY update_type"
  metric_name: demo_documents_update_rate

В результате будет отправляться метрика с именем demo_documents_update_rate . Внимание: Имена метрик и лейблов могут содержать только ASCII-символы и цифры и должны удовлетворять регулярному выражению [a-zA-Z_][a-zA-Z0-9_]*.

Внимание: Перед использованием нужно проверить корректность конфигурационного файла.

Внимание: Для применения настроек необходимо перезапустить Okagent:

$ sudo /etc/init.d/okagent restart

или

$ sudo systemctl restart okagent.service

Плагин Execute

Этот плагин отправляет пользовательские метрики, созданные внешним процессом, на основание данных, полученных из его стандартного потока вывода. Для генерации метрик можно использовать два типа парсеров: Regexp или Json.

Regexp

Regexp-парсер анализирует строки, полученные в результате работы скрипта, и преобразует их в значение метрики и дополнительные наборы labelset. Например, для отправки метрики на основание выполнения команды du необходимо создать конфигурационный файл /usr/local/okagent/etc/config.d/app_log_disk_usage.yaml в формате YAML следующего вида:

plugin: execute
config:
  command: 'du /var/log/app/main.log'
  regexp: '(?P<value>\d+)'
  name: demo_app_log_size  # metric name
  value: value             # metric value
  labels:                  # metric labels
    log_name: main

В результате будет отправляться метрика с именем demo_app_log_size. Внимание: Имена метрик и лейблов могут содержать только ASCII-символы/цифры и должны удовлятворять регулярному вырожению [a-zA-Z_][a-zA-Z0-9_]*.

Внимание: Перед использованием нужно проверить корректность конфигурационного файла.

Внимание: Для применения настроек необходимо перезапустить Okagent:

$ sudo /etc/init.d/okagent restart

или

$ sudo systemctl restart okagent.service

JSON

JSON-парсер может использоваться для отправки уже подготовленных метрик или нескольких метрик одновременно.

Внимание: Результат вывода скрипта должен быть в формате JSON и обязательно содержать поля name и value; дополнительные лейблы должны быть перечислены в поле с именем labels:

{
    "name": "metric1",
    "labels": {"label1": "foo", "label2": "bar"},
    "value": 123.4
}

Пример. Допустим, имеется Bash-скрипт calc_metrics.sh следующего содержания:

echo '{"name": "metric1", "labels": {"label1": "foo", "label2": "bar"}, "value": 123.4}'

Чтобы отправлять метрики с помощью плагина Execute и этого скрипта, необходимо создать конфигурационный YAML-файл /usr/local/okagent/etc/config.d/execute_json.yaml следующего вида:

plugin: execute
config:
  command: /tmp/calc_metrics.sh
  parser: json

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

echo '[{"name": "metric1", "value": 123.4}, {"name": "metric2", "value": 567}]'

Внимание: Имена метрик и лейблов могут содержать только ASCII-символы и цифры и должны удовлетворять регулярному выражению [a-zA-Z_][a-zA-Z0-9_]*.

Внимание: Перед использованием необходимо проверить корректность конфигурационного файла.

Внимание: Для применения настроек необходимо перезапустить Okagent:

$ sudo /etc/init.d/okagent restart

или

$ sudo systemctl restart okagent.service

Плагин Logparser

Данный плагин отправляет метрики, полученные из файла логов. Для генерации метрик можно использовать парсеры Regexp или JSON.

Regexp

Regexp-парсер анализирует каждую строку файла и преобразует ее в значение метрики и дополнительные наборы labelset. Например, для отправки метрики на базе файла логов /var/log/app/stages.log необходимо создать конфигурационный YAML-файл /usr/local/okagent/etc/config.d/stage_log.yaml следующего вида:

plugin: logparser
config:
   file: /var/log/app/stages.log
   regexes:
   # 2015-11-21 15:42:36,972 demo [DEBUG] page=item stages: db=0.007s, render=0.002s, total=0.010s count=1
   - regex: '(?P\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).+ page=(?P\w+) stages: db=(?P\d+\.\d+)s, render=(?P\d+\.\d+)s, total=(?P\d+\.\d+)s count=(?P\d+)'
   time_field: datetime
   time_field_format: '2006-01-02 15:04:05'
   metrics:
   ...
  • file — путь до файла, который будет анализироваться. Okagent корректно обрабатывает ротацию файлов.
  • regexes — список регулярных выражений, которые будут применены к строкам. Регулярные выражения применяются последовательно.
    • regexp — поле, в котором задается Perl-совместимое регулярное выражение(regex), на основании которого строка будет разделена на именованные группы для дальнейшей трансформации в метрики.
  • time_field — имя группы для временных меток.
  • time_field_format — формат временных меток.
  • metrics — список метрик, которые должны быть отправлены, вместе с правилами трансформации строк в метрики.

JSON

JSON-парсер преобразовывает логи в формате JSON в метрики. Данный способ предпочтителен, поскольку создает меньшую нагрузку и не требует парсинга на базе регулярных выражений.

plugin: logparser
config:
   file: /var/log/app/stages.log
   json: true
   # {ts: "2015-11-21 15:42:36.000+0300", user: "demo", page: "item", db: "0.007", render: "0.002", total: "0.010", count: "1"}
   time_field: ts
   time_field_format: "2006-01-02 15:04:05.000-0700"
   metrics:
   ...
  • file — путь до анализируемого файла. Okagent корректно обрабатывает ротацию файлов.
  • json — поле, определяющее тип парсера (JSON).
  • time_field — имя группы для временных меток.
  • time_field_format — формат временных меток.

TOP

Парсинг логов часто приводит к большому “оттоку” (churn) метрик, что негативно сказывается на отображении графиков. Для метрик на основе файлов логов рекомендуется использовать функцию TOP. Она позволяет получить N метрик (параметр N задается в конфигурационном файле), при этом все остальные метрики суммируются и отправляются в виде дополнительной метрики со значением label: ~other.

Пример. Производится парсинг лог-фала /var/log/app/stages.log, в котором содержится информация о запросах пользователей к сервису. Требуется отправлять метрики только по десяти запросам, которые чаще всего встречались за последние 10 минут. Для реализации этой схемы необходимо создать конфигурационный YAML-файл /usr/local/okagent/etc/config.d/top_url.yaml следующего вида:

   plugin: logparser
   config:
   file: /var/log/app/stages.log
   #{"ts":"2018-09-12 13:07:11.500","logger": "requests","time":"33","method":"PUT","status":200,"uri":"/aaa/bbb","rid":noRequestId,ip":"2.2.2.2"}
   #{"ts":"2019-11-20 18:32:49.851+0300","logger":"requests","time":"157","method":"PUT","status":200,"uri":"/foo/bar?from=header_new","rid":"11","ip":"1.1.1.1"}
   json: true
   time_field: ts
   time_field_format: "2006-01-02 15:04:05.000-0700"
   top_vars:
   topurl:
   source: uri
   weight: 1
   threshold_percent: 1
   window_minutes: 10
   metrics:
   - type: rate
   name: service_requests_rate
   labels:
   method: =method
   url: =topurl
   status: =status
   - type: percentiles
   name: service_response_time_percentiles
   value: ms2sec:time
   args: [50, 75, 95, 99]
   - type: percentiles
   name: service_response_time_percentile_by_url
   value: ms2sec:time
   args: [95]
   labels:
   url: =topurl

В разделе top_vars есть следующие поля:

  • topurl — новый лейбл для метрики, по которому будет производиться получение TOPN URIs (JSON-поле – source: uri).

  • weight — вес, на который будет изменяться счетчик при каждом вхождении для URI.

  • threshold_percent — метрики, процент которых в общей сумме ниже этого порогового значения, объединяются в специальную кумулятивную метрику (~other).

  • window_minutes — размер окна, в рамках которого производится подсчет TOP.

  • type задает тип метрики и может принимать следующие значения:

    • rate — средняя скорость роста метрики в минуту. Является значением по умолчанию.
    • percentile — процентиль для метрики. Поле args — массив желаемых процентилей, например: [50, 95, 99].
    • max или min — отправляет максимальное или минимальное значение для метрики за минуту.
    • threshold — собирает количество попаданий значения value в различные интервалы (например, (-∞, 0.5], (0.5, 1], …).
  • time_field — имя группы для хранения временных меток.

  • time_field_format — формат временных меток. Возможные форматы:

    • unix_timestamp — временные метки в формате Unix
    • common_log_format — временные метки в формате 2/Jan/2006:15:04:05 -0700
    • time_iso8601 — временные метки в формате RFC 3339 (также ISO 8601)
  • Кастомный формат временных меток. Пользователь сам определяет, как контрольное время — например, Mon Jan 2 15:04:05 -0700 MST 2006 — будет приведено к формату лога. Служит примером для плагина Logparser.

При отсутствии информации о часовом поясе используется часовой пояс UTC.

Поле metric может содержать поле labels, значениями которого могут выступать статические (stage: db) или динамические (page: =page) лейблы. Знак равенства = перед значением лейбла (как в примере выше — page: =page) означает, что значение этого лейбла должно быть взято из regexp-группы с именем page.

Прмер. Предположим, что лог приложения содержит следующие записи:

   ...
   2015-11-01 22:51:44,072 demo [DEBUG] page=item stages: db=0.005s, render=0.002s
   2015-11-01 22:51:44,087 demo [DEBUG] page=list stages: db=0.003s, render=0.001s
   ...

Если применить приведенный ниже конфигурационный файл,..

   plugin: logparser
   config:
   file: /var/log/app/stages.log
   regexes:
   # 2015-11-21 15:42:36,972 demo [DEBUG] page=item stages: db=0.007s, render=0.002s, total=0.010s count=1
   - regex: '(?P<datetime>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).+ page=(?P<page>\w+) stages: db=(?P<db>\d+\.\d+)s, render=(?P<render>\d+\.\d+)s, total=(?P<total>\d+\.\d+)s count=(?P<count>\d+)'
   time_field: datetime
   time_field_format: '2006-01-02 15:04:05'
   metrics:
   - type: percentiles
   args: [50, 75, 95, 98, 99]
   value: db
   name: demo_stages_percentiles
   labels:
   stage: db
   - type: percentiles
   args: [50, 75, 95, 98, 99]
   value: render
   name: demo_stages_percentiles
   labels:
   stage: render
   - type: rate
   name: demo_requests_rate
   labels:
   page: =page
   - type: rate
   name: demo_documents_rate
   value: count
   labels:
   page: =page
   - type: threshold
   value: total
   args: [0.05, 0.1]
   name: demo_render_histogram
   labels:
   page: =render

… плагин Logparser будет отправлять следующие метрики: demo_requests_rate, demo_documents_rate, demo_stages_percentiles and demo_render_histogram.

Внимание: Перед использованием проверьте корректность конфигурационного файла.

Внимание: Для применения настроек перезапустите Okagent:

$ sudo /etc/init.d/okagent restart

или

$ sudo systemctl restart okagent.service

Плагин HTTP

Этот плагин отправляет пользовательские метрики о доступности HTTP-сервиса, а так же метрики, полученные в результате парсинга ответа на HTTP-запроса.

Пример. Есть HTTP-сервис, доступ к которому ограничен Basic Auth. Ответ на запрос к URL /service/stat выглядит следующим образом:

curl --user name:password -H 'Foo: bar' -v 'http://127.0.0.1:8080/service/stat'
   > GET /service/stat HTTP/1.1
   > Host: 127.0.0.1
   > Authorization: Basic bmFtZTpwYXNzd29yZA==
   > Foo: bar
   >
   < HTTP/1.1 200 OK
   <
   online_users=140 active_users=10

Для отправки пользовательских метрик, полученных в результате парсинга ответа на HTTP-запрос, необходимо создать конфигурационный файл /usr/local/okagent/etc/config.d/http.yaml в формате YAML:

plugin: http
config:
   url: http://127.0.0.1:8080/service/stat
   username: name
   password: password
   #sslskip: on #optional, disable certificate verification, like curl --insecure
   headers:
    foo: bar
   metrics:
   - metric: users_online
   regex: 'online_users=(\d+)'
   - metric: users_active
   regex: 'active_users=(\d+)'

Запрос будет выполняться каждую минуту, и по результатам парсинга полученного ответа будут отправляться следующие метрики:

metric(name="users_online")
   metric(name="users_active")

Кроме того, будут отправляться три дополнительные метрики:

metric(name="status", plugin="http", instance="<config filename>")

Со значением “1”, если запрос был выполнен успешно, и “0” — в противном случае.

metric(name="status", plugin="http", instance="<config filename> type="text", value="")

Значение лейбла value будет пустым, если запрос был выполнен без ошибок. В противном случае в значении поля value будет указана ошибка, которая возникла в процессе выполнения запроса.

metric(name="http.request_time", plugin="http", instance="<config filename>")

В качестве значения этой метрики будет передаваться время выполения запроса.

Внимание: Имена метрик и лейблов могут содержать только ASCII-символы и цифры и должны удовлятворять регулярному выражению [a-zA-Z_][a-zA-Z0-9_]*.

Внимание: Перед использованием проверьте корректность конфигурационного файла.

Внимание: Для применения настроек перезапустите Okagent:

$ sudo /etc/init.d/okagent restart

или

$ sudo systemctl restart okagent.service

Плагин Redis query

Этот плагин позволяет отправлять кастомные метрики, полученные в результате выполения команд Redis. Пример конфигурационного файла /usr/local/okagent/etc/config.d/redis_example.yaml приведен ниже:

plugin: redis_query
config:
    #host: 127.0.0.1 #optional
    #port: 6379 #optional
    #database: 0 #optional
    commands:
    - LLEN achievement_queue
    - SCARD some_queue
    - HGET stat active_connections
    - GET mail_sender_queue_len

Плагин с такой конфигурацией будет отправлять четыре метрики:

metric(name="achievement_queue.llen")
metric(name="some_queue.scard")
metric(name="stat.hget", param="active_connections")
metric(name="mail_sender_queue_len.get")

Поддерживаются следующие команды Redis: BITCOUNT, GET, GETBIT, GETRANGE, HGET, HLEN, HSTRLEN, LINDEX, LLEN, PTTL, SCARD, STRLEN, TTL, ZCARD, ZCOUNT, ZLEXCOUNT, ZRANK, ZREVRANK, ZSCORE.

StatsD / Метрики приложения

Что это такое?

Для большинства языков разработки существуют готовые библиотеки statsd client libraries. С их помощью можно легко отправлять метрики из приложения, такие как счетчики и таймеры, агенту Okagent по UDP. Okagent будет агрегировать полученные метрики и пересылать их в Okmeter для дальнейшего отображения и создания триггеров.

Okagent принимает UDP-подключения на порт 8125 и обрабатывет метрики StatsD типа counts, timings и gauges.

Пример отправки метрик из приложения по протоколу StatsD

Ниже приведен пример использования библиотеки pystatsd в веб-приложении, написанном на Python:

from statsd import StatsClient
statsd_client = StatsClient(host='127.0.0.1', port=8125, prefix='demo')
def item(*args, **kwargs):
statsd_client.incr('view.get.demo.views.item.hit') #what a long metric name!
return Items.get()

В результате будут отправляться следующие метрики:

metric(source_hostname="backend1",
name="demo.view.get.demo.views.item.hit", …) #equals to call count of "item" function
metric(source_hostname="backend1",
name="demo.view.get.demo.views.item.hit.rate", …) #and this is calls per second rate

Также можно измерять скорость работы функций или отдельных частей функций — для этого есть специальный тип Timers:

def list(*args, **kwargs):
with statsd_client.timer('view.get.demo.views.list.total'):
return get_list_with_some_work()

В результате будут отправляться следующие метрики:

metric(name="demo.view.get.demo.views.list.total.mean", …)
metric(name="demo.view.get.demo.views.list.total.count", …)
metric(name="demo.view.get.demo.views.list.total.lower", …)
metric(name="demo.view.get.demo.views.list.total.upper", …)
metric(name="demo.view.get.demo.views.list.total.percentile", percentile="50", …)
metric(name="demo.view.get.demo.views.list.total.percentile", percentile="75", …)
metric(name="demo.view.get.demo.views.list.total.percentile", percentile="90", …)
metric(name="demo.view.get.demo.views.list.total.percentile", percentile="95", …)
metric(name="demo.view.get.demo.views.list.total.percentile", percentile="97", …)
metric(name="demo.view.get.demo.views.list.total.percentile", percentile="99", …)

Рекомендации по использованию StatsD

В реальных проектах могут быть сотни, а иногда и тысячи метрик. При таком их количестве крайне важно именовать метрики правильно. Это позволит удобно и быстро строить различные графики. Мы часто сталкиваемся с тем, что пользователи пытаются минимизировать количество лейблов и вынести всю информацию в имя метрики, например myapp.some.really.long.metrics.names или some.other.long.metric.name. При построении графиков приходится указывать полное имя метрики, что зачастую трудоемко и усложняет описание графиков и триггеров. Кроме того, при появлении новой метрики потребуется вносить изменения в график.

Мы рекомендуем использовать стандарт Metrics 2.0.

В этом случае вместо метрики с именем demo.view.get.demo.views.list.total.mean рекомендуется отправлять метрику следующего вида:

metric(name="demoapp.view.timing.mean",
phase="total",
handler="search",
method="get")

В общем случае name метрики должно указывать на конкретную цель измерения (в нашем примере это view.timing). Уточняющие данные следует выносить в лейблы данной метрики.

Ниже приведен пример возможной реализации при использовании StatsD:

stats = StatsClient(host='127.0.0.1', port=8125, prefix='demoapp')
def search(request):
with stats.timer('view.timing.phase_is_total.handler_is_search.method_is_'+request.method):
return get_list_with_some_work()
def get_item(*args, **kwargs):
with stats.timer('view.timing.phase_is_total.handler_is_get_item.method_is_'+request.method):
return get_list_with_some_work()

Добавить лейблы tag_1 со значением some_value и tag_2 со значением other_val к метрике с именем my.precious.metric можно следующим образом: my.precious.metric.tag_1_is_some_value.tag_2_is_other_val. Порядок лейблов не имеет значения. Вариант my.precious.metric.tag_2_is_other_val.tag_1_is_some_value ничем не уступает первому и тоже будет работать.

Не рекомендуется использовать большое количество различных значений для одного лейбла. Например, сохранять полный URL в качестве значения лейбла — плохая идея, поскольку ведет к отправке большого количества метрик и негативно влияет на скорость отображения. Кроме того, обычно это не имеет смысла. Рекомендуется использовать не более 5 лейблов для каждой метрики и определять не более 10 различных значений для каждого лейбла.

Расширенная настройка

По умолчанию Okagent принимает UDP-запросы на порт 8125. Если данный порт недоступен, его можно переопределить, создав конфигурационный файл /usr/local/okagent/etc/config.d/statsd.yaml:

plugin: statsd
   config:
   listen_address: "192.168.1.1:18125"

Внимание: Перед использованием проверьте корректность конфигурационного файла.

Внимание: Для применения настроек перезапустите Okagent: $ sudo /etc/init.d/okagent restart (или $ sudo systemctl restart okagent.service).

Плагин Prometheus

Данный плагин позволяет собирать данные с Prometheus-совместимых экспортеров и отправлять их в виде метрик.

Для приложений, запущенных в Kubernetes, обнаружение (discovering) производится с помощью аннотаций:

apiVersion: apps/v1
kind: Deployment #or StatefulSet, DaemonSet, CronJob, ...
metadata:
  name: my-app
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/scheme: "http"
    prometheus.io/port: "80"
    prometheus.io/path: "/metrics"
...

Okagent также может производить discovering для приложений, запущенных в Docker-контейнерах, у которых установлены соответствующие лейблы:

$ docker run --name my-app \
--label io.prometheus.scrape=true \
--label io.prometheus.port=80 \
--label io.prometheus.scheme=http \
--label io.prometheus.path="/metrics" \
...

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

plugin: prometheus
config:
  targets:
  - http://localhost:9100/metrics
  # max cardinality (default 5000)
  limit: 1200
   # additional labels for all scraped metrics
   labels:
     exporter: node

При необходимости можно указать данные для аутентификации. На текущий момент поддерживается Basic Authorization и аутентификация на базе Bearer-токенов.

Пример конфигурационного файла с Basic Authorization:

plugin: prometheus
config:
   targets:
   - http://localhost:9100/metrics
   authorization:
    type: basic
    username: <user>
    password: <password>

Пример конфигурационного файла с использование Bearer-токена:

plugin: prometheus
config:
  targets:
  - http://localhost:9100/metrics
  authorization:
    type: bearer
    token: <token>