Расшифровка имен контейнеров Docker в Grafana с помощью Loki и Promtail

Моя задача — настроить мониторинг логов Docker примерно для 70 контейнеров. Объединение всех журналов в одну панель не идеально, особенно во время стресс-тестов и мониторинга приложений Docker. Я хочу иметь возможность выбирать приложение-контейнер Docker на панели и просматривать соответствующие журналы. Я добился этого, но проблема в том, что имена контейнеров зашифрованы, и мне нужно их расшифровать.

Мой вопрос: как я могу расшифровать имена контейнеров, используя источник данных Loki и Promtail?

Кроме того, я заметил, что источник данных Prometheus отображает расшифрованные имена контейнеров, а источник данных Loki — нет. Вот мои конфигурации для обоих:

Кроме того, я запускаю Loki и Promtail как обычное приложение с настроенным демоном systemd. Локи:

auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096


ingester:
  lifecycler:
    address: 127.0.0.1
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 5m
  chunk_retain_period: 30s

schema_config:
  configs:
  - from: 2021-03-08
    store: boltdb
    object_store: filesystem
    schema: v11
    index:
      prefix: index_
      period: 24h

storage_config:
  boltdb:
    directory: /tmp/loki/index

Промтайл:

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://localhost:3100/loki/api/v1/push

scrape_configs:
- job_name: cadvisor
  static_configs:
  - targets: ['localhost:8080/containers/']
    labels:
      job: cadvisonr
      __path__: /containers
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: varlogs
      __path__: /var/log/*log

- job_name: containers
  static_configs:
  - targets:
      - localhost
    labels:
      job: containerlogs
      __path__: /var/lib/docker/containers/*/*log

  pipeline_stages:
  - json:
      expressions:
        output: log
        stream: stream
        attrs:
  - json:
      expressions:
        tag:
      source: attrs
  - regex:
      expression: (?P<container_name>(?:[^|]*[^|]))
      source: tag
  - timestamp:
      format: RFC3339Nano
      source: time
  - labels:
      # tag:
      stream:
      container_name:
  - output:
      source: output

Кроме того, я знаю о плагине loki-driver-docker, но я пытался его запустить, и у меня ничего не меняется, и документация ужасна, там написано просто запустить его и почти ничего о настройке или о том, как проверить, правильно ли он работает.

Так что буду рад любым идеям и предложениям. Форум для меня последний шанс решить эту проблему.

UPD: На данный момент это выглядит так:

И я хочу, чтобы он расшифровывался как в cadvisor:

__path__: /var/lib/docker/containers/ Но почему вы не используете конфиг докера в promtail?
KamilCuk 03.04.2023 14:32

Что ты имеешь в виду? У меня есть эта строка для сбора логов: __path__: /var/lib/docker/containers/*/*log

worrum 03.04.2023 14:36
grafana.com/docs/loki/latest/clients/promtail/configuration/‌​… Вы читаете файлы, вы не получите никакой информации из файлов, файлы — это то, что они есть — это просто SHA контейнера.
KamilCuk 03.04.2023 14:41

Итак, promtail, который был собран и запущен из исходников, не сможет собирать логи из контейнера докеров, потому что не может использовать этот параметр --log-driver json-file --log-opt max-size=10m? И в файле конфигурации я должен использовать параметр - __meta_docker_container_name, чтобы получить имя контейнера докера? Как тогда выбрать указанные файлы журналов в Grafana? Извините, я Джуниор и у меня мало опыта, поэтому я вас не понимаю

worrum 03.04.2023 14:47
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
2
4
252
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это работает следующим образом:

  • у promtail есть бэкенды <something>_configs
  • каждый бэкэнд немного отличается
  • локи собирает строки логов
  • каждая строка логов в локи имеет "метки"
  • Бэкэнды promtail могут преобразовывать некоторую внутреннюю информацию в «метки» и отправлять эти локи.
  • Файловый сервер promtail видит только файлы, поэтому static_config видит только файлы
  • Серверная часть promtail docker подключается к docker deamon и действительно что-то знает об этих докерах.

Конфиг Promtail может выглядеть так:

  - job_name: "docker"
    docker_sd_configs:
      - host: "unix:///var/run/docker.sock"
        refresh_interval: "1s"
    relabel_configs:
      - source_labels: ['__meta_docker_container_name']
        target_label: "container_name"
      - source_labels: ['__meta_docker_container_id']
        target_label: "container_id"
      # etc.

Затем в grafana-loki вы можете фильтровать журналы с помощью языка LogQL, например:

logcli '{container_name = "something"}'

ты можешь помочь мне снова? Я закрою тему после этого. Ваше решение идеально, оно работает на моем локальном хосте, но у меня есть две машины, и каждая имеет свои собственные контейнеры. Я использую один экземпляр promtail на одной машине и счищаю метрики/журналы с другой, прямо указывая его ips — 10.129.11.20 и 10.129.11.22. Как реализовать это решение в docker.sock, потому что, как сказано в документации — Use unix:///var/run/docker.sock for a local setup.

worrum 03.04.2023 16:08
stackoverflow.com/questions/62757127/…
KamilCuk 03.04.2023 16:11

Другие вопросы по теме