Отправить метрики веб-приложений Python в InfluxDB
На данный момент у меня настроена такая система мониторинга:
web_app (via python statsd client) -> statsd -> ...
... -> carbon-relay-ng -> carbon-cache -> whisper
И я пользуюсь Grafana
над Graphite
в качестве графического инструмента.
Из-за слишком низкой производительности запросов я решил изменить этот стек на InfluxDB
+ Grafana
расслоение. Итак, мой вопрос, как я могу отправить метрики приложения на InfluxDB
? Я предпочитаю держать этот пакет довольно простым, поэтому я хотел бы пропустить statsd
если это возможно. Должен ли я заменить Python statsd-клиент на effxdb-python и использовать службу телеграфа UDP как часть агрегирования перед InfluxDB
или просто отправьте метрики непосредственно в InfluxDB
пример?
1 ответ
Я бы отправил данные телеграфу, используя линейный протокол.
Я часто использовал InflxDB-Python для отправки статистики непосредственно в InfluxDB. Локальная отправка результатов в telegraf может быть быстрее, в зависимости от того, насколько быстро и надежно реагирует ваша установка InfluxDB - это заблокирует ваше приложение в случае задержек.
Мне кажется, что использовать линейный протокол проще, чем другие варианты, и телеграф может напрямую принимать линейный протокол. Потенциальным недостатком является то, что все, что вы отправляете таким образом, попадет в базу данных, выделенную для статистики телеграфа. Переходя непосредственно к InfluxDB, вы можете выбрать, в какую базу данных будут поступать ваши данные, хотя это означает обход модуля python, если вы хотите использовать формат строки protcol.
Чтобы использовать effxdb-python и отправлять напрямую в InfluxDB, у вас есть выбор в формате JSON или использование подкласса SeriesHelper
JSON
Создание структуры JSON, что write_points
/ write
использует действительно неловко и неуклюже. В любом случае он только конвертирует его в формат строки.
Сравните JSON:
json_body = [
{
"measurement": "cpu_load_short",
"tags": {
"host": "server01",
"region": "us-west"
},
"time": "2009-11-10T23:00:00Z",
"fields": {
"value": 0.64
}
}
]
в формат строки:
# measurement,tag1=tag1value,tag2=tag2value column1=...
cpu_load_short,host=server01,region=us-west value=0.64 1465290833288375000
Я знаю, что, на мой взгляд, легче произвести (и я знаю, что временные метки не совпадают, я просто использую примеры). Формат строки может быть POST
прямо в InfluxDB, используя requests
библиотека или отправлено через UDP, если этот слушатель был настроен.
SeriesHelper
Модуль имеет способ просто принять значения и теги, используя SeriesHelper
который может быть неудобным в настройке, но прост в использовании.
Пример, который они дают:
from influxdb import InfluxDBClient, SeriesHelper
myclient = InfluxDBClient(host, port, user, password, dbname)
class MySeriesHelper(SeriesHelper):
# Meta class stores time series helper configuration.
class Meta:
client = myclient
series_name = 'events.stats.{server_name}'
fields = ['some_stat', 'other_stat']
tags = ['server_name']
bulk_size = 5
autocommit = True
MySeriesHelper(server_name='us.east-1', some_stat=159, other_stat=10)
MySeriesHelper(server_name='us.east-1', some_stat=158, other_stat=20)
Таким образом, вы можете видеть из вызова MySeriesHelper, который облегчает жизнь после того, как он настроен, но конфигурация для клиента должна быть настроена либо в глобальной области (что плохо для модуля), либо в определении класса. Это не хорошо для получения конфигурации из файла конфигурации или обнаружения службы, поэтому в итоге вы выполняете такие вещи в функциях анализа конфигурации:
# Read host, port, user password, dbname from config file, then:
MySeriesHelper.Meta.client = InfluxDBClient(host, port, user, password, dbname)
# Now it is safe to call MySeriesHelper
У меня не было проблем с надежностью при работе с influenxdb-python, и большую часть времени мы используем SeriesHelper
классы. Это не самая сложная вещь, но идея метрик заключается не в том, что один человек со знаниями добавляет все это, а в том, что это часть образа жизни всех людей, пишущих код в каждой части цепочки. С этой точки зрения, простота использования является ключом к тому, чтобы заставить людей принять инструмент.