Сбор логов docker контейнеров для Grafana

Сбор логов с docker контейнеров выполняется с использованием Alloy и Dockerproxy с дальнейшей обработкой и передачей в Loki.

Настройка сбора логов через Alloy

Общий файл конфигурации:

loki.relabel "docker" {
  forward_to = []

  rule {
    source_labels = ["__meta_docker_container_name"]
    regex         = "/(.*)"
    target_label  = "container_name"
  }

  rule {
    source_labels = ["__meta_docker_container_name"]
    regex         = "/(portainer_agent|loki|alloy)"
    action        = "drop"
  }

  rule {
    source_labels = ["__meta_docker_container_label_com_docker_compose_project"]
    regex         = "(monitoring|dockerproxy|dockge)"
    action        = "drop"
  } 
}

discovery.docker "gateway" {
  host = "tcp://192.168.0.131:2375"

}

loki.source.docker "gateway" {
  host = "tcp://192.168.0.131:2375"
  targets    = discovery.docker.gateway.targets
  labels     = {"app" = "docker", host = "gateway.local" }
  
  relabel_rules = loki.relabel.docker.rules
  forward_to = [loki.write.local.receiver]
}

loki.write "local" {
    endpoint {
        url = "http://loki:3100/loki/api/v1/push"
    }
    external_labels = {}
}

Документация:

Фильтрация и обработка логов

Установка метки имени контейнера

Для задания в метках имени контейнера необходим блок в секции loki.relabe:

rule { 
	source_labels = ["__meta_docker_container_name"] 
	regex = "/(.*)" 
	target_label = "container_name" 
	}

Отбор по имени контейнера

Для исключения контейнера по имени необходим блок в секции loki.relabe:

rule { 
	source_labels = ["__meta_docker_container_name"]
	regex = "/(<name1>|<name2>)" 
	action = "drop"
	}

где <name1> - имя исключаемого контейнера

Отбор по имени docker compose стека

Для исключения контейнера по имени необходим блок в секции loki.relabe:

rule { 
	source_labels = ["__meta_docker_container_label_com_docker_compose_project"]
	regex = "(<name1>|<name2>)" 
	action = "drop"
	}

где <name1> - имя исключаемого контейнера

Настройка хостов docker

Для сбора данных с хостов используется Dockerproxy для работы необходимо в environment в docker compose обязательно включить параметр NETWORKS:

...
	environment:
      - INFO=1 # Для работы Crowdsek
      - CONTAINERS=1
      - SERVICES=1
      - TASKS=1
      - POST=0 # Disallow any POST operations (effectively read-only)
      - NETWORKS=1 # Alloy
...

На этом все настройки на хосте для мониторинга закончены.

Панель мониторинга Grafana

Мониторинг логов добавлен в существующую панель.

Сбор логов docker контенейров для Grafana.png

Шаблон панели:
![[Docker Containers and Logs.json]]