Datadog을 이용하여 모니터링 중인데. K8s로 넘어가는 중이라 추가로 설정하는 것이 필요했다.
구축중인 동료가 기본적인 agent 구성을 해주었으나, 제대로 작동하지 않고 있었고, Tag가 잘못된 것인지 아니면 인식을 못하는 것인지 Tag를 이용하여 서비스를 찾는 환경이 쉽지 않은 일이 발생했다.
뭔가 설정을 잘못한 것이 있겠지하면서 메뉴얼을 다시 읽었고 그것에 대해 정리 해놓는다.

  • 환경은 Kubernetes로 작업한다.
  • 해당 파일들은 kind: Deployment 항목에서 할당된다. 기본 라벨은 tags.datadog.com으로 묶어서 사용할 수 있도록 구성할 수 있으며, 해당 묶음은 Datadog에서 읽어가는 부분이라 다르게 사용하면 제대로 못읽어 갈 수 있다.

Pod 레벨 메트릭에 붙은 태깅

...
template:
  metadata:
    labels:
      tags.datadog.com/env: "<ENV>"
      tags.datadog.com/service: "<SERVICE>"
      tags.datadog.com/version: "<VERSION>"
...

Kubernetes 상태값 메트릭 태깅

Agent에 옵션을 추가해야 하는데 기본 옵션은 외부 환경 변수로 주입할 수 없어 설정 파일을 생성하여 연결 해줘야 한다. 그리고 해당 항목을 설정하지 않으면, APM에서 Kubernetes Pods 항목에 아무런 Pod도 보이지 않게 된다.

ConfigMap.yaml

  • 라벨에서 기본 tag를 가져올 수 있도록 join_standard_tags 옵션을 true로 변경 해준다. 코드상 설명
apiVersion: v1
kind: ConfigMap
metadata:
  name: datadog-agent-kubernetes-state
data:
  kubernetes_stage.yaml: |
    init_config:

    instances:
      - join_standard_tags: true

Agent 항목에 ConfigMap으로 만든 설정 파일을 마운트 해준다.

...
  volumeMounts:
    - name: datadog-agent-kubernetes-state
      mountPath: /etc/datadog-agent/conf.d/kubernetes_state.d
...
  volumes:
    - name: datadog-agent-kubernetes-state
      projected:
        source:
          - configMap:
              name: datadog-agent-kubernetes-state
              items:
                - key: kubernetes_state.yaml
                  path: conf.yaml

서비스 Pod에서 label을 다음과 같이 작성해준다.

apiVersion: v1
kind: Deployment
metadata:
  labels:
    tags.datadoghq.com/env: "<ENV>"
    tags.datadoghq.com/service: "<SERVICE>"
    tags.datadoghq.com/version: "<VERSION>"
spec:
  template:
    metadata:
      labels:
        tags.datadoghq.com/env: "<ENV>"
        tags.datadoghq.com/service: "<SERVICE>"
        tags.datadoghq.com/version: "<VERSION>"
...

APM tracer와 SatesD 클라이언트 환경 설정

...
containers:
...
  env:
    - name: DD_ENV
      valueFrom:
        fieldRef:
          fieldPath: metadata.labels['tags.datadoghq.com/env']
    - name: DD_SERVICE
      valueFrom:
        fieldRef:
          fieldPath: metadata.labels['tags.datadoghq.com/service']
    - name: DD_VERSION
      valueFrom:
        fieldRef:
          fieldPath: metadata.labels['tags.datadoghq.com/version']

이 세가지를 한번에 구성해두면, APM을 통해서 들어가거나 Trace를 통해서 서비스의 문제점을 찾을때 연관된 내용들을 손쉽게 찾을 수 있을 것이다.