betelgeusebytes/k8s/observability-stack/06-alloy-config.yaml

143 lines
3.1 KiB
YAML

apiVersion: v1
kind: ConfigMap
metadata:
name: alloy-config
namespace: observability
data:
config.alloy: |
// Logging configuration
logging {
level = "info"
format = "logfmt"
}
// Discover Kubernetes pods for log collection
discovery.kubernetes "pods" {
role = "pod"
}
// Discover Kubernetes nodes
discovery.kubernetes "nodes" {
role = "node"
}
// Relabel pods for log collection
discovery.relabel "pod_logs" {
targets = discovery.kubernetes.pods.targets
// Only scrape pods with logs
rule {
source_labels = ["__meta_kubernetes_pod_container_name"]
action = "keep"
regex = ".+"
}
// Set the log path
rule {
source_labels = ["__meta_kubernetes_pod_uid", "__meta_kubernetes_pod_container_name"]
target_label = "__path__"
separator = "/"
replacement = "/var/log/pods/*$1/*.log"
}
// Set namespace label
rule {
source_labels = ["__meta_kubernetes_namespace"]
target_label = "namespace"
}
// Set pod name label
rule {
source_labels = ["__meta_kubernetes_pod_name"]
target_label = "pod"
}
// Set container name label
rule {
source_labels = ["__meta_kubernetes_pod_container_name"]
target_label = "container"
}
// Set node name label
rule {
source_labels = ["__meta_kubernetes_pod_node_name"]
target_label = "node"
}
// Copy all pod labels
rule {
action = "labelmap"
regex = "__meta_kubernetes_pod_label_(.+)"
}
}
// Read logs from discovered pods
loki.source.kubernetes "pod_logs" {
targets = discovery.relabel.pod_logs.output
forward_to = [loki.process.pod_logs.receiver]
}
// Process and enrich logs
loki.process "pod_logs" {
forward_to = [loki.write.local.receiver]
// Parse JSON logs
stage.json {
expressions = {
level = "level",
message = "message",
timestamp = "timestamp",
}
}
// Extract log level
stage.labels {
values = {
level = "",
}
}
// Add cluster label
stage.static_labels {
values = {
cluster = "betelgeuse-k8s",
}
}
}
// Write logs to Loki
loki.write "local" {
endpoint {
url = "http://loki.observability.svc.cluster.local:3100/loki/api/v1/push"
}
}
// OpenTelemetry receiver for traces
otelcol.receiver.otlp "default" {
grpc {
endpoint = "0.0.0.0:4317"
}
http {
endpoint = "0.0.0.0:4318"
}
output {
traces = [otelcol.exporter.otlp.tempo.input]
}
}
// Export traces to Tempo
otelcol.exporter.otlp "tempo" {
client {
endpoint = "tempo.observability.svc.cluster.local:4317"
tls {
insecure = true
}
}
}
// Scrape local metrics (Alloy's own metrics)
// Prometheus will scrape these via service discovery
prometheus.exporter.self "alloy" {
}