apiVersion: v1 kind: ConfigMap metadata: name: alloy-config namespace: default data: config.alloy: | // 发现集群内所有 Pod discovery.kubernetes "pods" { role = "pod" } // 重写元数据标签,并只保留带 app label 的 Pod discovery.relabel "pods" { targets = discovery.kubernetes.pods.targets rule { source_labels = ["__meta_kubernetes_namespace"] target_label = "namespace" } rule { source_labels = ["__meta_kubernetes_pod_name"] target_label = "pod" } rule { source_labels = ["__meta_kubernetes_pod_container_name"] target_label = "container" } rule { source_labels = ["__meta_kubernetes_pod_label_app"] target_label = "app" } // 只采集有 app label 的 Pod rule { source_labels = ["__meta_kubernetes_pod_label_app"] action = "keep" regex = ".+" } } // 通过 Kubernetes API 抓取容器日志(无需挂载宿主机日志目录) loki.source.kubernetes "pods" { targets = discovery.relabel.pods.output forward_to = [loki.process.parse.receiver] } // 解析 zap 输出的 JSON 日志,并将关键字段提升为 Loki Label loki.process "parse" { forward_to = [loki.write.default.receiver] // 解析结构化字段 stage.json { expressions = { level = "level", traceID = "traceID", spanID = "spanID", caller = "caller", pod = "pod", namespace = "namespace", node = "node", } } // 提升为 Label,支持在 Grafana 中按实例/Trace 过滤 stage.labels { values = { level = "", traceID = "", pod = "", namespace = "", node = "", } } } // 推送到 Loki loki.write "default" { endpoint { url = "http://loki-service:3100/loki/api/v1/push" } }