Собирайте метрики Docker с Prometheus

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

Предупреждение

Доступные метрики и названия данных метрик находятся в активной разработке и могут измениться в любое время.

В настоящее время вы можете контролировать только сам Docker. В настоящее время вы не можете отслеживать свое приложение с помощью цели Docker.

Пререквизиты

  1. Один или несколько механизмов Docker объединяются в swarm Docker, используя docker swarm init на одном менеджере и docker swarm join на других менеджерах и рабочих узлах.

  2. Вам нужно подключение к Интернету, чтобы получает образ Prometheus.

Настроить Докер

Чтобы настроить демон Docker в качестве цели Prometheus, вам нужно указывает файл metrics-address. Лучший способ сделать это — через daemon.json, который по умолчанию расположен в одном из следующих мест. Если файл не существует, создаёт его.

  • Линукс: /etc/docker/daemon.json

  • Сервер Windows: C:\ProgramData\docker\config\daemon.json

  • Docker Desktop для Mac / Docker Desktop для Windows: нажмите значок Docker на панели инструментов, выбрать Настройки, затем выбрать Daemon. Нажмите Дополнительно.

Если файл в настоящее время пуст, вставляет следующее:

{
  "metrics-addr" : "127.0.0.1:9323",
  "experimental" : true
}

Если файл не пуст, добавляет данные два ключа, убедившись, что полученный файл является допустимым JSON. Будьте осторожны, чтобы каждая строка заканчивалась запятой (,), кроме последней строки.

Сохраняет файл или, в случае Docker Desktop для Mac или Docker Desktop для Windows, сохраняет конфигурацию. Перезапустите Докер.

Docker теперь предоставляет метрики, совместимые с Prometheus, на порту 9323.

Настройка и запуск Prometheus

Prometheus работает как сервис Docker в рое Docker.

Копирует один из следующих файлов конфигурации и сохраняет его в /tmp/prometheus.yml (Linux или Mac) или C:\tmp\prometheus.yml (Windows). Это стандартный файл конфигурации Prometheus, за исключением добавления определения задания Docker в нижней части файла. Для Docker Desktop для Mac и Docker Desktop для Windows требуется немного другая конфигурация.

Докер для Linux

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
      monitor: 'codelab-monitor'

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first.rules"
  # - "second.rules"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'docker'
         # metrics_path defaults to '/metrics'
         # scheme defaults to 'http'.

    static_configs:
      - targets: ['localhost:9323']

Затем запускает службу Prometheus с одной репликой, используя эту конфигурацию.

$ docker service create --replicas 1 --name my-prometheus \
    --mount type=bind,source=/tmp/prometheus.yml,destination=/etc/prometheus/prometheus.yml \
    --publish published=9090,target=9090,protocol=tcp \
    prom/prometheus

Docker Desktop для Mac

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
      monitor: 'codelab-monitor'

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first.rules"
  # - "second.rules"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ['host.docker.internal:9090'] # Only works on Docker Desktop for Mac

  - job_name: 'docker'
         # metrics_path defaults to '/metrics'
         # scheme defaults to 'http'.

    static_configs:
      - targets: ['host.docker.internal:9323']

Затем запускает службу Prometheus с одной репликой, используя эту конфигурацию.

$ docker service create --replicas 1 --name my-prometheus \
    --mount type=bind,source=/tmp/prometheus.yml,destination=/etc/prometheus/prometheus.yml \
    --publish published=9090,target=9090,protocol=tcp \
    prom/prometheus

Docker Desktop для Windows

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
      monitor: 'codelab-monitor'

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first.rules"
  # - "second.rules"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ['host.docker.internal:9090'] # Only works on Docker Desktop for Windows

  - job_name: 'docker'
         # metrics_path defaults to '/metrics'
         # scheme defaults to 'http'.

    static_configs:
      - targets: ['host.docker.internal:9323']

Затем запускает службу Prometheus с одной репликой, используя эту конфигурацию.

PS C:\> docker service create --replicas 1 --name my-prometheus
    --mount type=bind,source=C:/tmp/prometheus.yml,destination=/etc/prometheus/prometheus.yml
    --publish published=9090,target=9090,protocol=tcp
    prom/prometheus

Убедиться, что цель Docker указана по адресу http://localhost:9090/targets/.

Prometheus targets page

Вы не можете напрямую обращаться к URL-адресам конечных точек, если используете Docker Desktop для Mac или Docker Desktop для Windows.

Используйте Прометей

Создаёт график. Щелкните ссылку Графики в пользовательском интерфейсе Prometheus. Выбрать показатель в поле со списком справа от кнопки Выполняет и нажмите Выполняет. На скриншоте далее показан график для engine_daemon_network_actions_seconds_count.

Prometheus engine\_daemon\_network\_actions\_seconds\_countreport

На приведённом выше графике показан довольно простой экземпляр Docker. Ваш график может выглядеть иначе, если вы выполняете активные рабочие нагрузки.

Чтобы сделать график более интересным, создаёт некоторые сетевые действия, запустив службу с 10 задачами, которые просто безостановочно пингуют Docker (вы можете изменяет цель пинга на что угодно):

$ docker service create \
  --replicas 10 \
  --name ping_service \
  alpine ping docker.com

Подождать несколько минут (интервал очистки по умолчанию составляет 15 секунд) и перезагрузите график.

Prometheus engine\_daemon\_network\_actions\_seconds\_countreport

Когда будете готовы, останавливает и удаляет службу ping_service, чтобы без причины не заливать хост пингами.

$ docker service remove ping_service

Подождать несколько минут, и вы должны увидеть, что график возвращается к уровню простоя.

Следующие шаги