Я поделился этой статьей на втором этапе работы команды по созданию контента для операций.
Добро пожаловать в публичный аккаунт 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.Он относится к передовым знаниям и информации в интернете не так много.Кому интересно,может изучить самостоятельно:
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. После входа в систему следуйте инструкциям по настройке источника данных:
Затем создайте панель инструментов:
Сначала мы выбираем способ импорта шаблона для предварительного просмотра эффекта, а затем узнаем о соответствующей конфигурации графана/дашборда Здесь мы выбираем набор, предоставленный официальнымTelegraf: system dashboard,адресhttps://grafana.com/dashboards/928
. Пожалуйста, настройте свой телеграф в соответствии с его подсказками. Затем в информационных панелях выберитеimport->Upload.jsonFile
, импортируйте загруженный шаблон:
Посмотреть Результаты:
Вы также можете установить некоторые плагины, такие как установкаплагин панели времени.
Метод установки заключается в том, чтобы перейти в каталог /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 открывается по умолчанию, и мы получаем следующую информацию после модификация:
Изменяем единицы измерения и цвета в опциях:
Точно так же вы можете попробовать добавить другие панели для достижения следующих эффектов:
Функции Grafana очень богаты и не могут быть подробно описаны здесь, пожалуйста, обратитесь к официальной документации для получения дополнительной информации:http://docs.grafana.org/features/datasources/