service:prometheus
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
service:prometheus [17.01.2023 08:39] – [Архитектура] viacheslav | service:prometheus [17.08.2024 07:34] (текущий) – [Конфиг] viacheslav | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Prometheus ====== | ||
+ | |||
+ | ===== Общая информация ===== | ||
+ | Основа мониторинга: | ||
+ | - Задержка — время, необходимое для обработки пользовательского запроса. Используется // | ||
+ | - Трафик - количество HTTP-запросов в секунду к страницам сайта/ | ||
+ | - Ошибка - частота неуспешных запросов (ошибка HTTP 500 и т .п.). Полезно разделять критические ошибки и обычные (429 too many requests). | ||
+ | - Насыщение - интенсивность использования сервиса и запас ресурсов (CPU, memory, disk IO). | ||
+ | |||
+ | ===== Архитектура ===== | ||
+ | * Сервер Прометея | ||
+ | * Хранилище метрик - TSDB (Time series database, БД временн**ы**х рядов) | ||
+ | * Exporter - источник данных, | ||
+ | * Alertmanager | ||
+ | |||
+ | Сервер работает по модели Pull - сервер сам ищет точки экспортёров (exporter endpoints) для сбора метрик, | ||
+ | |||
+ | Временн**ы**е ряды - значение метрики и метка времени + ярлыки (сервер-источник, | ||
+ | |||
+ | < | ||
+ | http_requests_total{status_code=" | ||
+ | http_requests_total{status_code=" | ||
+ | http_requests_total{status_code=" | ||
+ | </ | ||
+ | |||
+ | |||
+ | Метрики можно посмотреть на экспортёре с помощью curl или браузером, | ||
+ | Формат метрик: | ||
+ | * # HELP - описание | ||
+ | * # TYPE - [[https:// | ||
+ | * '' | ||
+ | |||
+ | У одной метрики могут быть разные значения ярлыков, | ||
+ | |||
+ | ==== Конфиг ==== | ||
+ | prometheus.yml | ||
+ | * global - глобальные параметры, | ||
+ | * scrape_configs - настройки поиска целей мониторинга | ||
+ | |||
+ | <code yaml> | ||
+ | global: | ||
+ | scrape_interval: | ||
+ | |||
+ | scrape_configs: | ||
+ | # Значение job_name добавляется ярлыком " | ||
+ | - job_name: ' | ||
+ | metrics_path: | ||
+ | static_configs: | ||
+ | - targets: [' | ||
+ | </ | ||
+ | |||
+ | В Кубере Прометей обнаруживает экспортеры автоматически. В '' | ||
+ | |||
+ | <code yaml> | ||
+ | scrape_configs: | ||
+ | - job_name: kubernetes-pods | ||
+ | # Настройки Service Discovery | ||
+ | kubernetes_sd_configs: | ||
+ | - role: pod # целью (target) будет каждый подходящий Pod | ||
+ | namespaces: | ||
+ | names: | ||
+ | - < | ||
+ | |||
+ | # Фильтрация и динамическое назначение ярлыков | ||
+ | relabel_configs: | ||
+ | # Аннотации-фильтры для поиска подов | ||
+ | - source_labels: | ||
+ | action: keep | ||
+ | regex: true | ||
+ | - source_labels: | ||
+ | regex: (.+);(.+) | ||
+ | replacement: | ||
+ | target_label: | ||
+ | - source_labels: | ||
+ | regex: (.+) | ||
+ | target_label: | ||
+ | |||
+ | # Добавление полезных ярлыков временному ряду этого конфига | ||
+ | - action: labelmap | ||
+ | regex: __meta_kubernetes_pod_label_(.+) | ||
+ | - source_labels: | ||
+ | action: replace | ||
+ | target_label: | ||
+ | - source_labels: | ||
+ | action: replace | ||
+ | target_label: | ||
+ | </ | ||
+ | |||
+ | Прометей автоматически добавляет метаярлыки при нахождении целей. Для Кубера эти метаярлыки формируются из пространства имён, аннотаций и ярлыков подов. Получается что-то вроде | ||
+ | < | ||
+ | __meta_kubernetes_pod_annotation_prometheus_io_scrape | ||
+ | __meta_kubernetes_pod_annotation_prometheus_io_port | ||
+ | __meta_kubernetes_pod_annotation_prometheus_io_path | ||
+ | </ | ||
+ | , поэтому их заменяют на что-то более короткое и удобное, | ||
+ | |||
+ | Тут для подов нужно задать аннотации | ||
+ | <code yaml> | ||
+ | spec: | ||
+ | template: | ||
+ | metadata: | ||
+ | annotations: | ||
+ | prometheus.io/ | ||
+ | prometheus.io/ | ||
+ | prometheus.io/ | ||
+ | </ | ||
+ | ===== Мониторинг Докера ===== | ||
+ | <code bash> | ||
+ | sudo nano / | ||
+ | # добавить перед последней закрывающей } | ||
+ | # если файла нет, то нужно его создать | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | # Потом нужно дать права группе docker на этот файл, если он был создан | ||
+ | sudo chown user:docker / | ||
+ | # перезапустить Докер | ||
+ | sudo systemctl restart docker | ||
+ | </ | ||
+ | После этого метрики будут доступны по адресу http:// | ||
+ | |||
+ | После этого можно ставить самого Прометея | ||
+ | <code bash> | ||
+ | # так в книжке, | ||
+ | # здесь переменная указывает на хост, чтобы брать с него метрики | ||
+ | docker run -e DOCKER_HOST=192.168.1.10 -dp 9090:9090 diamol/ | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | ===== Мониторинг хоста ===== | ||
+ | <code bash> | ||
+ | # На хосте нужно поставить Node exporter | ||
+ | sudo apt install prometheus-node-exporter | ||
+ | # Метрики | ||
+ | http:// | ||
+ | # prometheus.yml | ||
+ | - job_name: ' | ||
+ | static_configs: | ||
+ | - targets: [' | ||
+ | </ | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | ===== Мониторинг SMART ===== | ||
+ | Поставить smartctl-exporter для экспорта метрик. Docker-compose: | ||
+ | <code yaml> | ||
+ | smartctl-exporter: | ||
+ | image: prometheuscommunity/ | ||
+ | container_name: | ||
+ | privileged: true | ||
+ | user: root | ||
+ | </ | ||
+ | |||
+ | Внести в prometheus.yml | ||
+ | <code yaml> | ||
+ | - job_name: ' | ||
+ | metrics_path: | ||
+ | static_configs: | ||
+ | - targets: [' | ||
+ | </ | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | Метрики начинаются на '' | ||
+ | < | ||
+ | {__name__=~" | ||
+ | </ | ||
+ | ===== Мониторинг nginx ===== | ||
+ | Для nginx нужно включить там метрики '' | ||
+ | <file bash nginx/ | ||
+ | server { | ||
+ | listen | ||
+ | listen | ||
+ | server_name | ||
+ | |||
+ | location / { | ||
+ | root / | ||
+ | index index.html index.htm; | ||
+ | } | ||
+ | |||
+ | error_page | ||
+ | location = /50x.html { | ||
+ | root / | ||
+ | } | ||
+ | | ||
+ | location / | ||
+ | stub_status on; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Dockerfile | ||
+ | <file bash nginx/ | ||
+ | FROM nginx: | ||
+ | |||
+ | COPY default.conf.template / | ||
+ | </ | ||
+ | |||
+ | Публиковать nginx-prometheus-exporter наружу необязательно, | ||
+ | <file yaml docker-compose.yml> | ||
+ | --- | ||
+ | services: | ||
+ | nginx: | ||
+ | build: ./nginx | ||
+ | container_name: | ||
+ | ports: | ||
+ | - 80:80 | ||
+ | |||
+ | # source https:// | ||
+ | prometheus: | ||
+ | image: prom/ | ||
+ | container_name: | ||
+ | user: root | ||
+ | volumes: | ||
+ | - ./ | ||
+ | - ./ | ||
+ | ports: | ||
+ | - 9090:9090 | ||
+ | |||
+ | # source https:// | ||
+ | nginx-prometheus-exporter: | ||
+ | image: nginx/ | ||
+ | container_name: | ||
+ | depends_on: | ||
+ | - prometheus | ||
+ | environment: | ||
+ | - SCRAPE_URI=http:// | ||
+ | ports: | ||
+ | - 9113:9113 | ||
+ | # expose: | ||
+ | # - 9113 | ||
+ | </ | ||
+ | |||
+ | <file yaml prometheus.yml> | ||
+ | # source https:// | ||
+ | |||
+ | global: | ||
+ | scrape_interval: | ||
+ | |||
+ | # Attach these labels to any time series or alerts when communicating with | ||
+ | # external systems (federation, | ||
+ | external_labels: | ||
+ | monitor: ' | ||
+ | |||
+ | scrape_configs: | ||
+ | # The job name is added as a label `job=< | ||
+ | - job_name: ' | ||
+ | |||
+ | # Override the global default and scrape targets from this job every 5 seconds. | ||
+ | # scrape_interval: | ||
+ | |||
+ | static_configs: | ||
+ | # prometheus | ||
+ | - targets: [' | ||
+ | # prometheus-nginx-exporter | ||
+ | - targets: [' | ||
+ | </ | ||
+ | |||
+ | Как выглядит страница '' | ||
+ | < | ||
+ | Active connections: | ||
+ | server accepts handled requests | ||
+ | 26 26 14840 | ||
+ | Reading: 0 Writing: 1 Waiting: 3 | ||
+ | </ | ||
+ | Страница '' | ||
+ | < | ||
+ | # HELP nginx_connections_accepted Accepted client connections | ||
+ | # TYPE nginx_connections_accepted counter | ||
+ | nginx_connections_accepted 26 | ||
+ | # HELP nginx_connections_active Active client connections | ||
+ | # TYPE nginx_connections_active gauge | ||
+ | nginx_connections_active 3 | ||
+ | # HELP nginx_connections_handled Handled client connections | ||
+ | # TYPE nginx_connections_handled counter | ||
+ | nginx_connections_handled 26 | ||
+ | # HELP nginx_connections_reading Connections where NGINX is reading the request header | ||
+ | # TYPE nginx_connections_reading gauge | ||
+ | nginx_connections_reading 0 | ||
+ | # HELP nginx_connections_waiting Idle client connections | ||
+ | # TYPE nginx_connections_waiting gauge | ||
+ | nginx_connections_waiting 2 | ||
+ | # HELP nginx_connections_writing Connections where NGINX is writing the response back to the client | ||
+ | # TYPE nginx_connections_writing gauge | ||
+ | nginx_connections_writing 1 | ||
+ | # HELP nginx_exporter_build_info A metric with a constant ' | ||
+ | # TYPE nginx_exporter_build_info gauge | ||
+ | nginx_exporter_build_info{branch=" | ||
+ | # HELP nginx_http_requests_total Total http requests | ||
+ | # TYPE nginx_http_requests_total counter | ||
+ | nginx_http_requests_total 14995 | ||
+ | # HELP nginx_up Status of the last metric scrape | ||
+ | # TYPE nginx_up gauge | ||
+ | nginx_up 1 | ||
+ | </ | ||
+ | |||
+ | Литература: | ||
+ | https:// | ||
+ | https:// | ||
+ | [[https:// | ||
+ | ===== Howto ===== | ||
+ | ==== unixtime to datetime ==== | ||
+ | Значение * 1000, выставить формат отображения Datetime (Field -> Unit -> Datetime). | ||