이 제품은 선택한 Datadog 사이트에서 지원되지 않습니다. ().

개요

Test Optimization 데이터를 Datadog에 주입된 로그와 상호 연결하여 특정 테스트 사례에 대한 로그를 확인하고 분석할 수 있습니다.

로그와 테스트의 상관관계를 활용하여 특정 테스트 사례의 로그를 검토하세요.

설정

상관관계는 테스트 데이터를 Datadog으로 전송하는 방식에 따라 다르게 구성할 수 있습니다.

Java

Agentless 로그 전송은 다음 언어 및 프레임워크에서 지원됩니다.

  • dd-trace-java >= 1.35.2 및 Log4j2

다음 환경 변수를 사용하여 Agentless 로그 전송을 활성화하고 구성합니다.

이름설명기본값
DD_AGENTLESS_LOG_SUBMISSION_ENABLED(필수)로그 전송 활성화/비활성화false
DD_AGENTLESS_LOG_SUBMISSION_LEVEL(선택 사항)Agentless 전송을 위한 로그 수준 설정INFO
DD_AGENTLESS_LOG_SUBMISSION_QUEUE_SIZE(선택 사항)대기 중인 로그 큐의 최대 크기 설정1024
DD_AGENTLESS_LOG_SUBMISSION_URL(선택 사항)로그 전송을 위한 사용자 지정 URL 설정-

JavaScript/TypeScript

Agentless 로그 전송은 다음 트레이서 버전 및 로깅 라이브러리에서 지원됩니다.

v4 릴리스 라인의 - dd-trace-js v4.48.0 이상 또는 v5 릴리스 라인의 dd-trace-js v5.24.0 이상(winston 포함) v5 릴리스 라인의 - dd-trace-js v5.124.0 이상 또는 v6 릴리스 라인의 dd-trace-js v6.13.0 이상(pino 또는 bunyan 포함)

다음 환경 변수를 사용하여 Agentless 로그 전송을 활성화하고 구성합니다.

이름설명기본값
DD_AGENTLESS_LOG_SUBMISSION_ENABLED(필수)로그 전송 활성화/비활성화false
DD_AGENTLESS_LOG_SUBMISSION_URL(선택 사항)로그 전송을 위한 사용자 지정 URL 설정-

.NET

Agentless 로그 전송은 다음 언어 및 프레임워크에서 지원됩니다.

  • dd-trace-dotnet >= 2.50.0 및 XUnit TestOutputHelper.

다음 환경 변수를 사용하여 Agentless 로그 전송을 활성화하고 구성합니다.

이름설명기본값
DD_CIVISIBILITY_LOGS_ENABLED(필수)CI Visibility 로그 전송 활성화/비활성화false

Swift

다음 환경 변수를 사용하여 로그 전송을 활성화하고 구성합니다.

이름설명기본값
DD_ENABLE_STDOUT_INSTRUMENTATIONstdout 로그 전송 활성화/비활성화false
DD_ENABLE_STDERR_INSTRUMENTATIONstderr 로그 전송 활성화/비활성화false

Python

요구 사항: ddtrace >= 4.8.0.

로그 전송은 pytest 테스트 프레임워크에서 지원되며, 표준 라이브러리 logging 모듈을 통해 로그가 출력되는 경우에만 지원됩니다.

다음 환경 변수를 사용하여 Agentless 로그 전송 모드를 활성화합니다.

이름설명기본값
DD_AGENTLESS_LOG_SUBMISSION_ENABLED(필수)로그 전송 활성화/비활성화false

Agentless 모드 대신 Datadog Agent를 사용하는 경우, 환경에서 DD_LOGS_INJECTION=true를 설정합니다.

외부 프로세스 로그

별도의 프로세스에서 테스트로 트리거된 코드를 실행할 때, 로그를 상호 연결하려면 해당 테스트 트레이스의 trace_id 및 span_id가 필요합니다. ddtrace.testing.logs.DDTestLogsHandler(ddtrace >= 4.11.0)를 사용하여 해당 로그 레코드를 Datadog 로그 수집기로 전송하고, 기존 테스트 트레이스와 상호 연결합니다.

DDTestLogsHandler는 백엔드(Agentless 또는 EVP 프록시)를 감지하기 위해 pytest 플러그인과 동일한 환경 변수를 읽습니다. 해당 변수를 사용할 수 있는 모든 하위 프로세스에서 사용 가능합니다.

Agentless 모드(DD_CIVISIBILITY_AGENTLESS_ENABLED=true 설정):

변수설명기본값
DD_API_KEYDatadog API 키(필수)
DD_SITEDatadog 사이트datadoghq.com

Agent/EVP proxy 모드(기본값):

변수설명기본값
DD_TRACE_AGENT_URL전체 Agent URL-
DD_TRACE_AGENT_HOSTNAMEAgent 호스트 이름localhost
DD_TRACE_AGENT_PORTAgent 포트8126
작업자당 스레드

테스트 작업자당 하나의 스레드를 지정하려면 ThreadLocalCorrelationFilter를 사용하여 각 스레드의 로그 레코드를 올바른 테스트 트레이스와 상호 연결합니다.

import logging
from ddtrace.testing.logs import DDTestLogsHandler, ThreadLocalCorrelationFilter

with DDTestLogsHandler(service="my-service") as handler:
    correlation = ThreadLocalCorrelationFilter()
    handler.addFilter(correlation)
    logging.getLogger().addHandler(handler)

    while True:
        job = queue.get()  # queue and run_test are provided by your worker framework
        correlation.set_context(trace_id=job.trace_id, span_id=job.span_id)
        run_test(job.item)

DDTestLogsHandler는 컨텍스트 관리자로 사용할 경우 버퍼링된 레코드를 자동으로 플러시합니다. 컨텍스트 관리자 형식을 사용하지 않는 경우 handler.close()를 호출합니다.

Asyncio 작업자

Asyncio 기반 작업자의 경우, 스레드 로컬 스토리지가 asyncio.Task 경계를 넘어 전파되지 않으므로 ThreadLocalCorrelationFilter는 asyncio 기반 작업자와 호환되지 않습니다. CorrelationFilter 클래스를 상속하고 대신 contextvars.ContextVar를 사용합니다. 이벤트 루프는 await 경계를 넘어 자동으로 전파됩니다.

import asyncio
import contextvars
import logging
from ddtrace.testing.logs import CorrelationFilter, DDTestLogsHandler

class ContextVarCorrelationFilter(CorrelationFilter):
    def __init__(self):
        super().__init__()
        self._trace_id = contextvars.ContextVar("dd_trace_id", default=None)
        self._span_id = contextvars.ContextVar("dd_span_id", default=None)

    def set_context(self, trace_id, span_id):
        self._trace_id.set(trace_id)
        self._span_id.set(span_id)

    def get_trace_id(self):
        return self._trace_id.get()

    def get_span_id(self):
        return self._span_id.get()

async def run_one(job, correlation):
    correlation.set_context(trace_id=job.trace_id, span_id=job.span_id)
    await run_test(job.item)

async def main(jobs):
    with DDTestLogsHandler(service="my-service") as handler:
        correlation = ContextVarCorrelationFilter()
        handler.addFilter(correlation)
        logging.getLogger().addHandler(handler)
        await asyncio.gather(*(run_one(job, correlation) for job in jobs))

Ruby

Rails 애플리케이션에서는 Test Optimization을 통한 에이전트리스 로그 전송이 지원됩니다. 활성화하기 전에 애플리케이션이 Datadog 트레이싱으로 계측되었는지 확인하세요.

Agentless 로그 전송을 사용하려면 datadog-ci 버전 0.16 이상이 필요합니다. 다음과 같은 로깅 라이브러리가 지원됩니다.

  • activesupport >= 5.0(ActiveSupport::TaggedLogging을 사용하는 경우에만)
  • lograge >= 0.14
  • semantic_logger >= 4.0

다음 환경 변수를 사용하여 로그 전송을 활성화합니다.

이름설명기본값
DD_AGENTLESS_LOG_SUBMISSION_ENABLED(필수)로그 전송 활성화/비활성화false
  1. Datadog Agent를 통해 로그 수집 설정을 진행합니다.
  2. 로그 및 트레이스 상호 연결에 명시된 단계를 따릅니다.

추가 자료

추가적인 유용한 설명서, 링크 및 기사: