설정

샘플 애플리케이션은 GitHub에서 확인할 수 있습니다.
  1. Datadog Python SDK를 설치합니다.

    requirements.txt 또는 pyproject.toml에 ddtrace를 추가합니다. 최신 버전은 PyPI에서 확인할 수 있습니다.

    requirements.txt

    ddtrace==<VERSION>

    또는, Dockerfile에 SDK를 설치할 수 있습니다.

    Dockerfile

    RUN pip install ddtrace

    그런 다음, ddtrace-run으로 시작 명령을 래핑하세요.

    Dockerfile

    CMD ["ddtrace-run", "python", "app.py"]

    자세한 정보는 Python 애플리케이션 추적을 참조하세요.

  2. serverless-init을 설치합니다.

    Datadog publishes new releases of the serverless-init container image to Google’s gcr.io, AWS’s ECR, and on Docker Hub:

    hub.docker.comgcr.iopublic.ecr.aws
    datadog/serverless-initgcr.io/datadoghq/serverless-initpublic.ecr.aws/datadog/serverless-init

    Images are tagged based on semantic versioning, with each new version receiving three relevant tags:

    • 1, 1-alpine: use these to track the latest minor releases, without breaking changes
    • 1.x.x, 1.x.x-alpine: use these to pin to a precise version of the library
    • latest, latest-alpine: use these to follow the latest version release, which may include breaking changes

    Add the following instructions and arguments to your Dockerfile.

    COPY --from=datadog/serverless-init:<YOUR_TAG> /datadog-init /app/datadog-init
    ENTRYPOINT ["/app/datadog-init"]
    CMD ["ddtrace-run", "python", "path/to/your/python/app.py"]
    

    Datadog expects serverless-init to be the top-level application, with the rest of your app’s command line passed in for serverless-init to execute.

    If you already have an entrypoint defined inside your Dockerfile, you can instead modify the CMD argument.

    CMD ["/app/datadog-init", "ddtrace-run", "python", "path/to/your/python/app.py"]
    

    If you require your entrypoint to be instrumented as well, you can instead swap your entrypoint and CMD arguments.

    ENTRYPOINT ["/app/datadog-init"]
    CMD ["/your_entrypoint.sh", "ddtrace-run", "python", "path/to/your/python/app.py"]
    

    As long as your command to run is passed as an argument to datadog-init, you will receive full instrumentation.


  3. 로그를 설정합니다.

    로깅을 활성화하려면 DD_LOGS_ENABLED=true 환경 변수를 설정합니다. 이렇게 하면 serverless-init이 stdout 및 stderr에서 로그를 읽을 수 있습니다.

    Datadog은 다음과 같은 환경 변수를 권장합니다.

    • ENV PYTHONUNBUFFERED=1: Python 출력이 버퍼링되지 않고 컨테이너 로그에 즉시 표시되도록 합니다.
    • ENV DD_LOGS_INJECTION=true: 지원되는 로거에 대하여 로그/트레이스 상관관계를 활성화합니다.
    • ENV DD_SOURCE=python: 고급 Datadog 로그 구문 분석을 활성화합니다.

    줄이 여러 개인 로그를 로그 메시지 하나에 보존하고자 하는 경우, 로그를 JSON 형식으로 쓰는 것이 좋습니다. 예를 들어 structlog와 같은 타사 로깅 라이브러리를 사용할 수 있습니다.

    import structlog
    
    def tracer_injection(logger, log_method, event_dict):
        event_dict.update(tracer.get_log_correlation_context())
        return event_dict
    
    structlog.configure(
        processors=[
            tracer_injection,
            structlog.processors.EventRenamer("msg"),
            structlog.processors.JSONRenderer()
        ],
        logger_factory=structlog.WriteLoggerFactory(file=sys.stdout),
    )
    
    logger = structlog.get_logger()
    
    logger.info("Hello world!")

    자세한 정보는 Python 로그 및 트레이스 상호 연결하기를 참조하세요.

  4. 애플리케이션을 구성합니다.

    After the container is built and pushed to your registry, set the required environment variables for the Datadog Agent:

    • DD_API_KEY: Your Datadog API key, used to send data to your Datadog account. For privacy and safety, configure this API key as a Google Cloud Secret.
    • DD_SITE: Your Datadog site. For example, datadoghq.com.

    For more environment variables, see the Environment variables section on this page.

    The following command deploys the service and allows any external connection to reach it. In this example, your service listening is set to port 8080. Ensure that this port number matches the exposed port inside of your Dockerfile.

    gcloud run deploy <APP_NAME>
      --image=gcr.io/<YOUR_PROJECT>/<APP_NAME> \
      --port=8080 \
      --update-env-vars=DD_API_KEY=$DD_API_KEY \
      --update-env-vars=DD_SITE=$DD_SITE \
    
  1. Add a service label in Google Cloud. In your Cloud Run service’s info panel, add a label with the following key and value:

    KeyValue
    serviceThe name of your service. Matches the value provided as the DD_SERVICE environment variable.

    See Configure labels for services in the Cloud Run documentation for instructions.

  1. 커스텀 메트릭을 전송합니다.

    커스텀 메트릭을 전송하려면, DogStatsD 클라이언트를 설치하고 코드 예시를 참고하세요. 서버리스에서는 분포 메트릭 유형만 지원됩니다.

  2. 프로파일링을 활성화합니다(미리 보기).

    Continuous Profiler를 활성화하려면 환경 변수 DD_PROFILING_ENABLED=true를 설정합니다.

    Datadog의 Continuous Profiler는 Google Cloud Run 서비스에서 미리 보기로 제공됩니다.

Environment variables

VariableDescription
DD_API_KEYDatadog API key - Required
DD_SITEDatadog site - Required
DD_SERVICEDatadog Service name. Required
DD_LOGS_ENABLEDWhen true, send logs (stdout and stderr) to Datadog. Defaults to false.
DD_LOGS_INJECTIONWhen true, enrich all logs with trace data for supported loggers. See Correlate Logs and Traces for more information.
DD_VERSIONSee Unified Service Tagging.
DD_ENVSee Unified Service Tagging.
DD_SOURCESet the log source to enable a Log Pipeline for advanced parsing. To automatically apply language-specific parsing rules, set to python, or use your custom pipeline. Defaults to cloudrun.
DD_TAGSAdd custom tags to your logs, metrics, and traces. Tags should be comma separated in key/value format (for example: key1:value1,key2:value2).

Do not set the following environment variables in your serverless environment. They should only be set in non-serverless environments.

  • DD_AGENT_HOST
  • DD_TRACE_AGENT_URL

Pub/Sub을 사용한 분산 추적

DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED=true를 설정하세요. 이렇게 하면 푸시 요청에 대해 추론된 gcp.pubsub.receive 스팬이 생성됩니다.

Google Cloud Pub/Sub 푸시 구독 추적을 사용하려면 ddtrace 버전 4.8.0 이상이 필요합니다.

To get end-to-end distributed traces between Pub/Sub producers and Cloud Run, configure your push subscriptions with the --push-no-wrapper and --push-no-wrapper-write-metadata flags. This moves message attributes from the JSON body to HTTP headers, allowing Datadog to extract producer trace context and create span links.

For more information, see Producer-aware tracing for Google Cloud Pub/Sub and Cloud Run and Payload unwrapping in the Google Cloud documentation.

Configure push subscriptions for full trace visibility

Create a new push subscription:

gcloud pubsub subscriptions create order-processor-sub \
  --topic=orders \
  --push-endpoint=https://order-processor-xyz.run.app/pubsub \
  --push-no-wrapper \
  --push-no-wrapper-write-metadata

Update an existing push subscription:

gcloud pubsub subscriptions update order-processor-sub \
  --push-no-wrapper \
  --push-no-wrapper-write-metadata

Configure Eventarc Pub/Sub triggers

Eventarc Pub/Sub triggers use push subscriptions as the underlying delivery mechanism. When you create an Eventarc trigger, GCP automatically creates a managed push subscription. However, Eventarc does not expose --push-no-wrapper-write-metadata as a trigger creation parameter, so you must manually update the auto-created subscription.

  1. Create the Eventarc trigger:

    gcloud eventarc triggers create order-processor-trigger \
      --destination-run-service=order-processor \
      --destination-run-region=us-central1 \
      --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
      --transport-topic=projects/my-project/topics/orders \
      --location=us-central1
    
  2. Find the auto-created subscription:

    gcloud pubsub subscriptions list \
      --filter="topic:projects/my-project/topics/orders" \
      --format="table(name,pushConfig.pushEndpoint)"
    

    Example output:

    NAME                                                          PUSH_ENDPOINT
    eventarc-us-central1-order-processor-trigger-abc-sub-def      https://order-processor-xyz.run.app
    
  3. Update the subscription for trace propagation:

    gcloud pubsub subscriptions update \
      eventarc-us-central1-order-processor-trigger-abc-sub-def \
      --push-no-wrapper \
      --push-no-wrapper-write-metadata
    

문제 해결

This integration depends on your runtime having a full SSL implementation. If you are using a slim image, you may need to add the following command to your Dockerfile to include certificates:

RUN apt-get update && apt-get install -y ca-certificates

To have your Cloud Run services appear in the software catalog, you must set the DD_SERVICE, DD_VERSION, and DD_ENV environment variables.

If you are using request-based billing for a Google Cloud Run application instrumented in-container, very short requests may lead to dropped logs during the post-request CPU throttling. You can control the speed at which logs are sent to Datadog using the DD_LOGS_CONFIG_BATCH_WAIT environment variable. Set DD_LOGS_CONFIG_BATCH_WAIT to a value shorter than your typical request duration to avoid dropped logs. Sidecar instrumentation also prevents this issue, as the sidecar is not affected by request-based CPU throttling.

추가 자료