Платформа мониторинга сборки Telegraf+Influxdb+Grafana

задняя часть Grafana открытый источник

Я поделился этой статьей на втором этапе работы команды по созданию контента для операций.
Добро пожаловать в публичный аккаунт WeChat: OPS Unbounded Engineer
Время последнего обновления этой статьи: 2018-05-13
Адрес личного блога:blog.sqdyy.cn

Всем добрый вечер, сегодня вечером я поделюсь планом сборки платформы мониторинга на основе telegraf+influxdb+grafana.В первую очередь, давайте узнаем о InfluxDB. influxdb — это высокопроизводительная база данных, специально написанная для данных временных рядов, разработанная на языке GO и с открытым исходным кодом! Это часть стека технологий TICK. Он использует механизм TSM для высокоскоростного приема и сжатия данных. И обеспечить высокопроизводительный HTTP API записи/запроса, его оператор выражения аналогичен оператору запроса SQL (но концепция структуры данных отличается, см. подробностиInfluxDB design insights and tradeoffs.

Чтобы объяснить некоторые из приведенных выше названий, стек технологий TICK относится к четырем продуктам мониторинга с открытым исходным кодом, разработанным InfluxData, включая Telegraf, InfluxDB, Chronograf и Kapacitor. Среди них InfluxDB является наиболее широко используемой базой данных временных рядов с открытым исходным кодом.Общим сценарием применения является хранилище журналов. Kapacitor предоставляет решение для мониторинга и оповещения на основе influxdb, которое поддерживает различные методы агрегирования, выбора, преобразования и прогнозирования данных. Chronograf используется для отображения данных и может быть заменен более мощным Grafana.

Я не очень знаком с движком TSM.Он относится к передовым знаниям и информации в интернете не так много.Кому интересно,может изучить самостоятельно:

TSM

influxdb

База данных временных рядов в основном используется для хранения данных мониторинга системы и обычно имеет следующие характеристики:

  • Эффективный запрос со временем в качестве измерения
  • Удобная выборка вниз
  • Эффективно обрабатывать просроченные данные

Для изучения метода influxdb я предлагаю обратиться кСерия учебных пособий по InfluxDB в Linux UniversityИмейте базовое представление о Influxdb (но не нужно умирать, так как некоторые описания устарели), прежде чем приступить к работе.официальный файл influxdbГлубокое обучение лучше.

Загрузите и установите influxdb

# 添加yum 源
cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
sudo yum install influxdb
influx -version

Запускаем сервис и добавляем автозагрузку:

sudo service influxdb start
sudo systemctl start influxdb

основная концепция

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

Сравните с существительными в традиционных базах данных

существительное в influxDB Концепции традиционных баз данных
database техническая спецификация
measurement таблица в базе
points Строка данных в таблице

Уникальная концепция InfluxDB

Я только что сказал, что InfluxDB имеет ту же концепцию, что и традиционная база данных, и ее уникальные концепции представлены ниже.

Point

Точка эквивалентна строке данных в таблице в традиционной базе данных, состоящей из метки времени (timestamp), поля (data) и тегов (label).

Свойство точки Концепции традиционных баз данных
timestamp Для каждых данных требуется метка времени (первичный индекс и автоматически сгенерированная), которая специально обрабатывается в механизме хранения TSM для оптимизации последующих операций запроса.
field (ключ поля, набор полей, значение поля) Различные значения записи (свойства без индекса), такие как температура
tag (ключ тега, наборы тегов, значение тега) Различные индексированные атрибуты, такие как регионы
series

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

> show series from cpu
key
---
cpu,cpu=cpu-total,host=VM_42_233_centos
cpu,cpu=cpu0,host=VM_42_233_centos
cpu,cpu=cpu1,host=VM_42_233_centos
cpu,cpu=cpu2,host=VM_42_233_centos
cpu,cpu=cpu3,host=VM_42_233_centos

Структура его кода следующая:

type Series struct {
    mu          sync.RWMutex
    Key         string              // series key
    Tags        map[string]string   // tags
    id          uint64              // id
    measurement *Measurement        // measurement
}
shard

Под каждой стратегией хранения существует множество шардов, и каждый шард хранит данные за определенный период времени, например, данные с 7:00 до 8:00 попадают в shard0, а данные с 8:00 до 9:00 попадают в shard1. В соответствии с базовым механизмом хранения tsm существуют независимые файлы кэша, wal и tsm.

политика хранения данных

Политика хранения (RP) используется для определения времени, в течение которого данные хранятся в InfluxDB, или для определения данных, которые должны храниться в течение определенного периода. Когда вы создаете базу данных, InfluxDB автоматически создает автоген (с политикой бесконечного хранения):

> SHOW RETENTION POLICIES ON telegraf
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        true

Выше приведена инструкция для запроса существующих политик базы данных.Значения полей в результатах запроса следующие:

поле значение
name Название политики
duration Продолжительность, 0 означает бесконечное удержание
shardGroupDuration shardGroup — это базовая структура хранения InfluxDB.Временной интервал хранения одного шарда в таблице 168h0m0s составляет 168 часов.После 168 часов он будет сохранен в следующем шарде.
replicaN Полное название тираж, количество копий (не понял)
default Это политика по умолчанию
func shardGroupDuration(d time.Duration) time.Duration {
    if d >= 180*24*time.Hour || d == 0 { // 6 months or 0
        return 7 * 24 * time.Hour
    } else if d >= 2*24*time.Hour { // 2 days
        return 1 * 24 * time.Hour
    }
    return 1 * time.Hour
}

Мы можем создать новую политику хранения, следующий оператор создает 2-часовую политику хранения в библиотеке телеграфа с именем 2h0m0s и устанавливает ее в качестве политики по умолчанию:

> CREATE RETENTION POLICY "2h0m0s" ON "telegraf" DURATION 2h REPLICATION 1 DEFAULT
> SHOW RETENTION POLICIES ON telegraf
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        false
2h0m0s  2h0m0s   1h0m0s             1        true

В настоящее время наша автоген больше не является стратегией по умолчанию.Если вам нужно запросить данные этой стратегии, вам нужно явно добавить имя стратегии при запросе:

> SELECT time,host,usage_system FROM "autogen".cpu limit 2
name: cpu
time                host             usage_system
----                ----             ------------
1526008670000000000 VM_42_233_centos 1.7262947210419817
1526008670000000000 VM_42_233_centos 1.30130130130254

Дополнительные сведения о политиках хранения см. в официальной документации.database_management.

Непрерывный запрос

Непрерывный запрос (CQ) — это набор операторов, которые автоматически и регулярно запускаются в базе данных, и InfulxDB будет хранить результаты запроса в указанной таблице данных.

  • Использование непрерывного запроса является оптимальным способом снижения частоты выборки.Сочетание непрерывного запроса и стратегии хранения значительно сократит использование системы InfulxDB.
  • После использования непрерывного запроса данные будут храниться в указанной таблице данных, что обеспечивает удобство для будущей статистики данных различной точности.
  • Непрерывные запросы не могут быть изменены после создания. Чтобы изменить непрерывный запрос, вы должны DROP, а затем повторно использовать CREATE для создания нового запроса.

Ниже приведен синтаксис непрерывного запроса:

// 基本语法
CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
RESAMPLE EVERY <interval> FOR <interval>
BEGIN
  SELECT <function[s]> INTO <destination_measurement> 
  FROM <measurement> [WHERE <stuff>] 
  GROUP BY time(<interval>)[,<tag_key[s]>]
END

Например, следующий оператор создает новый непрерывный запрос с именем cq_30m в библиотеке телеграфа и добавляет среднее значение используемого поля в таблицу mem_used_30m каждые 30 минут. Все используемые политики хранения данных установлены по умолчанию:

CREATE CONTINUOUS QUERY cq_30m ON telegraf BEGIN SELECT mean(used) INTO mem_used_30m FROM mem GROUP BY time(30m) END

Вот некоторые распространенные операции:

SQL описывать
SHOW CONTINUOUS QUERIES Запросить все CQ
DROP CONTINUOUS QUERY <cq_name> ON <database_name> удалить непрерывный запрос

Для получения более подробной информации, связанной с непрерывными запросами, обратитесь к официальному файлу.continuous_queries.

Общие функции

InfluxDB предоставляет множество полезных функций, которые делятся на три категории:

  • Агрегатная функция
функция описывать
count(field_key) количество возвратов
DISTINCT(field_key) вернуть уникальное значение
INTEGRAL(field_key) Вычислите значение площади поверхности, покрытой значением поля, и получите сумму площадей.
MEAN(field_key) средняя доходность
MEDIAN(field_key) вернуть промежуточное значение
MODE(field_key) Возвращает наиболее часто встречающееся значение в поле
SPREAD(field_key) Возвращает максимальную разницу
SUM(field_key) возвращаемая сумма
  • выберите функцию класса
функция описывать
BOTTOM(field_key,N) Возвращает наименьшее значение N
FIRST(field_key) Возвращает самое старое значение в поле
LAST(field_key) Возвращает последнее значение в поле
MAX(field_key) Возвращает максимальное значение в поле
MIN(field_key) Возвращает минимальное значение в поле
PERCENTILE(field_key,N) Returns the Nth percentile field value.
SAMPLE(field_key,N) Возвращает случайную выборку из N полей
TOP(field_key,N) Возвращает наибольшее значение N
  • функция класса преобразования
функция описывать
CEILING() ~
CUMULATIVE_SUM() ~
DERIVATIVE() ~
DIFFERENCE() ~
ELAPSED() ~
FLOOR() ~
HISTOGRAM() ~
MOVING_AVERAGE() ~
NON_NEGATIVE_DERIVATIVE() ~
NON_NEGATIVE_DIFFERENCE() ~
  • класс предсказания
функция описывать
HOLT_WINTERS() Алгоритм сезонного прогнозирования — прогнозирование и раннее предупреждение тенденций трафика данных

Telegraf

После установления концепции библиотеки временных рядов мы должны записать данные в библиотеку временных рядов.Вы можете собирать метрики с помощью программы метрик вашей службы приложений, а затем записывать данные в influxdb через http API, предоставленный influxdb, но это Проблема Мы не вводим такое использование (например, метрики java также должны вводить синтаксис java), следующее представляет программу-агент, которая прекрасно сочетается с influxdb для сбора данных:Telegraf

Telegraf — это программа-агент, написанная на Go, которую можно использовать для сбора системной и служебной статистики.Стек технологий TICKчасть. Он имеет подключаемый модуль ввода, который может получать данные индикатора непосредственно из системы, получать данные индикатора из сторонних API и даже получать данные индикатора через statsd и Kafka. Он также имеет выходные плагины, которые могут отправлять собранные метрики в различные хранилища данных, службы и очереди сообщений. Такие как InfluxDB, Graphite, OpenTSDB, Datadog, Librato, Kafka, MQTT, NSQ и т. д.

Скачайте и установите Телеграф:

wget https://dl.influxdata.com/telegraf/releases/telegraf-1.6.2-1.x86_64.rpm
sudo yum install telegraf-1.6.2-1.x86_64.rpm
telegraf -version

Если ваш телеграф установлен, расположение его конфигурационного файла:

/etc/telegraf/telegraf.conf

Отредактируйте файл конфигурации, чтобы указать нашу настроенную базу данных influxdb в качестве желаемого источника вывода:

[[outputs.influxdb]]
  urls=["http://localhost:8086"]

Запускаем сервис и добавляем автозагрузку:

sudo systemctl start telegraf.service
sudo service telegraf status
sudo systemctl enable telegraf.service

Проверьте, какие данные собирает телеграф в конфигурации по умолчанию на InfluxDB:

> show databases
> use telegraf
> show measurements
> SHOW FIELD KEYS

Как настроить

В конфигурации по умолчанию включен плагин INPUT в категории system, то есть telegraf.conf имеет следующую конфигурацию:

# Read metrics about cpu usage
# 读取有关CPU使用情况的指标
[[inputs.cpu]]
  ## Whether to report per-cpu stats or not
  percpu = true
  ## Whether to report total system cpu stats or not
  totalcpu = true
  ## If true, collect raw CPU time metrics.
  collect_cpu_time = false
  ## If true, compute and report the sum of all non-idle CPU states.
  report_active = false

# Read metrics about disk usage by mount point
# 通过mount point读取有关磁盘使用情况的指标
[[inputs.disk]]
  ## Ignore mount points by filesystem type.
  ignore_fs = ["tmpfs", "devtmpfs", "devfs"]

# Read metrics about disk IO by device
# 通过device读取有关磁盘IO的指标
[[inputs.diskio]]

# Get kernel statistics from /proc/stat
# 通过/proc/stat获取内核统计信息
[[inputs.kernel]]
  # no configuration

# Read metrics about memory usage
# 读取有关内存使用量的指标
[[inputs.mem]]
  # no configuration

# Get the number of processes and group them by status
# 获取进程的数量并按状态分组
[[inputs.processes]]
  # no configuration

# Read metrics about swap memory usage
# 读取有关交换内存使用量的指标
[[inputs.swap]]
  # no configuration

# Read metrics about system load & uptime
# 读取有关系统负载和运行时间的指标
[[inputs.system]]
  # no configuration

Конкретные собранные данные выглядят следующим образом (первый уровень — измерения, а второй уровень — поля (поле метки времени опущено)):

- cpu[units: percent (out of 100)]
    - usage_guest      float
    - usage_guest_nice float
    - usage_idle       float
    - usage_iowait     float
    - usage_irq        float
    - usage_nice       float
    - usage_softirq    float
    - usage_steal      float
    - usage_system     float
    - usage_user       float
- disk
    - free         integer
    - inodes_free  integer
    - inodes_total integer
    - inodes_used  integer
    - total        integer
    - used         integer
    - used_percent float
- diskio
    - io_time          integer
    - iops_in_progress integer
    - read_bytes       integer
    - read_time        integer
    - reads            integer
    - weighted_io_time integer
    - write_bytes      integer
    - write_time       integer
    - writes           integer
- kernel
    - boot_time        integer
    - context_switches integer
    - entropy_avail    integer
    - interrupts       integer
    - processes_forked integer
- mem
    - active            integer
    - available         integer
    - available_percent float
    - buffered          integer
    - cached            integer
    - free              integer
    - inactive          integer
    - slab              integer
    - total             integer
    - used              integer
    - used_percent      float
    - wired             integer
- processes
    - blocked       integer
    - dead          integer
    - idle          integer
    - paging        integer
    - running       integer
    - sleeping      integer
    - stopped       integer
    - total         integer
    - total_threads integer
    - unknown       integer
    - zombies       integer
- swap
    - free         integer
    - in           integer
    - out          integer
    - total        integer
    - used         integer
    - used_percent float
- system
    - load1         float
    - load15        float
    - load5         float
    - n_cpus        integer
    - n_users       integer
    - uptime        integer
    - uptime_format string

Как найти метрики и собрать данные

телеграф в основном делится на входные плагины и входные плагины, каталоги исходного кода которых соответствуютplugins/inputsиplugins/outputs, вы просто ссылаетесь наофициальный файл телеграфаНайдите нужный плагин, а затем перейдите в каталог, соответствующий исходному коду, чтобы найти соответствующий.mdфайла, следуйте инструкциям, чтобы получить соответствующую информацию и настроить его.

После включения службы телеграфа вы обнаружите, что в influxdb есть дополнительная библиотека телеграфа с несколькими измерениями, а это значит, что наш сбор данных прошел успешно. После того, как у нас есть данные, нам нужно позаботиться о том, как агрегировать данные и отображать их. Далее будет представлен пакет визуализации grafana.


Grafana

Grafana — это пакет для анализа и визуализации метрик с открытым исходным кодом, который обычно используется для визуализации данных о производительности для инфраструктуры и данных временных рядов для анализа приложений. Он также может применяться в других областях, включая промышленные датчики, домашнюю автоматизацию, управление погодой и процессами. Но обратите внимание: когда мы используем Grafana, нас больше всего волнует, как агрегировать данные и отображать их.

Grafana поддерживает различные источники данных баз данных временных рядов, Grafana предоставляет различные методы запросов для каждого источника данных и может хорошо поддерживать характеристики каждого источника данных. Он поддерживает следующие источники данных: Graphite, Elasticsearch, CloudWatch, InfluxDB, OpenTSDB, Prometheus, MySQL, Postgres, Microsoft SQL Server (MSSQL). Каждый источник данных имеет соответствующую документацию, и вы можете объединить данные из нескольких источников данных в одну панель управления.Эта статья является лишь примером применения источника данных influxdb.

Скачайте и установите Телеграф:

# 安装grafana
wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.1.2-1.x86_64.rpm 
# 启动服务、添加开机启动:
systemctl enable grafana-server
systemctl start grafana-server
# 配置
配置文件 /etc/grafana/grafana.ini
systemd服务名 grafana-server.service
默认日志文件 /var/log/grafana/grafana.log
默认数据库文件 /var/lib/grafana/grafana.db

Простой в использовании

Доступ после запуска сервисаhttp://localhost:3000, порт по умолчанию3000, который можно изменить в файле конфигурации. Имя пользователя и пароль по умолчанию — admin/admin. После входа в систему следуйте инструкциям по настройке источника данных:

配置数据源1
配置数据源2

Затем создайте панель инструментов:

创建面板1.png

Сначала мы выбираем способ импорта шаблона для предварительного просмотра эффекта, а затем узнаем о соответствующей конфигурации графана/дашборда Здесь мы выбираем набор, предоставленный официальнымTelegraf: system dashboard,адресhttps://grafana.com/dashboards/928. Пожалуйста, настройте свой телеграф в соответствии с его подсказками. Затем в информационных панелях выберитеimport->Upload.jsonFile, импортируйте загруженный шаблон:

导入模板

Посмотреть Результаты:

telegraf-system-dashboard

Вы также можете установить некоторые плагины, такие как установкаплагин панели времени.

Метод установки заключается в том, чтобы перейти в каталог /var/lib/grafana/plugins и запустить инструмент grafana-cli для установки плагина.Установите плагин панели времени ниже:

> sudo grafana-cli plugins install grafana-clock-panel
 installing grafana-clock-panel @ 0.0.9
 from url: https://grafana.com/api/plugins/grafana-clock-panel/versions/0.0.9/download
 into: /var/lib/grafana/plugins
 
 ✔ Installed grafana-clock-panel successfully 
  
 Restart grafana after installing plugins . <service grafana-server restart>

# 重启服务
> sudo systemctl restart grafana-server

Конфигурация своими руками

Мы создаем новую панель мониторинга.Панель инструментов состоит из нескольких строк.Одна строка строк разделена на столбцы 12.Мы можем настроить ширину и высоту панели. Теперь мы решаем добавить Singlestat (если это будет рисовать линейную таблицу, выберите Graph), а затем нажмите Panel Title->Edit, чтобы отредактировать информацию о нашей панели, представление Metrics открывается по умолчанию, и мы получаем следующую информацию после модификация:

upTime1

Изменяем единицы измерения и цвета в опциях:

upTime2

Точно так же вы можете попробовать добавить другие панели для достижения следующих эффектов:

最终效果

Функции Grafana очень богаты и не могут быть подробно описаны здесь, пожалуйста, обратитесь к официальной документации для получения дополнительной информации:http://docs.grafana.org/features/datasources/