部署

# 添加repo
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

# 下载
helm pull grafana/alloy
tar -zxvf alloy-1.10.0.tgz

# 创建命名空间
kubectl create namespace monitoring
# values.yaml

image:
  registry: harbor.xxx.com/public

alloy:
  extraPorts:
    - name: oltp-grpc
      port: 4317
      targetPort: 4317
      protocol: TCP
    - name: oltp-http 
      port: 4318
      targetPort: 4318
      protocol: TCP
  configMap:
    create: true 
    content: |
      discovery.kubernetes "pods" {
        role = "pod"
        namespaces {
          names = ["n1", "n2", "n3"]
        }
      }
      discovery.relabel "pod_logs" {
        targets = discovery.kubernetes.pods.targets
        rule {
          source_labels = ["__meta_kubernetes_pod_label_item_name"]
          target_label  = "item_name"
        }
        rule {
          source_labels = ["__meta_kubernetes_pod_label_env_type"]
          target_label  = "env_type"
        }
        rule {
          source_labels = ["__meta_kubernetes_pod_label_app_name"]
          target_label  = "app_name"
        }
        rule {
          source_labels = ["__meta_kubernetes_pod_node_name"]
          target_label  = "node_name"
        }
        rule {
          source_labels = ["__meta_kubernetes_pod_name"]
          target_label  = "pod_name"
        }
        rule {
          source_labels = ["__meta_kubernetes_namespace"]
          target_label  = "pod_namespace"
        }
        rule {
          source_labels = ["__meta_kubernetes_pod_container_name"]
          target_label  = "container_name"
        }
      }
      loki.source.kubernetes "pod_logs" {
        targets    = discovery.relabel.pod_logs.output
        forward_to = [loki.process.pod_logs.receiver]
      }
      loki.process "pod_logs" {     
        stage.cri {}
        stage.json {
          expressions = {
            level      = "level",
            message    = "message",
            logger     = "logger",
            thread     = "thread",
            trace_id   = "trace_id",
            span_id    = "span_id",
            stackTrace = "stack_trace",
          }
        }
        stage.template {
          source   = "message"
          template = "{{ if .trace_id }}trace_id={{ .trace_id }} {{ end }}{{ .Value }}"
        }
        stage.labels {
          values = {
            level         = "",
            item_name     = "item_name",
            env_type      = "env_type",
            app_name      = "app_name",
            pod_name      = "pod_name",
            pod_namespace = "pod_namespace",
            node_name     = "node_name",
          }
        }
        forward_to = [loki.write.default.receiver]
      }
      loki.write "default" {
        endpoint {
          name = "default"
          url  = "http://loki-gateway/loki/api/v1/push"
          headers = {
            "X-Scope-OrgID" = "tenant1",
          }
        }
        external_labels = {
          cluster = "kubernetes",
        }
      }
      otelcol.receiver.otlp "default" {
        grpc {
          endpoint = "0.0.0.0:4317"
        }
        http {
          endpoint = "0.0.0.0:4318"
        }
        output {
          traces = [otelcol.processor.batch.default.input]
        }
      }
      otelcol.processor.batch "default" {
        timeout         = "1s"
        send_batch_size     = 8192
        send_batch_max_size = 8192
        output {
          traces = [otelcol.exporter.otlp.tempo.input]
        }
      }
      otelcol.exporter.otlp "tempo" {
        client {
          endpoint = "http://tempo-distributed-distributor.monitoring.svc.cluster.local:4317"
          tls {
            insecure = true
          }
        }
        timeout = "10s"
      }
# 测试
helm install alloy ./alloy \
-f ./values.yaml \
--create-namespace \
--namespace=monitoring \
--dry-run=server > test.log

# 安装
helm install alloy ./alloy \
-f ./values.yaml \
--create-namespace \
--namespace=monitoring

镜像

docker.io/grafana/alloy:v1.17.0

quay.io/prometheus-operator/prometheus-config-reloader:v0.91.0

资源对象

ServiceAccount
    alloy
ConfigMap
    alloy
ClusterRole
    alloy
ClusterRoleBinding
    alloy
Service
    alloy
DaemonSet
    alloy        

验证

app.kubernetes.io/instance: alloy

kubectl get pods --namespace <NAMESPACE>
kubectl exec -it deploy/kube-prometheus-stack-grafana -c grafana -n monitoring -- sh

wget -qO- --header='X-Scope-OrgID: tenant1' 'http://loki-gateway/loki/api/v1/labels'

wget -qO- --header='X-Scope-OrgID: tenant1' 'http://loki-gateway/loki/api/v1/label/item_name/values'
wget -qO- --header='X-Scope-OrgID: tenant1' 'http://loki-gateway/loki/api/v1/label/env_type/values'
wget -qO- --header='X-Scope-OrgID: tenant1' 'http://loki-gateway/loki/api/v1/label/app_name/values'
wget -qO- --header='X-Scope-OrgID: tenant1' 'http://loki-gateway/loki/api/v1/label/node_name/values'