Logging handler для представлення параметрів, які передаються в extra повідомлення логування у вигляді певних метрик
Установка:
pip install statsdhandler
StatsdHandler параметри в лог записі може представляти у вигляді наступних метрик
- Gauge - аплікація відправляє
metric_name:value|gдеvalueдесяткове/дробове число, statsd повертає останнє значення. Також аплікація може інкрементувати або декрементувати попереднє значення якщо перед ним першим символом буде+або- - Counters/Лічильники - аплікація відправляє
metric_name:value|c, деvalueдодатнє або від'ємне ціле число подій що відбулись statsd повертає суму значень - Timers/Histograms - аплікація віправляє
metric_name:value|msабоmetric_name:value|h, деvalueє будь-яке дробове число, statsd повертає min, max, average, average of 95 percentile, median і standart deviation - Sets - аплікація відправляє
metric_name:value|s, деvalueбудь-що (число або текст, пробіли на початку і в кінці стрічки видаляються) statsd повертає к-ть унікальних значень серед відправлених.
import logging
from statsdhandler.statsdhandler import StatsdHandler
import time
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
sdh = StatsdHandler(config_path='path/to/config.yaml')
sdh.setLevel(logging.DEBUG)
logger.addHandler(sdh)main:
host: localhost
port: 1234
my_app_other_param: some_value_3
formatters:
simple:
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
handlers:
console:
class: logging.StreamHandler
level: INFO
formatter: simple
stream: ext://sys.stdout
statsd:
class: statsdhandler.statsdhandler.StatsdHandler
level: DEBUG
config_path: path/to/handler/config.yaml
loggers:
mylogger:
handlers: [console, statsd]
propagate: no
level: DEBUG
mylogger_2:
handlers: [console, statsd]
propagate: no
level: DEBUG
"":
handlers: [console, statsd]
level: DEBUGЛістінг конфігураційного файлу хендлера:
main:
app_key: app_key
host: localhost
port: 8125
publish_templates:
all_levels:
- '%(logger)s;%(attr)s;%(metric_name)s'
- '%(attr)s;%(metric_name)s'
- '%(metric_name)s'
full_path:
- '%(logger)s;%(attr)s;%(metric_name)s'
counters:
MESSAGE_ID:
value_type: key
REQUEST_METHOD:
value_equals: [POST, PUT]
value_type: key
publish_template: all_levels
REQUESTS:
value_type: value
publish_template: full_path
timers:
- start_attr_name: JOURNAL_REQUEST_START_1
end_attr_name: JOURNAL_REQUEST_END_1
publish_template: full_path
name: timer_name
- value_attr_name: JOURNAL_REQUEST_DUR_TIME
publish_template: full_path
name: timer_name_3
gauges:
JOURNAL_GAUGE_ATTR:
publish_template: full_path
JOURNAL_GAUGE_ATTR_DECR: {}
histograms:
HISTOGRAM_ARG:
publish_template: full_path
sets:
SET_ARG: {}
SET_ARG:
publish_template: full_pathВ конфігураційному файлі хендлера ключові значення:
-
секція
mainapp_key- префікс для метрикhost- ІР на якому 'крутиться' statsdport- порт на якому крутиться statsd
-
секція
publish_templates:all_levelsifull_path- це шаблони форматів метрик, які хендлер буде відсилати в statsd наприклад для шаблонуall_levelsі лічильникаREQUEST_METHODодна і таж метрика буде відсилатись тричіapp_key.mylogger;REQUEST_METHOD;POST:1|c app_key.REQUEST_METHOD;POST:1|c app_key.POST:1|cтакий спосіб надсилання потрібний для того щоб агрегувати одні і тіж метрики на кілької рівнях аплікації, у варіанті з логером ми отримаємо на виході к-ть POST опрацьованих певним модулем, у варіанті без логера ми отримаєм к-ть POST із заданим атрибутом по всіх логерах, і у варіанті де лише app_key i POST ми отримаємо к-ть POST по всій аплікації зі всіх модулів із різних атрибутів що відслідковуються.
-
секція
counters:MESSAGE_ID,REQUEST_METHOD,REQUESTS- перелік атрибутівlog_recodоб'єкту які будуть надсилатись в statsd як лічильники, кожен з них це словник, який може бути пустим або мати наступні ключі:value_type- це строка яка може приймати значенняkeyабоvalueяка вказує як інтерпретувати значення атрибуту, як ключ чи як значення, у випадуkeyзначення атрибуту додасться в кінці назви метрики, а значенням лічильника буде 1
logger.info('Upload file', extra={'MESSAGE_ID': 'upload_file'})
в statsd відправиться наступне:
app_key.mylogger;MESSAGE_ID;upload_file:1|cв іншому випадку атрибут буде закінченням назви метрики а значення атрибута буде значенням метрики
logger.info('New requests', extra={'REQUESTS': 5})
в statsd відправиться:
app_key.mylogger;REQUESTS;REQUESTS:5|cvalue_equals- це масив який містить значення які потрібно надсилати у statsd, тобто якщо атрибутREQUEST_METHODматиме значення відмінне відPOSTiPUT, то в statsd нічого не відправитьсяpublish_template- строка яка містить назву шаблону, якщо її не передати, то використовуватиметься шаблон по замовчуванню такий же якfull_path, якщо передати невірну назву шаблону, то також буде використовуватись шаблон по замовчуванню.
-
секція
timers: Це масив словників які описують параметри таймерів:start_attr_name- назва атрибуту, значення якого сприймати за початок відлікуend_attr_name- назва атрибуту, значення якого сприймати як кінець відлікуvalue_attr_name- назва атрибуту, значення якого сприймати як результат (час) виконання певного процесуname- назва яка буде використовуватись для таймера для шаблонів це змінна%(metric_name)s
-
секції
gauges,histogramsisets: Це словники в яких ключем виступає назва атрибуту який буде представлятись як метрикиgauges,histogramsабоsetsв залежності від секції в якій буде розміщенний, а значенням словник який може бути пустим або містити ключpublish_templateякий вказує на шаблон форматування метрики.