Отправить метрики веб-приложений 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 классы. Это не самая сложная вещь, но идея метрик заключается не в том, что один человек со знаниями добавляет все это, а в том, что это часть образа жизни всех людей, пишущих код в каждой части цепочки. С этой точки зрения, простота использования является ключом к тому, чтобы заставить людей принять инструмент.

Другие вопросы по тегам