From 9d61a1ceeb56de7a847d4b68fe27176d91932e53 Mon Sep 17 00:00:00 2001 From: dannc Date: Tue, 18 Oct 2022 10:19:21 +0700 Subject: [PATCH] initial: create stack, add readme --- .env.example | 4 ++ .gitignore | 4 ++ docker-compose.yml | 50 ++++++++++++++ .../provisioning/datasources/datasource.yml | 16 +++++ loki/config.yml | 42 +++++++++++ promtail/config.yml | 30 ++++++++ readme.md | 69 +++++++++++++++++++ 7 files changed, 215 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 docker-compose.yml create mode 100644 grafana/provisioning/datasources/datasource.yml create mode 100644 loki/config.yml create mode 100644 promtail/config.yml create mode 100644 readme.md diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..6f90eaf --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +COMPOSE_PROFILES=grafana,promtail + +GRAFANA_VERSION=9.1.7 +LOKI_STACK_VERSION=2.6.0 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0d12e13 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/.idea/ + +/.env +/docker-compose.override.yml \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..8a8bc8d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,50 @@ +--- +version: "3.9" + +services: + grafana: + image: grafana/grafana:${GRAFANA_VERSION:-latest} + labels: + - "traefik.enable=true" + - "traefik.http.routers.grafana.rule=Host(`grafana.docker.localhost`)" + - "traefik.http.services.grafana.loadbalancer.server.port=3000" + expose: + - 3000 + volumes: + - ./grafana/provisioning:/etc/grafana/provisioning + - grafana-storage:/var/lib/grafana + profiles: + - grafana + + loki: + image: grafana/loki:${LOKI_STACK_VERSION:-2.6.0} + labels: + - "traefik.enable=true" + - "traefik.http.routers.loki.rule=Host(`loki.docker.localhost`)" + - "traefik.http.services.loki.loadbalancer.server.port=3100" + expose: + - 3100 + volumes: + - ./loki:/loki/config + command: --config.file=/loki/config/config.yml + profiles: + - grafana + + promtail: + image: grafana/promtail:${LOKI_STACK_VERSION:-2.6.0} + labels: + - "traefik.enable=true" + - "traefik.http.routers.grafana.rule=Host(`promtail.docker.localhost`)" + - "traefik.http.services.grafana.loadbalancer.server.port=9080" + expose: + - 9080 + volumes: + - /var/lib/docker/containers:/var/lib/docker/containers:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./promtail:/opt/promtail + command: -config.file=/opt/promtail/config.yml + profiles: + - promtail + +volumes: + grafana-storage: diff --git a/grafana/provisioning/datasources/datasource.yml b/grafana/provisioning/datasources/datasource.yml new file mode 100644 index 0000000..917ed4e --- /dev/null +++ b/grafana/provisioning/datasources/datasource.yml @@ -0,0 +1,16 @@ +--- +apiVersion: 1 + +deleteDatasources: + - name: Loki + orgId: 1 + +datasources: + - name: Loki + type: loki + orgId: 1 + access: proxy + url: http://loki:3100 + jsonData: + maxLines: 1000 + editable: true \ No newline at end of file diff --git a/loki/config.yml b/loki/config.yml new file mode 100644 index 0000000..1af2bd7 --- /dev/null +++ b/loki/config.yml @@ -0,0 +1,42 @@ +--- +auth_enabled: false + +server: + http_listen_port: 3100 + +common: + path_prefix: /loki + storage: + filesystem: + chunks_directory: /loki/chunks + rules_directory: /loki/rules + replication_factor: 1 + ring: + kvstore: + store: inmemory + +schema_config: + configs: + - from: 2020-10-24 + store: boltdb-shipper + object_store: filesystem + schema: v11 + index: + prefix: index_ + period: 24h + +ruler: + alertmanager_url: http://localhost:9093 + +# By default, Loki will send anonymous, but uniquely-identifiable usage and configuration +# analytics to Grafana Labs. These statistics are sent to https://stats.grafana.org/ +# +# Statistics help us better understand how Loki is used, and they show us performance +# levels for most users. This helps us prioritize features and documentation. +# For more information on what's sent, look at +# https://github.com/grafana/loki/blob/main/pkg/usagestats/stats.go +# Refer to the buildReport method to see what goes into a report. +# +# If you would like to disable reporting, uncomment the following lines: +#analytics: +# reporting_enabled: false \ No newline at end of file diff --git a/promtail/config.yml b/promtail/config.yml new file mode 100644 index 0000000..4c787ad --- /dev/null +++ b/promtail/config.yml @@ -0,0 +1,30 @@ +--- +server: + http_listen_address: 0.0.0.0 + http_listen_port: 9080 + +positions: + filename: /tmp/positions.yaml + +clients: + - url: http://loki:3100/loki/api/v1/push + +scrape_configs: + - job_name: docker + docker_sd_configs: + - host: unix:///var/run/docker.sock + refresh_interval: 5s + filters: + - name: label + values: ["loki.log=true"] + pipeline_stages: + - docker: {} + - static_labels: + job: "promtail" + relabel_configs: + - source_labels: ['__meta_docker_container_name'] + regex: '/(.*)' + target_label: 'container' + - source_labels: ['__meta_docker_container_log_stream'] + regex: '/(.*)' + target_label: 'source_stream' diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..3fd6710 --- /dev/null +++ b/readme.md @@ -0,0 +1,69 @@ +## Grafana + loki logging stack + +Стек docker-compose для упрощённого сбора и просмотра логов контейнеров с grafana loki. + +### Installing + +1. Скопировать [.env.example](/.env.example) в `.env` + +#### With promtail + +1. Добавить новый лейбл к контейнеру, чьи логи необходимо отсылать в loki + + Например, достаточно просто добавить новый лейбл в `docker-compose`-файл искомого стека: + ```yaml + services: + my-service: + labels: + - "loki.log=true" + ``` + +2. Запустить весь стек `docker-compose` + + ```shell + docker compose up -d + ``` + +#### With docker plugin + +1. Установить [лог-драйвер grafana loki для docker](https://grafana.com/docs/loki/latest/clients/docker-driver/) + + ```shell + docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions + ``` + + По факту, данный драйвер работает аналогично стандартному драйверу `json-file`, который позволяет просматривать логи стандартной командой `docker logs`, но при этом дополнительно пытается отправить логи в инстанс `loki`. + +2. Активировать лог-драйвер для контейнера + + К примеру, можно определить данный конфиг в искомом `docker-compose`-стеке: + ```yaml + x-loki-log-config: &loki-log-config + logging: + driver: loki + options: + loki-url: "http://loki.docker.localhost/loki/api/v1/push" + loki-retries: 5 + loki-batch-size: 400 + max-size: "50m" + max-file: "10" + ``` + + а затем просто подключить к конкретному контейнеру: + + ```yaml + services: + my-service: + <<: *loki-log-config + ``` + +3. Убрать профиль `promtail` из значения `COMPOSE_PROFILES` в файле [.env](/.env) +4. Запустить стек `grafana` + `loki` + + ```shell + docker compose up -d + ``` + +### Difference between driver and promtail + +Использование драйвера - [рекомендованный способ доставки логов в loki](https://grafana.com/docs/loki/latest/clients/promtail/configuration/#example-docker-config). К тому же, он имеет очень много предопределённых лейблов для фильтрации контейнеров в `grafana`. Но его необходимо вручную ставить на всех машинах, на которых необходимо настроить подобный сбор логов.