Apache APISIX에서 Datadog를 사용한 Cloud Monitoring

API7.ai

November 12, 2021

Ecosystem

커버 이미지

IT 제품과 소비자 대상 애플리케이션 개발의 복잡성이 증가함에 따라, 모니터링은 애플리케이션 제공의 필수적인 부분이 되었습니다. 또한, 안정성을 보장하면서 빠른 업그레이드 주기의 끝없는 요구를 충족시키고, 서비스 수준 지표(SLI)와 서비스 수준 목표(SLO), 서비스 수준 협약(SLA) 사이의 완벽한 균형을 유지하기 위해 효과적인 모니터링은 매우 중요합니다.

클라우드 API 관리 제품인 Apache APISIX는 애플리케이션에서 관찰 가능성 문제를 분리하여 개발자들이 비즈니스 로직에만 집중하여 애플리케이션을 구축할 수 있도록 하며, Apache APISIX가 선택한 플랫폼의 관찰 가능성을 처리합니다.

Apache APISIX는 최근 Datadog와의 더 깊은 통합을 제공하기 위해 새로운 플러그인인 APISIX-Datadog를 출시했습니다. 이 글에서는 APISIX-Datadog 플러그인과 그 기능을 소개합니다.

APISIX-Datadog 플러그인의 작동 방식

APISIX-Datadog 플러그인 아키텍처

APISIX-Datadog 플러그인은 사용자 정의 메트릭을 DogStatsD 서버로 푸시하며, Datadog 에이전트와 함께 UDP 연결을 통해 제공됩니다. DogStatsD는 기본적으로 StatsD 프로토콜의 구현입니다. 이는 Apache APISIX 에이전트의 사용자 정의 메트릭을 수집하고, 이를 단일 데이터 포인트로 집계한 후 구성된 Datadog 서버로 전송합니다. DogStatsD에 대해 더 알아보려면 DogStatsD 문서를 방문하세요.

APISIX-Datadog가 활성화되면, Apache APISIX 에이전트는 모든 요청-응답 주기에 대해 다음 메트릭을 DogStatsD 서버로 내보냅니다:

메트릭 이름StatsD 유형설명
요청 카운터카운터수신된 요청 수.
요청 지연 시간히스토그램요청을 처리하는 데 걸린 시간(밀리초).
업스트림 지연 시간히스토그램요청을 업스트림 서버로 프록시한 후 응답을 받을 때까지 걸린 시간(밀리초).
APISIX 지연 시간히스토그램APISIX 에이전트가 요청을 처리하는 데 걸린 시간(밀리초).
인그레스 크기타이머요청 본문 크기(바이트).
이그레스 크기타이머응답 본문 크기(바이트).

메트릭은 다음 태그와 함께 DogStatsD 에이전트로 전송됩니다. 특정 태그에 적합한 값이 없으면 해당 태그는 생략됩니다.

메트릭 이름설명
route_name라우트 스키마 정의에 지정된 이름. 없으면 라우트 ID 값으로 대체됩니다.
service_id서비스 추상화로 생성된 라우트인 경우, 특정 서비스 ID가 사용됩니다.
consumer라우트에 연결된 소비자가 있는 경우, 소비자 사용자 이름이 태그로 추가됩니다.
balancer_ip현재 요청을 처리한 업스트림 밸런서의 IP.
response_statusHTTP 응답 상태 코드.
scheme요청을 만드는 데 사용된 스키마, 예: HTTP, gRPC, gRPCs 등.

플러그인은 타이머와 함께 버퍼를 유지합니다. 타이머가 만료되면, APISIX-Datadog 플러그인은 버퍼링된 메트릭을 일괄적으로 로컬에서 실행 중인 dogstatsd 서버로 플래시합니다. 이 접근 방식은 동일한 UDP 소켓을 재사용하여 리소스를 덜 소모하며(비록 UDP 소켓이 매우 가볍기 때문에 중요하지 않을 수 있음), 타이머를 구성할 수 있으므로 네트워크를 항상 과부하시키지 않습니다.

Datadog 에이전트 실행 단계

  1. 이미 인프라 내에서 Datadog를 사용 중이라면, 시스템에 Datadog 에이전트가 설치되어 있을 것입니다. 이는 Docker 컨테이너, Pod 또는 각 패키지 관리자의 바이너리일 수 있습니다. 이 경우, 이미 준비가 된 것입니다. 방화벽(있는 경우)을 통해 포트 8125/udp가 허용되는지 확인하세요. 즉, Apache APISIX 에이전트가 Datadog 에이전트의 포트 8125에 접근할 수 있는지 확인하세요. 이 하위 섹션을 건너뛰어도 됩니다.

전체 Datadog 에이전트를 설치하는 방법에 대해 더 알아보려면 여기를 방문하세요.

  1. Datadog를 처음 사용하는 경우
    1. 먼저 www.datadoghq.com을 방문하여 계정을 생성하세요.
    2. API 키를 생성하세요. API 키 생성
  2. APISIX-Datadog 플러그인은 datadog/agent의 dogstatsd 구성 요소만 필요로 합니다. 이는 플러그인이 비동기적으로 메트릭을 표준 UDP 소켓을 통해 statsd 프로토콜에 따라 dogstatsd 서버로 전송하기 때문입니다. 따라서 APISIX는 전체 에이전트 대신 독립 실행형 datadog/dogstatsd 이미지를 사용할 것을 권장합니다. 이는 ~2.8GB의 datadog/agent 이미지에 비해 매우 가볍습니다(~11MB).

컨테이너로 실행하려면:

# 최신 이미지 가져오기
docker pull datadog/dogstatsd:latest
# 분리된 컨테이너 실행
docker run -d --name dogstatsd-agent -e DD_API_KEY=<2단계에서 얻은 API 키> -p 8125:8125/udp  datadog/dogstatsd

프로덕션 환경에서 Kubernetes를 사용 중이라면, dogstatsdDaemonset 또는 Apache APISIX 에이전트와 함께 Multi-Container Pod로 배포할 수 있습니다.

Apache APISIX와 함께 Datadog 사용 방법

APISIX-Datadog 플러그인 활성화

다음은 특정 라우트에 대해 datadog 플러그인을 활성화하는 방법의 예입니다. dogstatsd 에이전트가 이미 실행 중이라고 가정합니다.

# 특정 라우트에 플러그인 활성화
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "plugins": {
        "datadog": {}
    },
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "127.0.0.1:1980": 1
        }
    },
    "uri": "/hello"
}'

이제 /hello 엔드포인트 URI에 대한 모든 요청은 위의 메트릭을 생성하고 이를 로컬 Datadog 에이전트의 DogStatsD 서버로 푸시합니다.

사용자 정의 구성

기본 구성에서, 플러그인은 dogstatsd 서비스가 127.0.0.1:8125에서 사용 가능할 것으로 예상합니다. 구성을 업데이트하려면 플러그인 메타데이터를 업데이트하세요:

메타데이터 스키마

이름유형필수 여부기본값설명
hosts문자열선택 사항"127.0.0.1"DogStatsD 서버 호스트 주소
port정수선택 사항8125DogStatsD 서버 호스트 포트
namespace문자열선택 사항"apisix"APISIX 에이전트가 전송한 모든 사용자 정의 메트릭의 접두사. 메트릭 그래프에서 엔티티를 찾는 데 유용합니다. 예: (apisix.request.counter)
constant_tags배열선택 사항["source
"]
생성된 메트릭에 포함된 정적 태그. 특정 신호에 대해 메트릭을 그룹화하는 데 유용합니다.

태그를 효과적으로 작성하는 방법에 대해 더 알아보려면 여기를 방문하세요.

다음과 같이 업데이트된 메타데이터로 /apisix/admin/plugin_metadata 엔드포인트에 요청을 보내세요:

curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/datadog -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "host": "127.0.0.1",
    "port": 8125,
    "constant_tags": [
        "source:apisix",
        "service:custom"
    ],
    "namespace": "apisix"
}'

플러그인 스키마

마찬가지로, 플러그인을 활성화하면서 몇 가지 속성을 조정할 수 있습니다.

이름유형필수 여부기본값유효 값설명
batch_max_size정수선택 사항5000[1,...]각 배치의 최대 버퍼 크기
inactive_timeout정수선택 사항5[1,...]비활성 상태일 때 버퍼가 플래시될 최대 시간(초)
buffer_duration정수선택 사항60[1,...]배치가 처리되기 전에 배치 내 가장 오래된 항목의 최대 시간(초)
max_retry_count정수선택 사항1[1,...]dogstatsd 서버에 도달하지 못한 경우 최대 재시도 횟수

모든 필드는 선택 사항이며, 속성이 설정되지 않으면 datadog 플러그인은 기본값으로 인스턴스화됩니다. 속성을 업데이트하려면, 필요한 라우트, 서비스 또는 소비자를 업데이트된 속성 값으로 업데이트하세요. 예를 들어, 아래 코드는 각 배치의 최대 버퍼 크기를 수정합니다:

'{
...
"plugins": {
    "datadog": {
        "batch_max_size": 10
    }
}
... }'

APISIX-Datadog 플러그인 비활성화

이제 플러그인을 비활성화하려면, 플러그인 구성에서 해당 JSON 구성을 제거하여 datadog를 비활성화하세요. APISIX 플러그인은 핫 리로드되므로 APISIX를 재시작할 필요가 없습니다.

# 라우트에 대한 플러그인 비활성화
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "uri": "/hello",
    "plugins": {},
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "127.0.0.1:1980": 1
        }
    }
}'
Tags: