From 3a5fa3ceb99fa8f0618e4cafd50b7bf8950054c6 Mon Sep 17 00:00:00 2001 From: eedo_y Date: Sat, 11 Apr 2026 14:49:48 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20tempo=20metricsGenerator=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95=20(#4?= =?UTF-8?q?9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monitoring-tempo/values-prod-gitops.yaml | 17 +++++++++++++++++ k8s-helm/releases/monitoring-tempo/values.yaml | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/k8s-helm/releases/monitoring-tempo/values-prod-gitops.yaml b/k8s-helm/releases/monitoring-tempo/values-prod-gitops.yaml index bb9d44d..646cd1c 100644 --- a/k8s-helm/releases/monitoring-tempo/values-prod-gitops.yaml +++ b/k8s-helm/releases/monitoring-tempo/values-prod-gitops.yaml @@ -81,3 +81,20 @@ tempo: limits: cpu: 500m memory: 512Mi + + metricsGenerator: + # 트레이스에서 RED 메트릭(Rate, Error, Duration)을 자동 생성합니다. + enabled: true + replicas: 1 + resources: + requests: + cpu: 200m + memory: 256Mi + limits: + cpu: 500m + memory: 1Gi + config: + # Prometheus로 메트릭을 전송합니다. + storage: + remote_write: + - url: http://monitoring-core-kube-prome-prometheus.monitoring.svc.cluster.local:9090/api/v1/write diff --git a/k8s-helm/releases/monitoring-tempo/values.yaml b/k8s-helm/releases/monitoring-tempo/values.yaml index c7d579f..67e2f41 100644 --- a/k8s-helm/releases/monitoring-tempo/values.yaml +++ b/k8s-helm/releases/monitoring-tempo/values.yaml @@ -43,7 +43,8 @@ tempo: replicas: 1 metricsGenerator: - enabled: false + enabled: true + replicas: 1 gateway: enabled: false From 5f88ec9de6d2096bcace94231fae86d0d1778c3b Mon Sep 17 00:00:00 2001 From: eedo_y Date: Sat, 11 Apr 2026 15:19:27 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20alloy=20logpods=20=EA=B8=B0=EB=B0=98?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A7=91=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD=20(#49)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monitoring-alloy/templates/podlogs.yaml | 87 +++++++++++++++++++ .../releases/monitoring-alloy/values.yaml | 86 ++++-------------- 2 files changed, 103 insertions(+), 70 deletions(-) create mode 100644 k8s-helm/releases/monitoring-alloy/templates/podlogs.yaml diff --git a/k8s-helm/releases/monitoring-alloy/templates/podlogs.yaml b/k8s-helm/releases/monitoring-alloy/templates/podlogs.yaml new file mode 100644 index 0000000..5648cb0 --- /dev/null +++ b/k8s-helm/releases/monitoring-alloy/templates/podlogs.yaml @@ -0,0 +1,87 @@ +{{- if .Values.podLogs.enabled }} + +apiVersion: monitoring.grafana.com/v1alpha2 + +kind: PodLogs + +# 메타데이터 +metadata: + name: {{ .Release.Name }}-pods + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/name: monitoring-alloy + app.kubernetes.io/component: podlogs + +# 스펙. 현재는 모드 파드 수집 진행함. +spec: + namespaceSelector: {} + selector: {} + + # 라벨링 + relabelings: + # 네임스페이스는 가장 기본적인 조회 축이라 그대로 보존합니다. + - sourceLabels: + - __meta_kubernetes_namespace + targetLabel: namespace + + # Pod 이름을 그대로 라벨로 남겨 개별 인스턴스 추적에 사용합니다. + - sourceLabels: + - __meta_kubernetes_pod_name + targetLabel: pod + + # 컨테이너 이름은 service fallback과 세부 필터링에 함께 사용합니다. + - sourceLabels: + - __meta_kubernetes_pod_container_name + targetLabel: container + + # 장애 분석 시 노드 기준 조회가 가능하도록 노드 이름을 남깁니다. + - sourceLabels: + - __meta_kubernetes_pod_node_name + targetLabel: node + + # service 추출 규칙: 우선순위가 낮은 것부터 높은 순서로 덮어씁니다. + + # 1. 기본값: 컨테이너 이름 + - sourceLabels: + - __meta_kubernetes_pod_container_name + targetLabel: service + # 2. Pod controller가 ReplicaSet이면 Deployment 이름 추출 + - sourceLabels: + - __meta_kubernetes_pod_controller_kind + - __meta_kubernetes_pod_controller_name + separator: / + regex: ReplicaSet/(.+)-[a-z0-9]{8,10}$ + replacement: $1 + targetLabel: service + + # 3. app 라벨이 있으면 우선 사용 + - sourceLabels: + - __meta_kubernetes_pod_label_app + regex: (.+) + targetLabel: service + + # 4. 표준 app.kubernetes.io/name 라벨이 있으면 최우선 + - sourceLabels: + - __meta_kubernetes_pod_label_app_kubernetes_io_name + regex: (.+) + targetLabel: service + + # Logs Drilldown이 우선 참조하는 service_name 라벨도 함께 맞춥니다. + - sourceLabels: + - service + targetLabel: service_name + + # 서비스 네임스페이스는 워크로드 네임스페이스와 동일하게 둡니다. + - sourceLabels: + - __meta_kubernetes_namespace + targetLabel: service_namespace + + # job은 namespace/service 형식으로 설정합니다. + - sourceLabels: + - __meta_kubernetes_namespace + - service + separator: / + targetLabel: job + +{{- end }} diff --git a/k8s-helm/releases/monitoring-alloy/values.yaml b/k8s-helm/releases/monitoring-alloy/values.yaml index e2b512c..87c3363 100644 --- a/k8s-helm/releases/monitoring-alloy/values.yaml +++ b/k8s-helm/releases/monitoring-alloy/values.yaml @@ -18,6 +18,13 @@ alloy: enabled: true enableReporting: false + # node_filter가 공식 예시처럼 NODE_NAME 환경변수를 사용할 수 있게 맞춥니다. + extraEnv: + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + extraPorts: - name: otlp-grpc port: 4317 @@ -113,7 +120,7 @@ alloy: // ======================================== // 각 Alloy Pod는 자신이 올라간 노드의 Pod 로그만 읽도록 범위를 제한합니다. loki.source.podlogs "pods" { - forward_to = [loki.relabel.pod_logs.receiver] + forward_to = [loki.process.pod_logs.receiver] node_filter { enabled = true @@ -127,75 +134,6 @@ alloy: stage.cri {} } - // Kubernetes 메타데이터를 Loki 조회용 라벨로 정리합니다. - loki.relabel "pod_logs" { - forward_to = [loki.process.pod_logs.receiver] - - // 네임스페이스는 가장 기본적인 조회 축이라 그대로 보존합니다. - rule { - source_labels = ["__meta_kubernetes_namespace"] - target_label = "namespace" - } - - // Pod 이름을 그대로 라벨로 남겨 개별 인스턴스 추적에 사용합니다. - rule { - source_labels = ["__meta_kubernetes_pod_name"] - target_label = "pod" - } - - // 컨테이너 이름은 service fallback과 세부 필터링에 함께 사용합니다. - rule { - source_labels = ["__meta_kubernetes_pod_container_name"] - target_label = "container" - } - - // 장애 분석 시 노드 기준 조회가 가능하도록 노드 이름을 남깁니다. - rule { - source_labels = ["__meta_kubernetes_pod_node_name"] - target_label = "node" - } - - // service 추출 규칙: 우선순위가 낮은 것부터 높은 순서로 덮어씁니다. - - // 1. 기본값: 컨테이너 이름 - rule { - source_labels = ["__meta_kubernetes_pod_container_name"] - target_label = "service" - } - - // 2. Pod controller가 ReplicaSet이면 Deployment 이름 추출 - // ReplicaSet 이름 형식: - - // pod-template-hash는 마지막 하이픈 뒤의 8-10자리 영숫자 - rule { - source_labels = ["__meta_kubernetes_pod_controller_kind", "__meta_kubernetes_pod_controller_name"] - separator = "/" - regex = "ReplicaSet/(.+)-[a-z0-9]{8,10}$" - replacement = "$1" - target_label = "service" - } - - // 3. app 라벨이 있으면 우선 사용 - rule { - source_labels = ["__meta_kubernetes_pod_label_app"] - regex = "(.+)" - target_label = "service" - } - - // 4. 표준 app.kubernetes.io/name 라벨이 있으면 최우선 - rule { - source_labels = ["__meta_kubernetes_pod_label_app_kubernetes_io_name"] - regex = "(.+)" - target_label = "service" - } - - // job은 namespace/service 형식으로 설정합니다. - rule { - source_labels = ["__meta_kubernetes_namespace", "service"] - separator = "/" - target_label = "job" - } - } - // 공통 외부 라벨을 함께 붙여 Loki로 전송합니다. loki.write "default" { external_labels = { @@ -221,3 +159,11 @@ alloy: serviceMonitor: enabled: true + +# ======================================== +# PodLogs 수집 설정 +# ======================================== + +podLogs: + # Alloy loki.source.podlogs가 읽을 PodLogs CR을 함께 배포합니다. + enabled: true From 3134f303a292bd16bf61852ff0b04dbbb589cbbc Mon Sep 17 00:00:00 2001 From: eedo_y Date: Sat, 11 Apr 2026 15:42:50 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20alloy=20crd=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20tempo=20=EB=A7=A4=ED=8A=B8=EB=A6=AD=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20(#49)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- k8s-helm/releases/monitoring-alloy/values.yaml | 3 +++ k8s-helm/releases/monitoring-tempo/values-prod-gitops.yaml | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/k8s-helm/releases/monitoring-alloy/values.yaml b/k8s-helm/releases/monitoring-alloy/values.yaml index 87c3363..f95de64 100644 --- a/k8s-helm/releases/monitoring-alloy/values.yaml +++ b/k8s-helm/releases/monitoring-alloy/values.yaml @@ -11,6 +11,9 @@ global: alloy: fullnameOverride: monitoring-alloy + crds: + # PodLogs 같은 Alloy CRD를 릴리스와 함께 명시적으로 설치합니다. + create: true alloy: # DaemonSet 여러 인스턴스 간에 scrape 대상을 나눠 가져가도록 클러스터링을 활성화합니다. diff --git a/k8s-helm/releases/monitoring-tempo/values-prod-gitops.yaml b/k8s-helm/releases/monitoring-tempo/values-prod-gitops.yaml index 646cd1c..35d78cf 100644 --- a/k8s-helm/releases/monitoring-tempo/values-prod-gitops.yaml +++ b/k8s-helm/releases/monitoring-tempo/values-prod-gitops.yaml @@ -82,6 +82,13 @@ tempo: cpu: 500m memory: 512Mi + overrides: + defaults: + metrics_generator: + # RED 메트릭 생성을 위해 span-metrics processor를 명시적으로 활성화합니다. + processors: + - span-metrics + metricsGenerator: # 트레이스에서 RED 메트릭(Rate, Error, Duration)을 자동 생성합니다. enabled: true