пятница, 8 января 2016 г.

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

Добрый день. В предыдущей статье мы познакомились с платформой для работы с временными рядами InfluxData. Разобрались, что она состоит из 4 приложений: Telegraf, InfluxDB, Chronograf и Kapacitor, которые образуют так называемый TICK стек технологий (по первым буквам приложений). Научились устанавливать и работать с базой данных InfluxDB. В текущей статье речь пойдет о приложении Telegraf.






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

Telegraf - это open source агент написанный на языке Go, предназначенный для сбора метрик или данных из системы, на которой он установлен, а также из других сервисов. Telegraf передает собранные метрики в InfluxDB в корректном формате.

Ключевые возможности

  • MIT лицензия.
  • Минимальное потребление памяти.
  • Расширяемая плагинная архитектура. На момент написания статьи написано 40+ плагинов для сбора метрик и для отправки в различные хранилища.
  • Возможность отправлять статистику в сторонние API, например в OpenTSDB, Datadog, RabbitMQ и пр.
  • Возможность собирать системные метрики CPU, Memory, disks, I/O и прочее.

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

Скачиваем последнюю версию Telegraf с сайта https://influxdata.com/downloads/ и устанавливаем:
wget https://s3.amazonaws.com/get.influxdb.org/telegraf/telegraf_0.2.4_amd64.deb
sudo dpkg -i telegraf_0.2.4_amd64.deb
На Debian Telegraf устанавливается в /opt/telegraf. Символьная ссылка telegraf по умолчанию  почему-то не создается. Для удобства сделаем символьную ссылку на /opt/telegraf/telegraf:
sudo ln -s /opt/telegraf/telegraf /usr/bin/telegraf

Создание и редактирование файла конфигурации

Перед запуском сервиса telegraf необходимо подготовить файл конфигурации. По умолчанию файл конфигурации находится по пути /etc/opt/telegraf/telegraf.conf. В файле telegraf.conf описываются плагины (то откуда получаются значения метрик) и каналы для вывода метрик (outputs) - наименования поддерживаемых API для отправки метрик. Существует несколько способов создания и редактирования файла telegraf.conf.

Для удобства в telegraf есть утилита, которая генерирует файл telegraf.conf и позволяет указать имена требуемых плагинов и outputs'ов. Выглядит эта команда в общем виде так:
telegraf -sample-config -filter <pluginname>[:<pluginname>] -outputfilter <outputname>[:<outputname>] > telegraf.conf
Параметр -filter -  задает имена плагинов, разделенных ":", а параметр -outputfilter - задает имена output'ов. Со списком поддерживаемых плагинов, можно ознакомиться здесь, а со списком поддерживаемых outputs можно ознакомиться здесь.
Если не указывать параметры -filter и -outputfilter, то создастся файл конфигурации со всеми доступными плагинами и всеми доступными outputs:
telegraf -sample-config > telegraf.conf
Для нашего примера мониторинга создадим конфигурацию с плагинами cpu, mem, disk и одним каналом отправки метрик - influxdb:
telegraf -sample-config -filter cpu:mem:disk -outputfilter influxdb > telegraf.conf
Заглянем в полученный файл telegraf.conf и разберемся, что там есть.
# Telegraf configuration

# Telegraf is entirely plugin driven. All metrics are gathered from the
# declared plugins.

# Even if a plugin has no configuration, it must be declared in here
# to be active. Declaring a plugin means just specifying the name
# as a section with no variables. To deactivate a plugin, comment
# out the name and any variables.

# Use 'telegraf -config telegraf.toml -test' to see what metrics a config
# file would generate.

# One rule that plugins conform to is wherever a connection string
# can be passed, the values '' and 'localhost' are treated specially.
# They indicate to the plugin to use their own builtin configuration to
# connect to the local system.

# NOTE: The configuration has a few required parameters. They are marked
# with 'required'. Be sure to edit those to make this configuration work.

# Tags can also be specified via a normal map, but only one form at a time:
[tags]
  # dc = "us-east-1"

# Configuration for telegraf agent
[agent]
  # Default data collection interval for all plugins
  interval = "1m"
  # Rounds collection interval to 'interval'
  # ie, if interval="10s" then always collect on :00, :10, :20, etc.
  round_interval = true

  # Default data flushing interval for all outputs. You should not set this below
  # interval. Maximum flush_interval will be flush_interval + flush_jitter
  flush_interval = "10s"
  # Jitter the flush interval by a random amount. This is primarily to avoid
  # large write spikes for users running a large number of telegraf instances.
  # ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s
  flush_jitter = "0s"

  # Run telegraf in debug mode
  debug = false
  # Override default hostname, if empty use os.Hostname()
  hostname = ""


###############################################################################
#                                  OUTPUTS                                    #
###############################################################################

[outputs]

# Configuration for influxdb server to send metrics to
[[outputs.influxdb]]
  # The full HTTP or UDP endpoint URL for your InfluxDB instance.
  # Multiple urls can be specified but it is assumed that they are part of the same
  # cluster, this means that only ONE of the urls will be written to each interval.
  # urls = ["udp://localhost:8089"] # UDP endpoint example
  urls = ["http://localhost:8086"] # required
  # The target database for metrics (telegraf will create it if not exists)
  database = "telegraf" # required
  # Precision of writes, valid values are n, u, ms, s, m, and h
  # note: using second precision greatly helps InfluxDB compression
  precision = "s"

  # Connection timeout (for the connection with InfluxDB), formatted as a string.
  # If not provided, will default to 0 (no timeout)
  # timeout = "5s"
  # username = "telegraf"
  # password = "metricsmetricsmetricsmetrics"
  # Set the user agent for HTTP POSTs (can be useful for log differentiation)
  # user_agent = "telegraf"
  # Set UDP payload size, defaults to InfluxDB UDP Client default (512 bytes)
  # udp_payload = 512


###############################################################################
#                                  PLUGINS                                    #
###############################################################################

[plugins]

# Read metrics about cpu usage
[[plugins.cpu]]
  # Whether to report per-cpu stats or not
  percpu = true
  # Whether to report total system cpu stats or not
  totalcpu = true
  # Comment this line if you want the raw CPU time metrics
  drop = ["cpu_time"]

# Read metrics about disk usage by mount point
[[plugins.disk]]
  # By default, telegraf gather stats for all mountpoints.
  # Setting mountpoints will restrict the stats to the specified mountpoints.
  # Mountpoints=["/"]

# Read metrics about memory usage
[[plugins.mem]]
  # no configuration


###############################################################################
#                              SERVICE PLUGINS                                #
###############################################################################

Весь файл разбит на 4 блока:

  • Глобальные настройки Telegraf.
  • OUTPUTS - настройки каналов отправки метрик.
  • PLUGINS - настройки плагинов.
  • SERVICES - настройки мониторинга сервисов.

Глобальные настройки Telegraf

Telegraf имеет несколько глобальных настроек расположенных в секции agent в конфигурационном файле:

  • hostname - имя хоста, которое передается в качестве тега. Значение по умолчанию - имя хоста системы, на которой запущен Telegraf. При желании можно переопределить.
  • interval - интервал сбора метрик по умолчанию для всех плагинов. Задается в формате числа и единицы времени, например, 10s - 10 секунд, 5m - 5 минут. При желании в отдельных плагинах можно интервал переопределить.
  • debug - если true, то значения метрик будет выводиться в STDOUT и в InfluxDB.
Для нашего мониторинга оставим параметры по умолчанию, в частности interval=10s. Это означает, что метрики будут опрашиваться с интервалом в 10 секунд.

Настройки OUTPUTS

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

Настройки PLUGINS

Плагины - это скрипты, которые собирают значения метрик. При старте Telegraf загружает все настроенные плагины. Например, плагин system собирает основные параметры системы, такие как загрузка процессора, размер оперативной памяти и жестких дисков и прочее. Если вам нужно что-то собрать дополнительно, то необходимо сконфигурировать соответствующий плагин.
Все плагины имеют собственные настройки, а также общие настройки:
  • pass - массив строк, который служит для фильтрации метрик, генерируемых данным плагином.
  • drop - параметр обратный параметру pass, если имя метрики находится в этом списке, то данная метрика не отправляется.
  • tagpass - список тегов, по которым разрешается отправка метрик. При сборе проверяется каждый элемент списка на полное совпадение с тегом метрики, и метрика отправляется если хотя бы один из списка элемент совпал.
  • tagdrop - параметр обратный параметру tagpass.
  • interval - специфичный интервал опроса для плагина.

Для нашего мониторинга оставим раздел PLUGINS без изменения.

Telegraf на момент написания статьи насчитывал 40+ плагинов и каналов для отправки. Для актуальной информации по наличию того или иного плагина лучше обратиться к странице  на GitHub. Чтобы посмотреть, как настраивать определенный плагин или output можно воспользоваться командой:
telegraf -usage <pluginname>

Запуск telegraf

Пришло время запустить Telegraf, для этого выполним команду:
sudo service telegraf start
Starting the process telegraf [ OK ]
telegraf process was started [ OK ]
С этого момента запущен процесс telegraf, который собирает сконфигурированные метрики и отправляет в сконфигурированные каналы отправки. В InfluxDB автоматически создалась база данных с именем telegraf:
> show databases
name: databases
---------------
name
_internal
mydb
telegraf
Посмотрим, какие метрики создались в базе telegraf:
> use telegraf
Using database telegraf
> show measurements
name: measurements
------------------
name
cpu_usage_guest
cpu_usage_guest_nice
cpu_usage_idle
cpu_usage_iowait
cpu_usage_irq
cpu_usage_nice
cpu_usage_softirq
cpu_usage_steal
cpu_usage_system
cpu_usage_user
disk_free
disk_inodes_free
disk_inodes_total
disk_inodes_used
disk_total
disk_used
mem_available
mem_available_percent
mem_buffered
mem_cached
mem_free
mem_total
mem_used
mem_used_percent
Посмотрим значения метрики cpu_usage_idle:
> SELECT value FROM cpu_usage_idle WHERE cpu='cpu-total' LIMIT 5
name: cpu_usage_idle
--------------------
time   value
1452271200000000000 95.77983560503617
1452271260000000000 98.04077365394461
1452271320000000000 99.24956625347593
1452271380000000000 99.16506235875006
1452271500000000000 92.37084040124813

Все! Мониторинг работает, метрики собираются и записываются  базу данных.

Заключение

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