Updates for grafana stack

This commit is contained in:
2026-07-10 06:50:52 -05:00
parent 728a0c60f2
commit f37ec41530
16 changed files with 652 additions and 97 deletions
+5
View File
@@ -0,0 +1,5 @@
---
alloy_image: "grafana/alloy:v1.7.1"
alloy_dir: "{{ apps_base_dir }}/observability/alloy"
alloy_loki_push_url: "{{ loki_push_url }}"
alloy_prometheus_remote_write_url: "{{ prometheus_remote_write_url }}"
+50
View File
@@ -0,0 +1,50 @@
---
# Ship host/container logs → Loki and metrics → Prometheus via Grafana Alloy
# (Promtail successor; also collects node + cAdvisor metrics).
- name: alloy | ensure project directories
ansible.builtin.file:
path: "{{ item }}"
state: directory
owner: "{{ admin_user }}"
group: "{{ admin_user }}"
mode: "0750"
loop:
- "{{ apps_base_dir }}/observability"
- "{{ alloy_dir }}"
- name: alloy | config
ansible.builtin.template:
src: config.alloy.j2
dest: "{{ alloy_dir }}/config.alloy"
owner: "{{ admin_user }}"
group: "{{ admin_user }}"
mode: "0644"
register: _alloy_config
- name: alloy | compose file
ansible.builtin.template:
src: docker-compose.yml.j2
dest: "{{ alloy_dir }}/docker-compose.yml"
owner: "{{ admin_user }}"
group: "{{ admin_user }}"
mode: "0644"
register: _alloy_compose
- name: alloy | start / recreate container
ansible.builtin.command:
cmd: >-
docker compose up -d --remove-orphans
{{ '--force-recreate' if (_alloy_compose is changed or _alloy_config is changed) else '' }}
chdir: "{{ alloy_dir }}"
become: true
become_user: "{{ admin_user }}"
register: _alloy_up
changed_when: >-
_alloy_up.rc == 0 and (
'Started' in (_alloy_up.stdout | default(''))
or 'Recreated' in (_alloy_up.stdout | default(''))
or 'Created' in (_alloy_up.stdout | default(''))
or _alloy_compose is changed
or _alloy_config is changed
)
+206
View File
@@ -0,0 +1,206 @@
// Managed by Ansible (roles/alloy). Do not edit by hand.
// host label = inventory hostname: {{ inventory_hostname }}
// =====================================================================
// LOGS
// =====================================================================
loki.source.journal "system" {
forward_to = [loki.process.journal_labels.receiver]
relabel_rules = discovery.relabel.journal.rules
labels = {
job = "systemd",
host = "{{ inventory_hostname }}",
}
}
discovery.relabel "journal" {
targets = []
rule {
source_labels = ["__journal__systemd_unit"]
target_label = "unit"
}
}
loki.process "journal_labels" {
forward_to = [loki.write.default.receiver]
stage.static_labels {
values = {
env = "host",
app = "system",
}
}
}
discovery.docker "containers" {
host = "unix:///var/run/docker.sock"
}
discovery.relabel "docker" {
targets = discovery.docker.containers.targets
rule {
source_labels = ["__meta_docker_container_name"]
regex = "/(.*)"
target_label = "container"
}
rule {
source_labels = ["__meta_docker_container_label_com_docker_compose_project"]
target_label = "compose_project"
}
rule {
source_labels = ["__meta_docker_container_label_com_docker_compose_service"]
target_label = "compose_service"
}
}
loki.source.docker "containers" {
host = "unix:///var/run/docker.sock"
targets = discovery.relabel.docker.output
forward_to = [loki.process.docker_labels.receiver]
labels = {
job = "docker",
host = "{{ inventory_hostname }}",
}
}
loki.process "docker_labels" {
forward_to = [loki.write.default.receiver]
stage.regex {
source = "compose_project"
expression = "^(?P<app>[a-z0-9_]+)_(?P<env>beta|prod)$"
}
stage.labels {
values = {
app = "",
env = "",
}
}
{% raw %}
stage.template {
source = "env"
template = `{{ if .env }}{{ .env }}{{ else }}infra{{ end }}`
}
stage.template {
source = "app"
template = `{{ if .app }}{{ .app }}{{ else }}{{ .compose_project }}{{ end }}`
}
{% endraw %}
stage.labels {
values = {
app = "",
env = "",
}
}
}
loki.write "default" {
endpoint {
url = "{{ alloy_loki_push_url }}"
}
}
// =====================================================================
// METRICS — host (CPU / RAM / disk / load / network)
// =====================================================================
prometheus.exporter.unix "node" {
procfs_path = "/host/proc"
sysfs_path = "/host/sys"
rootfs_path = "/host/root"
}
prometheus.scrape "node" {
targets = prometheus.exporter.unix.node.targets
forward_to = [prometheus.relabel.add_host.receiver]
scrape_interval = "15s"
job_name = "node"
}
// =====================================================================
// METRICS — Docker containers (cAdvisor)
// =====================================================================
prometheus.exporter.cadvisor "docker" {
docker_host = "unix:///var/run/docker.sock"
docker_only = true
storage_duration = "5m"
store_container_labels = false
allowlisted_container_labels = [
"com.docker.compose.project",
"com.docker.compose.service",
]
}
prometheus.scrape "cadvisor" {
targets = prometheus.exporter.cadvisor.docker.targets
forward_to = [prometheus.relabel.cadvisor_labels.receiver]
scrape_interval = "15s"
job_name = "cadvisor"
}
prometheus.relabel "cadvisor_labels" {
forward_to = [prometheus.remote_write.default.receiver]
rule {
target_label = "host"
replacement = "{{ inventory_hostname }}"
}
rule {
source_labels = ["container_label_com_docker_compose_project"]
target_label = "compose_project"
}
rule {
source_labels = ["compose_project"]
regex = "^([a-z0-9_]+)_(beta|prod)$"
target_label = "app"
replacement = "${1}"
}
rule {
source_labels = ["compose_project"]
regex = "^([a-z0-9_]+)_(beta|prod)$"
target_label = "env"
replacement = "${2}"
}
rule {
source_labels = ["env"]
regex = "^$"
target_label = "env"
replacement = "infra"
}
rule {
source_labels = ["app"]
regex = "^$"
target_label = "app"
replacement = "infra"
}
}
prometheus.relabel "add_host" {
forward_to = [prometheus.remote_write.default.receiver]
rule {
target_label = "host"
replacement = "{{ inventory_hostname }}"
}
}
prometheus.remote_write "default" {
endpoint {
url = "{{ alloy_prometheus_remote_write_url }}"
}
}
@@ -0,0 +1,29 @@
# Managed by Ansible (roles/alloy). Do not edit by hand.
services:
alloy:
image: {{ alloy_image }}
container_name: alloy
restart: unless-stopped
privileged: true
pid: host
command:
- run
- /etc/alloy/config.alloy
- --storage.path=/var/lib/alloy/data
- --server.http.listen-addr=0.0.0.0:12345
volumes:
- ./config.alloy:/etc/alloy/config.alloy:ro
- alloy-data:/var/lib/alloy/data
- /var/run/docker.sock:/var/run/docker.sock:ro
- /var/log/journal:/var/log/journal:ro
- /etc/machine-id:/etc/machine-id:ro
- /run/systemd/journal:/run/systemd/journal:ro
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/host/root:ro
- /var/run:/var/run:ro
- /var/lib/docker:/var/lib/docker:ro
- /dev/disk:/dev/disk:ro
volumes:
alloy-data: