02-12 17:04
반응형
250x250
Recent Posts
Recent Comments
Link
관리 메뉴

DevOps Tasks

Spring Boot Actuator & DatadogMonitoring 본문

DevOps

Spring Boot Actuator & DatadogMonitoring

데밥스 2025. 2. 9. 21:43
728x90
반응형


Spring Boot 애플리케이션의 성능을 모니터링하기 위해 `Actuator`와 `Micrometer`, 그리고 Datadog을 연동하는 방법을 알아보겠습니다.

특히 `StatsD` 기반 Custom Metric 설정까지 다룹니다.


1. Spring Boot Actuator & Micrometer

1.1 Actuator란?

`Spring Boot Actuator`는 애플리케이션의 운영 및 모니터링을 위한 엔드포인트를 제공하는 모듈입니다. 기본적으로 /actuator/metrics 엔드포인트를 통해 애플리케이션 내부의 다양한 성능 지표(CPU 사용량, GC 상태, HTTP 요청 수 등)를 확인할 수 있습니다.

1.2 Micrometer와 Exporter

Actuator는 `Micrometer`를 통해 메트릭을 수집하며, `Micrometer`는 다양한 모니터링 시스템과 연동할 수 있도록 `Exporter` 기능을 제공합니다. 대표적인 `Exporter`는 다음과 같습니다.

Exporter 설명 사용 대상
StatsD Exporter UDP 기반으로 메트릭을 전송 Datadog(StatsD 방식)
Datadog Exporter Datadog API를 통해 HTTP로 메트릭을 전송 Datadog(HTTP 방식)
Prometheus Exporter Prometheus 서버가 Pull 방식으로 메트릭 가져감 Prometheus
Graphite Exporter Graphite 서버로 메트릭을 전송 Graphite

 


2. Spring Boot 설정 (Actuator + Micrometer + StatsD)

Datadog과 연동하기 위해 `StatsD Exporter`를 활용할 수 있습니다. 아래는 Spring Boot 프로젝트에서 필요한 설정 예시입니다.

2.1 `application.yaml` 예시

management:
  endpoints:
    web:
      exposure:
        include:
          - metrics   	# /actuator/metrics 노출
  metrics:
    enable:
      all: false
      hikaricp: true  	# HikariCP 메트릭 활성화
      tomcat: true    	# Tomcat 메트릭 활성화
  statsd:
    metrics:
      export:
        enabled: true
        host: localhost # Datadog Agent 호스트
        port: 8125      # Datadog Agent StatsD 포트
        flavor: datadog # Datadog StatsD 형식
        step: 10s       # 10초 간격으로 메트릭 전송

2.2 Gradle 의존성

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'io.micrometer:micrometer-registry-statsd'
}
  • `spring-boot-starter-actuator` : Actuator 엔드포인트 제공
  • `micrometer-registry-statsd` : StatsD를 통해 Datadog으로 메트릭 전송

3. Datadog Agent & StatsD 설정

3.1 왜 StatsD인가?

Datadog은 `HTTP API`와 `StatsD` 방식을 모두 지원합니다. 두 방식의 차이

방식 설명 장점 단점
Datadog API HTTP로 직접 메트릭 전송 Agent 없이 사용 가능 API 호출 부담, 네트워크 비용
StatsD UDP로 Agent에 전송 (고성능) 성능 우수, 경량 Datadog Agent 필요

이번 예시에서는 `StatsD`를 사용하고, Datadog Agent가 해당 메트릭을 수집하여 Datadog 서버로 전달합니다.

3.2 Datadog Agent의 StatsD 설정 예시

Datadog Agent에서 StatsD 포트를 열어 Micrometer가 전송하는 데이터를 받아야 합니다.

{
  "hostPort": 8125,
  "protocol": "udp",
  "containerPort": 8125
}

또한, 환경 변수를 통해 Datadog Agent를 구성할 수 있습니다.

"environment": [
    {
      "name": "DD_APM_ENABLED",
      "value": "true"
    },
    {
      "name": "DD_APM_NON_LOCAL_TRAFFIC",
      "value": "true"
    },
    {
      "name": "DD_LOGS_ENABLED",
      "value": "false"
    },
    {
      "name": "DD_SITE",
      "value": "datadoghq.com"
    },
    {
      "name": "DD_LOG_LEVEL",
      "value": "WARN"
    },
    {
      "name": "ECS_FARGATE",
      "value": "true"
    }
]

 

환경 변수 설명
DD_APM_ENABLED APM(애플리케이션 성능 모니터링) 활성화
DD_APM_NON_LOCAL_TRAFFIC 외부 트래픽도 추적하도록 설정
DD_LOGS_ENABLED 로그 수집 비활성화
DD_SITE Datadog 서버 사이트
DD_LOG_LEVEL WARN 레벨로 로그 출력
ECS_FARGATE AWS Fargate 환경임을 명시

 

3.3 컨테이너 단위 식별 개선 : `DD_DOGSTATSD_TAG_CARDINALITY`

3.3.1 식별 단위의 중요성

 

기본적으로 ECS Fargate에서는 `Task` 단위로 메트릭을 식별합니다.

그러나 세분화된 분석(예: 컨테이너별 리소스 사용량, 세션 상태)을 위해 `container_id` 단위 식별이 필요할 수 있습니다.

3.2 DD_DOGSTATSD_TAG_CARDINALITY 설정

{
  "name": "DD_DOGSTATSD_TAG_CARDINALITY",
  "value": "orchestrator"
}
  • low(기본값) : ECS는 `Service` 단위, K8s는 Pod 단위
  • orchestrator : ECS는 `Task` 단위
  • high : ECS는 `Container ID` 단위, K8s는 Pod+Container

초기에는 `low` 옵션(=Service 단위)으로만 메트릭을 집계했지만, `orchestrator`나 `high`로 설정하면 더욱 세밀하게 모니터링할 수 있습니다.

DogStatsD를 사용하지 않는 애플리케이션에는 영향이 없습니다.


4. Datadog 메트릭 수집 Flow

  1. Spring Boot Actuator + Micrometer에서 메트릭 생성
  2. StatsD Exporter를 통해 UDP 전송
  3. Datadog Agent가 메트릭 수신 후 Datadog 서버로 업로드
  4. Datadog UI에서 메트릭을 실시간으로 확인 및 대시보드 구성
[Spring Boot Actuator] → (Micrometer) → [StatsD] → (Datadog Agent) → (Datadog Backend) → [Datadog UI]

아래 이미지는 Datadog UI에서 Spring Boot 애플리케이션의 메트릭이 정상적으로 수집·표시되는 모습입니다.

위처럼 Datadog 대시보드에서 필요한 메트릭(예: `custom.request.count` 등)을 검색·추가하여 실시간으로 모니터링할 수 있습니다.


5. Datadog Custom Metric 수집

5.1 사용자 정의 메트릭

`StatsD`를 활용하면 기본 메트릭 외에도 `Custom Metric`을 손쉽게 전송할 수 있습니다.

import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class CustomMetrics {

    private final MeterRegistry meterRegistry;

    public CustomMetrics(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
    }

    @PostConstruct
    public void init() {
        meterRegistry.counter("custom.request.count").increment();
    }
}
  • `custom.request.count`라는 메트릭을 정의하고 카운트를 증가
  • Datadog에서 해당 메트릭(`custom.request.count`) 모니터링 가능

6. `DD_DOGSTATSD_TAG_CARDINALITY="orchestrator"` 설정 영향

Datadog의 `Tag Cardinality` 설정을 orchestrator로 변경하면, ECS 태그(`container_id`, `task_name` 등)를 자동 추가하게 됩니다.

항목 영향 여부 해결책
DogStatsD 미사용 애플리케이션 ❌ 없음 문제 없음
DogStatsD 사용 애플리케이션 ⭕ 있음 자동 추가 태그로 인한 메트릭 필터링 조정 필요
Datadog Agent 성능 부하 ⭕ 미미함 ECS API 호출이 증가하지만 운영상 큰 영향 없음

결론: DogStatsD를 사용하지 않는 앱은 영향 없고, 사용 중인 앱에서는 태그 필터링 조정이 필요합니다.


7. 결론

  • `Spring Boot Actuator` + `Micrometer`를 통해 Datadog으로 애플리케이션 메트릭 전송 가능
  • `StatsD` 방식을 사용하면 높은 성능과 Agent 연동으로 효율적인 모니터링 구현
  • Custom Metric을 통해 서비스 특화 지표를 Datadog에 전달해 더욱 세밀하게 모니터링 가능
  • `Tag Cardinality` 설정을 orchestrator로 하면 ECS 태그가 자동으로 추가되어 메트릭 식별이 한층 수월해집니다.

Enjoy your enhanced monitoring with Datadog! 🚀

728x90
반응형