콘텐츠로 이동

애플리케이션 성능 모니터링(APM) 샘플링 구성 방법


Guance의 애플리케이션 성능 모니터링(APM) 기능은 OpenTracing 프로토콜을 준수하는 수집기에서 수집한 트레이스 데이터를 분석하고 관리할 수 있도록 지원합니다. 기본적으로 애플리케이션 성능 데이터는 전체 데이터 수집 방식으로 수집됩니다. 즉, 모든 호출 시 데이터가 생성됩니다. 이를 제한하지 않으면 수집되는 데이터 양이 많아져 데이터 저장 공간을 과도하게 차지하게 됩니다. 샘플링 방식을 설정하여 애플리케이션 성능 데이터를 수집하면 데이터 저장량을 절약하고 비용을 절감할 수 있습니다.

아래에서는 DDtrace 수집기 를 예로 들어 샘플링 비율을 5%로 설정하는 방법을 안내합니다.

전제 조건

  1. DataKit 설치
  2. DDtrace 수집기 활성화

샘플링 설정

애플리케이션 성능 데이터 수집을 시작하기 전에 먼저 사용하는 언어에 따라 DDtrace를 구성해야 합니다.

아래에서는 Python에서 일반적으로 사용하는 Webserver Flask 애플리케이션을 예로 들어 애플리케이션 성능 데이터를 샘플링하는 방법을 설명합니다. 예제에서 SERVICE_A는 HTTP 서비스를 제공하며 SERVICE_B HTTP 서비스를 호출합니다.

1. DDtrace 실행 환경 설치

pip install ddtrace

2. Flask 패키지 설치

pip install flask

3. 샘플링 구성

샘플링 구성 설명

SERVICE_ASERVICE_B를 생성하고, SERVICE_A에는 5% 샘플링을 설정하고, SERVICE_B는 기본 수집 설정을 사용합니다.

생성 시 DDtrace를 참조하고 서비스 이름, 서비스 이름 매핑 관계를 설정해야 하며, 환경 변수를 통해 프로젝트 이름, 환경 이름, 버전 번호 관련 정보를 설정하고 DataKit 트레이스 API 서비스 주소를 구성해야 합니다(구체적인 주소는 DataKit 주소에 따라 다르며 포트 번호는 9529입니다).

Python Flask 전체 예제를 참조하세요.

1. SERVICE_A

# -*- encoding: utf8 -*-
#--------- service_a.py ----------

from flask import Flask, request
import requests, os
from ddtrace import tracer,sampler

# 서비스 이름 설정
os.environ["DD_SERVICE"] = "SERVICE_A"

# 서비스 이름 매핑 관계 설정
os.environ["DD_SERVICE_MAPPING"] = "postgres:postgresql,defaultdb:postgresql"

# 환경 변수를 통해 프로젝트 이름, 환경 이름, 버전 번호 설정
os.environ["DD_TAGS"] = "project:your_project_name,env=test,version=v1"

# DataKit 트레이스 API 서비스 주소 구성
tracer.configure(
    hostname = "localhost",  # 실제 DataKit 주소에 따라 설정
    port     = "9529",
    sampler  = sampler.RateSampler(0.05),
)

app = Flask(__name__)

def shutdown_server():
    func = request.environ.get('werkzeug.server.shutdown')
    if func is None:
        raise RuntimeError('Not running with the Werkzeug Server')
    func()

@app.route('/a',  methods=['GET'])
def index():
    requests.get('http://127.0.0.1:54322/b')
    return 'OK', 200

@app.route('/stop',  methods=['GET'])
def stop():
    shutdown_server()
    return 'Server shutting down...\n'

# service A 시작: HTTP 서비스를 54321 포트에서 시작
if __name__ == '__main__':
    app.run(host="0.0.0.0", port=54321, debug=True)

예시:

2. SERVICE_B

# -*- encoding: utf8 -*-

#--------- service_b.py ----------

from flask import Flask, request
import os, time, requests
from ddtrace import tracer

# 서비스 이름 설정
os.environ["DD_SERVICE"] = "SERVICE_B"

# 서비스 이름 매핑 관계 설정
os.environ["DD_SERVICE_MAPPING"] = "postgres:postgresql,defaultdb:postgresql"

# 환경 변수를 통해 프로젝트 이름, 환경 이름, 버전 번호 설정
os.environ["DD_TAGS"] = "project:your_project_name,env=test,version=v1"

tracer.configure(
    hostname = "localhost",  # 실제 DataKit 주소에 따라 설정
    port="9529",
)

app = Flask(__name__)

def shutdown_server():
    func = request.environ.get('werkzeug.server.shutdown')
    if func is None:
        raise RuntimeError('Not running with the Werkzeug Server')
    func()

@app.route('/b',  methods=['GET'])
def index():
    time.sleep(1)
    return 'OK', 200

@app.route('/stop',  methods=['GET'])
def stop():
    shutdown_server()
    return 'Server shutting down...\n'

# service B 시작: HTTP 서비스를 54322 포트에서 시작
if __name__ == '__main__':
    app.run(host="0.0.0.0", port=54322, debug=True)

4. SERVICE_ASERVICE_B 시작 및 호출

# 두 서비스를 각각 백그라운드에서 시작:
(ddtrace-run python3 service_a.py &> a.log &)
(ddtrace-run python3 service_b.py &> b.log &)

# A 서비스를 호출하여 B 서비스를 호출하도록 트리거하면 해당 트레이스 데이터가 생성됩니다(여러 번 실행 가능)
curl http://localhost:54321/a

# 각 서비스 중지
curl http://localhost:54321/stop
curl http://localhost:54322/stop

5. Guance 워크스페이스에서 결과 확인

Guance 워크스페이스에 로그인하면 수집된 SERVICE_ASERVICE_B의 트레이스 데이터를 확인할 수 있습니다.

Warning

APM 샘플링은 트레이스(Trace)를 기반으로 수행됩니다. 100개의 트레이스가 있고 샘플링 비율을 5%로 설정하면, 그중 5%인 5개의 트레이스와 그 하위의 모든 Span이 무작위로 선택되어 Guance 워크스페이스에 보고됩니다.

본 예시에서 SERVICE_A는 HTTP 서비스를 제공하며 SERVICE_B HTTP 서비스를 호출합니다. 즉, 서비스 A가 서비스 B를 호출하는 것이 하나의 트레이스입니다. 100개의 트레이스가 있다면 그중 5개의 트레이스가 무작위로 보고됩니다.

추가 참고

  • 위는 클라이언트 측에서 APM 샘플링 비율을 구성하는 방법입니다. 이 외에도 DataKit을 통해 직접 샘플링 비율을 구성할 수 있습니다. APM 수집기 구성에서 샘플링을 활성화하기만 하면 됩니다.

  ## Sampler config uses to set global sampling strategy.
  ## sampling_rate used to set global sampling rate.
  [inputs.tracer.sampler]
    sampling_rate = 1.0
  • APM 샘플링을 설정하면 중요한 트레이스가 누락될 수 있습니다. 필터를 구성하여 중요한 트레이스가 반드시 보고되도록 할 수 있습니다. 예를 들어 keep_rare_resource = true를 설정하면 희소한 것으로 판단되는 트레이스가 Guance에 직접 보고됩니다.

문서 평가

이 페이지가 도움이 되었나요?