🔧 DevOps

Datadog

클라우드 모니터링 및 보안 플랫폼

상세 설명

Datadog은 클라우드 규모의 인프라, 애플리케이션, 로그를 통합 모니터링하는 SaaS 플랫폼입니다. 2010년에 설립되어 현재 가장 많이 사용되는 상용 모니터링 솔루션 중 하나로, 관측 가능성(Observability)의 세 기둥인 메트릭, 로그, 트레이스를 하나의 플랫폼에서 제공합니다.

핵심 기능

  • Infrastructure Monitoring: 서버, 컨테이너, 클라우드 서비스 메트릭 수집
  • APM (Application Performance Monitoring): 분산 트레이싱으로 요청 흐름 추적
  • Log Management: 로그 수집, 파싱, 분석
  • RUM (Real User Monitoring): 실제 사용자 경험 측정
  • Synthetics: API 및 브라우저 기반 합성 모니터링
  • Security Monitoring: 보안 이벤트 탐지 및 SIEM

Datadog Agent 아키텍처

  • Datadog Agent: 호스트에서 실행되는 메트릭/로그 수집기
  • DogStatsD: 커스텀 메트릭 전송 데몬
  • Trace Agent: APM 트레이스 수집기
  • Process Agent: 프로세스 레벨 모니터링

코드 예제

datadog.yaml - Agent 설정

# /etc/datadog-agent/datadog.yaml
api_key: "your-api-key-here"
site: "datadoghq.com"  # EU는 datadoghq.eu

# 호스트 태그 설정
tags:
  - env:production
  - service:api-server
  - team:platform

# APM 설정
apm_config:
  enabled: true
  apm_dd_url: https://trace.agent.datadoghq.com

# 로그 수집 활성화
logs_enabled: true
logs_config:
  container_collect_all: true
  processing_rules:
    - type: exclude_at_match
      name: exclude_healthchecks
      pattern: "GET /health"

# 프로세스 모니터링
process_config:
  enabled: true
  container_collection:
    enabled: true

# DogStatsD 설정
dogstatsd_port: 8125
dogstatsd_non_local_traffic: true

Kubernetes 통합 설정

# datadog-values.yaml - Helm Chart 설정
datadog:
  apiKey: ${DD_API_KEY}
  appKey: ${DD_APP_KEY}
  site: datadoghq.com

  # 클러스터 이름
  clusterName: production-k8s

  # 태그
  tags:
    - env:production
    - region:ap-northeast-2

  # APM 활성화
  apm:
    portEnabled: true
    socketEnabled: true

  # 로그 수집
  logs:
    enabled: true
    containerCollectAll: true

  # 프로세스 모니터링
  processAgent:
    enabled: true
    processCollection: true

# 클러스터 에이전트
clusterAgent:
  enabled: true
  metricsProvider:
    enabled: true  # HPA 연동

# Node Agent
agents:
  rbac:
    create: true
  containers:
    agent:
      resources:
        requests:
          memory: "256Mi"
          cpu: "200m"

애플리케이션 APM 연동 (Python)

# Flask 애플리케이션 APM 연동
from ddtrace import tracer, patch_all

# 자동 패치
patch_all()

# 커스텀 설정
tracer.configure(
    hostname='localhost',
    port=8126,
    service='my-flask-app',
    env='production',
)

from flask import Flask
from datadog import statsd

app = Flask(__name__)

@app.route('/api/users/')
def get_user(user_id):
    # 커스텀 스팬 추가
    with tracer.trace('database.query', service='postgresql') as span:
        span.set_tag('user.id', user_id)
        user = fetch_user_from_db(user_id)

    # 커스텀 메트릭 전송
    statsd.increment('api.users.get', tags=['endpoint:get_user'])

    return jsonify(user)

# DogStatsD 커스텀 메트릭
from datadog import initialize, statsd

initialize(statsd_host='localhost', statsd_port=8125)

# 카운터
statsd.increment('page.views', tags=['page:home'])

# 게이지
statsd.gauge('queue.size', queue.size(), tags=['queue:orders'])

# 히스토그램
statsd.histogram('request.latency', response_time, tags=['endpoint:api'])

실무 대화 예제

SRE 엔지니어
"프로덕션에서 간헐적으로 500 에러가 발생하는데, 로그만 봐서는 원인을 모르겠어요."
시니어 SRE
"Datadog APM에서 해당 시간대의 트레이스를 확인해볼게요. Error status로 필터링하면... 여기 보이네요. 특정 DB 쿼리에서 타임아웃이 발생하고 있어요. 트레이스를 따라가보면 이 쿼리가 5초 이상 걸리고 있네요."
SRE 엔지니어
"와, 어떻게 그렇게 빨리 찾았어요?"
시니어 SRE
"APM Trace에서 각 스팬의 duration을 보면 병목 지점이 바로 보여요. 여기 Service Map에서 이 서비스가 DB에 의존하는 것도 한눈에 보이고요. 이 쿼리에 인덱스를 추가하거나, 타임아웃 설정을 조정해야 할 것 같아요."

주의사항

비용 관리

Datadog은 호스트 수, 로그 볼륨, 커스텀 메트릭 수에 따라 비용이 발생합니다. 로그 인덱싱 정책과 메트릭 카디널리티를 주의깊게 관리하세요.

API 키 보안

API 키가 노출되면 악의적인 데이터 전송이나 과금 문제가 발생할 수 있습니다. Secrets Manager를 통해 안전하게 관리하세요.

Agent 리소스

Datadog Agent는 일정량의 CPU/메모리를 사용합니다. 리소스가 제한된 환경에서는 Agent 설정을 최적화하세요.

카디널리티 폭발

태그에 고유 ID(사용자 ID, 세션 ID)를 직접 사용하면 메트릭 카디널리티가 폭발적으로 증가합니다. 적절한 버킷팅을 사용하세요.

더 배우기