Компоненты Prometheus#

Prometheus#

Prometheus - это инструмент для мониторинга и оповещения систем. Prometheus собирает и хранит свои метрики в виде данных временных рядов, то есть информация о метриках хранится с меткой времени, на которой она была записана, наряду с необязательными парами ключ-значение, называемыми метками.

Общий принцип работы Prometheus:

  1. Prometheus читает секцию конфигурационного файла scrape_configs, согласно которой настраивает свой внутренний механизм Service Discovery (обнаружения сервисов).

  2. Для каждой target (цели мониторинга), каждый scrape_interval (частота опрашивания цели мониторинга), выполняется HTTP-запрос к этой цели. В ответ получаются метрики в своем формате, которые сохраняются в базу.

  3. Каждый evaluation_interval (оценка запроса для оповещения) обрабатываются правила, на основании которых:

    • или отправляются alerts (оповещения);

    • или записываются новые метрики (результат выполнения правила).

  4. Механизм Service Discovery взаимодействует с DropApp API (в основном для получения endpoints).

  5. Механизм Service Discovery обновляет targets (список целей).

Prometheus-operator автоматически обнаруживает изменения на сервере API DropApp в любом из вышеперечисленных объектов и обеспечивает синхронизацию сопоставления развертываний и конфигураций.

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

Имя метрики указывает на основной измеряемый показатель системы. Например, http_requests_total - итоговое число полученных запросов HTTP.

Имя метрики может содержать символы ASCII, цифры, подчеркивания и двоеточия. Проверку имени метрики можно выполнить с помощью регулярного выражения [a-zA-Z_:][a-zA-Z0-9_:]*.

Примечание

Двоеточие зарезервировано для пользовательских правил записи. Они не должны использоваться экспортерами или другими инструментами.

Метки позволяют использовать размерную модель данных Prometheus: любая заданная комбинация меток для одного и того же имени метрики идентифицирует конкретный размерный экземпляр этой метрики.

Например: все HTTP-запросы, в которых использовался метод POST, отправляются в обработчик /api/tracks. Язык запросов позволяет выполнять фильтрацию и агрегирование на основе этих измерений. Изменение любого значения метки, включая добавление или удаление метки, создаст новый временной ряд.

Имя метки может содержать символы ASCII, цифры и подчеркивания. Имена меток с двойным подчеркиванием (_name_) зарезервированы для внутреннего использования. Проверку имени метки можно выполнить с помощью регулярного выражения [a-zA-Z_][a-zA-Z0-9_]*. Значения меток могут содержать любые символы Unicode. Метка с пустым значением считается эквивалентной несуществующей метке.

Prometheus очищает метрики либо напрямую, либо через промежуточный шлюз для кратковременных заданий. Prometheus хранит все очищенные образцы локально и запускает правила над этими данными, чтобы либо агрегировать и записывать новые временные ряды из существующих данных, либо генерировать оповещения. Также возможно использование других совместимых инструментов сбора и визуализации данных.

Конфигурация Prometheus#

У сервера Prometheus есть config (конфигурационный файл) и rule files (файлы с правилами).

В config имеются следующие секции:

  • scrape_configs — настройки поиска целей для мониторинга;

  • rule_files — список директорий с правилами, которые необходимо загрузить;

  • alerting — настройки поиска Prometheus-alertmanager, в которые отправляются alerts (оповещения). Результатом работы является список endpoints, в которые Prometheus будет отправлять предупреждения.

Пример scrape_configs:

scrape_configs.yaml
scrape_configs:
  # Общие настройки
- job_name: kube-prometheus/custom/0    # Название scrape job
                                        # Показывается в разделе Service Discovery
  scrape_interval: 30s                  # Частота сбора данных в секундах
  scrape_timeout: 10s                   # Таймаут в секундах на запрос
  metrics_path: /metrics                # Путь к метрикам
  scheme: http                          # Выбор типа соединения, доступные значения `http` или `https`

  # Настройки Service Discovery
  kubernetes_sd_configs:                
  - api_server: null                    # Использовать адрес API-сервера из переменных
                                        # Окружение (которые есть в каждом pod)
    role: endpoints                     # Источник targets  (endpoints)
    namespaces:
      names:                            # Поиск endpoints в указанных namespaces
      - alice
      - bob

  # Настройки фильтрации enpoints и relabel 
  # Перечень меток для всех получаемых метрик
  relabel_configs:
  # Фильтр по значению метки prometheus_custom_target,
  # полученного из service, связанного с endpoint
  - source_labels: [__meta_kubernetes_service_label_prometheus_custom_target]
    regex: .+                           # Может использоваться любая не пустая метка
    action: keep
    
  # Фильтр по имени порта
  - source_labels: [__meta_kubernetes_endpoint_port_name]
    regex: http-metrics                 # Для имени порта http-metrics
    action: keep
    
  - source_labels: [__meta_kubernetes_service_label_prometheus_custom_target]
    regex: (.*)
    target_label: job
    replacement: custom-$1
    action: replace
    
  # Метка namespace
  - source_labels: [__meta_kubernetes_namespace]
    regex: (.*)
    target_label: namespace
    replacement: $1
    action: replace
    
  # Метка service
  - source_labels: [__meta_kubernetes_service_name]
    regex: (.*)
    target_label: service
    replacement: $1
    action: replace
    
  # Метка instance (имя pod)
  - source_labels: [__meta_kubernetes_pod_name]
    regex: (.*)
    target_label: instance
    replacement: $1
    action: replace

Метка job, используемое значение метки prometheus_custom_target в случае service, добавляется префикс custom.

Метка job — служебная в Prometheus. Определяет название группы, в которой будет показываться target на странице targets, а также она будет у каждой метрики, полученной у этих targets (для последующей фильтрации rules и dashboards)

Пример rule_files:

rule_files:
- /etc/prometheus/rules/rules-0/*
- /etc/prometheus/rules/rules-1/*

Prometheus отслеживает:

  • добавление и удаление pods (при добавлении/удалении pods DropApp изменяет endpoints, в таком случае Prometheus добавляет/удаляет цели);

  • добавление и удаление endpoints в указанных namespaces.

Изменение конфигурационного файла требуется в следующих случаях:

  • добавление нового scrape_config;

  • изменение списка namespaces.

Prometheus-operator#

Prometheus-operator обеспечивает встроенное развертывание и управление Prometheus и связанными с ним компонентами мониторинга. Это сделано для упрощения и автоматизации настройки стека мониторинга на основе Prometheus для кластеров DropApp.

Основной особенностью Prometheus-operator является мониторинг сервера API DropApp на предмет изменений в объектах и обеспечение того, чтобы текущие развертывания Prometheus соответствовали этим объектам.

Prometheus-operator действует в соответствии со следующими определениями пользовательских ресурсов (CRD или Custom Resource Definitions):

  • Prometheus — определяет желаемое развертывание кластера Prometheus;

  • PrometheusAgent — определяет желаемое развертывание Prometheus, но работает в режиме агента;

  • Prometheus-alertmanager — определяет желаемое развертывание Prometheus-alertmanager;

  • ThanosRuler — определяет желаемое развертывание ThanosRuler;

  • ServiceMonitor — декларативно определяет, как следует контролировать группы сервисов DropApp. Оператор автоматически генерирует конфигурацию очистки Prometheus на основе текущего состояния объектов на сервере API;

  • PodMonitor — декларативно определяет, как следует контролировать группу pods. Автоматически генерирует конфигурацию очистки Prometheus на основе текущего состояния объектов на сервере API;

  • Probe — декларативно определяет группы входов или статических целей. Оператор автоматически генерирует конфигурацию Prometheus на основе определения;

  • ScrapeConfig — декларативно определяет конфигурации очистки, которые должны быть добавлены в Prometheus. Это CustomResourceDefinition помогает очищать ресурсы за пределами кластера DropApp;

  • PrometheusRule — определяет желаемый набор правил оповещений и/или записей Prometheus. Оператор генерирует файл правил, который может использоваться экземплярами Prometheus;

  • AlertmanagerConfig — декларативно определяет подразделы конфигурации Prometheus-alertmanager, позволяя маршрутизировать оповещения и устанавливать правила inhibit.

Prometheus-operator отслеживает ресурсы Prometheus и генерирует для каждого из них:

  • StatefulSet (с самим Prometheus);

  • Secret с prometheus.yaml (конфигурационный файл Prometheus) и configmaps.json(конфигурационный файл для Prometheus-config-reloader).

Оператор также следит за ресурсами ServiceMonitor и за ConfigMaps с правилами, и на их основании обновляет конфиги prometheus.yaml и configmaps.json (они хранятся в secret).

Сценарии использования Prometheus#

Сценарий использования PodMonitors#

Для использования PodMonitors выполните шаги:

  1. Используйте PodMonitor в качестве альтернативы ServiceMonitor без необходимости создания сервиса DropApp:

    apiVersion: monitoring.coreos.com/v1
    kind: PodMonitor
    metadata:
      name: example-app
      labels:
        team: frontend
    spec:
      selector:
        matchLabels:
          app: example-app
      podMetricsEndpoints:
      - port: web
    

    Метка spec.selector указывает Prometheus, какие pods следует очистить.

  2. Определите выбор PodMonitors с помощью поля thespecspec.podMonitorSelector:

    apiVersion: monitoring.coreos.com/v1
    kind: Prometheus
    metadata:
      name: prometheus
    spec:
      serviceAccountName: prometheus
      podMonitorSelector:
        matchLabels:
          team: frontend
      resources:
        requests:
          memory: 400Mi
      enableAdminAPI: false
    

Сценарий предоставления Prometheus service#

Чтобы получить доступ к интерфейсу Prometheus, сервис необходимо предоставить другим приложениям.

  1. Определите службу NodePort:

    apiVersion: v1
    kind: Service
    metadata:
      name: prometheus
    spec:
      type: NodePort
      ports:
      - name: web
        nodePort: 30900
        port: 9090
        protocol: TCP
        targetPort: web
      selector:
        prometheus: prometheus
    

    После создания Service веб-сервер Prometheus доступен по IP-адресу node на порту 30900.