Prometheus + Telegraf

Усі статті, обговорення, новини про DevOps — в одному місці. Підписуйтеся на DOU | DevOps!

Чому Prometheus — бо він вже став стандартом (хоча я рекомендував би придивитись до VictoriaMetrics, на певному етапі ваш Prometheus почне гальмувати й ви все одно почнете розглядати VictoriaMetrics у якості storage, так що можна зразу розглянути його як повноцінну заміну Prometheus)

Чому вам може знадобитись Telegraf:

  1. Якщо у вас своє залізо, або більше — свій датацентр, скоріш за все у вас є специфічні пристрої (наприклад raid контролери), деяке специфічне ПЗ чи ще щось нестандартне. І тоді виявиться що node exporter це все не підтримує, і зовнішні скрипти до нього підключаються дуже цікавим шляхом. Telegraf же має плагін exec.
  2. У вас є купа застарілого софта, який шле метрики по протоколу graphite, або collectd, або influx і ви хочете замість купи різних експортерів мати один інструмент. Telegraf може слухати все це і віддавати, такий собі pushgateway на стероїдах.
  3. Я не робив повноцінного тестування, але в мене Telegraf їв менше ресурсів ніж node exporter

Як поставити Prometheus я писати на буду, вже є мільйон мануалів, а от що робити далі — це якраз тема цієї статті.

1. Ставимо останню версію telegraf

згідно з інструкцією на офіційному сайті — docs.influxdata.com/telegraf/v1.26/install

2. Далі вам знадобляться дашборди.

От два на вибір
grafana.com/...​49-system-metrics-single
grafana.com/...​rics-for-the-linux-hosts

3. А тепер найцікавіше — алерти.

Звісно ви можете піти на samber.github.io/...​wesome-prometheus-alerts взяти алерти для node exporter і повністю їх переписати. Враховуючи, що всі метрики мають інші назви й навіть різну структуру то це буде довго.

Гарний приклад різниці між telegraf і node exporter — це плагін systemd. Для telegraf це згідно github.com/...​gins/inputs/systemd_units

ValueMeaningDescription
0activeunit is ~
1reloadingunit is ~
2inactiveunit is ~
3failedunit is ~
4activatingunit is ~
5deactivatingunit is ~

Для node exporter я документації не знайшов, але ось приклад того що він повертає

node_systemd_unit_state{name="nginx.service",state="activating",type="forking"} 0
node_systemd_unit_state{name="nginx.service",state="active",type="forking"} 1
node_systemd_unit_state{name="nginx.service",state="deactivating",type="forking"} 0
node_systemd_unit_state{name="nginx.service",state="failed",type="forking"} 0
node_systemd_unit_state{name="nginx.service",state="inactive",type="forking"} 0

Як бачите, зовсім різна ідеологія. Одна метрика і різні значення, чи купа метрик, і тільки одна = 1.

І ось тут вам дуже допоможе Mirantis і їх core-services-alerts
Самі цікаві алерти тут — system-alerts. Але ці — ntp-alerts чи ці — ssl-cert-alerts теж варті уваги.

4. telegraf.conf

Уважно подивившись на те які метрики використовуються в алертах вище можна написати telegraf.conf який проекспортує всі потрібні метрики
щось типу

[agent]
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  interval = "10s"
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  round_interval = true
[tags]
  mytag = "${MYTAG}"
 
[[inputs.cpu]]
  collect_cpu_time = false
  percpu = true
  totalcpu = true
[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs", "devfs"]
[[inputs.diskio]]
[[inputs.kernel_vmstat]]
[[inputs.mem]]
[[inputs.net]]
[[inputs.ntpq]]
[[inputs.netstat]]
[[inputs.processes]]
[[inputs.swap]]
[[inputs.system]]
[[inputs.systemd_units]]
  unittype = "service"
[[outputs.prometheus_client]]
  collectors_exclude = ["gocollector", "process"]
  listen = ":9273"
  expiration_interval = "60s"

5. Service discovery

В принципі все вже готово, але я ще додам приклад service discovery. Навряд ви захочете заміняти node exporter на telegraf у банальній інсталяції kubernetes. Так що скоріше за все у вас змішаний кластер, або навіть свої залізні інстанси в датацентрі. Тому замість kubernetes service discovery вам потрібно щось на кшталт:

      - job_name: "ec2"
        ec2_sd_configs:
        - port: 9273
          region: us-east-1
          filters:
          - name: vpc-id
            values:
            - *vpc_id
        relabel_configs:
        - source_labels: [__meta_ec2_tag_Name]
          regex: metal.*
          action: keep
        - source_labels: [__meta_ec2_instance_id]
          target_label: instance
        - source_labels: [__meta_ec2_tag_Name]
          target_label: name

тут я відфільтровую потрібні інстанси за vpc-id і префіксом імені

👍ПодобаєтьсяСподобалось2
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Підписатись на коментарі