среда, 6 января 2016 г.

Мониторинг с помощью InfluxData. Часть 1. InfluxDB

influxdata
Новый год наступил, а значит самое время узнать что-то новое. Текущая статья начинает серию статей про InfluxData - платформу для сбора/хранения/визуализации/управления временными рядами (time-series data).

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

В данной статье познакомимся с платформой InfluxData, я опишу основные ее возможности, а также установим, настроим и научимся пользоваться базой данных InfluxDB.

Знакомство с InfluxData

InfluxData представляет собой набор приложений, написанных на языке Go:
  1. Telegraf - утилита для сбора измерений временных рядов.
  2. InfluxDB - кластеризуемая база данных, специально разработанная для хранения временных рядов.
  3. Chronograf - инструмент для визуализации временных рядов. Web приложение для настройки графиков и dashboard'ов.
  4. Kapacitor - утилита для обработки значений временных рядов и контроля отклонений значений. 
Вместе эти 4 приложения образуют так называемый стек технологий TICK (по первым буквам), который является синонимом платформы InfluxData. 

Предназначение InfluxData

С помощью платформы InfluxData можно решать следующие задачи:
  • Настраиваемый DevOps мониторинг.
  • Анализ временных рядов в реальном времени.
  • Internet of Things (IoT), сенсоры устройств.
  • Рекомендательные сервисы на основе поведения и предпочтений пользователей.
  • Многие другие задачи, связанные с временными рядами.

Я же буду рассматривать данную платформу в качестве open source системы мониторинга. А именно буду собирать / сохранять / визуализировать / обрабатывать метрики. Как вы уже наверное догадались:

  • собирать метрики будем с помощью Telegraf
  • сохранять - в InfluxDB
  • визуализировать - с помощью Chronograf
  • обрабатывать - с помощью Kapacitor.
Взаимодействие компонентов TICK
База данных InfluxDB является ядром платформы, все остальные части взаимодействуют через базу данных. Поэтому рассмотрение платформы начнем именно с базы данных InfluxDB.

Знакомство с InfluxDB

InfluxDB - это кластеризуемая база данных, предназначенная для хранения временных рядов, метрик. Она написана на языке Go и не имеет внешних зависимостей. Это означает, что после ее установки, вам не придется что-то еще устанавливать или настраивать для начала работы.

InfluxDB предназначена для хранения метрик DevOps мониторинга, данных от датчиков сенсоров (sensor data), данных для on-line аналитики временных рядов.

Основные возможности InfluxDB


  • SQL подобный язык запросов InfluxQL.
  • HTTP(S) API для записи и выборки данных.
  • Встроенная поддержка других популярных в мониторинге протоколов передачи данных, например collectd.
  • Возможность сохранять миллиарды точек измерений.
  • Классификация данных по тегам для быстрой и эффективной выборки.
  • Поддержка политик хранения данных.
  • Встроенный интерфейс управления.
  • Агрегация данных на лету:
SELECT mean(value) FROM cpu_user WHERE cpu=cpu6 AND time > now() - 1d GROUP BY time(5m)
  •  Сохранение и выборка сотен тысяч значений, отфильтрованных по тегам:
SELECT mean(value) FROM cpu
    WHERE region="uswest" AND az="1" AND server="server01" AND time > now() - 1d
    GROUP BY time(30s)
  • Слияние нескольких временных рядов друг с другом:
SELECT mean(value) FROM /cpu.*/ WHERE time > now() - 1h GROUP BY time(30m) 

В реализации InfluxDB кластера используется алгоритм Raft, о котором я писал ранее.

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

 Установка и настройка InfluxDB

Скачиваем последнюю версию InfluxDB с сайта https://influxdata.com/downloads, и устанавливаем.

wget https://s3.amazonaws.com/influxdb/influxdb_0.9.6.1_amd64.deb
sudo dpkg -i influxdb_0.9.6.1_amd64.deb

После установки запускаем сервис influxdb:
sudo service influxdb start
Starting the process influxdb [ OK ]
influxdb process was started [ OK ]

Открываем Command Line Interface (CLI) командой influx и посмотрим какие есть базы данных командой show databases:
➜  ~  influx
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 0.9.6.1
InfluxDB shell 0.9.6.1
> 
> show databases
name: databases
---------------
name
_internal

> 
HTTP API по умолчанию доступно по порту 8086. 

Создание базы данных

Итак на предыдущем шаге мы запустили на локальном компьютере InfluxDB. Создадим новую базу данных следующей командой:
> create database mydb
Проверим, что база данных создалась:
> show databases
name: databases
---------------
name
_internal
mydb

Большинство запросов в InfluxDB выполняется в рамках какой-либо выбранной базы данных. Для того чтобы выбрать базу данных для последующих запросов, вызовем команду use <db_name>:
> use mydb
Using database mydb

Внутреннее устройство данных

Немного остановимся на данном  этапе и разберемся, как устроены данные внутри InfluxDB. Данные в InfluxDB организованы в виде временного ряда, который содержит измеренные значения, например загрузка процессора - "cpu_load" или температура - "temperature". Временной ряд содержит 0 или несколько точек, по одной на каждое значение измерения метрики. Каждая точка содержит время (timestamp), имя измерения или метрики (measurement), не менее одного поля (fields) в формате ключ-значения (например value=0.5), и 0 или несколько тегов (tags) в формате ключ-значение, которые содержат метаинформацию о собранном значении (host="server01", region="Yekaterinburg").

Если провести аналогию с SQL базой данных, то измерение (measurement) - это таблица, в которой первичным ключом является колонка со временем (timestamp). Теги (tags) - это индексированные колонки, а поля (fields) - это не индексированные колонки. Только в отличие от SQL базы данных в InfluxDB, можно сохранить миллионы измерений (measurement), вы не обязаны заранее определять схему, и null значения не будут храниться.

В общем виде формат добавления новой точки измерения в БД выглядит так:
<measurement>[,<;tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
Приведу несколько примеров точек, которые могут быть добавлены в  InfluxDB:
cpu,host=serverA,region=us_west value=0.64
payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230
stock,symbol=AAPL bid=127.46,ask=127.48
temperature,machine=unit42,type=assembly external=25,internal=37 1434067467000000000

Вставка данных

Для добавления точек измерений через CLI используется команда INSERT. Добавим в созданную до этого базу данных mydb пару точек.
> insert cpu,host=serverA,region=Yekaterinburg value=0.35
> insert cpu,host=serverA,region=Yekaterinburg value=0.26
Мы добавили 2 точки измерения с именем "cpu" со значениями "0.35" и "0.26" и с тегами "host" и "region".
Также данные можно добавлять через HTTP API базы данных. Для добавления точки нужно выполнить HTTP запрос методом POST по пути /write. Имя базы данных передается URL параметром db, а строка данных передается в теле запроса. Добавим новую точку через HTTP API:
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu,host=serverA,region=Yekaterinburg value=0.11'

Выборка данных

Для выборки данных, которые были записаны в предыдущем пункте, будем использовать SQL подобный язык запросов InfluxQL:
> select * from cpu
name: cpu
---------
time   host region  value
1451977899277070372 serverA Yekaterinburg 0.35
1451977918095646124 serverA Yekaterinburg 0.26
1451978089212967544 serverA Yekaterinburg 0.11

Обратите внимание, мы при записи точек не указывали время получения измерения (timestamp). В этом случае InfluxDB устанавливает автоматически текущее время сервера для каждой вставленной точки.
InfluxQL позволяет фильтровать результаты по тегам и полям с помощью предложения WHERE. Добавим несколько точек с тегом host=serverB:
> insert cpu,host=serverB,region=Yekaterinburg value=0.14
> insert cpu,host=serverB,region=Yekaterinburg value=0.89
> insert cpu,host=serverB,region=Yekaterinburg value=0.52
> select * from cpu
name: cpu
---------
time   host region  value
1451977899277070372 serverA Yekaterinburg 0.35
1451977918095646124 serverA Yekaterinburg 0.26
1451978089212967544 serverA Yekaterinburg 0.11
1451979223717750733 serverB Yekaterinburg 0.14
1451979229194772949 serverB Yekaterinburg 0.89
1451979235498117139 serverB Yekaterinburg 0.52

Теперь отфильтруем значения по тегу host:
> select * from cpu where host='serverB'
name: cpu
---------
time   host region  value
1451979223717750733 serverB Yekaterinburg 0.14
1451979229194772949 serverB Yekaterinburg 0.89
1451979235498117139 serverB Yekaterinburg 0.52

Данные можно получить через HTTP API базы данных. Для получения данных нужно выполнить HTTP запрос методом GET по пути /query. Имя базы данных передается URL параметром db, а запрос передается URL параметром q. Выполним запрос к базе данных через HTTP API:
curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=select * from cpu where host='serverB'"
{
    "results": [
        {
            "series": [
                {
                    "name": "cpu",
                    "columns": [
                        "time",
                        "host",
                        "region",
                        "value"
                    ],
                    "values": [
                        [
                            "2016-01-05T07:33:43.717750733Z",
                            "serverB",
                            "Yekaterinburg",
                            0.14
                        ],
                        [
                            "2016-01-05T07:33:49.194772949Z",
                            "serverB",
                            "Yekaterinburg",
                            0.89
                        ],
                        [
                            "2016-01-05T07:33:55.498117139Z",
                            "serverB",
                            "Yekaterinburg",
                            0.52
                        ]
                    ]
                }
            ]
        }
    ]
}%                                                                                                                                                                 
Как видим данные возвращаются в формате JSON, корневым элементом является поле с именем results. В случае ошибок в JSON будет добавлено поле error, которое будет содержать текст ошибки. Заметьте, что в URL параметрах присутствует параметр pretty=true, который включает форматирование выводимого JSON'а, он нужен исключительно для отладки.

Заключение

Таким образом, мы научились устанавливать и настраивать базу данных InfluxDB. Научились добавлять записи, а также делать выборки данных. Этого будет достаточно для настройки простого мониторинга с помощью InfluxData. Как видите, все выглядит довольно просто и позволяет начать работать с базой данных очень быстро.
Для более подробного ознакомления с возможностями InfluxDB можно обратиться к документации.
В следующей статье научимся настраивать коллекторы, собирающие измерения метрик с помощью приложения Telegraf из TICK стека.