Привет, Хабр!
Мониторинг сегодня – фактически обязательная «часть программы» для компании любых размеров. В данной статье мы попробуем разобраться в многообразии программного обеспечения для мониторинга и рассмотрим подробнее одно из популярных решений – систему на основе Prometheus и Grafana
История и определение
На заре появления компьютерных сетей в конце 1970х – начале 1980х гг. главной задачей мониторинга была проверка связности и доступности серверов. В 1981 году появился протокол ICMP, на основе которого в декабре 1983 года написана утилита ping, а позднее и traceroute, которые используются для диагностики сетевых неполадок и по сей день. Следующим этапом стало создание в 1988 году протокола SNMP, что привело к рождению MRTG – одной из первых программ для мониторинга и измерения нагрузки трафика на сетевые каналы. Параллельно с середины 1980х гг. стало активно разрабатываться программное обеспечение для мониторинга потребления ресурсов компьютерами, такое как top, vmstat, nmon, Task Manager и др. К середине 1990х годов в связи с ростом ИТ инфраструктуры многие компании стали испытывать потребность в комплексной и централизованной системе мониторинга, что послужило спусковым крючком для синхронного начала разработки нескольких прототипов. В 1999-2002 гг. на свет появились решения, предопределившие развитие отрасли на годы вперед и развивающиеся до сих пор – Nagios и Zabbix.
Мониторинг в ИТ сегодня – это система, которая позволяет в режиме реального времени выявлять проблемы в ИТ инфраструктуре, а также оценивать тренды использования ресурсов. Как правило состоит из нескольких базовых компонентов – сбора сырых данных, обработки данных с целью их анализа, рассылки уведомлений и пользовательского интерфейса для просмотра графиков и отчетов. В настоящее время существует большое количество систем для мониторинга различных категорий – сети, серверной инфраструктуры, производительности приложений (APM), реального пользователя (RUM), безопасности и др. Таким образом, мониторить можно все – от сетевой доступности узлов в огромной корпорации до значений датчика температуры в спальне в «умном» доме.
Читать подробнее:
Обзор систем мониторинга
Для цельности картины рассмотрим несколько примеров систем мониторинга:
PingInfoView, SolarWinds pingdom и др.
Ping – наиболее известный способ проверки доступности узлов в сети. Программы, умеющие с определенным интервалом пинговать набор сетевых узлов и отражающие в режиме реального времени графики доступности, по сути есть зародыш системы мониторинга. Выручат, если полноценной системы мониторинга еще нетZabbix
Поддерживает сбор данных из различных источников – как с помощью агентов (реализованы под большинство распространенных платформ), так и без них (agent-less) посредством SNMP и IPMI, ODBC, ICMP и TCP проверок, HTTP запросов и т.д., а также собственных скриптов. Имеются инструменты для преобразования и анализа данных, подсистема рассылки уведомлений и веб-интерфейс. Свободно распространяется по лицензии GNU GPL v2 (бесплатно)PRTG
Поддерживает сбор данных без агентов посредством преднастроенных сенсоров SNMP, WMI, Database, ICMP и TCP проверок, HTTP запросов и т.д., а также собственных скриптов. Имеются инструменты для анализа данных, удобная подсистема рассылки уведомлений и веб-интерфейс. Является коммерческим продуктом, лицензируется по количеству сенсоров. PRTG Network Monitor с количеством сенсоров не более 100 доступен для использования бесплатноNagios Core / Nagios XI
Поддерживает сбор данных с помощью агентов (реализованы под большинство распространенных платформ) и без них посредством SNMP и WMI, а также расширений и собственных скриптов. Имеются инструменты для анализа данных, подсистема рассылки уведомлений и веб-интерфейс. Nagios Core свободно распространяется по лицензии GNU GPL v2 (бесплатно), Nagios XI является коммерческим продуктом. Подробнее о различиях между Nagios Core и Nagios XI можно почитать в статье Nagios Core vs. Nagios XI: 4 Key DifferencesIcinga
Появилась как форк Nagios. Поддерживает сбор данных с помощью агентов, а также расширений и собственных скриптов. Имеются инструменты для анализа данных, подсистема рассылки уведомлений и веб-интерфейс. Свободно распространяется по лицензии GNU GPL v2 (бесплатно)Prometheus
Ядро – БД временных рядов (Time series database, TSDB). Поддерживает сбор данных из различных источников посредством экспортеров и шлюза PushGateway. Имеются инструменты для анализа данных, подсистема уведомлений и простой веб-интерфейс. Для визуализации рекомендуется использовать Grafana. Свободно распространяется по лицензии Apache License 2.0 (бесплатно)VictoriaMetrics
Ядро – БД временных рядов (TSDB). Поддерживает сбор данных из различных источников посредством экспортеров (совместимых с Prometheus), интеграции с внешними системами (например, Prometheus) и прямых запросов на вставку. Имеются инструменты для анализа данных, подсистема уведомлений и простой веб-интерфейс. Для визуализации рекомендуется использовать Grafana. Свободно распространяется по лицензии Apache License 2.0 (бесплатно)Grafana
Не является системой мониторинга, однако не упомянуть ее в контексте статьи просто нельзя. Является прекрасной системой визуализации и анализа информации, которая позволяет «из коробки» работать с широким спектром источников данных (data source) – Elasticsearch, Loki, MS SQL, MySQL, PostgreSQL, Prometheus и др. При необходимости также интегрируется с Zabbix, PRTG и др. системами. Свободно распространяется по лицензии GNU AGPL v3 (бесплатно)
Читать подробнее:
Работа с Prometheus и Grafana
Рассмотрим подробнее схему взаимодействия компонентов системы мониторинга на основе Prometheus. Базовая конфигурация состоит из трех компонентов экосистемы:
Экспортеры (exporters)
Экспортер собирает данные и возвращает их в виде набора метрик. Экспортеры делятся на официальные (написанные командой Prometheus) и неофициальные (написанные разработчиками различного программного обеспечения для интеграции с Prometheus). При необходимости есть возможность писать свои экспортеры и расширять существующие дополнительными метрикамиPrometheus
Получает метрики от экспортеров и сохраняет их в БД временных рядов. Поддерживает мощный язык запросов PromQL (Prometheus Query Language) для выборки и аггрегации метрик. Позволяет строить простые графики и формировать правила уведомлений (alerts) на основе выражений PromQL для отправки через AlertmanagerAlertmanager
Обрабатывает уведомления от Prometheus и рассылает их. С помощью механизма приемников (receivers) реализована интеграция с почтой (SMTP), Telegram, Slack и др. системами, а также отправка сообщений в собственный API посредством вебхуков (webhook)
Таким образом, базовая конфигурация позволяет собирать данные, писать сложные запросы и отправлять уведомления на их основе. Однако по-настоящему потенциал Prometheus раскрывается при добавлении двух дополнительных компонентов (или как минимум одного – Grafana):
-
VictoriaMetrics
Получает метрики из Prometheus посредством remote write. Поддерживает язык запросов MetricsQL, синтаксис которого совместим с PromQL. Предоставляет оптимизированное по потреблению ресурсов хранение данных и высокопроизводительное выполнение запросов. Идеально подходит для долговременного хранения большого количества метрик Grafana
Предоставляет средства визуализации и дополнительного анализа информации из Prometheus и VictoriaMetrics. Есть примеры дашбордов практически под любые задачи, которые при необходимости можно легко доработать. Создание собственных дашбордов также интуитивно (разумеется, за исключением некоторых тонкостей) – достаточно знать основы PromQL / MetricsQL
Де-факто использование Grafana вместе с Prometheus уже стало стандартом, в то время как добавление в конфигурацию VictoriaMetrics безусловно опционально и необходимо скорее для высоконагруженных систем.
Практика
Итак, система мониторинга на основе Prometheus – PAVG (Prometheus, Alertmanager, VictoriaMetrics, Grafana) – предоставляет широкий спектр возможностей. Рассмотрим ее практическое применение. Для упрощения предположим, что основные компоненты будут развернуты на одном сервере мониторинга с примением docker и systemd, а также вынесем требования безопасности за рамки данной статьи.
Важное примечание
Все ниженаписанное является лишь иллюстрацией, которая призвана помочь ознакомиться с рассматриваемой системой
Развертывание экспортеров
Экспортеры могут быть развернуты на сервере мониторинга (например blackbox), на целевых серверах (kafka, mongodb, jmx и др.) или на всех серверах (node, cadvisor и др.). Как правило не требовательны к аппаратным ресурсам. В качестве примера возьмем три экспортера – node (сбор данных по ЦПУ, ОЗУ, дисковой подсистеме и сети), cadvisor (сбор информации о контейнерах) и blackbox (проверка точек входа TCP, HTTP/HTTPS и др.). Для развертывания необходимо:
-
Создать /etc/systemd/system/node-exporter.service
node-exporter.service
[Unit] Description=node exporter Requires=docker.service After=docker.service [Service] Restart=always ExecStartPre=-/usr/bin/docker rm node-exporter ExecStart=/usr/bin/docker run \ --rm \ --publish=9100:9100 \ --memory=64m \ --volume="/proc:/host/proc:ro" \ --volume="/sys:/host/sys:ro" \ --volume="/:/rootfs:ro" \ --name=node-exporter \ prom/node-exporter:v1.1.2 ExecStop=/usr/bin/docker stop -t 10 node-exporter [Install] WantedBy=multi-user.target
-
Создать /etc/systemd/system/cadvisor.service
cadvisor.service
[Unit] Description=cadvisor Requires=docker.service After=docker.service [Service] Restart=always ExecStartPre=-/usr/bin/docker rm cadvisor ExecStart=/usr/bin/docker run \ --rm \ --publish=8080:8080 \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --privileged=true \ --name=cadvisor \ gcr.io/cadvisor/cadvisor:v0.44.0 ExecStop=/usr/bin/docker stop -t 10 cadvisor [Install] WantedBy=multi-user.target
-
Создать /etc/systemd/system/blackbox-exporter.service
blackbox-exporter.service
[Unit] Description=blackbox exporter Requires=docker.service After=docker.service [Service] Restart=always ExecStartPre=-/usr/bin/docker rm blackbox-exporter ExecStart=/usr/bin/docker run \ --rm \ --publish=9115:9115 \ --memory=64m \ --name=blackbox-exporter \ prom/blackbox-exporter:v0.22.0 ExecStop=/usr/bin/docker stop -t 10 blackbox-exporter [Install] WantedBy=multi-user.target
-
Запустить сервисы
sudo systemctl daemon-reload sudo systemctl start node-exporter cadvisor blackbox-exporter sudo systemctl status node-exporter cadvisor blackbox-exporter sudo systemctl enable node-exporter cadvisor blackbox-exporter
Проверить работу (здесь <hostname> – DNS запись или IP адрес вашего сервера)
http://<hostname>:9100/metrics (node)
http://<hostname>:8080/metrics (cadvisor)
http://<hostname>:9115/metrics (blackbox)
http://<hostname>:9115/probe?target=github.com&module=http_2xx
http://<hostname>:9115/probe?target=github.com:443&module=tcp_connect
Экспортеры реализованы практически под все распространенное программное обеспечение, причем зачастую от нескольких разработчиков с разным набором метрик. Поиск не составляет труда – достаточно дать запрос на GitHub, DockerHub или в любимой поисковой системе. Однако в случае необходимости можно написать свой экспортер – например на Go или Python.
Развертывание Alertmanager
Как правило не требователен к аппаратным ресурсам. Для развертывания необходимо:
-
Подготовить каталог для конфигурационного файла
sudo mkdir /etc/alertmanager
-
Создать /etc/alertmanager/alertmanager.yml
alertmanager.yml
global: resolve_timeout: 10s # mail configuration smtp_smarthost: "<smtp_server_address>:25" smtp_from: "<smtp_from>" smtp_auth_username: "<smtp_username>" smtp_auth_password: "<smtp_password>" route: # default receiver receiver: "webhook_alert" group_wait: 20s group_interval: 1m group_by: [service] repeat_interval: 3h # receiver tree routes: - receiver: "mail" match_re: severity: warning|error|critical continue: true - receiver: "webhook_alert" match_re: severity: warning|error|critical continue: true - receiver: "webhook_report" match_re: severity: info # receiver settings receivers: - name: "mail" email_configs: - to: <mail_to> - name: "webhook_alert" webhook_configs: - send_resolved: true # api endpoint for webhook url: http://webhook_api_url/alert - name: "webhook_report" webhook_configs: - send_resolved: false # api endpoint for webhook url: http://webhook_api_url/report
В рассматриваемом примере уведомления рассылаются на почту и две дополнительные точки входа API – для срочных уведомлений (warning|error|critical) и отчетов (info). Подробнее о подготовке конфигурации можно почитать в статье Alerting Configuration
-
Создать /etc/systemd/system/alertmanager.service
alertmanager.service
[Unit] Description=alertmanager Requires=docker.service After=docker.service [Service] Restart=always ExecStartPre=-/usr/bin/docker rm alertmanager ExecStart=/usr/bin/docker run \ --rm \ --publish=9093:9093 \ --memory=512m \ --volume=/etc/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro \ --name=alertmanager \ prom/alertmanager:v0.23.0 \ --config.file=/etc/alertmanager/alertmanager.yml ExecStop=/usr/bin/docker stop -t 10 alertmanager [Install] WantedBy=multi-user.target
-
Запустить сервис
sudo systemctl daemon-reload sudo systemctl start alertmanager sudo systemctl status alertmanager sudo systemctl enable alertmanager
Проверить работу (здесь <hostname> – DNS запись или IP адрес вашего сервера)
http://<hostname>:9093
http://<hostname>:9093/#/alerts
http://<hostname>:9093/#/status
Для обеспечения высокой доступности Alertmanager поддерживает развертывание в кластерной конфигурации. Подробнее о создании кластера можно почитать в статье Alerting High Availability.
Развертывание VictoriaMetrics
Потребление ресурсов VictoriaMetrics зависит от количества опрашиваемых экспортеров и собираемых метрик, нагрузки запросами на чтение, глубины хранения данных и др. факторов. Вывести средние значения для старта достаточно сложно, однако для небольшой инсталляции достаточно 1 ядра ЦПУ, 2 ГБ ОЗУ и 20 ГБ дискового пространства. Для развертывания необходимо:
-
Подготовить каталог для хранения данных
sudo mkdir -p /data/victoriametrics
-
Создать /etc/systemd/system/victoriametrics.service
victoriametrics.service
[Unit] Description=victoriametrics Requires=docker.service After=docker.service [Service] Restart=always ExecStartPre=-/usr/bin/docker rm victoriametrics ExecStart=/usr/bin/docker run \ --rm \ --publish=8428:8428 \ --volume=/data/victoriametrics:/victoria-metrics-data \ --name=victoriametrics \ victoriametrics/victoria-metrics:v1.55.1 \ -dedup.minScrapeInterval=60s \ -retentionPeriod=2 ExecStop=/usr/bin/docker stop -t 10 victoriametrics [Install] WantedBy=multi-user.target
Указано хранение метрик в течение 2 месяцев
-
Запустить сервис
sudo systemctl daemon-reload sudo systemctl start victoriametrics sudo systemctl status victoriametrics sudo systemctl enable victoriametrics
Проверить работу (здесь <hostname> – DNS запись или IP адрес вашего сервера):
http://<hostname>:8428
Развертывание Prometheus
Потребление ресурсов Prometheus зависит от количества опрашиваемых экспортеров и собираемых метрик, нагрузки запросами на чтение, глубины хранения данных и др. факторов. Вывести средние значения для старта достаточно сложно, однако для небольшой инсталляции достаточно 1 ядра ЦПУ, 2 ГБ ОЗУ и 20 ГБ дискового пространства. Для развертывания необходимо:
-
Создать пользователя и подготовить каталоги для конфигурационных файлов и хранения данных
sudo useradd -M -u 1101 -s /bin/false prometheus sudo mkdir -p /etc/prometheus/rule_files # каталог конфигурации sudo mkdir -p /data/prometheus # каталог данных sudo chown -R prometheus /etc/prometheus /data/prometheus
Обязательно убедиться, что на раздел с каталогом для хранения данных выделено достаточно дискового пространства
-
Создать конфигурационный файл /etc/prometheus/prometheus.yml (здесь <hostname> – DNS запись или IP адрес вашего сервера)
prometheus.yml
global: scrape_interval: 15s scrape_timeout: 10s evaluation_interval: 30s # alerting settings alerting: alertmanagers: - follow_redirects: true timeout: 10s static_configs: - targets: - <hostname>:9093 # alert rule files rule_files: - /etc/prometheus/rule_files/*.yml # remote write to victoriametrics remote_write: - url: http://<hostname>:8428/api/v1/write remote_timeout: 30s # scrape exporter jobs scrape_configs: - job_name: 'prometheus' static_configs: - targets: - <hostname>:9090 - job_name: 'node' metrics_path: /metrics static_configs: - targets: - <hostname>:9100 - job_name: 'cadvisor' metrics_path: /metrics static_configs: - targets: - <hostname>:8080 - job_name: 'blackbox' metrics_path: /metrics static_configs: - targets: - <hostname>:9115 - job_name: 'blackbox-tcp' metrics_path: /probe params: module: [tcp_connect] static_configs: - targets: - github.com:443 relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: <hostname>:9115 - job_name: 'blackbox-http' metrics_path: /probe params: module: [http_2xx] static_configs: - targets: - https://github.com relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: <hostname>:9115
-
Создать правила уведомлений /etc/prometheus/rule_files/main.yml
rule_files/main.yml
groups: - name: target rules: - alert: target_down expr: up == 0 for: 1m labels: service: target severity: critical annotations: summary: 'Target down! Failed to scrape {{ $labels.job }} on {{ $labels.instance }}' - name: probe rules: - alert: probe_down expr: probe_success == 0 for: 1m labels: service: probe severity: error annotations: summary: 'Probe {{ $labels.instance }} down' - name: hardware rules: - alert: hardware_cpu expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) > 75 for: 3m labels: service: hardware severity: warning annotations: summary: 'High CPU load on {{ $labels.instance }} - {{ $value | printf "%.2f" }}%' - alert: hardware_memory expr: 100 - ((node_memory_MemAvailable_bytes * 100) / node_memory_MemTotal_bytes) > 85 for: 3m labels: service: hardware severity: warning annotations: summary: 'High memory utilization on {{ $labels.instance }} - {{ $value | printf "%.2f" }}%' - alert: hardware_disk expr: (node_filesystem_free_bytes / node_filesystem_size_bytes * 100) < 25 for: 3m labels: service: hardware severity: error annotations: summary: 'Low free space on {{ $labels.instance }} device {{ $labels.device }} mounted on {{ $labels.mountpoint }} - {{ $value | printf "%.2f" }}%' - name: container rules: - alert: container_down expr: (time() - container_last_seen) > 60 for: 1m labels: service: container severity: error annotations: summary: 'Container down! Last seen {{ $labels.name }} on {{ $labels.instance }} - {{ $value | printf "%.2f" }}s ago'
В данном случае для примера мы добавили только один файл c несколькими группами правил, однако в больших инсталляциях для удобства группы распределены по различным файлам – application, container, hardware, kubernetes, mongodb, elasticsearch и т.д.
-
Создать /etc/systemd/system/prometheus.service
prometheus.service
[Unit] Description=prometheus Requires=docker.service After=docker.service [Service] Restart=always ExecStartPre=-/usr/bin/docker rm prometheus ExecStart=/usr/bin/docker run \ --rm \ --user=1101 \ --publish=9090:9090 \ --memory=2048m \ --volume=/etc/prometheus/:/etc/prometheus/ \ --volume=/data/prometheus/:/prometheus/ \ --name=prometheus \ prom/prometheus:v2.30.3 \ --config.file=/etc/prometheus/prometheus.yml \ --storage.tsdb.path=/prometheus \ --storage.tsdb.retention.time=14d ExecStop=/usr/bin/docker stop -t 10 prometheus [Install] WantedBy=multi-user.target
Указано хранение метрик в течение 14 суток
-
Запустить сервис
sudo systemctl daemon-reload sudo systemctl start prometheus sudo systemctl status prometheus sudo systemctl enable prometheus
Проверить работу (здесь <hostname> – DNS запись или IP адрес вашего сервера)
http://<hostname>:9090
Status → Configuration, Status → Rules, Status → Targets
Для обеспечения высокой доступности Prometheus может быть развернут в нескольких экземплярах, каждый из которых будет опрашивать экспортеры и сохранять данные в локальную БД.
Развертывание Grafana
Grafana не слишком требовательна к потреблению ресурсов – для небольшой инсталляции достаточно 1 ядра ЦПУ и 1 ГБ ОЗУ (хотя, конечно, есть нюанс...). Для развертывания необходимо:
-
Создать пользователя и подготовить каталоги для конфигурационных файлов и хранения данных
sudo useradd -M -u 1102 -s /bin/false grafana sudo mkdir -p /etc/grafana/provisioning/datasources # каталог декларативного описания источников данных sudo mkdir /etc/grafana/provisioning/dashboards # каталог декларативного описания дашбордов sudo mkdir -p /data/grafana/dashboards # каталог данных sudo chown -R grafana /etc/grafana/ /data/grafana
-
Создать файл декларативного описания источников данных /etc/grafana/provisioning/datasources/main.yml (здесь <hostname> – DNS запись или IP адрес вашего сервера)
datasources/main.yml
apiVersion: 1 datasources: - name: Prometheus type: prometheus version: 1 access: proxy orgId: 1 basicAuth: false editable: false url: http://<hostname>:9090 - name: VictoriaMetrics type: prometheus version: 1 access: proxy orgId: 1 basicAuth: false editable: false url: http://<hostname>:8428
-
Создать файл декларативного описания дашбордов /etc/grafana/provisioning/dashboards/main.yml
dashboards/main.yml
apiVersion: 1 providers: - name: 'main' orgId: 1 folder: '' type: file disableDeletion: false editable: True options: path: /var/lib/grafana/dashboards
-
Добавить дашборд Node Exporter Full в каталог /data/grafana/dashboards
cd ~/ && git clone https://github.com/rfmoz/grafana-dashboards sudo cp grafana-dashboards/prometheus/node-exporter-full.json /data/grafana/dashboards/
Репозиторий и его содержимое актуальны на начало 2023 года
-
Создать /etc/systemd/system/grafana.service
grafana.service
[Unit] Description=grafana Requires=docker.service After=docker.service [Service] Restart=always ExecStartPre=-/usr/bin/docker rm grafana ExecStart=/usr/bin/docker run \ --rm \ --user=1102 \ --publish=3000:3000 \ --memory=1024m \ --volume=/etc/grafana/provisioning:/etc/grafana/provisioning \ --volume=/data/grafana:/var/lib/grafana \ --name=grafana \ grafana/grafana:9.2.8 ExecStop=/usr/bin/docker stop -t 10 grafana [Install] WantedBy=multi-user.target
-
Запустить сервис
sudo systemctl daemon-reload sudo systemctl start grafana sudo systemctl status grafana sudo systemctl enable grafana
Проверить работу (здесь <hostname> – DNS запись или IP адрес вашего сервера)
http://<hostname>:3000 (учетные данные по умолчанию – admin/admin, желательно сразу изменить пароль)
Configuration → Data sources
Explore → Metric → up → Run query
Dashboards → Browse → General → Node Exporter Full
Подсказки
На практике могут быть полезны следующие простые советы:
Система мониторинга на основе Prometheus описывается декларативно. Храните конфигурации в git и используйте ansible для автоматизации
Не стесняйтесь использовать средства проверки YAML синтаксиса при написании конфигураций (встроенные в IDE или онлайн, например YAML Checker)
Используйте прокси сервер перед компонентами системы мониторинга (например nginx)
Почаще исследуйте метрики в «сыром» виде (от экспортеров) и обязательно изучите PromQL Cheat Sheet
За помощь в подготовке статьи автор выражает благодарность @novikov0805, @Eviil и @KoPashka
Все статьи серии:
Комментарии (12)
andreymal
06.01.2023 16:08Создать /etc/systemd/system/node-exporter.service
Простите, а зачем запускать node-exporter в докере, если он состоит из одного-единственного бинарника, способного запускаться в любой среде, и если вы всё равно ломаете изоляцию контейнера пачкой volume?
simust Автор
06.01.2023 18:40Разумеется, запускать node-exporter (равно как и все остальные компоненты) в контейнере вовсе не обязательно. Это лишь пример, иллюстрация одного из вариантов :)
Изоляция процессов в контейнерах осуществляется благодаря двумя механизмами ядра Linux – пространствам имен (namespaces) и контрольным группам (cgroups). Мы частично нарушили изоляцию файловой системы, но остальные пространства все еще работают, как и контрольные группы.
Еще один плюс (возможно очень субъективный) – все программное обеспечение распространяется через образы. Это банально удобно
andreymal
06.01.2023 18:51+1Стоит иметь в виду, что systemd тоже умеет изоляцию процессов через те же самые namespaces и cgroups, так что использование докера ради изоляции может быть оверкиллом
А учитывая, что задачей node-exporter является мониторинг хоста, а не контейнера - изоляция его в контейнере может сломать часть метрик (я по этой причине специально выключил у себя всю изоляцию, чтобы node-exporter не вопил, что rootfs внезапно read-only бида-бида, и всё в таком духе - я осознаю, что это менее безопасно, но зато метрики более качественные)
simust Автор
06.01.2023 19:01Спасибо за важное замечание! Мне остается только добавить, что разработчик действительно не рекомендует запускать node_exporter в контейнере:
The
node_exporter
is designed to monitor the host system. It's not recommended to deploy it as a Docker container because it requires access to the host system.«Во Франции незаконно называть свинью Наполеоном, но меня не остановить» :)
Benedictus
07.01.2023 05:47А можете объяснить дилетанту, чем внедряют Vicoria Metrics в дополнении к Prometheus? Зачем плодить лишние хранилища? В интернетах пишут что Vicoria Metrics якобы нужна для создания долгосрочного хранилища данных, но почему этого нельзя сделать в Prometheus я так и не уловил
simust Автор
07.01.2023 06:20Как минимум благодаря дедубликации данных можно хранить меньшее число точек во временных рядах. Например, Prometheus собирает значения от экспортера каждые 15 секунд и на отрезке последних нескольких недель это оправданно. Однако на глубине в год такая точность уже не требуется – и VictoriaMetrics позволяет хранить только значения за каждые 60 секунд с помощью опции -dedup.minScrapeInterval=60s. Тогда горячие данные можно смотреть от источника данных Prometheus, а холодные – от VM.
Также есть интересная статья Бенчмарк Prometheus vs VictoriaMetrics на метриках node_exporter, которая наглядно сравнивает потребление ресурсов
На практике это может это может выглядеть так (набор экспортеров очень пестрый, от того же node до mongodb и кастомных):
Prometheus – хранение данных 21 день, БД ~90 ГБ
VictoriaMetrics – хранение данных 365 дней, БД ~270 ГБ
EvilMan
08.01.2023 23:31Где "основы мониторинга", обещанные в заголовке?
Где сравнение систем мониторинга и обоснование выбора в пользу прометеуса?
Где пример того, как замониторить какую-нибудь программу, тот же nginx, например? Ага, скачайте и поставьте что-то там.
Зачем ставить и запускать сразу три экспортёра, а не ограничиться одним? Или одним экспортёром нельзя собирать все нужные данные?
Статья обрывается на моменте, как мы запустили сервисы графаны и прометеуса.
Лучи ненависти в сторону автора, и минусы в статью и в карму за потраченное время.
Типичный shitops подход - понадёргать отдельных команд и файлов из интернета, получить какую-то херню на выходе с модным интерфейсом и считать себя крутым специалистом.
simust Автор
09.01.2023 00:27Основы мониторинга в понимании разных людей должны содержать разную информацию. Необходимость, понятие и краткий обзор существующих систем – вот что является основами по-моему субъективному мнению (которое не обязательно должно совпадать с Вашим)
Статья изначально не подавалась как сравнительная. Различные системы мониторинга перечислены для понимания общей картины. Нет и не может быть универсального обоснования в вакууме в пользу Prometheus (как и в пользу любой другой системы)
Это забавно, но в концепции Prometheus «замониторить какую-нибудь программу» действительно означает развернуть экспортер :) В статье есть упоминание, где подобный экспортер найти, дальше достаточно открыть ReadMe. Можно написать и свой экспортер, что совсем не сложно по официальной документации
Зачем делать репозиторий для каждого проекта, неужели нельзя сложить все в один? Иногда реализовать экспортер, который будет отдавать метрики по разным подсистемам, все же можно и даже разумно, но объединять метрики по хосту, контейнерам и проверке доступности точек входа по tcp/http – странное предложение. Возможно я не понял сарказм :(
Верно. Остается только дополнить, что статья останавливается на минимальном наборе сервисов, которые можно потрогать вживую, и понимании, как дальше разворачивать необходимые экспортеры и добавлять дашборды
Эмоции – двигатель прогресса
Мне больше импонирует термин monkeyops. И все же команды и файлы не понадерганы из Интернета, не стоит настолько упрощать. Крутым специалистом себя не считаю :)
NickDoom
Главное — не попасть в системную ошибку выжившего, когда мониторинг не покрыл юзеров, с порога выкинувших поделие, сожравшее четыре гига на полупрозрачные окошки и потребовавшее аккаунта в трёх облачных сервисах…
remzalp
При этом всё перечисленное на удивление мало кушает
andreymal
Зависит от того, с какой точки зрения посмотреть. Каждый процесс в отдельности кушает действительно мало, но если просуммировать весь стек мониторинга, то лично у меня набежало под 300 мегабайт занятой оперативки — если у вас мажорская стойка из 128-гиговых дедиков, вы такую мелочь конечно не заметите, но если, например, для пет-проекта брать дешёвый гиговый VPS по акции
на сэкономленные с обедов деньги, то эти 300 мегабайт начинают очень сильно ощущатьсяremzalp
Я сравнивал с традиционным ELK, где только один эластик выжирает крайне много по сравнению с 300 мб. Плюс весь стек мониторинга не надо дублировать на каждом инстансе, так что всё-равно получаем на выходе достаточно не жрущее