diff --git a/tasks/monitoring.yml b/tasks/monitoring.yml index bcc708b..b918171 100644 --- a/tasks/monitoring.yml +++ b/tasks/monitoring.yml @@ -1,19 +1,4 @@ --- -- name: Deploy Loki - include_role: - name: docker - vars: - name: monitoring_loki - volume_name: grafana-loki - image: - name: grafana/loki - tag: latest - volumes: - - "{{ data_dir }}/monitoring/loki/loki-config.yaml:/etc/loki/local-config.yaml" - - "grafana-loki:/loki" - networks: - - name: "monitoring" - - name: Deploy Prometheus include_role: name: docker @@ -47,6 +32,42 @@ template: src: templates/monitoring/loki.yaml.j2 dest: "{{ data_dir }}/monitoring/loki/loki-config.yaml" +- name: Create Promtail Configuration + template: + src: templates/monitoring/promtail.yaml.j2 + dest: "{{ data_dir }}/monitoring/promtail/promtail-config.yaml" + +- name: Deploy Promtail + include_role: + name: docker + vars: + name: monitoring_promtail + image: + name: grafana/promtail + tag: latest + networks: + - name: monitoring + command: -config.file=/etc/promtail/config.yaml + volumes: + - "{{ data_dir }}/monitoring/promtail/promtail-config.yaml" + - "/var/log:/var/log:ro" + - "/var/run/docker.sock:/var/run/docker.sock:ro" + - "/var/lib/docker/containers:/var/lib/docker/containers:ro" + +- name: Deploy Loki + include_role: + name: docker + vars: + name: monitoring_loki + volume_name: grafana-loki + image: + name: grafana/loki + tag: latest + volumes: + - "{{ data_dir }}/monitoring/loki/loki-config.yaml:/etc/loki/local-config.yaml" + - "grafana-loki:/loki" + networks: + - name: "monitoring" - name: Deploy Node Exporter include_role: diff --git a/templates/monitoring/promtail.yaml.j2 b/templates/monitoring/promtail.yaml.j2 new file mode 100644 index 0000000..d19dc35 --- /dev/null +++ b/templates/monitoring/promtail.yaml.j2 @@ -0,0 +1,63 @@ +server: + http_listen_port: 9080 + +positions: + filename: /tmp/positions.yaml + +clients: + - url: http://monitoring_loki:3100/loki/api/v1/push + +scrape_configs: + - job_name: docker + docker_sd_configs: + - host: unix:///var/run/docker.sock + refresh_interval: 5s + relabel_configs: + # Keep only running containers + - source_labels: ['__meta_docker_container_id'] + target_label: container_id + + # Container name (strips leading slash) + - source_labels: ['__meta_docker_container_name'] + regex: '/(.+)' + target_label: container_name + + # Compose project name + - source_labels: ['__meta_docker_container_label_com_docker_compose_project'] + target_label: compose_project + + # Compose service name + - source_labels: ['__meta_docker_container_label_com_docker_compose_service'] + target_label: compose_service + + # Image name + - source_labels: ['__meta_docker_container_image'] + target_label: image + + # Custom labels - grab any label starting with "logging." + # e.g. logging.env=production becomes env=production + - regex: '__meta_docker_container_label_logging_(.+)' + action: labelmap + replacement: '$1' + + # Drop containers with logging=disabled label + - source_labels: ['__meta_docker_container_label_logging'] + regex: 'disabled' + action: drop + + pipeline_stages: + # Docker JSON log format parsing + - json: + expressions: + output: log + stream: stream + timestamp: time + + # Use Docker's timestamp + - timestamp: + source: timestamp + format: RFC3339Nano + + # Output just the log line + - output: + source: output \ No newline at end of file