This commit is contained in:
Mike McFetridge
2026-07-23 19:38:14 -04:00
parent 72272e4006
commit 84e1ead50c
283 changed files with 0 additions and 206 deletions
+62
View File
@@ -0,0 +1,62 @@
services:
<< service_name >>:
image: docker.io/grafana/alloy:v1.16.0
restart: << restart_policy >>
<%- if container_hostname %>
hostname: << container_hostname >>
<%- endif %>
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
<%- endif %>
command:
- run
- /etc/alloy/alloy.d/
- --server.http.listen-addr=127.0.0.1:12345
<%- if not traefik_enabled %>
ports:
- "<< ports_webui >>:12345"
<%- endif %>
volumes:
- << service_name >>_data:/alloy/data
- ./config:/etc/alloy/alloy.d/:ro
<%- if logs_enabled or metrics_enabled %>
- /:/rootfs:ro
- /sys:/sys:ro
<%- endif %>
<%- if logs_enabled and logs_system %>
- /run:/run:ro
- /var/log:/var/log:ro
<%- endif %>
<%- if (logs_enabled and logs_docker) or (metrics_enabled and metrics_docker) %>
- /var/lib/docker/:/var/lib/docker/:ro
<%- endif %>
<%- if metrics_enabled and metrics_system %>
- /run/udev/data:/run/udev/data:ro
<%- endif %>
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>-web.loadBalancer.server.port=12345
- traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>-https.tls=true
- traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
external: true
<%- endif %>
volumes:
<< service_name >>_data:
driver: local
@@ -0,0 +1,4 @@
logging {
level = "info"
format = "logfmt"
}
@@ -0,0 +1,23 @@
<%- if logs_enabled and logs_docker %>
discovery.docker "dockerlogs" {
host = "unix:///var/run/docker.sock"
}
discovery.relabel "dockerlogs" {
targets = []
rule {
source_labels = ["__meta_docker_container_name"]
regex = "/(.*)"
target_label = "service_name"
}
}
loki.source.docker "default" {
host = "unix:///var/run/docker.sock"
targets = discovery.docker.dockerlogs.targets
labels = {"platform" = "docker"}
relabel_rules = discovery.relabel.dockerlogs.rules
forward_to = [loki.write.default.receiver]
}
<%- endif %>
@@ -0,0 +1,44 @@
<%- if logs_enabled and logs_system %>
loki.source.journal "journal" {
max_age = "24h0m0s"
relabel_rules = discovery.relabel.journal.rules
forward_to = [loki.write.default.receiver]
labels = {component = string.format("%s-journal", constants.hostname)}
// NOTE: This is important to fix https://github.com/grafana/alloy/issues/924
path = "/var/log/journal"
}
local.file_match "system" {
path_targets = [{
__address__ = "localhost",
__path__ = "/var/log/{syslog,messages,*.log}",
instance = constants.hostname,
job = string.format("%s-logs", constants.hostname),
}]
}
discovery.relabel "journal" {
targets = []
rule {
source_labels = ["__journal__systemd_unit"]
target_label = "unit"
}
rule {
source_labels = ["__journal__boot_id"]
target_label = "boot_id"
}
rule {
source_labels = ["__journal__transport"]
target_label = "transport"
}
rule {
source_labels = ["__journal_priority_keyword"]
target_label = "level"
}
}
loki.source.file "system" {
targets = local.file_match.system.targets
forward_to = [loki.write.default.receiver]
}
<%- endif %>
@@ -0,0 +1,23 @@
<%- if metrics_enabled and metrics_docker %>
prometheus.exporter.cadvisor "dockermetrics" {
docker_host = "unix:///var/run/docker.sock"
storage_duration = "5m"
}
/* Relabel component to drop container_spec metrics that often have NaN values */
prometheus.relabel "docker_filter" {
forward_to = [prometheus.remote_write.default.receiver]
rule {
source_labels = ["__name__"]
regex = "container_spec_(cpu_period|cpu_quota|cpu_shares|memory_limit_bytes|memory_swap_limit_bytes|memory_reservation_limit_bytes)"
action = "drop"
}
}
prometheus.scrape "dockermetrics" {
targets = prometheus.exporter.cadvisor.dockermetrics.targets
forward_to = [prometheus.relabel.docker_filter.receiver]
scrape_interval = "10s"
}
<%- endif %>
@@ -0,0 +1,36 @@
<%- if metrics_enabled and metrics_system %>
discovery.relabel "metrics" {
targets = prometheus.exporter.unix.metrics.targets
rule {
target_label = "instance"
replacement = constants.hostname
}
rule {
target_label = "job"
replacement = string.format("%s-metrics", constants.hostname)
}
}
prometheus.exporter.unix "metrics" {
disable_collectors = ["ipvs", "btrfs", "infiniband", "xfs", "zfs"]
enable_collectors = ["meminfo"]
rootfs_path = "/rootfs"
filesystem {
fs_types_exclude = "^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|tmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$"
mount_points_exclude = "^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+)($|/)"
mount_timeout = "5s"
}
netclass {
ignored_devices = "^(veth.*|cali.*|[a-f0-9]{15})$"
}
netdev {
device_exclude = "^(veth.*|cali.*|[a-f0-9]{15})$"
}
}
prometheus.scrape "metrics" {
scrape_interval = "15s"
targets = discovery.relabel.metrics.output
forward_to = [prometheus.remote_write.default.receiver]
}
<%- endif %>
@@ -0,0 +1,20 @@
<%- if logs_enabled %>
loki.write "default" {
endpoint {
url = "<< logs_loki_url >>"
// Batching configuration to reduce request volume and prevent rate limiting
batch_wait = "5s" // Wait up to 5 seconds before sending
batch_size = "1MiB" // Send when batch reaches 1MB (1048576 bytes)
}
external_labels = {}
}
<%- endif %>
<%- if metrics_enabled %>
prometheus.remote_write "default" {
endpoint {
url = "<< metrics_prometheus_url >>"
}
}
<%- endif %>
+239
View File
@@ -0,0 +1,239 @@
{
"slug": "alloy",
"kind": "compose",
"metadata": {
"name": "Grafana Alloy",
"description": "OpenTelemetry collector by Grafana that collects, processes, and exports metrics and logs to various backends like Prometheus and Loki.",
"tags": [
"traefik"
],
"icon": {
"provider": "selfhst",
"id": "grafana-alloy"
},
"draft": false,
"version": {
"name": "v1.16.0",
"source_dep_name": "docker.io/grafana/alloy",
"source_dep_version": "v1.16.0"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "alloy",
"config": {
"placeholder": "alloy"
}
},
{
"name": "container_hostname",
"type": "str",
"title": "Hostname",
"required": false
},
{
"name": "restart_policy",
"type": "enum",
"title": "Container restart policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"title": "Log Collection",
"toggle": "logs_enabled",
"name": "logs",
"items": [
{
"name": "logs_docker",
"type": "bool",
"title": "Docker Logs",
"required": false,
"default": true
},
{
"name": "logs_enabled",
"type": "bool",
"title": "Logs",
"required": false,
"default": false
},
{
"name": "logs_loki_url",
"type": "str",
"title": "Loki URL",
"required": true,
"default": "http://loki:3100/loki/api/v1/push",
"description": "Loki endpoint URL for sending logs",
"config": {
"placeholder": "http://loki:3100/loki/api/v1/push"
}
},
{
"name": "logs_system",
"type": "bool",
"title": "System Logs",
"required": false,
"default": true
}
]
},
{
"title": "Metrics Collection",
"toggle": "metrics_enabled",
"name": "metrics",
"items": [
{
"name": "metrics_docker",
"type": "bool",
"title": "Docker Metrics",
"required": false,
"default": true
},
{
"name": "metrics_enabled",
"type": "bool",
"title": "Metrics",
"required": false,
"default": false
},
{
"name": "metrics_prometheus_url",
"type": "str",
"title": "Prometheus URL",
"required": true,
"default": "http://prometheus:9090/api/v1/write",
"config": {
"placeholder": "http://prometheus:9090/api/v1/write"
}
},
{
"name": "metrics_system",
"type": "bool",
"title": "System Metrics",
"required": false,
"default": true
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_webui",
"type": "int",
"title": "Web UI Port",
"required": false,
"default": 12345,
"description": "Port for Alloy web UI",
"config": {
"placeholder": "12345"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "alloy"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Traefik network name",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
}
]
}