Моя задача — настроить мониторинг логов 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/*/*log
Итак, promtail, который был собран и запущен из исходников, не сможет собирать логи из контейнера докеров, потому что не может использовать этот параметр --log-driver json-file --log-opt max-size=10m
? И в файле конфигурации я должен использовать параметр - __meta_docker_container_name
, чтобы получить имя контейнера докера? Как тогда выбрать указанные файлы журналов в Grafana? Извините, я Джуниор и у меня мало опыта, поэтому я вас не понимаю
Это работает следующим образом:
<something>_configs
static_config
видит только файлыКонфиг 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
.
__path__: /var/lib/docker/containers/
Но почему вы не используете конфиг докера в promtail?