From d9cf9fa9059401ebc46f0619e2d991e8e9271540 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Tue, 4 Mar 2025 15:56:32 -0500 Subject: [PATCH 001/164] chore: remove the hardcoded 2.21.3 version in dockerfile (#568) * remove the hardcoded 2.21.3 version in dockerfile * Apply suggestions from code review Co-authored-by: datadog-datadog-prod-us1[bot] <88084959+datadog-datadog-prod-us1[bot]@users.noreply.github.com> --------- Co-authored-by: Munir Abdinur Co-authored-by: datadog-datadog-prod-us1[bot] <88084959+datadog-datadog-prod-us1[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 757d671ab..7f522e5ab 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ ENV PATH=/root/.cargo/bin:$PATH # Install datadog_lambda and dependencies from local COPY . . -RUN pip install . ddtrace==2.21.3 -t ./python/lib/$runtime/site-packages +RUN pip install --no-cache-dir . -t ./python/lib/$runtime/site-packages # Remove botocore (40MB) to reduce package size. aws-xray-sdk # installs it, while it's already provided by the Lambda Runtime. From aec49103a8a68362bea6bf1509b7bc51df7a3088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jordan=20gonz=C3=A1lez?= <30836115+duncanista@users.noreply.github.com> Date: Tue, 4 Mar 2025 15:58:02 -0500 Subject: [PATCH 002/164] add `CODEOWNERS` (#569) --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..e53b26464 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @DataDog/serverless-aws From 53306e38df8514525649789495baa7cad91eecd6 Mon Sep 17 00:00:00 2001 From: Aleksandr Pasechnik Date: Tue, 4 Mar 2025 16:45:00 -0500 Subject: [PATCH 003/164] chore: new govcloud release script (#567) also refactoring the environments template datasource and adding layer bundling jobs. --- ci/datasources/environments.yaml | 4 +- ci/input_files/build.yaml.tpl | 66 +++++++++++--- ci/publish_layers.sh | 36 ++++++-- scripts/publish_govcloud.sh | 105 ++++++++++++++++++++++ scripts/publish_prod.sh | 144 +++++++++++++------------------ 5 files changed, 255 insertions(+), 100 deletions(-) create mode 100755 scripts/publish_govcloud.sh diff --git a/ci/datasources/environments.yaml b/ci/datasources/environments.yaml index 90056ab00..1ae2b4d71 100644 --- a/ci/datasources/environments.yaml +++ b/ci/datasources/environments.yaml @@ -1,9 +1,9 @@ environments: - - name: sandbox + sandbox: external_id: sandbox-publish-externalid role_to_assume: sandbox-layer-deployer account: 425362996713 - - name: prod + prod: external_id: prod-publish-externalid role_to_assume: dd-serverless-layer-deployer-role account: 464622532012 diff --git a/ci/input_files/build.yaml.tpl b/ci/input_files/build.yaml.tpl index eae6b0d19..769f87f5c 100644 --- a/ci/input_files/build.yaml.tpl +++ b/ci/input_files/build.yaml.tpl @@ -103,9 +103,6 @@ integration-test ({{ $runtime.name }}-{{ $runtime.arch }}): script: - RUNTIME_PARAM={{ $runtime.python_version }} ARCH={{ $runtime.arch }} ./scripts/run_integration_tests.sh -{{ range $environment := (ds "environments").environments }} - -{{ if or (eq $environment.name "prod") }} sign-layer ({{ $runtime.name }}-{{ $runtime.arch }}): stage: sign tags: ["arch:amd64"] @@ -128,22 +125,25 @@ sign-layer ({{ $runtime.name }}-{{ $runtime.arch }}): before_script: - apt-get update - apt-get install -y uuid-runtime + {{ with $environment := (ds "environments").environments.prod }} - EXTERNAL_ID_NAME={{ $environment.external_id }} ROLE_TO_ASSUME={{ $environment.role_to_assume }} AWS_ACCOUNT={{ $environment.account }} source ./ci/get_secrets.sh + {{ end }} script: - - LAYER_FILE=datadog_lambda_py-{{ $runtime.arch}}-{{ $runtime.python_version }}.zip ./scripts/sign_layers.sh {{ $environment.name }} -{{ end }} + - LAYER_FILE=datadog_lambda_py-{{ $runtime.arch}}-{{ $runtime.python_version }}.zip ./scripts/sign_layers.sh prod + +{{ range $environment_name, $environment := (ds "environments").environments }} -publish-layer-{{ $environment.name }} ({{ $runtime.name }}-{{ $runtime.arch }}): +publish-layer-{{ $environment_name }} ({{ $runtime.name }}-{{ $runtime.arch }}): stage: publish tags: ["arch:amd64"] image: registry.ddbuild.io/images/docker:20.10-py3 rules: - - if: '"{{ $environment.name }}" =~ /^(sandbox|staging)/' + - if: '"{{ $environment_name }}" == "sandbox"' when: manual allow_failure: true - if: '$CI_COMMIT_TAG =~ /^v.*/' needs: -{{ if or (eq $environment.name "prod") }} +{{ if or (eq $environment_name "prod") }} - sign-layer ({{ $runtime.name }}-{{ $runtime.arch}}) {{ else }} - build-layer ({{ $runtime.name }}-{{ $runtime.arch }}) @@ -153,7 +153,7 @@ publish-layer-{{ $environment.name }} ({{ $runtime.name }}-{{ $runtime.arch }}): - integration-test ({{ $runtime.name }}-{{ $runtime.arch }}) {{ end }} dependencies: -{{ if or (eq $environment.name "prod") }} +{{ if or (eq $environment_name "prod") }} - sign-layer ({{ $runtime.name }}-{{ $runtime.arch}}) {{ else }} - build-layer ({{ $runtime.name }}-{{ $runtime.arch }}) @@ -166,7 +166,7 @@ publish-layer-{{ $environment.name }} ({{ $runtime.name }}-{{ $runtime.arch }}): before_script: - EXTERNAL_ID_NAME={{ $environment.external_id }} ROLE_TO_ASSUME={{ $environment.role_to_assume }} AWS_ACCOUNT={{ $environment.account }} source ./ci/get_secrets.sh script: - - STAGE={{ $environment.name }} PYTHON_VERSION={{ $runtime.python_version }} ARCH={{ $runtime.arch }} ./ci/publish_layers.sh + - STAGE={{ $environment_name }} PYTHON_VERSION={{ $runtime.python_version }} ARCH={{ $runtime.arch }} ./ci/publish_layers.sh {{- end }} @@ -186,3 +186,49 @@ publish-pypi-package: {{- end }} script: - ./ci/publish_pypi.sh + +layer bundle: + stage: build + tags: ["arch:amd64"] + image: registry.ddbuild.io/images/docker:20.10 + needs: + {{ range (ds "runtimes").runtimes }} + - build-layer ({{ .name }}-{{ .arch }}) + {{ end }} + dependencies: + {{ range (ds "runtimes").runtimes }} + - build-layer ({{ .name }}-{{ .arch }}) + {{ end }} + artifacts: + expire_in: 1 hr + paths: + - datadog_lambda_py-bundle-${CI_JOB_ID}/ + name: datadog_lambda_py-bundle-${CI_JOB_ID} + script: + - rm -rf datadog_lambda_py-bundle-${CI_JOB_ID} + - mkdir -p datadog_lambda_py-bundle-${CI_JOB_ID} + - cp .layers/datadog_lambda_py-*.zip datadog_lambda_py-bundle-${CI_JOB_ID} + +signed layer bundle: + stage: sign + image: registry.ddbuild.io/images/docker:20.10-py3 + tags: ["arch:amd64"] + rules: + - if: '$CI_COMMIT_TAG =~ /^v.*/' + needs: + {{ range (ds "runtimes").runtimes }} + - sign-layer ({{ .name }}-{{ .arch }}) + {{ end }} + dependencies: + {{ range (ds "runtimes").runtimes }} + - sign-layer ({{ .name }}-{{ .arch }}) + {{ end }} + artifacts: + expire_in: 1 day + paths: + - datadog_lambda_py-signed-bundle-${CI_JOB_ID}/ + name: datadog_lambda_py-signed-bundle-${CI_JOB_ID} + script: + - rm -rf datadog_lambda_py-signed-bundle-${CI_JOB_ID} + - mkdir -p datadog_lambda_py-signed-bundle-${CI_JOB_ID} + - cp .layers/datadog_lambda_py-*.zip datadog_lambda_py-signed-bundle-${CI_JOB_ID} diff --git a/ci/publish_layers.sh b/ci/publish_layers.sh index 85317ddd8..58257bf11 100755 --- a/ci/publish_layers.sh +++ b/ci/publish_layers.sh @@ -24,7 +24,20 @@ AWS_CLI_PYTHON_VERSIONS=( "python3.13" "python3.13" ) -PYTHON_VERSIONS=("3.8-amd64" "3.8-arm64" "3.9-amd64" "3.9-arm64" "3.10-amd64" "3.10-arm64" "3.11-amd64" "3.11-arm64" "3.12-amd64" "3.12-arm64" "3.13-amd64" "3.13-arm64") +PYTHON_VERSIONS=( + "3.8-amd64" + "3.8-arm64" + "3.9-amd64" + "3.9-arm64" + "3.10-amd64" + "3.10-arm64" + "3.11-amd64" + "3.11-arm64" + "3.12-amd64" + "3.12-arm64" + "3.13-amd64" + "3.13-arm64" +) LAYER_PATHS=( ".layers/datadog_lambda_py-amd64-3.8.zip" ".layers/datadog_lambda_py-arm64-3.8.zip" @@ -53,11 +66,16 @@ LAYERS=( "Datadog-Python313" "Datadog-Python313-ARM" ) -STAGES=('prod', 'sandbox', 'staging') +STAGES=('prod', 'sandbox', 'staging', 'gov-staging', 'gov-prod') printf "Starting script...\n\n" -printf "Installing dependencies\n" -pip install awscli + +if [ -z "$SKIP_PIP_INSTALL" ]; then + echo "Installing dependencies" + pip install awscli +else + echo "Skipping pip install" +fi publish_layer() { region=$1 @@ -89,7 +107,7 @@ fi printf "Python version specified: $PYTHON_VERSION\n" if [[ ! ${PYTHON_VERSIONS[@]} =~ $PYTHON_VERSION ]]; then - printf "[Error] Unsupported PYTHON_VERSION found.\n" + printf "[Error] Unsupported PYTHON_VERSION found: $PYTHON_VERSION.\n" exit 1 fi @@ -133,8 +151,14 @@ if [[ ! ${STAGES[@]} =~ $STAGE ]]; then fi layer="${LAYERS[$index]}" +if [ -z "$LAYER_NAME_SUFFIX" ]; then + echo "No layer name suffix" +else + layer="${layer}-${LAYER_NAME_SUFFIX}" +fi +echo "layer name: $layer" -if [[ "$STAGE" =~ ^(staging|sandbox)$ ]]; then +if [[ "$STAGE" =~ ^(staging|sandbox|gov-staging)$ ]]; then # Deploy latest version latest_version=$(aws lambda list-layer-versions --region $REGION --layer-name $layer --query 'LayerVersions[0].Version || `0`') VERSION=$(($latest_version + 1)) diff --git a/scripts/publish_govcloud.sh b/scripts/publish_govcloud.sh new file mode 100755 index 000000000..5fd107b0e --- /dev/null +++ b/scripts/publish_govcloud.sh @@ -0,0 +1,105 @@ +#! /usr/bin/env bash + +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2025 Datadog, Inc. +# +# USAGE: download the layer bundle from the build pipeline in gitlab. Use the +# Download button on the `layer bundle` job. This will be a zip file containing +# all of the required layers. Run this script as follows: +# +# ENVIRONMENT=[us1-staging-fed or us1-fed] [LAYER_NAME_SUFFIX=optional-layer-suffix] [REGIONS=us-gov-west-1] ./scripts/publish_govcloud.sh +# +# protip: you can drag the zip file from finder into your terminal to insert +# its path. + +set -e + +LAYER_PACKAGE=$1 + +if [ -z "$LAYER_PACKAGE" ]; then + printf "[ERROR]: layer package not provided\n" + exit 1 +fi + +PACKAGE_NAME=$(basename "$LAYER_PACKAGE" .zip) + +if [ -z "$ENVIRONMENT" ]; then + printf "[ERROR]: ENVIRONMENT not specified\n" + exit 1 +fi + +if [ "$ENVIRONMENT" = "us1-staging-fed" ]; then + AWS_VAULT_ROLE=sso-govcloud-us1-staging-fed-power-user + + export STAGE=gov-staging + + if [[ ! "$PACKAGE_NAME" =~ ^datadog_lambda_py-(signed-)?bundle-[0-9]+$ ]]; then + echo "[ERROR]: Unexpected package name: $PACKAGE_NAME" + exit 1 + fi + +elif [ $ENVIRONMENT = "us1-fed" ]; then + AWS_VAULT_ROLE=sso-govcloud-us1-fed-engineering + + export STAGE=gov-prod + + if [[ ! "$PACKAGE_NAME" =~ ^datadog_lambda_py-signed-bundle-[0-9]+$ ]]; then + echo "[ERROR]: Unexpected package name: $PACKAGE_NAME" + exit 1 + fi + +else + printf "[ERROR]: ENVIRONMENT not supported, must be us1-staging-fed or us1-fed.\n" + exit 1 +fi + +TEMP_DIR=$(mktemp -d) +unzip $LAYER_PACKAGE -d $TEMP_DIR +cp -v $TEMP_DIR/$PACKAGE_NAME/*.zip .layers/ + + +AWS_VAULT_PREFIX="aws-vault exec $AWS_VAULT_ROLE --" + +echo "Checking that you have access to the GovCloud AWS account" +$AWS_VAULT_PREFIX aws sts get-caller-identity + + +AVAILABLE_REGIONS=$($AWS_VAULT_PREFIX aws ec2 describe-regions | jq -r '.[] | .[] | .RegionName') + +# Determine the target regions +if [ -z "$REGIONS" ]; then + echo "Region not specified, running for all available regions." + REGIONS=$AVAILABLE_REGIONS +else + echo "Region specified: $REGIONS" + if [[ ! "$AVAILABLE_REGIONS" == *"$REGIONS"* ]]; then + echo "Could not find $REGIONS in available regions: $AVAILABLE_REGIONS" + echo "" + echo "EXITING SCRIPT." + exit 1 + fi +fi + +for region in $REGIONS +do + echo "Starting publishing layers for region $region..." + + export REGION=$region + + for python_version in "3.8" "3.9" "3.10" "3.11" "3.12" "3.13"; do + for arch in "amd64" "arm64"; do + export PYTHON_VERSION=$python_version + export ARCH=$arch + + export SKIP_PIP_INSTALL=true + + echo "Publishing layer for $PYTHON_VERSION and $ARCH" + + $AWS_VAULT_PREFIX ./ci/publish_layers.sh + done + done +done + +echo "Done !" diff --git a/scripts/publish_prod.sh b/scripts/publish_prod.sh index f3d13653c..d2918c544 100755 --- a/scripts/publish_prod.sh +++ b/scripts/publish_prod.sh @@ -6,6 +6,11 @@ set -e read -p "Are we only doing the simplified GovCloud release? ONLY IF THE NORMAL RELEASE IS DONE AND YOU HAVE DOWNLOADED THE LAYERS (y/n)? " GOVCLOUD_ONLY +if [ $GOVCLOUD_ONLY != "n" ]; then + echo "GovCloud publishing is now supported only in publich_govcloud.sh" + exit 1 +fi + # Ensure on main, and pull the latest BRANCH=$(git rev-parse --abbrev-ref HEAD) if [ $BRANCH != "main" ]; then @@ -34,107 +39,82 @@ else fi # Ensure pypi registry access -if [ $GOVCLOUD_ONLY == "y" ]; then - echo "Skipping PyPI check since this is a GovCloud-only release" - -else - read -p "Do you have access to PyPI (y/n)?" CONT - if [ "$CONT" != "y" ]; then - echo "Exiting" - exit 1 - fi +read -p "Do you have access to PyPI (y/n)?" CONT +if [ "$CONT" != "y" ]; then + echo "Exiting" + exit 1 fi CURRENT_VERSION=$(poetry version --short) LAYER_VERSION=$(echo $NEW_VERSION | cut -d '.' -f 2) -if [ $GOVCLOUD_ONLY == "y" ]; then - echo "Skipping Libary Updates, code changes, layer builds and signing for GovCloud-only release" +read -p "Ready to update the library version from $CURRENT_VERSION to $NEW_VERSION and publish layer version $LAYER_VERSION (y/n)?" CONT +if [ "$CONT" != "y" ]; then + echo "Exiting" + exit 1 +fi +echo "Answer 'n' if already done in a PR" +read -p "Update pyproject.toml version? (y/n)?" CONT +if [ "$CONT" != "y" ]; then + echo "Skipping updating package.json version" else - read -p "Ready to update the library version from $CURRENT_VERSION to $NEW_VERSION and publish layer version $LAYER_VERSION (y/n)?" CONT - if [ "$CONT" != "y" ]; then - echo "Exiting" - exit 1 - fi - - echo "Answer 'n' if already done in a PR" - read -p "Update pyproject.toml version? (y/n)?" CONT - if [ "$CONT" != "y" ]; then - echo "Skipping updating package.json version" - else - echo - echo "Replacing version in pyproject.toml and datadog_lambda/version.py" - echo - - poetry version ${NEW_VERSION} - echo "__version__ = \"${NEW_VERSION}\"" > datadog_lambda/version.py - fi - echo - echo "Building layers..." - ./scripts/build_layers.sh - + echo "Replacing version in pyproject.toml and datadog_lambda/version.py" echo - echo "Signing layers for commercial AWS regions" - aws-vault exec sso-prod-engineering -- ./scripts/sign_layers.sh prod - - echo "Answer 'n' if GitLab already did this" - read -p "Deploy layers to commercial AWS (y/n)?" CONT - if [ "$CONT" != "y" ]; then - echo "Skipping deployment to commercial AWS" - else - echo "Ensuring you have access to the production AWS account" - aws-vault exec sso-prod-engineering -- aws sts get-caller-identity - - echo - echo "Publishing layers to commercial AWS regions" - VERSION=$LAYER_VERSION aws-vault exec sso-prod-engineering --no-session -- ./scripts/publish_layers.sh - fi + + poetry version ${NEW_VERSION} + echo "__version__ = \"${NEW_VERSION}\"" > datadog_lambda/version.py fi -read -p "Deploy layers to GovCloud AWS (y/n)?" CONT +echo +echo "Building layers..." +./scripts/build_layers.sh + +echo +echo "Signing layers for commercial AWS regions" +aws-vault exec sso-prod-engineering -- ./scripts/sign_layers.sh prod + +echo "Answer 'n' if GitLab already did this" +read -p "Deploy layers to commercial AWS (y/n)?" CONT if [ "$CONT" != "y" ]; then - echo "Skipping deployment to GovCloud AWS" + echo "Skipping deployment to commercial AWS" else - echo "Ensuring you have access to the AWS GovCloud account" - aws-vault exec sso-govcloud-us1-fed-engineering -- aws sts get-caller-identity + echo "Ensuring you have access to the production AWS account" + aws-vault exec sso-prod-engineering -- aws sts get-caller-identity - echo "Publishing layers to GovCloud AWS regions" - VERSION=$LAYER_VERSION aws-vault exec sso-govcloud-us1-fed-engineering -- ./scripts/publish_layers.sh + echo + echo "Publishing layers to commercial AWS regions" + VERSION=$LAYER_VERSION aws-vault exec sso-prod-engineering --no-session -- ./scripts/publish_layers.sh fi -if [ $GOVCLOUD_ONLY == "y" ]; then - echo "Skipping PyPI check and Github Release since this is a GovCloud-only release" - +echo "Answer 'n' if GitLab already did this" +read -p "Ready to publish $NEW_VERSION to PyPI (y/n)?" CONT +if [ "$CONT" != "y" ]; then + echo "Skipping publishing to PyPI" else - echo "Answer 'n' if GitLab already did this" - read -p "Ready to publish $NEW_VERSION to PyPI (y/n)?" CONT - if [ "$CONT" != "y" ]; then - echo "Skipping publishing to PyPI" - else - echo - echo "Publishing to https://pypi.org/project/datadog-lambda/" - ./scripts/pypi.sh - fi - - - echo "Answer 'n' if you already released in GitHub" - read -p "Do you want to bump the version in GitHub? (y/n)" CONT - if [ "$CONT" != "y" ]; then - echo "Skipping publishing updates to GitHub" - else - echo - echo 'Publishing updates to github' - git commit pyproject.toml datadog_lambda/version.py -m "Bump version to ${NEW_VERSION}" - git push origin main - git tag "v$LAYER_VERSION" - git push origin "refs/tags/v$LAYER_VERSION" - fi + echo + echo "Publishing to https://pypi.org/project/datadog-lambda/" + ./scripts/pypi.sh +fi + +echo "Answer 'n' if you already released in GitHub" +read -p "Do you want to bump the version in GitHub? (y/n)" CONT +if [ "$CONT" != "y" ]; then + echo "Skipping publishing updates to GitHub" +else echo - echo "Now create a new release with the tag v${LAYER_VERSION} created unless you have done this already" - echo "https://github.com/DataDog/datadog-lambda-python/releases/new?tag=v$LAYER_VERSION&title=v$LAYER_VERSION" + echo 'Publishing updates to github' + git commit pyproject.toml datadog_lambda/version.py -m "Bump version to ${NEW_VERSION}" + git push origin main + git tag "v$LAYER_VERSION" + git push origin "refs/tags/v$LAYER_VERSION" fi + +echo +echo "Now create a new release with the tag v${LAYER_VERSION} created unless you have done this already" +echo "https://github.com/DataDog/datadog-lambda-python/releases/new?tag=v$LAYER_VERSION&title=v$LAYER_VERSION" + # Open a PR to the documentation repo to automatically bump layer version VERSION=$LAYER_VERSION LAYER=datadog-lambda-python ./scripts/create_documentation_pr.sh From dc1ccba4b81d80097341057bf786c25ec0efc52a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jordan=20gonz=C3=A1lez?= <30836115+duncanista@users.noreply.github.com> Date: Tue, 4 Mar 2025 17:06:41 -0500 Subject: [PATCH 004/164] update `CODEOWNERS` (#570) --- .github/CODEOWNERS | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e53b26464..26b4b78e4 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1,6 @@ -* @DataDog/serverless-aws +* @DataDog/serverless-aws +datadog_lambda/tracing.py @DataDog/apm-serverless +datadog_lambda/patch.py @DataDog/apm-serverless +datadog_lambda/span_points.py @DataDog/apm-serverless +datadog_lambda/cold_start.py @DataDog/apm-serverless +datadog_lambda/wrapper.py @DataDog/apm-serverless From fc0beaae643d59a4745ae6d8da163ad39cdb5970 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Fri, 7 Mar 2025 10:24:16 -0800 Subject: [PATCH 005/164] Pin ddtrace to Date: Mon, 10 Mar 2025 19:53:38 -0400 Subject: [PATCH 006/164] Enable LLM Observability with `agentless_enabled=True` by default with a parsed API key (#572) * enable llmobs agentless with parsed api_key * extract getting api key to its own function * lint --- datadog_lambda/api.py | 58 ++++++++++++++++++++++++--------------- datadog_lambda/wrapper.py | 9 +++++- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/datadog_lambda/api.py b/datadog_lambda/api.py index b5414fd95..a114fe8fe 100644 --- a/datadog_lambda/api.py +++ b/datadog_lambda/api.py @@ -4,6 +4,7 @@ logger = logging.getLogger(__name__) KMS_ENCRYPTION_CONTEXT_KEY = "LambdaFunctionName" +api_key = None def decrypt_kms_api_key(kms_client, ciphertext): @@ -46,6 +47,40 @@ def decrypt_kms_api_key(kms_client, ciphertext): return plaintext +def get_api_key() -> str: + """ + Gets the Datadog API key from the environment variables or secrets manager. + Extracts the result to a global value to avoid repeated calls to the + secrets manager from different products. + """ + global api_key + if api_key: + return api_key + + import boto3 + + DD_API_KEY_SECRET_ARN = os.environ.get("DD_API_KEY_SECRET_ARN", "") + DD_API_KEY_SSM_NAME = os.environ.get("DD_API_KEY_SSM_NAME", "") + DD_KMS_API_KEY = os.environ.get("DD_KMS_API_KEY", "") + DD_API_KEY = os.environ.get("DD_API_KEY", os.environ.get("DATADOG_API_KEY", "")) + + if DD_API_KEY_SECRET_ARN: + api_key = boto3.client("secretsmanager").get_secret_value( + SecretId=DD_API_KEY_SECRET_ARN + )["SecretString"] + elif DD_API_KEY_SSM_NAME: + api_key = boto3.client("ssm").get_parameter( + Name=DD_API_KEY_SSM_NAME, WithDecryption=True + )["Parameter"]["Value"] + elif DD_KMS_API_KEY: + kms_client = boto3.client("kms") + api_key = decrypt_kms_api_key(kms_client, DD_KMS_API_KEY) + else: + api_key = DD_API_KEY + + return api_key + + def init_api(): if not os.environ.get("DD_FLUSH_TO_LOG", "").lower() == "true": # Make sure that this package would always be lazy-loaded/outside from the critical path @@ -54,28 +89,7 @@ def init_api(): from datadog import api if not api._api_key: - import boto3 - - DD_API_KEY_SECRET_ARN = os.environ.get("DD_API_KEY_SECRET_ARN", "") - DD_API_KEY_SSM_NAME = os.environ.get("DD_API_KEY_SSM_NAME", "") - DD_KMS_API_KEY = os.environ.get("DD_KMS_API_KEY", "") - DD_API_KEY = os.environ.get( - "DD_API_KEY", os.environ.get("DATADOG_API_KEY", "") - ) - - if DD_API_KEY_SECRET_ARN: - api._api_key = boto3.client("secretsmanager").get_secret_value( - SecretId=DD_API_KEY_SECRET_ARN - )["SecretString"] - elif DD_API_KEY_SSM_NAME: - api._api_key = boto3.client("ssm").get_parameter( - Name=DD_API_KEY_SSM_NAME, WithDecryption=True - )["Parameter"]["Value"] - elif DD_KMS_API_KEY: - kms_client = boto3.client("kms") - api._api_key = decrypt_kms_api_key(kms_client, DD_KMS_API_KEY) - else: - api._api_key = DD_API_KEY + api._api_key = get_api_key() logger.debug("Setting DATADOG_API_KEY of length %d", len(api._api_key)) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 2632d22eb..6afa9a070 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -56,10 +56,14 @@ if profiling_env_var: from ddtrace.profiling import profiler +llmobs_api_key = None llmobs_env_var = os.environ.get("DD_LLMOBS_ENABLED", "false").lower() in ("true", "1") if llmobs_env_var: + from datadog_lambda.api import get_api_key from ddtrace.llmobs import LLMObs + llmobs_api_key = get_api_key() + logger = logging.getLogger(__name__) DD_FLUSH_TO_LOG = "DD_FLUSH_TO_LOG" @@ -229,7 +233,10 @@ def __init__(self, func): # Enable LLM Observability if llmobs_env_var: - LLMObs.enable() + LLMObs.enable( + agentless_enabled=True, + api_key=llmobs_api_key, + ) logger.debug("datadog_lambda_wrapper initialized") except Exception as e: From 71b64fa1de4c0e56bb49cc2201a87da0d10409c5 Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Wed, 12 Mar 2025 14:16:42 -0400 Subject: [PATCH 007/164] Use FIPs endpoints in Govcloud regions (#575) --- datadog_lambda/api.py | 31 +++++++++++++-- tests/test_api.py | 89 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 tests/test_api.py diff --git a/datadog_lambda/api.py b/datadog_lambda/api.py index a114fe8fe..031359122 100644 --- a/datadog_lambda/api.py +++ b/datadog_lambda/api.py @@ -64,16 +64,41 @@ def get_api_key() -> str: DD_KMS_API_KEY = os.environ.get("DD_KMS_API_KEY", "") DD_API_KEY = os.environ.get("DD_API_KEY", os.environ.get("DATADOG_API_KEY", "")) + REGION = os.environ.get("AWS_REGION", "") + is_gov_region = REGION.startswith("us-gov-") + if is_gov_region: + logger.debug( + "Govcloud region detected. Using FIPs endpoints for secrets management." + ) + if DD_API_KEY_SECRET_ARN: - api_key = boto3.client("secretsmanager").get_secret_value( + # Secrets manager endpoints: https://docs.aws.amazon.com/general/latest/gr/asm.html + fips_endpoint = ( + f"https://secretsmanager-fips.{REGION}.amazonaws.com" + if is_gov_region + else None + ) + secrets_manager_client = boto3.client( + "secretsmanager", endpoint_url=fips_endpoint + ) + api_key = secrets_manager_client.get_secret_value( SecretId=DD_API_KEY_SECRET_ARN )["SecretString"] elif DD_API_KEY_SSM_NAME: - api_key = boto3.client("ssm").get_parameter( + # SSM endpoints: https://docs.aws.amazon.com/general/latest/gr/ssm.html + fips_endpoint = ( + f"https://ssm-fips.{REGION}.amazonaws.com" if is_gov_region else None + ) + ssm_client = boto3.client("ssm", endpoint_url=fips_endpoint) + api_key = ssm_client.get_parameter( Name=DD_API_KEY_SSM_NAME, WithDecryption=True )["Parameter"]["Value"] elif DD_KMS_API_KEY: - kms_client = boto3.client("kms") + # KMS endpoints: https://docs.aws.amazon.com/general/latest/gr/kms.html + fips_endpoint = ( + f"https://kms-fips.{REGION}.amazonaws.com" if is_gov_region else None + ) + kms_client = boto3.client("kms", endpoint_url=fips_endpoint) api_key = decrypt_kms_api_key(kms_client, DD_KMS_API_KEY) else: api_key = DD_API_KEY diff --git a/tests/test_api.py b/tests/test_api.py new file mode 100644 index 000000000..a69f4382d --- /dev/null +++ b/tests/test_api.py @@ -0,0 +1,89 @@ +import os +import unittest +from unittest.mock import patch, MagicMock + +import datadog_lambda.api as api + + +class TestDatadogLambdaAPI(unittest.TestCase): + def setUp(self): + api.api_key = None + self.env_patcher = patch.dict( + os.environ, + { + "DD_API_KEY_SECRET_ARN": "", + "DD_API_KEY_SSM_NAME": "", + "DD_KMS_API_KEY": "", + "DD_API_KEY": "", + "DATADOG_API_KEY": "", + "AWS_REGION": "", + }, + clear=True, + ) + self.env_patcher.start() + + @patch("boto3.client") + def test_secrets_manager_fips_endpoint(self, mock_boto3_client): + mock_client = MagicMock() + mock_client.get_secret_value.return_value = {"SecretString": "test-api-key"} + mock_boto3_client.return_value = mock_client + + os.environ["AWS_REGION"] = "us-gov-east-1" + os.environ["DD_API_KEY_SECRET_ARN"] = "test-secrets-arn" + + api_key = api.get_api_key() + + mock_boto3_client.assert_called_with( + "secretsmanager", + endpoint_url="https://secretsmanager-fips.us-gov-east-1.amazonaws.com", + ) + self.assertEqual(api_key, "test-api-key") + + @patch("boto3.client") + def test_ssm_fips_endpoint(self, mock_boto3_client): + mock_client = MagicMock() + mock_client.get_parameter.return_value = { + "Parameter": {"Value": "test-api-key"} + } + mock_boto3_client.return_value = mock_client + + os.environ["AWS_REGION"] = "us-gov-west-1" + os.environ["DD_API_KEY_SSM_NAME"] = "test-ssm-param" + + api_key = api.get_api_key() + + mock_boto3_client.assert_called_with( + "ssm", endpoint_url="https://ssm-fips.us-gov-west-1.amazonaws.com" + ) + self.assertEqual(api_key, "test-api-key") + + @patch("boto3.client") + @patch("datadog_lambda.api.decrypt_kms_api_key") + def test_kms_fips_endpoint(self, mock_decrypt_kms, mock_boto3_client): + mock_client = MagicMock() + mock_boto3_client.return_value = mock_client + mock_decrypt_kms.return_value = "test-api-key" + + os.environ["AWS_REGION"] = "us-gov-west-1" + os.environ["DD_KMS_API_KEY"] = "encrypted-api-key" + + api_key = api.get_api_key() + + mock_boto3_client.assert_called_with( + "kms", endpoint_url="https://kms-fips.us-gov-west-1.amazonaws.com" + ) + self.assertEqual(api_key, "test-api-key") + + @patch("boto3.client") + def test_no_fips_for_standard_regions(self, mock_boto3_client): + mock_client = MagicMock() + mock_client.get_secret_value.return_value = {"SecretString": "test-api-key"} + mock_boto3_client.return_value = mock_client + + os.environ.clear() + os.environ["AWS_REGION"] = "us-west-2" + os.environ["DD_API_KEY_SECRET_ARN"] = "test-arn" + + api.get_api_key() + + mock_boto3_client.assert_called_with("secretsmanager", endpoint_url=None) From 7d7c15346f871d9a5d3333a8f95334b7fe3d2bf3 Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Fri, 14 Mar 2025 14:14:07 -0700 Subject: [PATCH 008/164] Use correct SecretsManager region (#576) --- datadog_lambda/api.py | 21 ++++++++++++++------- tests/test_api.py | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/datadog_lambda/api.py b/datadog_lambda/api.py index 031359122..ad8608731 100644 --- a/datadog_lambda/api.py +++ b/datadog_lambda/api.py @@ -64,8 +64,8 @@ def get_api_key() -> str: DD_KMS_API_KEY = os.environ.get("DD_KMS_API_KEY", "") DD_API_KEY = os.environ.get("DD_API_KEY", os.environ.get("DATADOG_API_KEY", "")) - REGION = os.environ.get("AWS_REGION", "") - is_gov_region = REGION.startswith("us-gov-") + LAMBDA_REGION = os.environ.get("AWS_REGION", "") + is_gov_region = LAMBDA_REGION.startswith("us-gov-") if is_gov_region: logger.debug( "Govcloud region detected. Using FIPs endpoints for secrets management." @@ -73,13 +73,20 @@ def get_api_key() -> str: if DD_API_KEY_SECRET_ARN: # Secrets manager endpoints: https://docs.aws.amazon.com/general/latest/gr/asm.html - fips_endpoint = ( - f"https://secretsmanager-fips.{REGION}.amazonaws.com" + try: + secrets_region = DD_API_KEY_SECRET_ARN.split(":")[3] + except Exception: + logger.debug( + "Invalid secret arn in DD_API_KEY_SECRET_ARN. Unable to get API key." + ) + return "" + endpoint_url = ( + f"https://secretsmanager-fips.{secrets_region}.amazonaws.com" if is_gov_region else None ) secrets_manager_client = boto3.client( - "secretsmanager", endpoint_url=fips_endpoint + "secretsmanager", endpoint_url=endpoint_url, region_name=secrets_region ) api_key = secrets_manager_client.get_secret_value( SecretId=DD_API_KEY_SECRET_ARN @@ -87,7 +94,7 @@ def get_api_key() -> str: elif DD_API_KEY_SSM_NAME: # SSM endpoints: https://docs.aws.amazon.com/general/latest/gr/ssm.html fips_endpoint = ( - f"https://ssm-fips.{REGION}.amazonaws.com" if is_gov_region else None + f"https://ssm-fips.{LAMBDA_REGION}.amazonaws.com" if is_gov_region else None ) ssm_client = boto3.client("ssm", endpoint_url=fips_endpoint) api_key = ssm_client.get_parameter( @@ -96,7 +103,7 @@ def get_api_key() -> str: elif DD_KMS_API_KEY: # KMS endpoints: https://docs.aws.amazon.com/general/latest/gr/kms.html fips_endpoint = ( - f"https://kms-fips.{REGION}.amazonaws.com" if is_gov_region else None + f"https://kms-fips.{LAMBDA_REGION}.amazonaws.com" if is_gov_region else None ) kms_client = boto3.client("kms", endpoint_url=fips_endpoint) api_key = decrypt_kms_api_key(kms_client, DD_KMS_API_KEY) diff --git a/tests/test_api.py b/tests/test_api.py index a69f4382d..c7facb43e 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -29,13 +29,36 @@ def test_secrets_manager_fips_endpoint(self, mock_boto3_client): mock_boto3_client.return_value = mock_client os.environ["AWS_REGION"] = "us-gov-east-1" - os.environ["DD_API_KEY_SECRET_ARN"] = "test-secrets-arn" + os.environ[ + "DD_API_KEY_SECRET_ARN" + ] = "arn:aws:secretsmanager:us-gov-east-1:1234567890:secret:key-name-123ABC" api_key = api.get_api_key() mock_boto3_client.assert_called_with( "secretsmanager", endpoint_url="https://secretsmanager-fips.us-gov-east-1.amazonaws.com", + region_name="us-gov-east-1", + ) + self.assertEqual(api_key, "test-api-key") + + @patch("boto3.client") + def test_secrets_manager_different_region(self, mock_boto3_client): + mock_client = MagicMock() + mock_client.get_secret_value.return_value = {"SecretString": "test-api-key"} + mock_boto3_client.return_value = mock_client + + os.environ["AWS_REGION"] = "us-east-1" + os.environ[ + "DD_API_KEY_SECRET_ARN" + ] = "arn:aws:secretsmanager:us-west-1:1234567890:secret:key-name-123ABC" + + api_key = api.get_api_key() + + mock_boto3_client.assert_called_with( + "secretsmanager", + endpoint_url=None, + region_name="us-west-1", ) self.assertEqual(api_key, "test-api-key") @@ -82,8 +105,12 @@ def test_no_fips_for_standard_regions(self, mock_boto3_client): os.environ.clear() os.environ["AWS_REGION"] = "us-west-2" - os.environ["DD_API_KEY_SECRET_ARN"] = "test-arn" + os.environ[ + "DD_API_KEY_SECRET_ARN" + ] = "arn:aws:secretsmanager:us-west-2:1234567890:secret:key-name-123ABC" api.get_api_key() - mock_boto3_client.assert_called_with("secretsmanager", endpoint_url=None) + mock_boto3_client.assert_called_with( + "secretsmanager", endpoint_url=None, region_name="us-west-2" + ) From 5a55fe45a49b8d7e6c8db0734f203bdff648f383 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Mon, 17 Mar 2025 13:16:39 -0700 Subject: [PATCH 009/164] Use sam/build-python images for building layers. (#577) --- scripts/build_layers.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_layers.sh b/scripts/build_layers.sh index a0d6ee39d..23941b7a0 100755 --- a/scripts/build_layers.sh +++ b/scripts/build_layers.sh @@ -61,7 +61,7 @@ function docker_build_zip { # between different python runtimes. temp_dir=$(mktemp -d) docker buildx build -t datadog-lambda-python-${arch}:$1 . --no-cache \ - --build-arg image=public.ecr.aws/docker/library/python:$1 \ + --build-arg image=public.ecr.aws/sam/build-python$1:1 \ --build-arg runtime=python$1 \ --platform linux/${arch} \ --progress=plain \ From 8398da08d0c6a6de4459b9619969bbb97b8895ee Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Tue, 18 Mar 2025 13:11:15 -0700 Subject: [PATCH 010/164] Lazy load boto client when using datadogpy for metrics. (#558) * Lazy load boto client when using datadogpy for metrics. * Update test mocking. --- datadog_lambda/api.py | 14 +++++++++----- pyproject.toml | 4 ++-- tests/test_api.py | 10 +++++----- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/datadog_lambda/api.py b/datadog_lambda/api.py index ad8608731..c539ea05a 100644 --- a/datadog_lambda/api.py +++ b/datadog_lambda/api.py @@ -57,8 +57,6 @@ def get_api_key() -> str: if api_key: return api_key - import boto3 - DD_API_KEY_SECRET_ARN = os.environ.get("DD_API_KEY_SECRET_ARN", "") DD_API_KEY_SSM_NAME = os.environ.get("DD_API_KEY_SSM_NAME", "") DD_KMS_API_KEY = os.environ.get("DD_KMS_API_KEY", "") @@ -85,7 +83,7 @@ def get_api_key() -> str: if is_gov_region else None ) - secrets_manager_client = boto3.client( + secrets_manager_client = _boto3_client( "secretsmanager", endpoint_url=endpoint_url, region_name=secrets_region ) api_key = secrets_manager_client.get_secret_value( @@ -96,7 +94,7 @@ def get_api_key() -> str: fips_endpoint = ( f"https://ssm-fips.{LAMBDA_REGION}.amazonaws.com" if is_gov_region else None ) - ssm_client = boto3.client("ssm", endpoint_url=fips_endpoint) + ssm_client = _boto3_client("ssm", endpoint_url=fips_endpoint) api_key = ssm_client.get_parameter( Name=DD_API_KEY_SSM_NAME, WithDecryption=True )["Parameter"]["Value"] @@ -105,7 +103,7 @@ def get_api_key() -> str: fips_endpoint = ( f"https://kms-fips.{LAMBDA_REGION}.amazonaws.com" if is_gov_region else None ) - kms_client = boto3.client("kms", endpoint_url=fips_endpoint) + kms_client = _boto3_client("kms", endpoint_url=fips_endpoint) api_key = decrypt_kms_api_key(kms_client, DD_KMS_API_KEY) else: api_key = DD_API_KEY @@ -133,3 +131,9 @@ def init_api(): # Unmute exceptions from datadog api client, so we can catch and handle them api._mute = False + + +def _boto3_client(*args, **kwargs): + import botocore.session + + return botocore.session.get_session().create_client(*args, **kwargs) diff --git a/pyproject.toml b/pyproject.toml index a38605674..8db5e3525 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ datadog = ">=0.51.0,<1.0.0" wrapt = "^1.11.2" ddtrace = ">=2.20.0,<4" ujson = ">=5.9.0" -boto3 = { version = "^1.34.0", optional = true } +botocore = { version = "^1.34.0", optional = true } requests = { version ="^2.22.0", optional = true } pytest = { version= "^8.0.0", optional = true } pytest-benchmark = { version = "^4.0", optional = true } @@ -38,7 +38,7 @@ flake8 = { version = "^5.0.4", optional = true } [tool.poetry.extras] dev = [ - "boto3", + "botocore", "flake8", "pytest", "pytest-benchmark", diff --git a/tests/test_api.py b/tests/test_api.py index c7facb43e..c98d91eb2 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -22,7 +22,7 @@ def setUp(self): ) self.env_patcher.start() - @patch("boto3.client") + @patch("botocore.session.Session.create_client") def test_secrets_manager_fips_endpoint(self, mock_boto3_client): mock_client = MagicMock() mock_client.get_secret_value.return_value = {"SecretString": "test-api-key"} @@ -42,7 +42,7 @@ def test_secrets_manager_fips_endpoint(self, mock_boto3_client): ) self.assertEqual(api_key, "test-api-key") - @patch("boto3.client") + @patch("botocore.session.Session.create_client") def test_secrets_manager_different_region(self, mock_boto3_client): mock_client = MagicMock() mock_client.get_secret_value.return_value = {"SecretString": "test-api-key"} @@ -62,7 +62,7 @@ def test_secrets_manager_different_region(self, mock_boto3_client): ) self.assertEqual(api_key, "test-api-key") - @patch("boto3.client") + @patch("botocore.session.Session.create_client") def test_ssm_fips_endpoint(self, mock_boto3_client): mock_client = MagicMock() mock_client.get_parameter.return_value = { @@ -80,7 +80,7 @@ def test_ssm_fips_endpoint(self, mock_boto3_client): ) self.assertEqual(api_key, "test-api-key") - @patch("boto3.client") + @patch("botocore.session.Session.create_client") @patch("datadog_lambda.api.decrypt_kms_api_key") def test_kms_fips_endpoint(self, mock_decrypt_kms, mock_boto3_client): mock_client = MagicMock() @@ -97,7 +97,7 @@ def test_kms_fips_endpoint(self, mock_decrypt_kms, mock_boto3_client): ) self.assertEqual(api_key, "test-api-key") - @patch("boto3.client") + @patch("botocore.session.Session.create_client") def test_no_fips_for_standard_regions(self, mock_boto3_client): mock_client = MagicMock() mock_client.get_secret_value.return_value = {"SecretString": "test-api-key"} From 58a55bb4e4ef6fabe85580a3914c1f4d060f9378 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Tue, 18 Mar 2025 13:11:44 -0700 Subject: [PATCH 011/164] Re-remove iast .so file. (#560) * Re-remove iast .so file. Commit https://github.com/DataDog/dd-trace-py/commit/fa18def52e13f863bd8de48cb8ef88feba0caf92 was merged to address this. * Re-remove taint tracking. --- Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7f522e5ab..0e79d884a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,10 +22,10 @@ RUN rm -rf ./python/lib/$runtime/site-packages/botocore* RUN rm -rf ./python/lib/$runtime/site-packages/setuptools RUN rm -rf ./python/lib/$runtime/site-packages/jsonschema/tests RUN find . -name 'libddwaf.so' -delete -# Comment this line out for now since ddtrace now tries to import it -# RUN rm ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_stacktrace*.so -RUN rm ./python/lib/$runtime/site-packages/ddtrace/internal/datadog/profiling/libdd_wrapper*.so -RUN rm ./python/lib/$runtime/site-packages/ddtrace/internal/datadog/profiling/ddup/_ddup.*.so +RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_taint_tracking/*.so +RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_stacktrace*.so +RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/internal/datadog/profiling/libdd_wrapper*.so +RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/internal/datadog/profiling/ddup/_ddup.*.so # _stack_v2 may not exist for some versions of ddtrace (e.g. under python 3.13) RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/internal/datadog/profiling/stack_v2/_stack_v2.*.so # remove *.dist-info directories except any entry_points.txt files From 96a6abd227a328d94d233d7baf951f2975f1b267 Mon Sep 17 00:00:00 2001 From: Abhinav Vedmala Date: Wed, 19 Mar 2025 09:50:53 -0400 Subject: [PATCH 012/164] Propagate Step Function Trace Context through Managed Services (#573) Allows us to extract Step Function trace context in the following cases 1. SFN -> EventBridge -> Lambda 2. SFN -> EventBridge -> SQS -> Lambda 3. SFN -> SQS -> Lambda 4. SFN -> SNS -> Lambda 5. SFN -> SNS -> SQS -> Lambda --- datadog_lambda/tracing.py | 81 ++++++--- datadog_lambda/trigger.py | 30 ++- datadog_lambda/wrapper.py | 3 - tests/test_tracing.py | 374 ++++++++++++++++++++++++-------------- tests/test_trigger.py | 66 +++++++ 5 files changed, 387 insertions(+), 167 deletions(-) diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index a73423e17..0fae76dd5 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -39,6 +39,7 @@ _EventSource, parse_event_source, get_first_record, + is_step_function_event, EventTypes, EventSubtypes, ) @@ -271,6 +272,15 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context): if dd_json_data: dd_data = json.loads(dd_json_data) + + if is_step_function_event(dd_data): + try: + return extract_context_from_step_functions(dd_data, None) + except Exception: + logger.debug( + "Failed to extract Step Functions context from SQS/SNS event." + ) + return propagator.extract(dd_data) else: # Handle case where trace context is injected into attributes.AWSTraceHeader @@ -313,6 +323,15 @@ def _extract_context_from_eventbridge_sqs_event(event): body = json.loads(body_str) detail = body.get("detail") dd_context = detail.get("_datadog") + + if is_step_function_event(dd_context): + try: + return extract_context_from_step_functions(dd_context, None) + except Exception: + logger.debug( + "Failed to extract Step Functions context from EventBridge to SQS event." + ) + return propagator.extract(dd_context) @@ -320,12 +339,23 @@ def extract_context_from_eventbridge_event(event, lambda_context): """ Extract datadog trace context from an EventBridge message's Details. This is only possible if Details is a JSON string. + + If we find a Step Function context, try to extract the trace context from + that header. """ try: detail = event.get("detail") dd_context = detail.get("_datadog") if not dd_context: return extract_context_from_lambda_context(lambda_context) + + try: + return extract_context_from_step_functions(dd_context, None) + except Exception: + logger.debug( + "Failed to extract Step Functions context from EventBridge event." + ) + return propagator.extract(dd_context) except Exception as e: logger.debug("The trace extractor returned with error %s", e) @@ -424,7 +454,7 @@ def _generate_sfn_trace_id(execution_id: str, part: str): def extract_context_from_step_functions(event, lambda_context): """ Only extract datadog trace context when Step Functions Context Object is injected - into lambda's event dict. + into lambda's event dict. Unwrap "Payload" if it exists to handle Legacy Lambda cases. If '_datadog' header is present, we have two cases: 1. Root is a Lambda and we use its traceID @@ -435,25 +465,25 @@ def extract_context_from_step_functions(event, lambda_context): object. """ try: + event = event.get("Payload", event) + event = event.get("_datadog", event) + meta = {} - dd_data = event.get("_datadog") - if dd_data and dd_data.get("serverless-version") == "v1": - if "x-datadog-trace-id" in dd_data: # lambda root - trace_id = int(dd_data.get("x-datadog-trace-id")) - high_64_bit_trace_id = _parse_high_64_bits( - dd_data.get("x-datadog-tags") - ) + if event.get("serverless-version") == "v1": + if "x-datadog-trace-id" in event: # lambda root + trace_id = int(event.get("x-datadog-trace-id")) + high_64_bit_trace_id = _parse_high_64_bits(event.get("x-datadog-tags")) if high_64_bit_trace_id: meta["_dd.p.tid"] = high_64_bit_trace_id else: # sfn root - root_execution_id = dd_data.get("RootExecutionId") + root_execution_id = event.get("RootExecutionId") trace_id = _generate_sfn_trace_id(root_execution_id, LOWER_64_BITS) meta["_dd.p.tid"] = _generate_sfn_trace_id( root_execution_id, HIGHER_64_BITS ) - parent_id = _generate_sfn_parent_id(dd_data) + parent_id = _generate_sfn_parent_id(event) else: execution_id = event.get("Execution").get("Id") trace_id = _generate_sfn_trace_id(execution_id, LOWER_64_BITS) @@ -472,20 +502,6 @@ def extract_context_from_step_functions(event, lambda_context): return extract_context_from_lambda_context(lambda_context) -def is_legacy_lambda_step_function(event): - """ - Check if the event is a step function that called a legacy lambda - """ - if not isinstance(event, dict) or "Payload" not in event: - return False - - event = event.get("Payload") - return isinstance(event, dict) and ( - "_datadog" in event - or ("Execution" in event and "StateMachine" in event and "State" in event) - ) - - def extract_context_custom_extractor(extractor, event, lambda_context): """ Extract Datadog trace context using a custom trace extractor function @@ -1309,8 +1325,18 @@ def create_inferred_span_from_eventbridge_event(event, context): synchronicity="async", tag_source="self", ) - dt_format = "%Y-%m-%dT%H:%M:%SZ" + timestamp = event.get("time") + dt_format = "%Y-%m-%dT%H:%M:%SZ" + + # Use more granular timestamp from upstream Step Function if possible + try: + if is_step_function_event(event.get("detail")): + timestamp = event["detail"]["_datadog"]["State"]["EnteredTime"] + dt_format = "%Y-%m-%dT%H:%M:%S.%fZ" + except (TypeError, KeyError, AttributeError): + logger.debug("Error parsing timestamp from Step Functions event") + dt = datetime.strptime(timestamp, dt_format) tracer.set_tags(_dd_origin) @@ -1320,6 +1346,11 @@ def create_inferred_span_from_eventbridge_event(event, context): if span: span.set_tags(tags) span.start = dt.replace(tzinfo=timezone.utc).timestamp() + + # Since inferred span will later parent Lambda, preserve Lambda's current parent + if dd_trace_context.span_id: + span.parent_id = dd_trace_context.span_id + return span diff --git a/datadog_lambda/trigger.py b/datadog_lambda/trigger.py index 11759a0a7..708138bf4 100644 --- a/datadog_lambda/trigger.py +++ b/datadog_lambda/trigger.py @@ -146,9 +146,7 @@ def parse_event_source(event: dict) -> _EventSource: if event.get("source") == "aws.events" or has_event_categories: event_source = _EventSource(EventTypes.CLOUDWATCH_EVENTS) - if ( - "_datadog" in event and event.get("_datadog").get("serverless-version") == "v1" - ) or ("Execution" in event and "StateMachine" in event and "State" in event): + if is_step_function_event(event): event_source = _EventSource(EventTypes.STEPFUNCTIONS) event_record = get_first_record(event) @@ -369,3 +367,29 @@ def extract_http_status_code_tag(trigger_tags, response): status_code = response.status_code return str(status_code) + + +def is_step_function_event(event): + """ + Check if the event is a step function that invoked the current lambda. + + The whole event can be wrapped in "Payload" in Legacy Lambda cases. There may also be a + "_datadog" for JSONata style context propagation. + + The actual event must contain "Execution", "StateMachine", and "State" fields. + """ + event = event.get("Payload", event) + + # JSONPath style + if "Execution" in event and "StateMachine" in event and "State" in event: + return True + + # JSONata style + dd_context = event.get("_datadog") + return ( + dd_context + and "Execution" in dd_context + and "StateMachine" in dd_context + and "State" in dd_context + and "serverless-version" in dd_context + ) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 6afa9a070..5641bd159 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -45,7 +45,6 @@ is_authorizer_response, tracer, propagator, - is_legacy_lambda_step_function, ) from datadog_lambda.trigger import ( extract_trigger_tags, @@ -286,8 +285,6 @@ def _before(self, event, context): self.response = None set_cold_start(init_timestamp_ns) submit_invocations_metric(context) - if is_legacy_lambda_step_function(event): - event = event["Payload"] self.trigger_tags = extract_trigger_tags(event, context) # Extract Datadog trace context and source from incoming requests dd_context, trace_context_source, event_source = extract_dd_trace_context( diff --git a/tests/test_tracing.py b/tests/test_tracing.py index 5480a92c7..0a961a62a 100644 --- a/tests/test_tracing.py +++ b/tests/test_tracing.py @@ -36,15 +36,12 @@ _convert_xray_trace_id, _convert_xray_entity_id, _convert_xray_sampling, - InferredSpanInfo, create_service_mapping, determine_service_name, service_mapping as global_service_mapping, propagator, emit_telemetry_on_exception_outside_of_handler, - is_legacy_lambda_step_function, ) -from datadog_lambda.trigger import EventTypes from tests.utils import get_mock_context @@ -613,9 +610,39 @@ def test_with_complete_datadog_trace_headers_with_trigger_tags(self): ] ) + def _test_step_function_trace_data_common( + self, event, expected_trace_id, expected_span_id, expected_tid + ): + """Common test logic for step function trace data tests""" + lambda_ctx = get_mock_context() + expected_context = Context( + trace_id=expected_trace_id, + span_id=expected_span_id, + sampling_priority=1, + meta={"_dd.p.tid": expected_tid}, + ) + expected_headers = { + TraceHeader.TRACE_ID: str(expected_trace_id), + TraceHeader.PARENT_ID: "10713633173203262661", + TraceHeader.SAMPLING_PRIORITY: "1", + TraceHeader.TAGS: f"_dd.p.tid={expected_tid}", + } + + ctx, source, _ = extract_dd_trace_context(event, lambda_ctx) + + self.assertEqual(source, "event") + self.assertEqual(ctx, expected_context) + self.assertEqual(get_dd_trace_context(), expected_headers) + + create_dd_dummy_metadata_subsegment(ctx, XraySubsegment.TRACE_KEY) + self.mock_send_segment.assert_called_with( + XraySubsegment.TRACE_KEY, + expected_context, + ) + @with_trace_propagation_style("datadog") def test_step_function_trace_data(self): - lambda_ctx = get_mock_context() + """Test basic step function trace data extraction""" sfn_event = { "Execution": { "Id": "arn:aws:states:sa-east-1:425362996713:execution:abhinav-activity-state-machine:72a7ca3e-901c-41bb-b5a3-5f279b92a316", @@ -634,79 +661,39 @@ def test_step_function_trace_data(self): "Name": "abhinav-activity-state-machine", }, } - ctx, source, event_source = extract_dd_trace_context(sfn_event, lambda_ctx) - self.assertEqual(source, "event") - expected_context = Context( - trace_id=435175499815315247, - span_id=3929055471293792800, - sampling_priority=1, - meta={"_dd.p.tid": "3e7a89d1b7310603"}, + self._test_step_function_trace_data_common( + sfn_event, 435175499815315247, 3929055471293792800, "3e7a89d1b7310603" ) - self.assertEqual(ctx, expected_context) - self.assertEqual( - get_dd_trace_context(), - { - TraceHeader.TRACE_ID: "435175499815315247", - TraceHeader.PARENT_ID: "10713633173203262661", - TraceHeader.SAMPLING_PRIORITY: "1", - TraceHeader.TAGS: "_dd.p.tid=3e7a89d1b7310603", + + @with_trace_propagation_style("datadog") + def test_step_function_trace_data_retry(self): + """Test step function trace data extraction with non-zero retry count""" + sfn_event = { + "Execution": { + "Id": "arn:aws:states:sa-east-1:425362996713:execution:abhinav-activity-state-machine:72a7ca3e-901c-41bb-b5a3-5f279b92a316", + "Name": "72a7ca3e-901c-41bb-b5a3-5f279b92a316", + "RoleArn": "arn:aws:iam::425362996713:role/service-role/StepFunctions-abhinav-activity-state-machine-role-22jpbgl6j", + "StartTime": "2024-12-04T19:38:04.069Z", + "RedriveCount": 0, }, + "State": { + "Name": "Lambda Invoke", + "EnteredTime": "2024-12-04T19:38:04.118Z", + "RetryCount": 1, + }, + "StateMachine": { + "Id": "arn:aws:states:sa-east-1:425362996713:stateMachine:abhinav-activity-state-machine", + "Name": "abhinav-activity-state-machine", + }, + } + self._test_step_function_trace_data_common( + sfn_event, 435175499815315247, 5063839446130725204, "3e7a89d1b7310603" ) - create_dd_dummy_metadata_subsegment(ctx, XraySubsegment.TRACE_KEY) - self.mock_send_segment.assert_called_with( - XraySubsegment.TRACE_KEY, - expected_context, - ) - - @with_trace_propagation_style("datadog") - def test_step_function_trace_data_retry(self): - lambda_ctx = get_mock_context() - sfn_event = { - "Execution": { - "Id": "arn:aws:states:sa-east-1:425362996713:execution:abhinav-activity-state-machine:72a7ca3e-901c-41bb-b5a3-5f279b92a316", - "Name": "72a7ca3e-901c-41bb-b5a3-5f279b92a316", - "RoleArn": "arn:aws:iam::425362996713:role/service-role/StepFunctions-abhinav-activity-state-machine-role-22jpbgl6j", - "StartTime": "2024-12-04T19:38:04.069Z", - "RedriveCount": 0, - }, - "State": { - "Name": "Lambda Invoke", - "EnteredTime": "2024-12-04T19:38:04.118Z", - "RetryCount": 1, - }, - "StateMachine": { - "Id": "arn:aws:states:sa-east-1:425362996713:stateMachine:abhinav-activity-state-machine", - "Name": "abhinav-activity-state-machine", - }, - } - ctx, source, event_source = extract_dd_trace_context(sfn_event, lambda_ctx) - self.assertEqual(source, "event") - expected_context = Context( - trace_id=435175499815315247, - span_id=5063839446130725204, - sampling_priority=1, - meta={"_dd.p.tid": "3e7a89d1b7310603"}, - ) - self.assertEqual(ctx, expected_context) - self.assertEqual( - get_dd_trace_context(), - { - TraceHeader.TRACE_ID: "435175499815315247", - TraceHeader.PARENT_ID: "10713633173203262661", - TraceHeader.SAMPLING_PRIORITY: "1", - TraceHeader.TAGS: "_dd.p.tid=3e7a89d1b7310603", - }, - ) - create_dd_dummy_metadata_subsegment(ctx, XraySubsegment.TRACE_KEY) - self.mock_send_segment.assert_called_with( - XraySubsegment.TRACE_KEY, - expected_context, - ) - # https://github.com/DataDog/logs-backend/blob/c17618cb552fc369ca40282bae0a65803f82f694/domains/serverless/apps/logs-to-traces-reducer/src/test/resources/test-json-files/stepfunctions/RedriveTest/snapshots/RedriveLambdaSuccessTraceMerging.json#L46 + # https://github.com/DataDog/logs-backend/blob/65ea567150f24e5498008f3cf8cabef9ea995f5d/domains/serverless/apps/logs-to-traces-reducer/src/test/resources/test-json-files/stepfunctions/RedriveTest/snapshots/RedriveLambdaSuccessTraceMerging.json#L45-L46 @with_trace_propagation_style("datadog") def test_step_function_trace_data_redrive(self): - lambda_ctx = get_mock_context() + """Test step function trace data extraction with non-zero redrive count""" sfn_event = { "Execution": { "Id": "arn:aws:states:sa-east-1:425362996713:execution:abhinav-activity-state-machine:72a7ca3e-901c-41bb-b5a3-5f279b92a316", @@ -725,33 +712,13 @@ def test_step_function_trace_data_redrive(self): "Name": "abhinav-activity-state-machine", }, } - ctx, source, event_source = extract_dd_trace_context(sfn_event, lambda_ctx) - self.assertEqual(source, "event") - expected_context = Context( - trace_id=435175499815315247, - span_id=8782364156266188026, - sampling_priority=1, - meta={"_dd.p.tid": "3e7a89d1b7310603"}, - ) - self.assertEqual(ctx, expected_context) - self.assertEqual( - get_dd_trace_context(), - { - TraceHeader.TRACE_ID: "435175499815315247", - TraceHeader.PARENT_ID: "10713633173203262661", - TraceHeader.SAMPLING_PRIORITY: "1", - TraceHeader.TAGS: "_dd.p.tid=3e7a89d1b7310603", - }, - ) - create_dd_dummy_metadata_subsegment(ctx, XraySubsegment.TRACE_KEY) - self.mock_send_segment.assert_called_with( - XraySubsegment.TRACE_KEY, - expected_context, + self._test_step_function_trace_data_common( + sfn_event, 435175499815315247, 8782364156266188026, "3e7a89d1b7310603" ) @with_trace_propagation_style("datadog") def test_step_function_trace_data_lambda_root(self): - lambda_ctx = get_mock_context() + """Test JSONata style step function trace data extraction where there's an upstream Lambda""" sfn_event = { "_datadog": { "Execution": { @@ -769,33 +736,13 @@ def test_step_function_trace_data_lambda_root(self): "serverless-version": "v1", } } - ctx, source, event_source = extract_dd_trace_context(sfn_event, lambda_ctx) - self.assertEqual(source, "event") - expected_context = Context( - trace_id=5821803790426892636, - span_id=6880978411788117524, - sampling_priority=1, - meta={"_dd.p.tid": "672a7cb100000000"}, - ) - self.assertEqual(ctx, expected_context) - self.assertEqual( - get_dd_trace_context(), - { - TraceHeader.TRACE_ID: "5821803790426892636", - TraceHeader.PARENT_ID: "10713633173203262661", - TraceHeader.SAMPLING_PRIORITY: "1", - TraceHeader.TAGS: "_dd.p.tid=672a7cb100000000", - }, - ) - create_dd_dummy_metadata_subsegment(ctx, XraySubsegment.TRACE_KEY) - self.mock_send_segment.assert_called_with( - XraySubsegment.TRACE_KEY, - expected_context, + self._test_step_function_trace_data_common( + sfn_event, 5821803790426892636, 6880978411788117524, "672a7cb100000000" ) @with_trace_propagation_style("datadog") def test_step_function_trace_data_sfn_root(self): - lambda_ctx = get_mock_context() + """Test JSONata style step function trace data extraction where there's an upstream step function""" sfn_event = { "_datadog": { "Execution": { @@ -812,28 +759,183 @@ def test_step_function_trace_data_sfn_root(self): "serverless-version": "v1", } } - ctx, source, event_source = extract_dd_trace_context(sfn_event, lambda_ctx) - self.assertEqual(source, "event") - expected_context = Context( - trace_id=4521899030418994483, - span_id=6880978411788117524, - sampling_priority=1, - meta={"_dd.p.tid": "12d1270d99cc5e03"}, + self._test_step_function_trace_data_common( + sfn_event, 4521899030418994483, 6880978411788117524, "12d1270d99cc5e03" ) - self.assertEqual(ctx, expected_context) - self.assertEqual( - get_dd_trace_context(), - { - TraceHeader.TRACE_ID: "4521899030418994483", - TraceHeader.PARENT_ID: "10713633173203262661", - TraceHeader.SAMPLING_PRIORITY: "1", - TraceHeader.TAGS: "_dd.p.tid=12d1270d99cc5e03", + + @with_trace_propagation_style("datadog") + def test_step_function_trace_data_eventbridge(self): + """Test step function trace data extraction through EventBridge""" + eventbridge_event = { + "version": "0", + "id": "eaacd8db-02de-ab13-ed5a-8ffb84048294", + "detail-type": "StepFunctionTask", + "source": "my.eventbridge", + "account": "425362996713", + "time": "2025-03-13T15:17:34Z", + "region": "sa-east-1", + "resources": [ + "arn:aws:states:sa-east-1:425362996713:stateMachine:abhinav-inner-state-machine", + "arn:aws:states:sa-east-1:425362996713:execution:abhinav-inner-state-machine:912eaa4c-291a-488a-bda3-d06bcc21203d", + ], + "detail": { + "Message": "Hello from Step Functions!", + "TaskToken": "AQCEAAAAKgAAAAMAAAAAAAAAAeMHr6sb8Ll5IKntjIiLGaBkaNeweo84kKYKDTvDaSAP1vjuYRJEGqFdHsKMyZL8ZcgAdanKpkbhPEN5hpoCe+BH9KblWeDsJxkDCk/meN5SaPlC1qS7Q/7/KqBq+tmAOCSy+MjdqFsnihy5Yo6g6C9uuPn7ccSB/609d8pznFm9nigEos/82emwi18lm67/+/bn4RTX4S7qV4RoGWUWUPeHfr34xWOipCt4SVDkoQPZdRVpq3wyRJP2zcK0zup24/opJqKKSCI5Q9orALNB2jEjDyQ9LE4mSrafoe0tcm/bOAGfrcpR3AwtArUiF6JPYd7Nw0XWWyPXFBjiQTJDhZFlGfllJ1N91eiN8wlzUX1+I0vw/t2PoEmuQ2VCJYCbl1ybjX/tQ97GZ9ogjY9N7VYy5uD5xfZ6VAyetUR06HUtbUIXTVxULm7wmsHb979W/fIQXsrxbFzc0+ypKaqGXJBoq7xX//irjpuNhWg1Wgfn0hxuXl5oN/LkqI83T8f9SdnJMxRDpaHDpttqbjVESB/Pf9o7gakjJj12+r2uiJNc81k50uhuHdFOGsImFHKV8hb1LGcq0ZzUKT5SbEDV2k+ezOP+O9Sk4c0unbpNLM3PKLKxVLhu2gtiIIVCHUHGmumW", + "_datadog": { + "Execution": { + "Id": "arn:aws:states:sa-east-1:425362996713:execution:abhinav-inner-state-machine:912eaa4c-291a-488a-bda3-d06bcc21203d", + "StartTime": "2025-03-13T15:17:33.972Z", + "Name": "912eaa4c-291a-488a-bda3-d06bcc21203d", + "RoleArn": "arn:aws:iam::425362996713:role/service-role/StepFunctions-abhinav-activity-state-machine-role-22jpbgl6j", + "RedriveCount": 0, + }, + "StateMachine": { + "Id": "arn:aws:states:sa-east-1:425362996713:stateMachine:abhinav-inner-state-machine", + "Name": "abhinav-inner-state-machine", + }, + "State": { + "Name": "EventBridge PutEvents", + "EnteredTime": "2025-03-13T15:17:34.008Z", + "RetryCount": 0, + }, + "Task": { + "Token": "AQCEAAAAKgAAAAMAAAAAAAAAAeMHr6sb8Ll5IKntjIiLGaBkaNeweo84kKYKDTvDaSAP1vjuYRJEGqFdHsKMyZL8ZcgAdanKpkbhPEN5hpoCe+BH9KblWeDsJxkDCk/meN5SaPlC1qS7Q/7/KqBq+tmAOCSy+MjdqFsnihy5Yo6g6C9uuPn7ccSB/609d8pznFm9nigEos/82emwi18lm67/+/bn4RTX4S7qV4RoGWUWUPeHfr34xWOipCt4SVDkoQPZdRVpq3wyRJP2zcK0zup24/opJqKKSCI5Q9orALNB2jEjDyQ9LE4mSrafoe0tcm/bOAGfrcpR3AwtArUiF6JPYd7Nw0XWWyPXFBjiQTJDhZFlGfllJ1N91eiN8wlzUX1+I0vw/t2PoEmuQ2VCJYCbl1ybjX/tQ97GZ9ogjY9N7VYy5uD5xfZ6VAyetUR06HUtbUIXTVxULm7wmsHb979W/fIQXsrxbFzc0+ypKaqGXJBoq7xX//irjpuNhWg1Wgfn0hxuXl5oN/LkqI83T8f9SdnJMxRDpaHDpttqbjVESB/Pf9o7gakjJj12+r2uiJNc81k50uhuHdFOGsImFHKV8hb1LGcq0ZzUKT5SbEDV2k+ezOP+O9Sk4c0unbpNLM3PKLKxVLhu2gtiIIVCHUHGmumW" + }, + "RootExecutionId": "arn:aws:states:sa-east-1:425362996713:execution:abhinav-inner-state-machine:912eaa4c-291a-488a-bda3-d06bcc21203d", + "serverless-version": "v1", + }, }, + } + self._test_step_function_trace_data_common( + eventbridge_event, + 3401561763239692811, + 10430178702434539423, + "a49ff3b7fb47b0b", ) - create_dd_dummy_metadata_subsegment(ctx, XraySubsegment.TRACE_KEY) - self.mock_send_segment.assert_called_with( - XraySubsegment.TRACE_KEY, - expected_context, + + @with_trace_propagation_style("datadog") + def test_step_function_trace_data_sqs(self): + """Test step function trace data extraction through SQS""" + sqs_event = { + "Records": [ + { + "EventSource": "aws:sns", + "EventVersion": "1.0", + "EventSubscriptionArn": "arn:aws:sns:sa-east-1:425362996713:logs-to-traces-dev-topic:f1653ba3-2ff7-4c8e-9381-45a7a62f9708", + "Sns": { + "Type": "Notification", + "MessageId": "e39184ea-bfd8-5efa-96fe-e4a64a457ff7", + "TopicArn": "arn:aws:sns:sa-east-1:425362996713:logs-to-traces-dev-topic", + "Subject": None, + "Message": "{}", + "Timestamp": "2025-03-13T15:01:49.942Z", + "SignatureVersion": "1", + "Signature": "WJHKq+pNOLgxa7+dB1dud02RM/30Jvz+KiMZzjRl38/Pphz90H24eGyIbnq3BJXYEyawFCHC6sq/5HcwXouGc5gbah6he+JpqXahMEs6cyMs2tg9SXxooRHEGv5iiZXKhnDcJYOrQ+iFExO9w+WFWfJjO2m/EDVVSYvuDjDV7mmTwAgEOD0zUvWpT7wOeKGG5Uk916Ppy3iMV7sCoHV/RwVikdhCWDDmxbdqteGduAXPdGESE/aj6kUx9ibEOKXyhC+7H1/j0tlhUchl6LZsTf1Gaiq2yEqKXKvsupcG3hRZ6FtIWP0jGlFhpW5EHc2oiHIVOsQceCYPqXYMCZvFuA==", + "SigningCertUrl": "https://sns.sa-east-1.amazonaws.com/SimpleNotificationService-9c6465fa7f48f5cacd23014631ec1136.pem", + "UnsubscribeUrl": "https://sns.sa-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:sa-east-1:425362996713:logs-to-traces-dev-topic:f1653ba3-2ff7-4c8e-9381-45a7a62f9708", + "MessageAttributes": { + "_datadog": { + "Type": "String", + "Value": '{"Execution":{"Id":"arn:aws:states:sa-east-1:425362996713:execution:abhinav-inner-state-machine:79478846-0cff-44de-91f5-02c96ff65762","StartTime":"2025-03-13T15:01:49.738Z","Name":"79478846-0cff-44de-91f5-02c96ff65762","RoleArn":"arn:aws:iam::425362996713:role/service-role/StepFunctions-abhinav-activity-state-machine-role-22jpbgl6j","RedriveCount":0},"StateMachine":{"Id":"arn:aws:states:sa-east-1:425362996713:stateMachine:abhinav-inner-state-machine","Name":"abhinav-inner-state-machine"},"State":{"Name":"SNS Publish","EnteredTime":"2025-03-13T15:01:49.768Z","RetryCount":0},"RootExecutionId":"arn:aws:states:sa-east-1:425362996713:execution:abhinav-inner-state-machine:79478846-0cff-44de-91f5-02c96ff65762","serverless-version":"v1"}', + } + }, + }, + } + ] + } + self._test_step_function_trace_data_common( + sqs_event, 3818106616964044169, 15912108710769293902, "3a4fd1a254eb514a" + ) + + @with_trace_propagation_style("datadog") + def test_step_function_trace_data_eventbridge_sqs(self): + """Test step function trace data extraction through EventBridge and SQS""" + eventbridge_sqs_event = { + "Records": [ + { + "messageId": "9ed082ad-2f4d-4309-ab99-9553d2be5613", + "receiptHandle": "AQEB6z7FatNIXbWOTC4Bx+udD0flrnT7XMehruTohl8O2KI2t9hvo5oxGIOhwcb+QtS5aRXsFE35TgGE8kZHlHK7Sa8jQUen6XmsPG7qB6BPdXjr0eunM2SDAtLj0mDSKx907VIKRYQG+qpI9ZyNK7Bi786oQIz2UkZGZru9zlXxJtAQiXBqfJ+OfTzhIwkPu04czU6lYfAbxdyNaBNdBEsTNJKPjquvcq1ZBVCHkn9L6wo8jha6XreoeS2WJ5N26ZLKtAl3wlSUByB92OKZU2mEuNboyY7bgK+nkx4N8fVVrafVXnY9YHuq60eQcZ/nusWFeJlVyN7NFypYP2IOn25xylltEACKbgUdEsFU2h5k7yI2DVk5eAt9vB6qmAJlgfkGsXG0SZrCADoIKXl9jpwajw==", + "body": '{"version":"0","id":"ff6d828b-b35e-abdf-64b6-6ea2cf698c0b","detail-type":"StepFunctionTask","source":"my.eventbridge","account":"425362996713","time":"2025-03-13T15:14:21Z","region":"sa-east-1","resources":["arn:aws:states:sa-east-1:425362996713:stateMachine:abhinav-inner-state-machine","arn:aws:states:sa-east-1:425362996713:execution:abhinav-inner-state-machine:fe087266-fe48-4a31-a21b-691f4e7ea985"],"detail":{"Message":"Hello from Step Functions!","TaskToken":"AQCEAAAAKgAAAAMAAAAAAAAAAfi3HMLTw3u9h0vSmkjyHlK1tv5bQUyA7i+6LIvrBWu+3S+DMuQ79JpMtAuCaMN/AGSuGPO7OPeTNA/9v7/kzAsLoPzwPhbrDPXP4SVF1YIO663PvtX/tEWxnAfwLqwDyx8G8VEsVLcmiiOafFCKJwn0OP/DoAWc0sjhWwRxIoQ0ipBGhOqU8rO8SFZVvxUbkosNejnhT7B6314pC89JZLpXU7SxFe+XrgN+uRAvFxsH/+RwDf94xk5hhtukH7HzhJKWN2WCtUISd84pM/1V7ppDuJ3FHgJT22xQIbEGA9Q4o+pLLehzE2SHCdo7eWYQqN+7BanxBNMI6kBMaf5nuh9izAp38lsrmHJyO8NvXgWg+F9hoTZX4RpV9CCwvRFrCRcCeDq4/uJzbvB4AwwA2q2Llm0X8yH0pKvPZ2v7pl4nCWdnEgj920I8AmBCuozbKP7gJRnAqfx3MnOSkpZTeGnHkp0ly8EevwCT2zX/1GQnCAx02kBaDJgUMputFeruMBzwVtlEVBFUUgaWbJwHzz2htuAw282pdATrKfv4VV1N962uLBJ32wd9a92rX7VXXToitvZGIvf/Z7cu4xfAzxQH1rIQ3M4ojkR9r48qoYtnYDlEf+BkIL8L4+xpbRFSBk3p","_datadog":{"Execution":{"Id":"arn:aws:states:sa-east-1:425362996713:execution:abhinav-inner-state-machine:fe087266-fe48-4a31-a21b-691f4e7ea985","StartTime":"2025-03-13T15:14:21.730Z","Name":"fe087266-fe48-4a31-a21b-691f4e7ea985","RoleArn":"arn:aws:iam::425362996713:role/service-role/StepFunctions-abhinav-activity-state-machine-role-22jpbgl6j","RedriveCount":0},"StateMachine":{"Id":"arn:aws:states:sa-east-1:425362996713:stateMachine:abhinav-inner-state-machine","Name":"abhinav-inner-state-machine"},"State":{"Name":"EventBridge PutEvents","EnteredTime":"2025-03-13T15:14:21.765Z","RetryCount":0},"Task":{"Token":"AQCEAAAAKgAAAAMAAAAAAAAAAfi3HMLTw3u9h0vSmkjyHlK1tv5bQUyA7i+6LIvrBWu+3S+DMuQ79JpMtAuCaMN/AGSuGPO7OPeTNA/9v7/kzAsLoPzwPhbrDPXP4SVF1YIO663PvtX/tEWxnAfwLqwDyx8G8VEsVLcmiiOafFCKJwn0OP/DoAWc0sjhWwRxIoQ0ipBGhOqU8rO8SFZVvxUbkosNejnhT7B6314pC89JZLpXU7SxFe+XrgN+uRAvFxsH/+RwDf94xk5hhtukH7HzhJKWN2WCtUISd84pM/1V7ppDuJ3FHgJT22xQIbEGA9Q4o+pLLehzE2SHCdo7eWYQqN+7BanxBNMI6kBMaf5nuh9izAp38lsrmHJyO8NvXgWg+F9hoTZX4RpV9CCwvRFrCRcCeDq4/uJzbvB4AwwA2q2Llm0X8yH0pKvPZ2v7pl4nCWdnEgj920I8AmBCuozbKP7gJRnAqfx3MnOSkpZTeGnHkp0ly8EevwCT2zX/1GQnCAx02kBaDJgUMputFeruMBzwVtlEVBFUUgaWbJwHzz2htuAw282pdATrKfv4VV1N962uLBJ32wd9a92rX7VXXToitvZGIvf/Z7cu4xfAzxQH1rIQ3M4ojkR9r48qoYtnYDlEf+BkIL8L4+xpbRFSBk3p"},"RootExecutionId":"arn:aws:states:sa-east-1:425362996713:execution:abhinav-inner-state-machine:fe087266-fe48-4a31-a21b-691f4e7ea985","serverless-version":"v1"}}}', + "attributes": { + "ApproximateReceiveCount": "1", + "SentTimestamp": "1741878862068", + "SenderId": "AROAWGCM4HXUUNHLDXVER:6145b5ba998f311c8ac27f5cade2b915", + "ApproximateFirstReceiveTimestamp": "1741878862075", + }, + "messageAttributes": {}, + "md5OfBody": "e5cf8197b304a4dd4fd5db8e4842484b", + "eventSource": "aws:sqs", + "eventSourceARN": "arn:aws:sqs:sa-east-1:425362996713:abhinav-q", + "awsRegion": "sa-east-1", + } + ] + } + self._test_step_function_trace_data_common( + eventbridge_sqs_event, + 6527209323865742984, + 14276854885394865473, + "2ee7d9862d048173", + ) + + @with_trace_propagation_style("datadog") + def test_step_function_trace_data_sns(self): + """Test step function trace data extraction through SNS""" + sns_event = { + "Records": [ + { + "EventSource": "aws:sns", + "EventVersion": "1.0", + "EventSubscriptionArn": "arn:aws:sns:sa-east-1:425362996713:logs-to-traces-dev-topic:f1653ba3-2ff7-4c8e-9381-45a7a62f9708", + "Sns": { + "Type": "Notification", + "MessageId": "7bc0c17d-bf88-5ff4-af7f-a131463a0d90", + "TopicArn": "arn:aws:sns:sa-east-1:425362996713:logs-to-traces-dev-topic", + "Subject": None, + "Message": "{}", + "Timestamp": "2025-03-13T15:19:14.245Z", + "SignatureVersion": "1", + "Signature": "r8RoYzq4uNcq0yj7sxcp8sTbFiDk8zqtocG7mJuE2MPVuR8O5eNg2ohofokUnC84xADlCq5k6ElP55lbbY36tQO+qDGdV6+TGN4bAL9FiQrDE6tQYYJdlv/sYE7iOOgnRBC9ljEdCIDNtQNGCfND/8JzatPg8KAy7xMRcLrGWu4xIMEysqNTz7rETfhdZjLQPssAht44KcoUJCH4/VuB+B9W1RhwA+M8Q3tqxzahIXzcgDM8OlmfkBlXo4FDVF3WUzjXLf9AMOg+66GupjQFtUpmRMkA8KXSV1HCso7e6nIIWtOnUoWeDDUfQPFFq4TNSlb6h2NuebaHdnW5nhxnJQ==", + "SigningCertUrl": "https://sns.sa-east-1.amazonaws.com/SimpleNotificationService-9c6465fa7f48f5cacd23014631ec1136.pem", + "UnsubscribeUrl": "https://sns.sa-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:sa-east-1:425362996713:logs-to-traces-dev-topic:f1653ba3-2ff7-4c8e-9381-45a7a62f9708", + "MessageAttributes": { + "_datadog": { + "Type": "String", + "Value": '{"Execution":{"Id":"arn:aws:states:sa-east-1:425362996713:execution:abhinav-inner-state-machine:11623e4f-70ee-4330-8fbe-955152dea54c","StartTime":"2025-03-13T15:19:14.019Z","Name":"11623e4f-70ee-4330-8fbe-955152dea54c","RoleArn":"arn:aws:iam::425362996713:role/service-role/StepFunctions-abhinav-activity-state-machine-role-22jpbgl6j","RedriveCount":0},"StateMachine":{"Id":"arn:aws:states:sa-east-1:425362996713:stateMachine:abhinav-inner-state-machine","Name":"abhinav-inner-state-machine"},"State":{"Name":"SNS Publish","EnteredTime":"2025-03-13T15:19:14.061Z","RetryCount":0},"RootExecutionId":"arn:aws:states:sa-east-1:425362996713:execution:abhinav-inner-state-machine:11623e4f-70ee-4330-8fbe-955152dea54c","serverless-version":"v1"}', + } + }, + }, + } + ] + } + self._test_step_function_trace_data_common( + sns_event, 1459500239678510857, 13193042003602978730, "fafc98885fd4647" + ) + + @with_trace_propagation_style("datadog") + def test_step_function_trace_data_sns_sqs(self): + """Test step function trace data extraction through SNS and SQS""" + sns_sqs_event = { + "Records": [ + { + "messageId": "9ec3339f-cd1a-43ba-9681-3e9113b430d3", + "receiptHandle": "AQEBJ5gIvqEWQt39NHPMAoK57cGgKtrgTtckWeWdDRi2FeucYr6pBhNjzXuUrmoHZMozX1WaoABtfQ5+kX5ucDBpA2Ci3Q07Z4MYvA6X0Sw13HCkiBnLrHPmH/F3rUBjvdRkIIKqA2ACX58MdkaYGNpqsHTJHB613wa8z4zurK0u7eUIXrr+e+gtsuPD39hiWlJo7cpBVv7y178rzMX8gPQTnRJv1cjhCHENtjWTSmfFC5N+BIQNIcjFsTTDRSovZlNIfAEuS+uowgzk0DUyoTJD5nFTL8lQHeXGRCUQe58/UY9OwRXEFVPGZOQR4OI9Wa4Kf/keFypTk9YwC9DhSeKvzZ0wBvejyl1n0ztT45+XYoWfi0mxGWM5b7r9wT36RDmjnM6vszH/d3fhZSRPASxWBQ==", + "body": '{\n "Type" : "Notification",\n "MessageId" : "1f3078d0-c792-5cf3-a130-189c3b846a3f",\n "TopicArn" : "arn:aws:sns:sa-east-1:425362996713:logs-to-traces-dev-topic",\n "Message" : "{}",\n "Timestamp" : "2025-03-13T15:29:26.348Z",\n "SignatureVersion" : "1",\n "Signature" : "mxOqAQ5o/isJrMS0PezHKRaA3g8Z/8YDbkToqhJub6I66LGtl+NYhyfTyllbgxvRP2XD2meKPRSgPI3nLyq8UHsWgyYwe3Tsv8QpRunCVE9Pebh+V1LGPWfjOiL0e+bnaj956QJD99560LJ6bzWP9QO584/zfOdcw6E5XQZfAI+pvEsf28Dy0WJO/lWTATRZDf8wGhmc7uKI1ZMsrOaNoUD8PXVqsI4yrJHxhzMb3SrC7YjI/PnNIbcn6ezwprbUdbZvyNAfJiE0k5IlppA089tMXC/ItgC7AgQhG9huPdKi5KdWGACK7gEwqmFwL+5T33sUXDaH2g58WhCs76pKEw==",\n "SigningCertURL" : "https://sns.sa-east-1.amazonaws.com/SimpleNotificationService-9c6465fa7f48f5cacd23014631ec1136.pem",\n "UnsubscribeURL" : "https://sns.sa-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:sa-east-1:425362996713:logs-to-traces-dev-topic:5f64545d-ae9a-4a5f-a7ee-798a0bd8519e",\n "MessageAttributes" : {\n "_datadog" : {"Type":"String","Value":"{\\"Execution\\":{\\"Id\\":\\"arn:aws:states:sa-east-1:425362996713:execution:abhinav-inner-state-machine:37ff72b8-0ee0-49e2-93c0-8a1764206a03\\",\\"StartTime\\":\\"2025-03-13T15:29:26.144Z\\",\\"Name\\":\\"37ff72b8-0ee0-49e2-93c0-8a1764206a03\\",\\"RoleArn\\":\\"arn:aws:iam::425362996713:role/service-role/StepFunctions-abhinav-activity-state-machine-role-22jpbgl6j\\",\\"RedriveCount\\":0},\\"StateMachine\\":{\\"Id\\":\\"arn:aws:states:sa-east-1:425362996713:stateMachine:abhinav-inner-state-machine\\",\\"Name\\":\\"abhinav-inner-state-machine\\"},\\"State\\":{\\"Name\\":\\"SNS Publish\\",\\"EnteredTime\\":\\"2025-03-13T15:29:26.182Z\\",\\"RetryCount\\":0},\\"RootExecutionId\\":\\"arn:aws:states:sa-east-1:425362996713:execution:abhinav-inner-state-machine:37ff72b8-0ee0-49e2-93c0-8a1764206a03\\",\\"serverless-version\\":\\"v1\\"}"}\n }\n}', + "attributes": { + "ApproximateReceiveCount": "1", + "SentTimestamp": "1741879766424", + "SenderId": "AIDAIOA2GYWSHW4E2VXIO", + "ApproximateFirstReceiveTimestamp": "1741879766432", + }, + "messageAttributes": {}, + "md5OfBody": "52af59de28507d7e67324b46c95337d8", + "eventSource": "aws:sqs", + "eventSourceARN": "arn:aws:sqs:sa-east-1:425362996713:abhinav-q", + "awsRegion": "sa-east-1", + } + ] + } + self._test_step_function_trace_data_common( + sns_sqs_event, 5708348677301000120, 18223515719478572006, "45457f5f3fde3fa1" ) diff --git a/tests/test_trigger.py b/tests/test_trigger.py index be028a232..9cb088f1c 100644 --- a/tests/test_trigger.py +++ b/tests/test_trigger.py @@ -9,6 +9,7 @@ get_event_source_arn, extract_trigger_tags, extract_http_status_code_tag, + is_step_function_event, ) from tests.utils import get_mock_context @@ -543,3 +544,68 @@ def test_extract_http_status_code_tag_from_response_object(self): response.status_code = 403 status_code = extract_http_status_code_tag(trigger_tags, response) self.assertEqual(status_code, "403") + + +class IsStepFunctionEvent(unittest.TestCase): + def test_is_step_function_event_jsonata(self): + event = { + "_datadog": { + "Execution": { + "Id": "665c417c-1237-4742-aaca-8b3becbb9e75", + "RedriveCount": 0, + }, + "StateMachine": {}, + "State": { + "Name": "my-awesome-state", + "EnteredTime": "Mon Nov 13 12:43:33 PST 2023", + "RetryCount": 0, + }, + "x-datadog-trace-id": "5821803790426892636", + "x-datadog-tags": "_dd.p.dm=-0,_dd.p.tid=672a7cb100000000", + "serverless-version": "v1", + } + } + self.assertTrue(is_step_function_event(event)) + + def test_is_step_function_event_jsonpath(self): + event = { + "Execution": { + "Id": "665c417c-1237-4742-aaca-8b3becbb9e75", + "RedriveCount": 0, + }, + "StateMachine": {}, + "State": { + "Name": "my-awesome-state", + "EnteredTime": "Mon Nov 13 12:43:33 PST 2023", + "RetryCount": 0, + }, + } + self.assertTrue(is_step_function_event(event)) + + def test_is_step_function_event_legacy_lambda(self): + event = { + "Payload": { + "Execution": { + "Id": "665c417c-1237-4742-aaca-8b3becbb9e75", + "RedriveCount": 0, + }, + "StateMachine": {}, + "State": { + "Name": "my-awesome-state", + "EnteredTime": "Mon Nov 13 12:43:33 PST 2023", + "RetryCount": 0, + }, + } + } + self.assertTrue(is_step_function_event(event)) + + def test_is_step_function_event_dd_header(self): + event = { + "_datadog": { + "x-datadog-trace-id": "5821803790426892636", + "x-datadog-parent-id": "5821803790426892636", + "x-datadog-tags": "_dd.p.dm=-0,_dd.p.tid=672a7cb100000000", + "x-datadog-sampling-priority": "1", + } + } + self.assertFalse(is_step_function_event(event)) From 92ec3b8e36b688ae972b1fe23c9737a6488668fa Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Wed, 19 Mar 2025 07:43:20 -0700 Subject: [PATCH 013/164] Submit metric for DynamoDB Stream Type (#578) --- datadog_lambda/metric.py | 14 ++++++++++++++ datadog_lambda/span_pointers.py | 4 ++++ .../snapshots/logs/async-metrics_python310.log | 9 +++++++++ .../snapshots/logs/async-metrics_python311.log | 9 +++++++++ .../snapshots/logs/async-metrics_python312.log | 9 +++++++++ .../snapshots/logs/async-metrics_python313.log | 9 +++++++++ .../snapshots/logs/async-metrics_python38.log | 9 +++++++++ .../snapshots/logs/async-metrics_python39.log | 9 +++++++++ .../snapshots/logs/sync-metrics_python310.log | 9 +++++++++ .../snapshots/logs/sync-metrics_python311.log | 9 +++++++++ .../snapshots/logs/sync-metrics_python312.log | 11 ++++++++++- .../snapshots/logs/sync-metrics_python313.log | 11 ++++++++++- .../snapshots/logs/sync-metrics_python38.log | 9 +++++++++ .../snapshots/logs/sync-metrics_python39.log | 11 ++++++++++- 14 files changed, 129 insertions(+), 3 deletions(-) diff --git a/datadog_lambda/metric.py b/datadog_lambda/metric.py index 6389c2687..f9c67a26e 100644 --- a/datadog_lambda/metric.py +++ b/datadog_lambda/metric.py @@ -188,3 +188,17 @@ def submit_errors_metric(lambda_context): lambda_context (object): Lambda context dict passed to the function by AWS """ submit_enhanced_metric("errors", lambda_context) + + +def submit_dynamodb_stream_type_metric(event): + stream_view_type = ( + event.get("Records", [{}])[0].get("dynamodb", {}).get("StreamViewType") + ) + if stream_view_type: + lambda_metric( + "datadog.serverless.dynamodb.stream.type", + 1, + timestamp=None, + tags=[f"streamtype:{stream_view_type}"], + force_async=True, + ) diff --git a/datadog_lambda/span_pointers.py b/datadog_lambda/span_pointers.py index e111469e6..40d959e61 100644 --- a/datadog_lambda/span_pointers.py +++ b/datadog_lambda/span_pointers.py @@ -6,6 +6,8 @@ from ddtrace._trace._span_pointer import _SpanPointerDirection from ddtrace._trace._span_pointer import _SpanPointerDescription + +from datadog_lambda.metric import submit_dynamodb_stream_type_metric from datadog_lambda.trigger import EventTypes @@ -28,6 +30,8 @@ def calculate_span_pointers( return _calculate_s3_span_pointers_for_event(event) elif event_source.equals(EventTypes.DYNAMODB): + # Temporary metric. TODO eventually remove(@nhulston) + submit_dynamodb_stream_type_metric(event) return _calculate_dynamodb_span_pointers_for_event(event) except Exception as e: diff --git a/tests/integration/snapshots/logs/async-metrics_python310.log b/tests/integration/snapshots/logs/async-metrics_python310.log index ed0d3b43f..24d3fb5b0 100644 --- a/tests/integration/snapshots/logs/async-metrics_python310.log +++ b/tests/integration/snapshots/logs/async-metrics_python310.log @@ -188,6 +188,15 @@ START "dd_lambda_layer:datadog-python310_X.X.X" ] } +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} { "m": "hello.dog", "v": 1, diff --git a/tests/integration/snapshots/logs/async-metrics_python311.log b/tests/integration/snapshots/logs/async-metrics_python311.log index b57a1b5a5..e4fa66bce 100644 --- a/tests/integration/snapshots/logs/async-metrics_python311.log +++ b/tests/integration/snapshots/logs/async-metrics_python311.log @@ -188,6 +188,15 @@ START "dd_lambda_layer:datadog-python311_X.X.X" ] } +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} { "m": "hello.dog", "v": 1, diff --git a/tests/integration/snapshots/logs/async-metrics_python312.log b/tests/integration/snapshots/logs/async-metrics_python312.log index 1b7e4b082..0d632c6c9 100644 --- a/tests/integration/snapshots/logs/async-metrics_python312.log +++ b/tests/integration/snapshots/logs/async-metrics_python312.log @@ -188,6 +188,15 @@ START "dd_lambda_layer:datadog-python312_X.X.X" ] } +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} { "m": "hello.dog", "v": 1, diff --git a/tests/integration/snapshots/logs/async-metrics_python313.log b/tests/integration/snapshots/logs/async-metrics_python313.log index 32342559d..090707096 100644 --- a/tests/integration/snapshots/logs/async-metrics_python313.log +++ b/tests/integration/snapshots/logs/async-metrics_python313.log @@ -188,6 +188,15 @@ START "dd_lambda_layer:datadog-python313_X.X.X" ] } +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python313_X.X.X" + ] +} { "m": "hello.dog", "v": 1, diff --git a/tests/integration/snapshots/logs/async-metrics_python38.log b/tests/integration/snapshots/logs/async-metrics_python38.log index 9dc9edf61..4a5069309 100644 --- a/tests/integration/snapshots/logs/async-metrics_python38.log +++ b/tests/integration/snapshots/logs/async-metrics_python38.log @@ -188,6 +188,15 @@ START "dd_lambda_layer:datadog-python38_X.X.X" ] } +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} { "m": "hello.dog", "v": 1, diff --git a/tests/integration/snapshots/logs/async-metrics_python39.log b/tests/integration/snapshots/logs/async-metrics_python39.log index 89e5d227b..54081402d 100644 --- a/tests/integration/snapshots/logs/async-metrics_python39.log +++ b/tests/integration/snapshots/logs/async-metrics_python39.log @@ -188,6 +188,15 @@ START "dd_lambda_layer:datadog-python39_X.X.X" ] } +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} { "m": "hello.dog", "v": 1, diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index 6eab44c28..e25697756 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -207,6 +207,15 @@ START "dd_lambda_layer:datadog-python310_X.X.X" ] } +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index 87cd6a6af..69d4a6952 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -207,6 +207,15 @@ START "dd_lambda_layer:datadog-python311_X.X.X" ] } +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index 41b5a71ca..49bae0a2a 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -207,6 +207,15 @@ START "dd_lambda_layer:datadog-python312_X.X.X" ] } +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { @@ -546,7 +555,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] } HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX -END Duration: XXXX ms Memory Used: XXXX MB { "traces": [ [ @@ -585,6 +593,7 @@ END Duration: XXXX ms Memory Used: XXXX MB ] ] } +END Duration: XXXX ms Memory Used: XXXX MB START { "m": "aws.lambda.enhanced.invocations", diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index 439e44d6c..2f461f6fe 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -207,6 +207,15 @@ START "dd_lambda_layer:datadog-python313_X.X.X" ] } +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python313_X.X.X" + ] +} HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { @@ -1302,7 +1311,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] } HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX -END Duration: XXXX ms Memory Used: XXXX MB { "traces": [ [ @@ -1341,6 +1349,7 @@ END Duration: XXXX ms Memory Used: XXXX MB ] ] } +END Duration: XXXX ms Memory Used: XXXX MB START { "m": "aws.lambda.enhanced.invocations", diff --git a/tests/integration/snapshots/logs/sync-metrics_python38.log b/tests/integration/snapshots/logs/sync-metrics_python38.log index b30289ca8..83e33d336 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python38.log +++ b/tests/integration/snapshots/logs/sync-metrics_python38.log @@ -207,6 +207,15 @@ START "dd_lambda_layer:datadog-python38_X.X.X" ] } +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { diff --git a/tests/integration/snapshots/logs/sync-metrics_python39.log b/tests/integration/snapshots/logs/sync-metrics_python39.log index 772ea5d19..0a433c346 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python39.log +++ b/tests/integration/snapshots/logs/sync-metrics_python39.log @@ -207,6 +207,15 @@ START "dd_lambda_layer:datadog-python39_X.X.X" ] } +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { @@ -368,6 +377,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] } HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +END Duration: XXXX ms Memory Used: XXXX MB { "traces": [ [ @@ -406,7 +416,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept ] ] } -END Duration: XXXX ms Memory Used: XXXX MB START { "m": "aws.lambda.enhanced.invocations", From 71c14e370e9f2a086ff676705a2d19b045b15f20 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Mon, 24 Mar 2025 08:38:10 -0700 Subject: [PATCH 014/164] Remove __future__ import. (#579) --- datadog_lambda/handler.py | 1 - 1 file changed, 1 deletion(-) diff --git a/datadog_lambda/handler.py b/datadog_lambda/handler.py index 433d9b926..4f12b1ad8 100644 --- a/datadog_lambda/handler.py +++ b/datadog_lambda/handler.py @@ -3,7 +3,6 @@ # This product includes software developed at Datadog (https://www.datadoghq.com/). # Copyright 2020 Datadog, Inc. -from __future__ import absolute_import from importlib import import_module import os From 95f9aed2b884f6205eb3e346ef6498bc0ae6aa4e Mon Sep 17 00:00:00 2001 From: Brett Langdon Date: Thu, 27 Mar 2025 15:28:52 -0400 Subject: [PATCH 015/164] Revert "Use sam/build-python images for building layers. (#577)" (#580) This reverts commit 5a55fe45a49b8d7e6c8db0734f203bdff648f383. --- scripts/build_layers.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_layers.sh b/scripts/build_layers.sh index 23941b7a0..a0d6ee39d 100755 --- a/scripts/build_layers.sh +++ b/scripts/build_layers.sh @@ -61,7 +61,7 @@ function docker_build_zip { # between different python runtimes. temp_dir=$(mktemp -d) docker buildx build -t datadog-lambda-python-${arch}:$1 . --no-cache \ - --build-arg image=public.ecr.aws/sam/build-python$1:1 \ + --build-arg image=public.ecr.aws/docker/library/python:$1 \ --build-arg runtime=python$1 \ --platform linux/${arch} \ --progress=plain \ From 2320c0a909413c8b66ba501fc969c043fbd27ec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jordan=20gonz=C3=A1lez?= <30836115+duncanista@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:28:25 -0400 Subject: [PATCH 016/164] chore: lazy load some imports (#581) * lazy load metrics also hashlib right away * black * update invocation metric to be error metric * lazyload `base64` * patch right call --- datadog_lambda/api.py | 2 +- datadog_lambda/tracing.py | 10 ++++++++-- datadog_lambda/trigger.py | 3 ++- datadog_lambda/wrapper.py | 24 ++++++++++++++++-------- tests/test_wrapper.py | 2 +- 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/datadog_lambda/api.py b/datadog_lambda/api.py index c539ea05a..fd3e2c177 100644 --- a/datadog_lambda/api.py +++ b/datadog_lambda/api.py @@ -1,6 +1,5 @@ import os import logging -import base64 logger = logging.getLogger(__name__) KMS_ENCRYPTION_CONTEXT_KEY = "LambdaFunctionName" @@ -9,6 +8,7 @@ def decrypt_kms_api_key(kms_client, ciphertext): from botocore.exceptions import ClientError + import base64 """ Decodes and deciphers the base64-encoded ciphertext given as a parameter using KMS. diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index 0fae76dd5..9a27673c6 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -2,10 +2,8 @@ # under the Apache License Version 2.0. # This product includes software developed at Datadog (https://www.datadoghq.com/). # Copyright 2019 Datadog, Inc. -import hashlib import logging import os -import base64 import traceback import ujson as json from datetime import datetime, timezone @@ -259,6 +257,8 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context): dd_json_data = None dd_json_data_type = dd_payload.get("Type") or dd_payload.get("dataType") if dd_json_data_type == "Binary": + import base64 + dd_json_data = dd_payload.get("binaryValue") or dd_payload.get("Value") if dd_json_data: dd_json_data = base64.b64decode(dd_json_data) @@ -373,6 +373,8 @@ def extract_context_from_kinesis_event(event, lambda_context): return extract_context_from_lambda_context(lambda_context) data = kinesis.get("data") if data: + import base64 + b64_bytes = data.encode("ascii") str_bytes = base64.b64decode(b64_bytes) data_str = str_bytes.decode("ascii") @@ -387,6 +389,8 @@ def extract_context_from_kinesis_event(event, lambda_context): def _deterministic_sha256_hash(s: str, part: str) -> int: + import hashlib + sha256_hash = hashlib.sha256(s.encode()).hexdigest() # First two chars is '0b'. zfill to ensure 256 bits, but we only care about the first 128 bits binary_hash = bin(int(sha256_hash, 16))[2:].zfill(256) @@ -551,6 +555,8 @@ def get_injected_authorizer_data(event, is_http_api) -> dict: if not dd_data_raw: return None + import base64 + injected_data = json.loads(base64.b64decode(dd_data_raw)) # Lambda authorizer's results can be cached. But the payload will still have the injected diff --git a/datadog_lambda/trigger.py b/datadog_lambda/trigger.py index 708138bf4..8090e36e6 100644 --- a/datadog_lambda/trigger.py +++ b/datadog_lambda/trigger.py @@ -3,7 +3,6 @@ # This product includes software developed at Datadog (https://www.datadoghq.com/). # Copyright 2019 Datadog, Inc. -import base64 import gzip import ujson as json from io import BytesIO, BufferedReader @@ -242,6 +241,8 @@ def parse_event_source_arn(source: _EventSource, event: dict, context: Any) -> s # e.g. arn:aws:logs:us-west-1:123456789012:log-group:/my-log-group-xyz if source.event_type == EventTypes.CLOUDWATCH_LOGS: + import base64 + with gzip.GzipFile( fileobj=BytesIO(base64.b64decode(event.get("awslogs", {}).get("data"))) ) as decompress_stream: diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 5641bd159..8c1914e32 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -2,7 +2,6 @@ # under the Apache License Version 2.0. # This product includes software developed at Datadog (https://www.datadoghq.com/). # Copyright 2019 Datadog, Inc. -import base64 import os import logging import traceback @@ -23,11 +22,6 @@ XraySubsegment, Headers, ) -from datadog_lambda.metric import ( - flush_stats, - submit_invocations_metric, - submit_errors_metric, -) from datadog_lambda.module_name import modify_module_name from datadog_lambda.patch import patch_all from datadog_lambda.span_pointers import calculate_span_pointers @@ -248,7 +242,11 @@ def __call__(self, event, context, **kwargs): self.response = self.func(event, context, **kwargs) return self.response except Exception: - submit_errors_metric(context) + if not should_use_extension: + from datadog_lambda.metric import submit_errors_metric + + submit_errors_metric(context) + if self.span: self.span.set_traceback() raise @@ -274,6 +272,9 @@ def _inject_authorizer_span_headers(self, request_id): injected_headers[Headers.Parent_Span_Finish_Time] = finish_time_ns if request_id is not None: injected_headers[Headers.Authorizing_Request_Id] = request_id + + import base64 + datadog_data = base64.b64encode( json.dumps(injected_headers, escape_forward_slashes=False).encode() ).decode() @@ -284,7 +285,12 @@ def _before(self, event, context): try: self.response = None set_cold_start(init_timestamp_ns) - submit_invocations_metric(context) + + if not should_use_extension: + from datadog_lambda.metric import submit_invocations_metric + + submit_invocations_metric(context) + self.trigger_tags = extract_trigger_tags(event, context) # Extract Datadog trace context and source from incoming requests dd_context, trace_context_source, event_source = extract_dd_trace_context( @@ -383,6 +389,8 @@ def _after(self, event, context): logger.debug("Failed to create cold start spans. %s", e) if not self.flush_to_log or should_use_extension: + from datadog_lambda.metric import flush_stats + flush_stats(context) if should_use_extension and self.local_testing_mode: # when testing locally, the extension does not know when an diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index f47285e68..4b2430362 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -470,7 +470,7 @@ def lambda_handler(event, context): self.mock_write_metric_point_to_stdout.assert_not_called() def test_only_one_wrapper_in_use(self): - patcher = patch("datadog_lambda.wrapper.submit_invocations_metric") + patcher = patch("datadog_lambda.metric.submit_invocations_metric") self.mock_submit_invocations_metric = patcher.start() self.addCleanup(patcher.stop) From 7cd2baf6361d0a02b8b48e084fbc828a7db66b00 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Fri, 4 Apr 2025 10:49:52 -0400 Subject: [PATCH 017/164] v6.107.0 (#583) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 0c8d879b4..702691d81 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "6.106.0" +__version__ = "6.107.0" diff --git a/pyproject.toml b/pyproject.toml index 8db5e3525..165a8cbe4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "6.106.0" +version = "6.107.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 8207aa224692c1f3eb72cc5cb8dc10251e5368d2 Mon Sep 17 00:00:00 2001 From: Sam Brenner <106700075+sabrenner@users.noreply.github.com> Date: Wed, 16 Apr 2025 13:59:37 -0400 Subject: [PATCH 018/164] revert llmobs api key and forced agentless (#585) --- datadog_lambda/wrapper.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 8c1914e32..e81b1baab 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -49,14 +49,10 @@ if profiling_env_var: from ddtrace.profiling import profiler -llmobs_api_key = None llmobs_env_var = os.environ.get("DD_LLMOBS_ENABLED", "false").lower() in ("true", "1") if llmobs_env_var: - from datadog_lambda.api import get_api_key from ddtrace.llmobs import LLMObs - llmobs_api_key = get_api_key() - logger = logging.getLogger(__name__) DD_FLUSH_TO_LOG = "DD_FLUSH_TO_LOG" @@ -226,10 +222,7 @@ def __init__(self, func): # Enable LLM Observability if llmobs_env_var: - LLMObs.enable( - agentless_enabled=True, - api_key=llmobs_api_key, - ) + LLMObs.enable() logger.debug("datadog_lambda_wrapper initialized") except Exception as e: From 33cd5bf9e05bd3e3a35450c42b522ce1280b9add Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Thu, 24 Apr 2025 11:30:38 -0700 Subject: [PATCH 019/164] Add new region ap-southeast-7. (#586) --- ci/datasources/regions.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/datasources/regions.yaml b/ci/datasources/regions.yaml index 93816ce9c..f74c62b82 100644 --- a/ci/datasources/regions.yaml +++ b/ci/datasources/regions.yaml @@ -12,6 +12,7 @@ regions: - code: "ap-southeast-3" - code: "ap-southeast-4" - code: "ap-southeast-5" + - code: "ap-southeast-7" - code: "ap-northeast-1" - code: "ap-northeast-2" - code: "ap-northeast-3" From 72caf0ae5d29f82649b57fb6075dcf9a4f7a436b Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Tue, 29 Apr 2025 14:10:13 -0400 Subject: [PATCH 020/164] add mx-central-1 region (#587) --- ci/datasources/regions.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/datasources/regions.yaml b/ci/datasources/regions.yaml index f74c62b82..d41bade3a 100644 --- a/ci/datasources/regions.yaml +++ b/ci/datasources/regions.yaml @@ -29,4 +29,5 @@ regions: - code: "il-central-1" - code: "me-south-1" - code: "me-central-1" + - code: "mx-central-1" - code: "sa-east-1" From 1f8d3fd96a7dce844a3ecaea4ec2f41be1e73f56 Mon Sep 17 00:00:00 2001 From: Aleksandr Pasechnik Date: Tue, 6 May 2025 11:45:18 -0400 Subject: [PATCH 021/164] feat: Correct FIPS-mode metrics (#588) - Our `dogstatsd` client now supports timestamps for the metrics that it will send. - This unblocks us to always send metrics to the extension, even if they have a timestamp. Confirmed that this actually works now with both bottlecap and the go agent. - Refactored the metrics workflow to have an explicit choice of metrics handlers (Extension, Forwarder, Datadog API, or, for some FIPS usecases, No Handler). - Added a `DD_LAMBDA_FIPS_MODE` flag which allows FIPS-mode logic to be enabled in commercial regions or disabled in govcloud regions. - The new FIPS mode is used for Datadog API Key secret lookup and for metrics handling decisions. ### Breaking Change Since the `DD_LAMBDA_FIPS_MODE` defaults to `true` in govcloud, direct metrics submission there (without an Extension or a Forwarder) will now be disabled. --- datadog_lambda/api.py | 22 ++-- datadog_lambda/dogstatsd.py | 27 +++-- datadog_lambda/fips.py | 19 ++++ datadog_lambda/metric.py | 149 +++++++++++++++----------- datadog_lambda/stats_writer.py | 2 +- datadog_lambda/statsd_writer.py | 6 +- datadog_lambda/thread_stats_writer.py | 3 +- tests/test_api.py | 26 ++++- tests/test_dogstatsd.py | 20 ++-- tests/test_metric.py | 123 +++++++++++++-------- 10 files changed, 254 insertions(+), 143 deletions(-) create mode 100644 datadog_lambda/fips.py diff --git a/datadog_lambda/api.py b/datadog_lambda/api.py index fd3e2c177..d1cee4e4d 100644 --- a/datadog_lambda/api.py +++ b/datadog_lambda/api.py @@ -1,5 +1,7 @@ -import os import logging +import os + +from datadog_lambda.fips import fips_mode_enabled logger = logging.getLogger(__name__) KMS_ENCRYPTION_CONTEXT_KEY = "LambdaFunctionName" @@ -7,9 +9,10 @@ def decrypt_kms_api_key(kms_client, ciphertext): - from botocore.exceptions import ClientError import base64 + from botocore.exceptions import ClientError + """ Decodes and deciphers the base64-encoded ciphertext given as a parameter using KMS. For this to work properly, the Lambda function must have the appropriate IAM permissions. @@ -63,10 +66,9 @@ def get_api_key() -> str: DD_API_KEY = os.environ.get("DD_API_KEY", os.environ.get("DATADOG_API_KEY", "")) LAMBDA_REGION = os.environ.get("AWS_REGION", "") - is_gov_region = LAMBDA_REGION.startswith("us-gov-") - if is_gov_region: + if fips_mode_enabled: logger.debug( - "Govcloud region detected. Using FIPs endpoints for secrets management." + "FIPS mode is enabled, using FIPS endpoints for secrets management." ) if DD_API_KEY_SECRET_ARN: @@ -80,7 +82,7 @@ def get_api_key() -> str: return "" endpoint_url = ( f"https://secretsmanager-fips.{secrets_region}.amazonaws.com" - if is_gov_region + if fips_mode_enabled else None ) secrets_manager_client = _boto3_client( @@ -92,7 +94,9 @@ def get_api_key() -> str: elif DD_API_KEY_SSM_NAME: # SSM endpoints: https://docs.aws.amazon.com/general/latest/gr/ssm.html fips_endpoint = ( - f"https://ssm-fips.{LAMBDA_REGION}.amazonaws.com" if is_gov_region else None + f"https://ssm-fips.{LAMBDA_REGION}.amazonaws.com" + if fips_mode_enabled + else None ) ssm_client = _boto3_client("ssm", endpoint_url=fips_endpoint) api_key = ssm_client.get_parameter( @@ -101,7 +105,9 @@ def get_api_key() -> str: elif DD_KMS_API_KEY: # KMS endpoints: https://docs.aws.amazon.com/general/latest/gr/kms.html fips_endpoint = ( - f"https://kms-fips.{LAMBDA_REGION}.amazonaws.com" if is_gov_region else None + f"https://kms-fips.{LAMBDA_REGION}.amazonaws.com" + if fips_mode_enabled + else None ) kms_client = _boto3_client("kms", endpoint_url=fips_endpoint) api_key = decrypt_kms_api_key(kms_client, DD_KMS_API_KEY) diff --git a/datadog_lambda/dogstatsd.py b/datadog_lambda/dogstatsd.py index a627492dc..f30a20399 100644 --- a/datadog_lambda/dogstatsd.py +++ b/datadog_lambda/dogstatsd.py @@ -1,11 +1,10 @@ +import errno import logging import os -import socket -import errno import re +import socket from threading import Lock - MIN_SEND_BUFFER_SIZE = 32 * 1024 log = logging.getLogger("datadog_lambda.dogstatsd") @@ -55,14 +54,21 @@ def _get_udp_socket(cls, host, port): return sock - def distribution(self, metric, value, tags=None): + def distribution(self, metric, value, tags=None, timestamp=None): """ - Send a global distribution value, optionally setting tags. + Send a global distribution value, optionally setting tags. The optional + timestamp should be an integer representing seconds since the epoch + (January 1, 1970, 00:00:00 UTC). >>> statsd.distribution("uploaded.file.size", 1445) >>> statsd.distribution("album.photo.count", 26, tags=["gender:female"]) + >>> statsd.distribution( + >>> "historic.file.count", + >>> 5, + >>> timestamp=int(datetime(2020, 2, 14, 12, 0, 0).timestamp()), + >>> ) """ - self._report(metric, "d", value, tags) + self._report(metric, "d", value, tags, timestamp) def close_socket(self): """ @@ -84,20 +90,21 @@ def normalize_tags(self, tag_list): for tag in tag_list ] - def _serialize_metric(self, metric, metric_type, value, tags): + def _serialize_metric(self, metric, metric_type, value, tags, timestamp): # Create/format the metric packet - return "%s:%s|%s%s" % ( + return "%s:%s|%s%s%s" % ( metric, value, metric_type, ("|#" + ",".join(self.normalize_tags(tags))) if tags else "", + ("|T" + str(timestamp)) if timestamp is not None else "", ) - def _report(self, metric, metric_type, value, tags): + def _report(self, metric, metric_type, value, tags, timestamp): if value is None: return - payload = self._serialize_metric(metric, metric_type, value, tags) + payload = self._serialize_metric(metric, metric_type, value, tags, timestamp) # Send it self._send_to_server(payload) diff --git a/datadog_lambda/fips.py b/datadog_lambda/fips.py new file mode 100644 index 000000000..8442ddd94 --- /dev/null +++ b/datadog_lambda/fips.py @@ -0,0 +1,19 @@ +import logging +import os + +is_gov_region = os.environ.get("AWS_REGION", "").startswith("us-gov-") + +fips_mode_enabled = ( + os.environ.get( + "DD_LAMBDA_FIPS_MODE", + "true" if is_gov_region else "false", + ).lower() + == "true" +) + +if is_gov_region or fips_mode_enabled: + logger = logging.getLogger(__name__) + logger.debug( + "Python Lambda Layer FIPS mode is %s.", + "enabled" if fips_mode_enabled else "not enabled", + ) diff --git a/datadog_lambda/metric.py b/datadog_lambda/metric.py index f9c67a26e..0c18b5178 100644 --- a/datadog_lambda/metric.py +++ b/datadog_lambda/metric.py @@ -3,37 +3,66 @@ # This product includes software developed at Datadog (https://www.datadoghq.com/). # Copyright 2019 Datadog, Inc. +import enum +import logging import os import time -import logging -import ujson as json from datetime import datetime, timedelta +import ujson as json + from datadog_lambda.extension import should_use_extension -from datadog_lambda.tags import get_enhanced_metrics_tags, dd_lambda_layer_tag +from datadog_lambda.fips import fips_mode_enabled +from datadog_lambda.tags import dd_lambda_layer_tag, get_enhanced_metrics_tags logger = logging.getLogger(__name__) -lambda_stats = None -extension_thread_stats = None -flush_in_thread = os.environ.get("DD_FLUSH_IN_THREAD", "").lower() == "true" +class MetricsHandler(enum.Enum): + EXTENSION = "extension" + FORWARDER = "forwarder" + DATADOG_API = "datadog_api" + NO_METRICS = "no_metrics" + -if should_use_extension: +def _select_metrics_handler(): + if should_use_extension: + return MetricsHandler.EXTENSION + if os.environ.get("DD_FLUSH_TO_LOG", "").lower() == "true": + return MetricsHandler.FORWARDER + + if fips_mode_enabled: + logger.debug( + "With FIPS mode enabled, the Datadog API metrics handler is unavailable." + ) + return MetricsHandler.NO_METRICS + + return MetricsHandler.DATADOG_API + + +metrics_handler = _select_metrics_handler() +logger.debug("identified primary metrics handler as %s", metrics_handler) + + +lambda_stats = None +if metrics_handler == MetricsHandler.EXTENSION: from datadog_lambda.statsd_writer import StatsDWriter lambda_stats = StatsDWriter() -else: + +elif metrics_handler == MetricsHandler.DATADOG_API: # Periodical flushing in a background thread is NOT guaranteed to succeed # and leads to data loss. When disabled, metrics are only flushed at the # end of invocation. To make metrics submitted from a long-running Lambda # function available sooner, consider using the Datadog Lambda extension. - from datadog_lambda.thread_stats_writer import ThreadStatsWriter from datadog_lambda.api import init_api + from datadog_lambda.thread_stats_writer import ThreadStatsWriter + flush_in_thread = os.environ.get("DD_FLUSH_IN_THREAD", "").lower() == "true" init_api() lambda_stats = ThreadStatsWriter(flush_in_thread) + enhanced_metrics_enabled = ( os.environ.get("DD_ENHANCED_METRICS", "true").lower() == "true" ) @@ -44,16 +73,19 @@ def lambda_metric(metric_name, value, timestamp=None, tags=None, force_async=Fal Submit a data point to Datadog distribution metrics. https://docs.datadoghq.com/graphing/metrics/distributions/ - When DD_FLUSH_TO_LOG is True, write metric to log, and - wait for the Datadog Log Forwarder Lambda function to submit - the metrics asynchronously. + If the Datadog Lambda Extension is present, metrics are submitted to its + dogstatsd endpoint. + + When DD_FLUSH_TO_LOG is True or force_async is True, write metric to log, + and wait for the Datadog Log Forwarder Lambda function to submit the + metrics asynchronously. Otherwise, the metrics will be submitted to the Datadog API periodically and at the end of the function execution in a background thread. - Note that if the extension is present, it will override the DD_FLUSH_TO_LOG value - and always use the layer to send metrics to the extension + Note that if the extension is present, it will override the DD_FLUSH_TO_LOG + value and always use the layer to send metrics to the extension """ if not metric_name or not isinstance(metric_name, str): logger.warning( @@ -71,56 +103,54 @@ def lambda_metric(metric_name, value, timestamp=None, tags=None, force_async=Fal ) return - flush_to_logs = os.environ.get("DD_FLUSH_TO_LOG", "").lower() == "true" tags = [] if tags is None else list(tags) tags.append(dd_lambda_layer_tag) - if should_use_extension and timestamp is not None: - # The extension does not support timestamps for distributions so we create a - # a thread stats writer to submit metrics with timestamps to the API - timestamp_ceiling = int( - (datetime.now() - timedelta(hours=4)).timestamp() - ) # 4 hours ago - if isinstance(timestamp, datetime): - timestamp = int(timestamp.timestamp()) - if timestamp_ceiling > timestamp: - logger.warning( - "Timestamp %s is older than 4 hours, not submitting metric %s", - timestamp, - metric_name, - ) - return - global extension_thread_stats - if extension_thread_stats is None: - from datadog_lambda.thread_stats_writer import ThreadStatsWriter - from datadog_lambda.api import init_api - - init_api() - extension_thread_stats = ThreadStatsWriter(flush_in_thread) - - extension_thread_stats.distribution( - metric_name, value, tags=tags, timestamp=timestamp - ) - return + if metrics_handler == MetricsHandler.EXTENSION: + if timestamp is not None: + if isinstance(timestamp, datetime): + timestamp = int(timestamp.timestamp()) + + timestamp_floor = int((datetime.now() - timedelta(hours=4)).timestamp()) + if timestamp < timestamp_floor: + logger.warning( + "Timestamp %s is older than 4 hours, not submitting metric %s", + timestamp, + metric_name, + ) + return - if should_use_extension: logger.debug( "Sending metric %s value %s to Datadog via extension", metric_name, value ) lambda_stats.distribution(metric_name, value, tags=tags, timestamp=timestamp) + + elif force_async or (metrics_handler == MetricsHandler.FORWARDER): + write_metric_point_to_stdout(metric_name, value, timestamp=timestamp, tags=tags) + + elif metrics_handler == MetricsHandler.DATADOG_API: + lambda_stats.distribution(metric_name, value, tags=tags, timestamp=timestamp) + + elif metrics_handler == MetricsHandler.NO_METRICS: + logger.debug( + "Metric %s cannot be submitted because the metrics handler is disabled", + metric_name, + ), + else: - if flush_to_logs or force_async: - write_metric_point_to_stdout( - metric_name, value, timestamp=timestamp, tags=tags - ) - else: - lambda_stats.distribution( - metric_name, value, tags=tags, timestamp=timestamp - ) + # This should be qutie impossible, but let's at least log a message if + # it somehow happens. + logger.debug( + "Metric %s cannot be submitted because the metrics handler is not configured: %s", + metric_name, + metrics_handler, + ) -def write_metric_point_to_stdout(metric_name, value, timestamp=None, tags=[]): +def write_metric_point_to_stdout(metric_name, value, timestamp=None, tags=None): """Writes the specified metric point to standard output""" + tags = tags or [] + logger.debug( "Sending metric %s value %s to Datadog via log forwarder", metric_name, value ) @@ -138,19 +168,8 @@ def write_metric_point_to_stdout(metric_name, value, timestamp=None, tags=[]): def flush_stats(lambda_context=None): - lambda_stats.flush() - - if extension_thread_stats is not None: - tags = None - if lambda_context is not None: - tags = get_enhanced_metrics_tags(lambda_context) - split_arn = lambda_context.invoked_function_arn.split(":") - if len(split_arn) > 7: - # Get rid of the alias - split_arn.pop() - arn = ":".join(split_arn) - tags.append("function_arn:" + arn) - extension_thread_stats.flush(tags) + if lambda_stats is not None: + lambda_stats.flush() def submit_enhanced_metric(metric_name, lambda_context): diff --git a/datadog_lambda/stats_writer.py b/datadog_lambda/stats_writer.py index d3919c30f..563b1ae98 100644 --- a/datadog_lambda/stats_writer.py +++ b/datadog_lambda/stats_writer.py @@ -1,5 +1,5 @@ class StatsWriter: - def distribution(self, metric_name, value, tags=[], timestamp=None): + def distribution(self, metric_name, value, tags=None, timestamp=None): raise NotImplementedError() def flush(self): diff --git a/datadog_lambda/statsd_writer.py b/datadog_lambda/statsd_writer.py index 33843dc6a..4aaab8d53 100644 --- a/datadog_lambda/statsd_writer.py +++ b/datadog_lambda/statsd_writer.py @@ -1,5 +1,5 @@ -from datadog_lambda.stats_writer import StatsWriter from datadog_lambda.dogstatsd import statsd +from datadog_lambda.stats_writer import StatsWriter class StatsDWriter(StatsWriter): @@ -7,8 +7,8 @@ class StatsDWriter(StatsWriter): Writes distribution metrics using StatsD protocol """ - def distribution(self, metric_name, value, tags=[], timestamp=None): - statsd.distribution(metric_name, value, tags=tags) + def distribution(self, metric_name, value, tags=None, timestamp=None): + statsd.distribution(metric_name, value, tags=tags, timestamp=timestamp) def flush(self): pass diff --git a/datadog_lambda/thread_stats_writer.py b/datadog_lambda/thread_stats_writer.py index 422a9a0a4..f21ee31f9 100644 --- a/datadog_lambda/thread_stats_writer.py +++ b/datadog_lambda/thread_stats_writer.py @@ -3,6 +3,7 @@ # Make sure that this package would always be lazy-loaded/outside from the critical path # since underlying packages are quite heavy to load and useless when the extension is present from datadog.threadstats import ThreadStats + from datadog_lambda.stats_writer import StatsWriter logger = logging.getLogger(__name__) @@ -17,7 +18,7 @@ def __init__(self, flush_in_thread): self.thread_stats = ThreadStats(compress_payload=True) self.thread_stats.start(flush_in_thread=flush_in_thread) - def distribution(self, metric_name, value, tags=[], timestamp=None): + def distribution(self, metric_name, value, tags=None, timestamp=None): self.thread_stats.distribution( metric_name, value, tags=tags, timestamp=timestamp ) diff --git a/tests/test_api.py b/tests/test_api.py index c98d91eb2..59ee4ee8d 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1,6 +1,6 @@ import os import unittest -from unittest.mock import patch, MagicMock +from unittest.mock import MagicMock, patch import datadog_lambda.api as api @@ -22,6 +22,7 @@ def setUp(self): ) self.env_patcher.start() + @patch("datadog_lambda.api.fips_mode_enabled", True) @patch("botocore.session.Session.create_client") def test_secrets_manager_fips_endpoint(self, mock_boto3_client): mock_client = MagicMock() @@ -62,6 +63,28 @@ def test_secrets_manager_different_region(self, mock_boto3_client): ) self.assertEqual(api_key, "test-api-key") + @patch("datadog_lambda.api.fips_mode_enabled", True) + @patch("botocore.session.Session.create_client") + def test_secrets_manager_different_region_but_still_fips(self, mock_boto3_client): + mock_client = MagicMock() + mock_client.get_secret_value.return_value = {"SecretString": "test-api-key"} + mock_boto3_client.return_value = mock_client + + os.environ["AWS_REGION"] = "us-east-1" + os.environ[ + "DD_API_KEY_SECRET_ARN" + ] = "arn:aws:secretsmanager:us-west-1:1234567890:secret:key-name-123ABC" + + api_key = api.get_api_key() + + mock_boto3_client.assert_called_with( + "secretsmanager", + endpoint_url="https://secretsmanager-fips.us-west-1.amazonaws.com", + region_name="us-west-1", + ) + self.assertEqual(api_key, "test-api-key") + + @patch("datadog_lambda.api.fips_mode_enabled", True) @patch("botocore.session.Session.create_client") def test_ssm_fips_endpoint(self, mock_boto3_client): mock_client = MagicMock() @@ -80,6 +103,7 @@ def test_ssm_fips_endpoint(self, mock_boto3_client): ) self.assertEqual(api_key, "test-api-key") + @patch("datadog_lambda.api.fips_mode_enabled", True) @patch("botocore.session.Session.create_client") @patch("datadog_lambda.api.decrypt_kms_api_key") def test_kms_fips_endpoint(self, mock_decrypt_kms, mock_boto3_client): diff --git a/tests/test_dogstatsd.py b/tests/test_dogstatsd.py index 149e1a707..ea6afd488 100644 --- a/tests/test_dogstatsd.py +++ b/tests/test_dogstatsd.py @@ -1,5 +1,5 @@ -from collections import deque import unittest +from collections import deque from datadog_lambda.dogstatsd import statsd @@ -36,16 +36,20 @@ def test_init(self): self.assertEqual(statsd.port, 8125) self.assertEqual(statsd.encoding, "utf-8") - def test_distribution_no_tags(self): - statsd.distribution("my.test.metric", 3) + def _checkOnlyOneMetric(self, value): payload = self.recv() metrics = payload.split("\n") self.assertEqual(len(metrics), 1) - self.assertEqual("my.test.metric:3|d", metrics[0]) + self.assertEqual(value, metrics[0]) + + def test_distribution_no_tags(self): + statsd.distribution("my.test.metric", 3) + self._checkOnlyOneMetric("my.test.metric:3|d") def test_distribution_with_tags(self): statsd.distribution("my.test.tags.metric", 3, tags=["taga:valuea,tagb:valueb"]) - payload = self.recv() - metrics = payload.split("\n") - self.assertEqual(len(metrics), 1) - self.assertEqual("my.test.tags.metric:3|d|#taga:valuea_tagb:valueb", metrics[0]) + self._checkOnlyOneMetric("my.test.tags.metric:3|d|#taga:valuea_tagb:valueb") + + def test_distribution_with_timestamp(self): + statsd.distribution("my.test.timestamp.metric", 9, timestamp=123456789) + self._checkOnlyOneMetric("my.test.timestamp.metric:9|d|T123456789") diff --git a/tests/test_metric.py b/tests/test_metric.py index d10a0f0d1..a4b0be2c4 100644 --- a/tests/test_metric.py +++ b/tests/test_metric.py @@ -1,23 +1,33 @@ import os import unittest - -from unittest.mock import patch, call +from datetime import datetime, timedelta +from unittest.mock import call, patch from botocore.exceptions import ClientError as BotocoreClientError from datadog.api.exceptions import ClientError -from datetime import datetime, timedelta -from datadog_lambda.metric import lambda_metric, flush_stats -from datadog_lambda.api import decrypt_kms_api_key, KMS_ENCRYPTION_CONTEXT_KEY -from datadog_lambda.thread_stats_writer import ThreadStatsWriter +from datadog_lambda.api import KMS_ENCRYPTION_CONTEXT_KEY, decrypt_kms_api_key +from datadog_lambda.metric import ( + MetricsHandler, + _select_metrics_handler, + flush_stats, + lambda_metric, +) from datadog_lambda.tags import dd_lambda_layer_tag +from datadog_lambda.thread_stats_writer import ThreadStatsWriter class TestLambdaMetric(unittest.TestCase): def setUp(self): - patcher = patch("datadog_lambda.metric.lambda_stats") - self.mock_metric_lambda_stats = patcher.start() - self.addCleanup(patcher.stop) + lambda_stats_patcher = patch("datadog_lambda.metric.lambda_stats") + self.mock_metric_lambda_stats = lambda_stats_patcher.start() + self.addCleanup(lambda_stats_patcher.stop) + + stdout_metric_patcher = patch( + "datadog_lambda.metric.write_metric_point_to_stdout" + ) + self.mock_write_metric_point_to_stdout = stdout_metric_patcher.start() + self.addCleanup(stdout_metric_patcher.stop) def test_lambda_metric_tagged_with_dd_lambda_layer(self): lambda_metric("test", 1) @@ -35,67 +45,94 @@ def test_lambda_metric_tagged_with_dd_lambda_layer(self): # let's fake that the extension is present, this should override DD_FLUSH_TO_LOG @patch("datadog_lambda.metric.should_use_extension", True) - def test_lambda_metric_flush_to_log_with_extension(self): + def test_select_metrics_handler_extension_despite_flush_to_logs(self): + os.environ["DD_FLUSH_TO_LOG"] = "True" + self.assertEqual(MetricsHandler.EXTENSION, _select_metrics_handler()) + del os.environ["DD_FLUSH_TO_LOG"] + + @patch("datadog_lambda.metric.should_use_extension", False) + def test_select_metrics_handler_forwarder_when_flush_to_logs(self): os.environ["DD_FLUSH_TO_LOG"] = "True" + self.assertEqual(MetricsHandler.FORWARDER, _select_metrics_handler()) + del os.environ["DD_FLUSH_TO_LOG"] + + @patch("datadog_lambda.metric.should_use_extension", False) + def test_select_metrics_handler_dd_api_fallback(self): + os.environ["DD_FLUSH_TO_LOG"] = "False" + self.assertEqual(MetricsHandler.DATADOG_API, _select_metrics_handler()) + del os.environ["DD_FLUSH_TO_LOG"] + + @patch("datadog_lambda.metric.fips_mode_enabled", True) + @patch("datadog_lambda.metric.should_use_extension", False) + def test_select_metrics_handler_has_no_fallback_in_fips_mode(self): + os.environ["DD_FLUSH_TO_LOG"] = "False" + self.assertEqual(MetricsHandler.NO_METRICS, _select_metrics_handler()) + del os.environ["DD_FLUSH_TO_LOG"] + + @patch("datadog_lambda.metric.metrics_handler", MetricsHandler.EXTENSION) + def test_lambda_metric_goes_to_extension_with_extension_handler(self): lambda_metric("test", 1) self.mock_metric_lambda_stats.distribution.assert_has_calls( [call("test", 1, timestamp=None, tags=[dd_lambda_layer_tag])] ) - del os.environ["DD_FLUSH_TO_LOG"] - @patch("datadog_lambda.metric.should_use_extension", True) - def test_lambda_metric_timestamp_with_extension(self): - patcher = patch("datadog_lambda.metric.extension_thread_stats") - self.mock_metric_extension_thread_stats = patcher.start() - self.addCleanup(patcher.stop) + @patch("datadog_lambda.metric.metrics_handler", MetricsHandler.NO_METRICS) + def test_lambda_metric_has_nowhere_to_go_with_no_metrics_handler(self): + lambda_metric("test", 1) + self.mock_metric_lambda_stats.distribution.assert_not_called() + self.mock_write_metric_point_to_stdout.assert_not_called() + @patch("datadog_lambda.metric.metrics_handler", MetricsHandler.EXTENSION) + def test_lambda_metric_timestamp_with_extension(self): delta = timedelta(minutes=1) timestamp = int((datetime.now() - delta).timestamp()) lambda_metric("test_timestamp", 1, timestamp) - self.mock_metric_lambda_stats.distribution.assert_not_called() - self.mock_metric_extension_thread_stats.distribution.assert_called_with( - "test_timestamp", 1, timestamp=timestamp, tags=[dd_lambda_layer_tag] + self.mock_metric_lambda_stats.distribution.assert_has_calls( + [call("test_timestamp", 1, timestamp=timestamp, tags=[dd_lambda_layer_tag])] ) + self.mock_write_metric_point_to_stdout.assert_not_called() - @patch("datadog_lambda.metric.should_use_extension", True) + @patch("datadog_lambda.metric.metrics_handler", MetricsHandler.EXTENSION) def test_lambda_metric_datetime_with_extension(self): - patcher = patch("datadog_lambda.metric.extension_thread_stats") - self.mock_metric_extension_thread_stats = patcher.start() - self.addCleanup(patcher.stop) - - delta = timedelta(hours=5) + delta = timedelta(minutes=1) timestamp = datetime.now() - delta - lambda_metric("test_timestamp", 1, timestamp) - self.mock_metric_lambda_stats.distribution.assert_not_called() - self.mock_metric_extension_thread_stats.distribution.assert_not_called() + lambda_metric("test_datetime_timestamp", 0, timestamp) + self.mock_metric_lambda_stats.distribution.assert_has_calls( + [ + call( + "test_datetime_timestamp", + 0, + timestamp=int(timestamp.timestamp()), + tags=[dd_lambda_layer_tag], + ) + ] + ) + self.mock_write_metric_point_to_stdout.assert_not_called() - @patch("datadog_lambda.metric.should_use_extension", True) + @patch("datadog_lambda.metric.metrics_handler", MetricsHandler.EXTENSION) def test_lambda_metric_invalid_timestamp_with_extension(self): - patcher = patch("datadog_lambda.metric.extension_thread_stats") - self.mock_metric_extension_thread_stats = patcher.start() - self.addCleanup(patcher.stop) - delta = timedelta(hours=5) timestamp = int((datetime.now() - delta).timestamp()) lambda_metric("test_timestamp", 1, timestamp) self.mock_metric_lambda_stats.distribution.assert_not_called() - self.mock_metric_extension_thread_stats.distribution.assert_not_called() + self.mock_write_metric_point_to_stdout.assert_not_called() + @patch("datadog_lambda.metric.metrics_handler", MetricsHandler.FORWARDER) def test_lambda_metric_flush_to_log(self): - os.environ["DD_FLUSH_TO_LOG"] = "True" - lambda_metric("test", 1) self.mock_metric_lambda_stats.distribution.assert_not_called() - - del os.environ["DD_FLUSH_TO_LOG"] + self.mock_write_metric_point_to_stdout.assert_has_calls( + [call("test", 1, timestamp=None, tags=[dd_lambda_layer_tag])] + ) @patch("datadog_lambda.metric.logger.warning") def test_lambda_metric_invalid_metric_name_none(self, mock_logger_warning): lambda_metric(None, 1) self.mock_metric_lambda_stats.distribution.assert_not_called() + self.mock_write_metric_point_to_stdout.assert_not_called() mock_logger_warning.assert_called_once_with( "Ignoring metric submission. Invalid metric name: %s", None ) @@ -104,6 +141,7 @@ def test_lambda_metric_invalid_metric_name_none(self, mock_logger_warning): def test_lambda_metric_invalid_metric_name_not_string(self, mock_logger_warning): lambda_metric(123, 1) self.mock_metric_lambda_stats.distribution.assert_not_called() + self.mock_write_metric_point_to_stdout.assert_not_called() mock_logger_warning.assert_called_once_with( "Ignoring metric submission. Invalid metric name: %s", 123 ) @@ -112,6 +150,7 @@ def test_lambda_metric_invalid_metric_name_not_string(self, mock_logger_warning) def test_lambda_metric_non_numeric_value(self, mock_logger_warning): lambda_metric("test.non_numeric", "oops") self.mock_metric_lambda_stats.distribution.assert_not_called() + self.mock_write_metric_point_to_stdout.assert_not_called() mock_logger_warning.assert_called_once_with( "Ignoring metric submission for metric '%s' because the value is not numeric: %r", "test.non_numeric", @@ -127,10 +166,6 @@ def setUp(self): self.mock_threadstats_flush_distributions = patcher.start() self.addCleanup(patcher.stop) - patcher = patch("datadog_lambda.metric.extension_thread_stats") - self.mock_extension_thread_stats = patcher.start() - self.addCleanup(patcher.stop) - def test_retry_on_remote_disconnected(self): # Raise the RemoteDisconnected error lambda_stats = ThreadStatsWriter(True) @@ -209,10 +244,6 @@ def test_flush_temp_constant_tags(self): lambda_stats.thread_stats.constant_tags, original_constant_tags ) - def test_flush_stats_without_context(self): - flush_stats(lambda_context=None) - self.mock_extension_thread_stats.flush.assert_called_with(None) - MOCK_FUNCTION_NAME = "myFunction" From 8a01794b02244efab5814f52e442aacf71682aac Mon Sep 17 00:00:00 2001 From: Aleksandr Pasechnik Date: Wed, 7 May 2025 16:45:13 -0400 Subject: [PATCH 022/164] 6.108.0 Release Candidate (#589) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 702691d81..bcd37def9 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "6.107.0" +__version__ = "6.108.0" diff --git a/pyproject.toml b/pyproject.toml index 165a8cbe4..8f16b438c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "6.107.0" +version = "6.108.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 8ca58b40dcfa8ad4c2169a27ddca27b19c7fb348 Mon Sep 17 00:00:00 2001 From: Aleksandr Pasechnik Date: Thu, 8 May 2025 11:19:03 -0400 Subject: [PATCH 023/164] fix: timestamps we send to the extension should be integers (#590) Also added some defense in depth for our lower level statsd call. --- datadog_lambda/dogstatsd.py | 2 +- datadog_lambda/metric.py | 12 ++++++++++++ tests/test_dogstatsd.py | 4 ++++ tests/test_metric.py | 28 ++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/datadog_lambda/dogstatsd.py b/datadog_lambda/dogstatsd.py index f30a20399..a08e25926 100644 --- a/datadog_lambda/dogstatsd.py +++ b/datadog_lambda/dogstatsd.py @@ -97,7 +97,7 @@ def _serialize_metric(self, metric, metric_type, value, tags, timestamp): value, metric_type, ("|#" + ",".join(self.normalize_tags(tags))) if tags else "", - ("|T" + str(timestamp)) if timestamp is not None else "", + ("|T" + str(int(timestamp))) if timestamp is not None else "", ) def _report(self, metric, metric_type, value, tags, timestamp): diff --git a/datadog_lambda/metric.py b/datadog_lambda/metric.py index 0c18b5178..c9b978d68 100644 --- a/datadog_lambda/metric.py +++ b/datadog_lambda/metric.py @@ -111,6 +111,18 @@ def lambda_metric(metric_name, value, timestamp=None, tags=None, force_async=Fal if isinstance(timestamp, datetime): timestamp = int(timestamp.timestamp()) + else: + try: + timestamp = int(timestamp) + except Exception: + logger.debug( + "Ignoring metric submission for metric '%s' because the timestamp cannot " + "be turned into an integer: %r", + metric_name, + timestamp, + ) + return + timestamp_floor = int((datetime.now() - timedelta(hours=4)).timestamp()) if timestamp < timestamp_floor: logger.warning( diff --git a/tests/test_dogstatsd.py b/tests/test_dogstatsd.py index ea6afd488..6fe79372d 100644 --- a/tests/test_dogstatsd.py +++ b/tests/test_dogstatsd.py @@ -53,3 +53,7 @@ def test_distribution_with_tags(self): def test_distribution_with_timestamp(self): statsd.distribution("my.test.timestamp.metric", 9, timestamp=123456789) self._checkOnlyOneMetric("my.test.timestamp.metric:9|d|T123456789") + + def test_distribution_with_float_timestamp(self): + statsd.distribution("my.test.timestamp.metric", 9, timestamp=123456789.123) + self._checkOnlyOneMetric("my.test.timestamp.metric:9|d|T123456789") diff --git a/tests/test_metric.py b/tests/test_metric.py index a4b0be2c4..e7dab2c3c 100644 --- a/tests/test_metric.py +++ b/tests/test_metric.py @@ -111,6 +111,34 @@ def test_lambda_metric_datetime_with_extension(self): ) self.mock_write_metric_point_to_stdout.assert_not_called() + @patch("datadog_lambda.metric.metrics_handler", MetricsHandler.EXTENSION) + def test_lambda_metric_float_with_extension(self): + delta = timedelta(minutes=1) + timestamp_float = (datetime.now() - delta).timestamp() + timestamp_int = int(timestamp_float) + + lambda_metric("test_timestamp", 1, timestamp_float) + self.mock_metric_lambda_stats.distribution.assert_has_calls( + [ + call( + "test_timestamp", + 1, + timestamp=timestamp_int, + tags=[dd_lambda_layer_tag], + ) + ] + ) + self.mock_write_metric_point_to_stdout.assert_not_called() + + @patch("datadog_lambda.metric.metrics_handler", MetricsHandler.EXTENSION) + def test_lambda_metric_timestamp_junk_with_extension(self): + delta = timedelta(minutes=1) + timestamp = (datetime.now() - delta).isoformat() + + lambda_metric("test_timestamp", 1, timestamp) + self.mock_metric_lambda_stats.distribution.assert_not_called() + self.mock_write_metric_point_to_stdout.assert_not_called() + @patch("datadog_lambda.metric.metrics_handler", MetricsHandler.EXTENSION) def test_lambda_metric_invalid_timestamp_with_extension(self): delta = timedelta(hours=5) From 1226b2de560afc6a8fe3e631ad84960b5dd03eef Mon Sep 17 00:00:00 2001 From: Aleksandr Pasechnik Date: Fri, 9 May 2025 12:46:04 -0400 Subject: [PATCH 024/164] v6.109.0 (#591) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index bcd37def9..c3aaa6b70 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "6.108.0" +__version__ = "6.109.0" diff --git a/pyproject.toml b/pyproject.toml index 8f16b438c..cccef63ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "6.108.0" +version = "6.109.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 16774731b8050e3355d24ffe6d917c656cf0c09f Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Fri, 9 May 2025 13:21:33 -0400 Subject: [PATCH 025/164] (feat): Enable Exception Replay in Lambda (#592) * import exception replay from tracer and enable if `DD_EXCEPTION_REPLAY_ENABLED=true` * lint --- datadog_lambda/wrapper.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index e81b1baab..e54601188 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -53,6 +53,12 @@ if llmobs_env_var: from ddtrace.llmobs import LLMObs +exception_replay_env_var = os.environ.get( + "DD_EXCEPTION_REPLAY_ENABLED", "false" +).lower() in ("true", "1") +if exception_replay_env_var: + from ddtrace.debugging._exception.replay import SpanExceptionHandler + logger = logging.getLogger(__name__) DD_FLUSH_TO_LOG = "DD_FLUSH_TO_LOG" @@ -224,6 +230,11 @@ def __init__(self, func): if llmobs_env_var: LLMObs.enable() + # Enable Exception Replay + if exception_replay_env_var: + logger.debug("Enabling exception replay") + SpanExceptionHandler.enable() + logger.debug("datadog_lambda_wrapper initialized") except Exception as e: logger.error(format_err_with_traceback(e)) From 9b694f7e25c58e9cbffb97392145c6962747fa87 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Tue, 13 May 2025 12:47:49 -0400 Subject: [PATCH 026/164] fix: safely getting all the values for trigger tags (#593) * solution2: safely getting all the values * lint * add comment back --- datadog_lambda/trigger.py | 45 +++++++++++++++++++++------ tests/test_trigger.py | 65 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 10 deletions(-) diff --git a/datadog_lambda/trigger.py b/datadog_lambda/trigger.py index 8090e36e6..52978d4bd 100644 --- a/datadog_lambda/trigger.py +++ b/datadog_lambda/trigger.py @@ -114,10 +114,14 @@ def parse_event_source(event: dict) -> _EventSource: event_source = None - request_context = event.get("requestContext") + # Get requestContext safely and ensure it's a dictionary + request_context = event.get("requestContext", {}) + if not isinstance(request_context, dict): + request_context = {} + if request_context and request_context.get("stage"): if "domainName" in request_context and detect_lambda_function_url_domain( - request_context.get("domainName") + request_context.get("domainName", "") ): return _EventSource(EventTypes.LAMBDA_FUNCTION_URL) event_source = _EventSource(EventTypes.API_GATEWAY) @@ -171,6 +175,8 @@ def parse_event_source(event: dict) -> _EventSource: def detect_lambda_function_url_domain(domain: str) -> bool: # e.g. "etsn5fibjr.lambda-url.eu-south-1.amazonaws.com" + if not isinstance(domain, str): + return False domain_parts = domain.split(".") if len(domain_parts) < 2: return False @@ -283,17 +289,28 @@ def extract_http_tags(event): Extracts HTTP facet tags from the triggering event """ http_tags = {} - request_context = event.get("requestContext") + + # Safely get request_context and ensure it's a dictionary + request_context = event.get("requestContext", {}) + if not isinstance(request_context, dict): + request_context = {} + path = event.get("path") method = event.get("httpMethod") + if request_context and request_context.get("stage"): - if request_context.get("domainName"): - http_tags["http.url"] = request_context.get("domainName") + domain_name = request_context.get("domainName") + if domain_name: + http_tags["http.url"] = domain_name path = request_context.get("path") method = request_context.get("httpMethod") + # Version 2.0 HTTP API Gateway - apigateway_v2_http = request_context.get("http") + apigateway_v2_http = request_context.get("http", {}) + if not isinstance(apigateway_v2_http, dict): + apigateway_v2_http = {} + if event.get("version") == "2.0" and apigateway_v2_http: path = apigateway_v2_http.get("path") method = apigateway_v2_http.get("method") @@ -303,15 +320,23 @@ def extract_http_tags(event): if method: http_tags["http.method"] = method - headers = event.get("headers") + # Safely get headers + headers = event.get("headers", {}) + if not isinstance(headers, dict): + headers = {} + if headers and headers.get("Referer"): http_tags["http.referer"] = headers.get("Referer") # Try to get `routeKey` from API GW v2; otherwise try to get `resource` from API GW v1 route = event.get("routeKey") or event.get("resource") - if route: - # "GET /my/endpoint" = > "/my/endpoint" - http_tags["http.route"] = route.split(" ")[-1] + if route and isinstance(route, str): + try: + # "GET /my/endpoint" = > "/my/endpoint" + http_tags["http.route"] = route.split(" ")[-1] + except Exception: + # If splitting fails, use the route as is + http_tags["http.route"] = route return http_tags diff --git a/tests/test_trigger.py b/tests/test_trigger.py index 9cb088f1c..b4da7ff0b 100644 --- a/tests/test_trigger.py +++ b/tests/test_trigger.py @@ -256,6 +256,30 @@ def test_event_source_unsupported(self): self.assertEqual(event_source.to_string(), "unknown") self.assertEqual(event_source_arn, None) + def test_event_source_with_non_dict_request_context(self): + # Test with requestContext as a string instead of a dict + event = {"requestContext": "not_a_dict"} + event_source = parse_event_source(event) + # Should still return a valid event source (unknown in this case) + self.assertEqual(event_source.to_string(), "unknown") + + def test_event_source_with_invalid_domain_name(self): + # Test with domainName that isn't a string + event = {"requestContext": {"stage": "prod", "domainName": 12345}} + event_source = parse_event_source(event) + # Should detect as API Gateway since stage is present + self.assertEqual(event_source.to_string(), "api-gateway") + + def test_detect_lambda_function_url_domain_with_invalid_input(self): + from datadog_lambda.trigger import detect_lambda_function_url_domain + + # Test with non-string input + self.assertFalse(detect_lambda_function_url_domain(None)) + self.assertFalse(detect_lambda_function_url_domain(12345)) + self.assertFalse(detect_lambda_function_url_domain({"not": "a-string"})) + # Test with string that would normally cause an exception when split + self.assertFalse(detect_lambda_function_url_domain("")) + class GetTriggerTags(unittest.TestCase): def test_extract_trigger_tags_api_gateway(self): @@ -530,6 +554,47 @@ def test_extract_trigger_tags_list_type_event(self): tags = extract_trigger_tags(event, ctx) self.assertEqual(tags, {}) + def test_extract_http_tags_with_invalid_request_context(self): + from datadog_lambda.trigger import extract_http_tags + + # Test with requestContext as a string instead of a dict + event = {"requestContext": "not_a_dict", "path": "/test", "httpMethod": "GET"} + http_tags = extract_http_tags(event) + # Should still extract valid tags from the event + self.assertEqual( + http_tags, {"http.url_details.path": "/test", "http.method": "GET"} + ) + + def test_extract_http_tags_with_invalid_apigateway_http(self): + from datadog_lambda.trigger import extract_http_tags + + # Test with http in requestContext that's not a dict + event = { + "requestContext": {"stage": "prod", "http": "not_a_dict"}, + "version": "2.0", + } + http_tags = extract_http_tags(event) + # Should not raise an exception + self.assertEqual(http_tags, {}) + + def test_extract_http_tags_with_invalid_headers(self): + from datadog_lambda.trigger import extract_http_tags + + # Test with headers that's not a dict + event = {"headers": "not_a_dict"} + http_tags = extract_http_tags(event) + # Should not raise an exception + self.assertEqual(http_tags, {}) + + def test_extract_http_tags_with_invalid_route(self): + from datadog_lambda.trigger import extract_http_tags + + # Test with routeKey that would cause a split error + event = {"routeKey": 12345} # Not a string + http_tags = extract_http_tags(event) + # Should not raise an exception + self.assertEqual(http_tags, {}) + class ExtractHTTPStatusCodeTag(unittest.TestCase): def test_extract_http_status_code_tag_from_response_dict(self): From b74068bbdb07be1e21b6ed34c73dd23c5a853f14 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Wed, 14 May 2025 22:27:42 -0400 Subject: [PATCH 027/164] perf: fewer memory allocation (#597) * fewer memory allocation * Update datadog_lambda/trigger.py * Update datadog_lambda/trigger.py --- datadog_lambda/trigger.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/datadog_lambda/trigger.py b/datadog_lambda/trigger.py index 52978d4bd..a2708a598 100644 --- a/datadog_lambda/trigger.py +++ b/datadog_lambda/trigger.py @@ -115,9 +115,9 @@ def parse_event_source(event: dict) -> _EventSource: event_source = None # Get requestContext safely and ensure it's a dictionary - request_context = event.get("requestContext", {}) + request_context = event.get("requestContext") if not isinstance(request_context, dict): - request_context = {} + request_context = None if request_context and request_context.get("stage"): if "domainName" in request_context and detect_lambda_function_url_domain( @@ -291,9 +291,9 @@ def extract_http_tags(event): http_tags = {} # Safely get request_context and ensure it's a dictionary - request_context = event.get("requestContext", {}) + request_context = event.get("requestContext") if not isinstance(request_context, dict): - request_context = {} + request_context = None path = event.get("path") method = event.get("httpMethod") From 1d6d28f318b403358689afa5de79d689a655eb4a Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Thu, 15 May 2025 08:57:26 -0400 Subject: [PATCH 028/164] Add Exception Replay env var to README (#599) * update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 03cd846a6..658babc28 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ Besides the environment variables supported by dd-trace-py, the datadog-lambda-p | DD_COLD_START_TRACE_SKIP_LIB | optionally skip creating Cold Start Spans for a comma-separated list of libraries. Useful to limit depth or skip known libraries. | `ddtrace.internal.compat,ddtrace.filters` | | DD_CAPTURE_LAMBDA_PAYLOAD | [Captures incoming and outgoing AWS Lambda payloads][1] in the Datadog APM spans for Lambda invocations. | `false` | | DD_CAPTURE_LAMBDA_PAYLOAD_MAX_DEPTH | Determines the level of detail captured from AWS Lambda payloads, which are then assigned as tags for the `aws.lambda` span. It specifies the nesting depth of the JSON payload structure to process. Once the specified maximum depth is reached, the tag's value is set to the stringified value of any nested elements beyond this level.
For example, given the input payload:
{
"lv1" : {
"lv2": {
"lv3": "val"
}
}
}
If the depth is set to `2`, the resulting tag's key is set to `function.request.lv1.lv2` and the value is `{\"lv3\": \"val\"}`.
If the depth is set to `0`, the resulting tag's key is set to `function.request` and value is `{\"lv1\":{\"lv2\":{\"lv3\": \"val\"}}}` | `10` | +| DD_EXCEPTION_REPLAY_ENABLED | When set to `true`, the Lambda will run with Error Tracking Exception Replay enabled, capturing local variables. | `false` | ## Opening Issues From 497aadc4dfb08f662559c18f8971da249be0dc62 Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Fri, 16 May 2025 14:22:28 -0400 Subject: [PATCH 029/164] fix flushing Exception Replay (#601) --- datadog_lambda/wrapper.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index e54601188..86bbf04d8 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -58,6 +58,7 @@ ).lower() in ("true", "1") if exception_replay_env_var: from ddtrace.debugging._exception.replay import SpanExceptionHandler + from ddtrace.debugging._uploader import LogsIntakeUploaderV1 logger = logging.getLogger(__name__) @@ -405,6 +406,10 @@ def _after(self, event, context): if llmobs_env_var: LLMObs.flush() + # Flush exception replay + if exception_replay_env_var: + LogsIntakeUploaderV1._instance.periodic() + if self.encode_authorizer_context and is_authorizer_response(self.response): self._inject_authorizer_span_headers( event.get("requestContext", {}).get("requestId") From 676446cf4998caeefcbac011ab23bde4af954b1e Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Fri, 23 May 2025 11:16:17 +0200 Subject: [PATCH 030/164] v6.110.0 (#602) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index c3aaa6b70..9534f0c73 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "6.109.0" +__version__ = "6.110.0" diff --git a/pyproject.toml b/pyproject.toml index cccef63ec..ba5bcb176 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "6.109.0" +version = "6.110.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 64f81daa97d589f1047d00000c31d85e24e4314d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jordan=20gonz=C3=A1lez?= <30836115+duncanista@users.noreply.github.com> Date: Fri, 23 May 2025 16:15:23 +0200 Subject: [PATCH 031/164] fix: `http.url` tag to include protocol (#603) * update `http.url` in inferred spans * update `http.url` in trigger tags * fix `resource_names` update * update integration test --- datadog_lambda/tracing.py | 14 +++++--- datadog_lambda/trigger.py | 2 +- .../logs/async-metrics_python310.log | 12 +++---- .../logs/async-metrics_python311.log | 12 +++---- .../logs/async-metrics_python312.log | 12 +++---- .../logs/async-metrics_python313.log | 12 +++---- .../snapshots/logs/async-metrics_python38.log | 12 +++---- .../snapshots/logs/async-metrics_python39.log | 12 +++---- .../snapshots/logs/sync-metrics_python310.log | 12 +++---- .../snapshots/logs/sync-metrics_python311.log | 12 +++---- .../snapshots/logs/sync-metrics_python312.log | 12 +++---- .../snapshots/logs/sync-metrics_python313.log | 12 +++---- .../snapshots/logs/sync-metrics_python38.log | 12 +++---- .../snapshots/logs/sync-metrics_python39.log | 14 ++++---- tests/test_tracing.py | 36 +++++++++---------- tests/test_trigger.py | 12 +++---- tests/test_wrapper.py | 2 +- 17 files changed, 108 insertions(+), 104 deletions(-) diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index 9a27673c6..4b6f300a8 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -850,13 +850,14 @@ def create_inferred_span_from_lambda_function_url_event(event, context): http = request_context.get("http") method = http.get("method") if http else None path = http.get("path") if http else None + http_url = f"https://{domain}{path}" resource = f"{method} {path}" tags = { "operation_name": "aws.lambda.url", - "http.url": domain + path, + "http.url": http_url, "endpoint": path, "http.method": method, - "resource_names": domain + path, + "resource_names": resource, "request_id": context.aws_request_id, } request_time_epoch = request_context.get("timeEpoch") @@ -948,6 +949,7 @@ def create_inferred_span_from_api_gateway_websocket_event( request_context = event.get("requestContext") domain = request_context.get("domainName") endpoint = request_context.get("routeKey") + http_url = f"https://{domain}{endpoint}" api_id = request_context.get("apiId") service_name = determine_service_name( @@ -955,7 +957,7 @@ def create_inferred_span_from_api_gateway_websocket_event( ) tags = { "operation_name": "aws.apigateway.websocket", - "http.url": domain + endpoint, + "http.url": http_url, "endpoint": endpoint, "resource_names": endpoint, "apiid": api_id, @@ -1007,11 +1009,12 @@ def create_inferred_span_from_api_gateway_event( ) method = event.get("httpMethod") path = event.get("path") + http_url = f"https://{domain}{path}" resource_path = _get_resource_path(event, request_context) resource = f"{method} {resource_path}" tags = { "operation_name": "aws.apigateway.rest", - "http.url": domain + path, + "http.url": http_url, "endpoint": path, "http.method": method, "resource_names": resource, @@ -1073,12 +1076,13 @@ def create_inferred_span_from_http_api_event( http = request_context.get("http") or {} method = http.get("method") path = event.get("rawPath") + http_url = f"https://{domain}{path}" resource_path = _get_resource_path(event, request_context) resource = f"{method} {resource_path}" tags = { "operation_name": "aws.httpapi", "endpoint": path, - "http.url": domain + path, + "http.url": http_url, "http.method": http.get("method"), "http.protocol": http.get("protocol"), "http.source_ip": http.get("sourceIp"), diff --git a/datadog_lambda/trigger.py b/datadog_lambda/trigger.py index a2708a598..14cb06ac2 100644 --- a/datadog_lambda/trigger.py +++ b/datadog_lambda/trigger.py @@ -301,7 +301,7 @@ def extract_http_tags(event): if request_context and request_context.get("stage"): domain_name = request_context.get("domainName") if domain_name: - http_tags["http.url"] = domain_name + http_tags["http.url"] = f"https://{domain_name}" path = request_context.get("path") method = request_context.get("httpMethod") diff --git a/tests/integration/snapshots/logs/async-metrics_python310.log b/tests/integration/snapshots/logs/async-metrics_python310.log index 24d3fb5b0..0bd7237c9 100644 --- a/tests/integration/snapshots/logs/async-metrics_python310.log +++ b/tests/integration/snapshots/logs/async-metrics_python310.log @@ -55,7 +55,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.rest", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", @@ -103,7 +103,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", @@ -594,7 +594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", @@ -644,7 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -1436,7 +1436,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.websocket", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com$default", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", "apiid": "XXXX", @@ -1486,7 +1486,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200", "_dd.base_service": "integration-tests-python" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python311.log b/tests/integration/snapshots/logs/async-metrics_python311.log index e4fa66bce..8550a0623 100644 --- a/tests/integration/snapshots/logs/async-metrics_python311.log +++ b/tests/integration/snapshots/logs/async-metrics_python311.log @@ -55,7 +55,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.rest", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", @@ -103,7 +103,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", @@ -594,7 +594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", @@ -644,7 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -1436,7 +1436,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.websocket", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com$default", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", "apiid": "XXXX", @@ -1486,7 +1486,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200", "_dd.base_service": "integration-tests-python" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python312.log b/tests/integration/snapshots/logs/async-metrics_python312.log index 0d632c6c9..57c318abf 100644 --- a/tests/integration/snapshots/logs/async-metrics_python312.log +++ b/tests/integration/snapshots/logs/async-metrics_python312.log @@ -55,7 +55,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.rest", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", @@ -103,7 +103,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", @@ -594,7 +594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", @@ -644,7 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -1436,7 +1436,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.websocket", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com$default", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", "apiid": "XXXX", @@ -1486,7 +1486,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200", "_dd.base_service": "integration-tests-python" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python313.log b/tests/integration/snapshots/logs/async-metrics_python313.log index 090707096..9204499bd 100644 --- a/tests/integration/snapshots/logs/async-metrics_python313.log +++ b/tests/integration/snapshots/logs/async-metrics_python313.log @@ -55,7 +55,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.rest", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", @@ -103,7 +103,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", @@ -594,7 +594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", @@ -644,7 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -1436,7 +1436,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.websocket", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com$default", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", "apiid": "XXXX", @@ -1486,7 +1486,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200", "_dd.base_service": "integration-tests-python" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python38.log b/tests/integration/snapshots/logs/async-metrics_python38.log index 4a5069309..e6df054c3 100644 --- a/tests/integration/snapshots/logs/async-metrics_python38.log +++ b/tests/integration/snapshots/logs/async-metrics_python38.log @@ -55,7 +55,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.rest", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", @@ -103,7 +103,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", @@ -594,7 +594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", @@ -644,7 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -1436,7 +1436,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.websocket", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com$default", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", "apiid": "XXXX", @@ -1486,7 +1486,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200", "_dd.base_service": "integration-tests-python" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python39.log b/tests/integration/snapshots/logs/async-metrics_python39.log index 54081402d..9bcb7a859 100644 --- a/tests/integration/snapshots/logs/async-metrics_python39.log +++ b/tests/integration/snapshots/logs/async-metrics_python39.log @@ -55,7 +55,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.rest", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", @@ -103,7 +103,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", @@ -594,7 +594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", @@ -644,7 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -1436,7 +1436,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.websocket", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com$default", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", "apiid": "XXXX", @@ -1486,7 +1486,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200", "_dd.base_service": "integration-tests-python" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index e25697756..40562a6d0 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -35,7 +35,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.rest", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", @@ -83,7 +83,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", @@ -631,7 +631,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", @@ -681,7 +681,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -1568,7 +1568,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.websocket", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com$default", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", "apiid": "XXXX", @@ -1618,7 +1618,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200", "_dd.base_service": "integration-tests-python" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index 69d4a6952..52ec4c85a 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -35,7 +35,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.rest", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", @@ -83,7 +83,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", @@ -631,7 +631,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", @@ -681,7 +681,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -1568,7 +1568,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.websocket", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com$default", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", "apiid": "XXXX", @@ -1618,7 +1618,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200", "_dd.base_service": "integration-tests-python" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index 49bae0a2a..3ec0f01f7 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -35,7 +35,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.rest", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", @@ -83,7 +83,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", @@ -631,7 +631,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", @@ -681,7 +681,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -1568,7 +1568,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.websocket", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com$default", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", "apiid": "XXXX", @@ -1618,7 +1618,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200", "_dd.base_service": "integration-tests-python" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index 2f461f6fe..d2c20dc04 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -35,7 +35,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.rest", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", @@ -83,7 +83,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", @@ -631,7 +631,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", @@ -681,7 +681,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -1568,7 +1568,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.websocket", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com$default", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", "apiid": "XXXX", @@ -1618,7 +1618,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200", "_dd.base_service": "integration-tests-python" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python38.log b/tests/integration/snapshots/logs/sync-metrics_python38.log index 83e33d336..57a354a6d 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python38.log +++ b/tests/integration/snapshots/logs/sync-metrics_python38.log @@ -35,7 +35,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.rest", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", @@ -83,7 +83,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", @@ -631,7 +631,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", @@ -681,7 +681,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -1568,7 +1568,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.websocket", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com$default", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", "apiid": "XXXX", @@ -1618,7 +1618,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200", "_dd.base_service": "integration-tests-python" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python39.log b/tests/integration/snapshots/logs/sync-metrics_python39.log index 0a433c346..8b7bb31b4 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python39.log +++ b/tests/integration/snapshots/logs/sync-metrics_python39.log @@ -35,7 +35,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.rest", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", @@ -83,7 +83,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.us-east-2.amazonaws.com", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", @@ -377,7 +377,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] } HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX -END Duration: XXXX ms Memory Used: XXXX MB { "traces": [ [ @@ -416,6 +415,7 @@ END Duration: XXXX ms Memory Used: XXXX MB ] ] } +END Duration: XXXX ms Memory Used: XXXX MB START { "m": "aws.lambda.enhanced.invocations", @@ -631,7 +631,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", @@ -681,7 +681,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -1568,7 +1568,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "runtime-id": "XXXX", "_dd.origin": "lambda", "operation_name": "aws.apigateway.websocket", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com$default", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", "apiid": "XXXX", @@ -1618,7 +1618,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "http.url": "XXXX.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200", "_dd.base_service": "integration-tests-python" }, diff --git a/tests/test_tracing.py b/tests/test_tracing.py index 0a961a62a..e38e4ecd1 100644 --- a/tests/test_tracing.py +++ b/tests/test_tracing.py @@ -1730,7 +1730,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "apiname": "1234567890", "endpoint": "/path/to/resource", "http.method": "POST", - "http.url": "70ixmpl4fl.execute-api.us-east-2.amazonaws.com/path/to/resource", + "http.url": "https://70ixmpl4fl.execute-api.us-east-2.amazonaws.com/path/to/resource", "operation_name": "aws.apigateway.rest", "request_id": "123", "resource_names": "POST /{proxy+}", @@ -1752,7 +1752,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "apiname": "lgxbo6a518", "endpoint": "/http/get", "http.method": "GET", - "http.url": "lgxbo6a518.execute-api.eu-west-1.amazonaws.com/http/get", + "http.url": "https://lgxbo6a518.execute-api.eu-west-1.amazonaws.com/http/get", "operation_name": "aws.apigateway.rest", "request_id": "123", "resource_names": "GET /http/get", @@ -1774,7 +1774,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "apiname": "lgxbo6a518", "endpoint": "/http/get", "http.method": "GET", - "http.url": "lgxbo6a518.execute-api.eu-west-1.amazonaws.com/http/get", + "http.url": "https://lgxbo6a518.execute-api.eu-west-1.amazonaws.com/http/get", "operation_name": "aws.apigateway.rest", "request_id": "123", "resource_names": "GET /http/get", @@ -1798,7 +1798,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "38.122.226.210", - "http.url": "x02yirxc7a.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.url": "https://x02yirxc7a.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.user_agent": "curl/7.64.1", "operation_name": "aws.httpapi", "request_id": "123", @@ -1821,7 +1821,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "apiname": "mcwkra0ya4", "endpoint": "/user/42", "http.method": "GET", - "http.url": "mcwkra0ya4.execute-api.sa-east-1.amazonaws.com/user/42", + "http.url": "https://mcwkra0ya4.execute-api.sa-east-1.amazonaws.com/user/42", "operation_name": "aws.apigateway.rest", "request_id": "123", "resource_names": "GET /user/{id}", @@ -1843,7 +1843,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "apiname": "9vj54we5ih", "endpoint": "/user/42", "http.method": "GET", - "http.url": "9vj54we5ih.execute-api.sa-east-1.amazonaws.com/user/42", + "http.url": "https://9vj54we5ih.execute-api.sa-east-1.amazonaws.com/user/42", "operation_name": "aws.httpapi", "request_id": "123", "resource_names": "GET /user/{id}", @@ -1866,7 +1866,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "connection_id": "Fc5SzcoYGjQCJlg=", "endpoint": "$default", "event_type": "MESSAGE", - "http.url": "p62c47itsb.execute-api.eu-west-1.amazonaws.com$default", + "http.url": "https://p62c47itsb.execute-api.eu-west-1.amazonaws.com$default", "message_direction": "IN", "operation_name": "aws.apigateway.websocket", "request_id": "123", @@ -1890,7 +1890,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "connection_id": "Fc2tgfl3mjQCJfA=", "endpoint": "$connect", "event_type": "CONNECT", - "http.url": "p62c47itsb.execute-api.eu-west-1.amazonaws.com$connect", + "http.url": "https://p62c47itsb.execute-api.eu-west-1.amazonaws.com$connect", "message_direction": "IN", "operation_name": "aws.apigateway.websocket", "request_id": "123", @@ -1914,7 +1914,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "connection_id": "Fc2tgfl3mjQCJfA=", "endpoint": "$disconnect", "event_type": "DISCONNECT", - "http.url": "p62c47itsb.execute-api.eu-west-1.amazonaws.com$disconnect", + "http.url": "https://p62c47itsb.execute-api.eu-west-1.amazonaws.com$disconnect", "message_direction": "IN", "operation_name": "aws.apigateway.websocket", "request_id": "123", @@ -2112,7 +2112,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "apiname": "None", "endpoint": "/path/to/resource", "http.method": "POST", - "http.url": "70ixmpl4fl.execute-api.us-east-2.amazonaws.com/path/to/resource", + "http.url": "https://70ixmpl4fl.execute-api.us-east-2.amazonaws.com/path/to/resource", "operation_name": "aws.apigateway.rest", "request_id": "123", "resource_names": "POST /{proxy+}", @@ -2135,7 +2135,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "apiname": "amddr1rix9", "endpoint": "/hello", "http.method": "GET", - "http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", + "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", "operation_name": "aws.apigateway.rest", "request_id": "123", "resource_names": "GET /hello", @@ -2157,7 +2157,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "apiname": "amddr1rix9", "endpoint": "/hello", "http.method": "GET", - "http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", + "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", "operation_name": "aws.apigateway.rest", "request_id": "123", "resource_names": "GET /hello", @@ -2180,7 +2180,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "apiname": "amddr1rix9", "endpoint": "/hello", "http.method": "GET", - "http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", + "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", "operation_name": "aws.apigateway.rest", "request_id": "123", "resource_names": "GET /hello", @@ -2202,7 +2202,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "apiname": "amddr1rix9", "endpoint": "/hello", "http.method": "GET", - "http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", + "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", "operation_name": "aws.apigateway.rest", "request_id": "123", "resource_names": "GET /hello", @@ -2224,7 +2224,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "apiname": "amddr1rix9", "endpoint": "/hello", "http.method": "GET", - "http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", + "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", "operation_name": "aws.httpapi", "request_id": "123", "resource_names": "GET /hello", @@ -2246,7 +2246,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "apiname": "amddr1rix9", "endpoint": "/hello", "http.method": "GET", - "http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", + "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", "operation_name": "aws.httpapi", "request_id": "123", "resource_names": "GET /hello", @@ -2270,7 +2270,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "connection_id": "ZLr9QeNLmjQCIZA=", "endpoint": "$connect", "event_type": "CONNECT", - "http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com$connect", + "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.com$connect", "message_direction": "IN", "operation_name": "aws.apigateway.websocket", "request_id": "123", @@ -2294,7 +2294,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "connection_id": "ZLwtceO1mjQCI8Q=", "endpoint": "main", "event_type": "MESSAGE", - "http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.commain", + "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.commain", "message_direction": "IN", "operation_name": "aws.apigateway.websocket", "request_id": "123", diff --git a/tests/test_trigger.py b/tests/test_trigger.py index b4da7ff0b..c12e8f5c4 100644 --- a/tests/test_trigger.py +++ b/tests/test_trigger.py @@ -294,7 +294,7 @@ def test_extract_trigger_tags_api_gateway(self): { "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "arn:aws:apigateway:us-west-1::/restapis/1234567890/stages/prod", - "http.url": "70ixmpl4fl.execute-api.us-east-2.amazonaws.com", + "http.url": "https://70ixmpl4fl.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/prod/path/to/resource", "http.method": "POST", "http.route": "/{proxy+}", @@ -313,7 +313,7 @@ def test_extract_trigger_tags_api_gateway_non_proxy(self): { "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "arn:aws:apigateway:us-west-1::/restapis/lgxbo6a518/stages/dev", - "http.url": "lgxbo6a518.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://lgxbo6a518.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/dev/http/get", "http.method": "GET", "http.route": "/http/get", @@ -332,7 +332,7 @@ def test_extract_trigger_tags_api_gateway_websocket_connect(self): { "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "arn:aws:apigateway:us-west-1::/restapis/p62c47itsb/stages/dev", - "http.url": "p62c47itsb.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://p62c47itsb.execute-api.eu-west-1.amazonaws.com", }, ) @@ -348,7 +348,7 @@ def test_extract_trigger_tags_api_gateway_websocket_default(self): { "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "arn:aws:apigateway:us-west-1::/restapis/p62c47itsb/stages/dev", - "http.url": "p62c47itsb.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://p62c47itsb.execute-api.eu-west-1.amazonaws.com", }, ) @@ -364,7 +364,7 @@ def test_extract_trigger_tags_api_gateway_websocket_disconnect(self): { "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "arn:aws:apigateway:us-west-1::/restapis/p62c47itsb/stages/dev", - "http.url": "p62c47itsb.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://p62c47itsb.execute-api.eu-west-1.amazonaws.com", }, ) @@ -380,7 +380,7 @@ def test_extract_trigger_tags_api_gateway_http_api(self): { "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "arn:aws:apigateway:us-west-1::/restapis/x02yirxc7a/stages/$default", - "http.url": "x02yirxc7a.execute-api.eu-west-1.amazonaws.com", + "http.url": "https://x02yirxc7a.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 4b2430362..f46b365ee 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -283,7 +283,7 @@ def test_5xx_sends_errors_metric_and_set_tags(self, mock_extract_trigger_tags): mock_extract_trigger_tags.return_value = { "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "arn:aws:apigateway:us-west-1::/restapis/1234567890/stages/prod", - "http.url": "70ixmpl4fl.execute-api.us-east-2.amazonaws.com", + "http.url": "https://70ixmpl4fl.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/prod/path/to/resource", "http.method": "GET", } From 87f2314928fb839886aefe09cf6a1b7c7a0a7988 Mon Sep 17 00:00:00 2001 From: happynancee <120061598+happynancee@users.noreply.github.com> Date: Mon, 2 Jun 2025 07:50:36 -0700 Subject: [PATCH 032/164] update codeowners file and make apm serverless co-owners of repo (#596) --- .github/CODEOWNERS | 7 +------ CODEOWNERS | 1 - 2 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 26b4b78e4..a7f48dfeb 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,6 +1 @@ -* @DataDog/serverless-aws -datadog_lambda/tracing.py @DataDog/apm-serverless -datadog_lambda/patch.py @DataDog/apm-serverless -datadog_lambda/span_points.py @DataDog/apm-serverless -datadog_lambda/cold_start.py @DataDog/apm-serverless -datadog_lambda/wrapper.py @DataDog/apm-serverless +* @DataDog/serverless-aws @DataDog/apm-serverless diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index e340f1ed6..000000000 --- a/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @DataDog/serverless \ No newline at end of file From 254466cb2c6d749211e74201572ce5a937ec82da Mon Sep 17 00:00:00 2001 From: Yiming Luo Date: Wed, 4 Jun 2025 12:34:10 -0400 Subject: [PATCH 033/164] chore: Use GitHub App for update-deps workflow (#605) --- .github/workflows/update_deps.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/update_deps.yml b/.github/workflows/update_deps.yml index 31025402f..33a524b25 100644 --- a/.github/workflows/update_deps.yml +++ b/.github/workflows/update_deps.yml @@ -3,14 +3,24 @@ name: update-deps on: schedule: - cron: "0 10 * * *" # Run at 10 am every day + workflow_dispatch: jobs: check: runs-on: ubuntu-latest + environment: + name: protected-main-env steps: + - name: Generate token + id: generate_token + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 + with: + app-id: ${{ secrets.GH_APP_ID }} + private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} + - uses: actions/checkout@v3 with: - ssh-key: ${{ secrets.SSH_PRIVATE_KEY }} + token: ${{ steps.generate_token.outputs.token }} - name: Set up Python uses: actions/setup-python@v4 From 6beb65d63c063ff6fc5e480e7bf076d29f2abf0c Mon Sep 17 00:00:00 2001 From: michael-zhao459 Date: Thu, 5 Jun 2025 15:24:42 -0400 Subject: [PATCH 034/164] feat: Enable sqs -> lambda support for DSM (#604) --------- Co-authored-by: Rey Abolofia --- datadog_lambda/dsm.py | 38 +++++++++++++ datadog_lambda/wrapper.py | 7 +++ tests/test_dsm.py | 112 ++++++++++++++++++++++++++++++++++++++ tests/test_wrapper.py | 60 ++++++++++++++++++++ 4 files changed, 217 insertions(+) create mode 100644 datadog_lambda/dsm.py create mode 100644 tests/test_dsm.py diff --git a/datadog_lambda/dsm.py b/datadog_lambda/dsm.py new file mode 100644 index 000000000..427f5e479 --- /dev/null +++ b/datadog_lambda/dsm.py @@ -0,0 +1,38 @@ +from datadog_lambda import logger +from datadog_lambda.trigger import EventTypes + + +def set_dsm_context(event, event_source): + + if event_source.equals(EventTypes.SQS): + _dsm_set_sqs_context(event) + + +def _dsm_set_sqs_context(event): + from datadog_lambda.wrapper import format_err_with_traceback + from ddtrace.internal.datastreams import data_streams_processor + from ddtrace.internal.datastreams.processor import DsmPathwayCodec + from ddtrace.internal.datastreams.botocore import ( + get_datastreams_context, + calculate_sqs_payload_size, + ) + + records = event.get("Records") + if records is None: + return + processor = data_streams_processor() + + for record in records: + try: + queue_arn = record.get("eventSourceARN", "") + + contextjson = get_datastreams_context(record) + payload_size = calculate_sqs_payload_size(record) + + ctx = DsmPathwayCodec.decode(contextjson, processor) + ctx.set_checkpoint( + ["direction:in", f"topic:{queue_arn}", "type:sqs"], + payload_size=payload_size, + ) + except Exception as e: + logger.error(format_err_with_traceback(e)) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 86bbf04d8..0e23b7218 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -9,6 +9,7 @@ from importlib import import_module from time import time_ns +from datadog_lambda.dsm import set_dsm_context from datadog_lambda.extension import should_use_extension, flush_extension from datadog_lambda.cold_start import ( set_cold_start, @@ -79,6 +80,7 @@ DD_REQUESTS_SERVICE_NAME = "DD_REQUESTS_SERVICE_NAME" DD_SERVICE = "DD_SERVICE" DD_ENV = "DD_ENV" +DD_DATA_STREAMS_ENABLED = "DD_DATA_STREAMS_ENABLED" def get_env_as_int(env_key, default_value: int) -> int: @@ -190,6 +192,9 @@ def __init__(self, func): self.min_cold_start_trace_duration = get_env_as_int( DD_MIN_COLD_START_DURATION, 3 ) + self.data_streams_enabled = ( + os.environ.get(DD_DATA_STREAMS_ENABLED, "false").lower() == "true" + ) self.local_testing_mode = os.environ.get( DD_LOCAL_TEST, "false" ).lower() in ("true", "1") @@ -322,6 +327,8 @@ def _before(self, event, context): self.inferred_span = create_inferred_span( event, context, event_source, self.decode_authorizer_context ) + if self.data_streams_enabled: + set_dsm_context(event, event_source) self.span = create_function_execution_span( context=context, function_name=self.function_name, diff --git a/tests/test_dsm.py b/tests/test_dsm.py new file mode 100644 index 000000000..544212d88 --- /dev/null +++ b/tests/test_dsm.py @@ -0,0 +1,112 @@ +import unittest +from unittest.mock import patch, MagicMock + +from datadog_lambda.dsm import set_dsm_context, _dsm_set_sqs_context +from datadog_lambda.trigger import EventTypes, _EventSource + + +class TestDsmSQSContext(unittest.TestCase): + def setUp(self): + patcher = patch("datadog_lambda.dsm._dsm_set_sqs_context") + self.mock_dsm_set_sqs_context = patcher.start() + self.addCleanup(patcher.stop) + + patcher = patch("ddtrace.internal.datastreams.data_streams_processor") + self.mock_data_streams_processor = patcher.start() + self.addCleanup(patcher.stop) + + patcher = patch("ddtrace.internal.datastreams.botocore.get_datastreams_context") + self.mock_get_datastreams_context = patcher.start() + self.mock_get_datastreams_context.return_value = {} + self.addCleanup(patcher.stop) + + patcher = patch( + "ddtrace.internal.datastreams.botocore.calculate_sqs_payload_size" + ) + self.mock_calculate_sqs_payload_size = patcher.start() + self.mock_calculate_sqs_payload_size.return_value = 100 + self.addCleanup(patcher.stop) + + patcher = patch("ddtrace.internal.datastreams.processor.DsmPathwayCodec.decode") + self.mock_dsm_pathway_codec_decode = patcher.start() + self.addCleanup(patcher.stop) + + def test_non_sqs_event_source_does_nothing(self): + """Test that non-SQS event sources don't trigger DSM context setting""" + event = {} + # Use Unknown Event Source + event_source = _EventSource(EventTypes.UNKNOWN) + set_dsm_context(event, event_source) + + # DSM context should not be set for non-SQS events + self.mock_dsm_set_sqs_context.assert_not_called() + + def test_sqs_event_with_no_records_does_nothing(self): + """Test that events where Records is None don't trigger DSM processing""" + events_with_no_records = [ + {}, + {"Records": None}, + {"someOtherField": "value"}, + ] + + for event in events_with_no_records: + _dsm_set_sqs_context(event) + self.mock_data_streams_processor.assert_not_called() + + def test_sqs_event_triggers_dsm_sqs_context(self): + """Test that SQS event sources trigger the SQS-specific DSM context function""" + sqs_event = { + "Records": [ + { + "eventSource": "aws:sqs", + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:my-queue", + "body": "Hello from SQS!", + } + ] + } + + event_source = _EventSource(EventTypes.SQS) + set_dsm_context(sqs_event, event_source) + + self.mock_dsm_set_sqs_context.assert_called_once_with(sqs_event) + + def test_sqs_multiple_records_process_each_record(self): + """Test that each record in an SQS event gets processed individually""" + multi_record_event = { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:queue1", + "body": "Message 1", + }, + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:queue2", + "body": "Message 2", + }, + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:queue3", + "body": "Message 3", + }, + ] + } + + mock_context = MagicMock() + self.mock_dsm_pathway_codec_decode.return_value = mock_context + + _dsm_set_sqs_context(multi_record_event) + + self.assertEqual(mock_context.set_checkpoint.call_count, 3) + + calls = mock_context.set_checkpoint.call_args_list + expected_arns = [ + "arn:aws:sqs:us-east-1:123456789012:queue1", + "arn:aws:sqs:us-east-1:123456789012:queue2", + "arn:aws:sqs:us-east-1:123456789012:queue3", + ] + + for i, call in enumerate(calls): + args, kwargs = call + tags = args[0] + self.assertIn("direction:in", tags) + self.assertIn(f"topic:{expected_arns[i]}", tags) + self.assertIn("type:sqs", tags) + self.assertEqual(kwargs["payload_size"], 100) diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index f46b365ee..f482fa3de 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -76,6 +76,10 @@ def setUp(self): self.mock_dd_lambda_layer_tag = patcher.start() self.addCleanup(patcher.stop) + patcher = patch("datadog_lambda.wrapper.set_dsm_context") + self.mock_set_dsm_context = patcher.start() + self.addCleanup(patcher.stop) + def test_datadog_lambda_wrapper(self): wrapper.dd_tracing_enabled = False @@ -563,6 +567,62 @@ def return_type_test(event, context): self.assertEqual(result, test_result) self.assertFalse(MockPrintExc.called) + def test_set_dsm_context_called_when_DSM_and_tracing_enabled(self): + os.environ["DD_DATA_STREAMS_ENABLED"] = "true" + wrapper.dd_tracing_enabled = True + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return "ok" + + result = lambda_handler({}, get_mock_context()) + self.assertEqual(result, "ok") + self.mock_set_dsm_context.assert_called_once() + + del os.environ["DD_DATA_STREAMS_ENABLED"] + + def test_set_dsm_context_not_called_when_only_DSM_enabled(self): + os.environ["DD_DATA_STREAMS_ENABLED"] = "true" + wrapper.dd_tracing_enabled = False + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return "ok" + + result = lambda_handler({}, get_mock_context()) + self.assertEqual(result, "ok") + self.mock_set_dsm_context.assert_not_called() + + del os.environ["DD_DATA_STREAMS_ENABLED"] + + def test_set_dsm_context_not_called_when_only_tracing_enabled(self): + os.environ["DD_DATA_STREAMS_ENABLED"] = "false" + wrapper.dd_tracing_enabled = True + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return "ok" + + result = lambda_handler({}, get_mock_context()) + self.assertEqual(result, "ok") + self.mock_set_dsm_context.assert_not_called() + + del os.environ["DD_DATA_STREAMS_ENABLED"] + + def test_set_dsm_context_not_called_when_tracing_and_DSM_disabled(self): + os.environ["DD_DATA_STREAMS_ENABLED"] = "false" + wrapper.dd_tracing_enabled = False + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return "ok" + + result = lambda_handler({}, get_mock_context()) + self.assertEqual(result, "ok") + self.mock_set_dsm_context.assert_not_called() + + del os.environ["DD_DATA_STREAMS_ENABLED"] + class TestLambdaDecoratorSettings(unittest.TestCase): def test_some_envs_should_depend_on_dd_tracing_enabled(self): From b3cf1c2ee54db0c01470e8cdd858db85a1183c24 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Wed, 11 Jun 2025 08:37:35 -0700 Subject: [PATCH 035/164] Consolidate env reading to single config object. (#600) --- datadog_lambda/api.py | 15 +- datadog_lambda/cold_start.py | 12 +- datadog_lambda/config.py | 145 +++++++++++++++++++ datadog_lambda/fips.py | 19 --- datadog_lambda/metric.py | 17 +-- datadog_lambda/patch.py | 12 +- datadog_lambda/span_pointers.py | 9 +- datadog_lambda/tag_object.py | 7 +- datadog_lambda/tracing.py | 32 ++--- datadog_lambda/wrapper.py | 163 ++++++---------------- tests/conftest.py | 8 ++ tests/test_api.py | 11 +- tests/test_cold_start.py | 9 +- tests/test_config.py | 240 ++++++++++++++++++++++++++++++++ tests/test_metric.py | 2 +- tests/test_patch.py | 8 ++ tests/test_tag_object.py | 8 +- tests/test_tracing.py | 22 ++- tests/test_wrapper.py | 86 +++++------- tests/utils.py | 1 + 20 files changed, 534 insertions(+), 292 deletions(-) create mode 100644 datadog_lambda/config.py delete mode 100644 datadog_lambda/fips.py create mode 100644 tests/conftest.py create mode 100644 tests/test_config.py diff --git a/datadog_lambda/api.py b/datadog_lambda/api.py index d1cee4e4d..4921dae90 100644 --- a/datadog_lambda/api.py +++ b/datadog_lambda/api.py @@ -1,7 +1,7 @@ import logging import os -from datadog_lambda.fips import fips_mode_enabled +from datadog_lambda.config import config logger = logging.getLogger(__name__) KMS_ENCRYPTION_CONTEXT_KEY = "LambdaFunctionName" @@ -29,7 +29,6 @@ def decrypt_kms_api_key(kms_client, ciphertext): is added. We need to try decrypting the API key both with and without the encryption context. """ # Try without encryption context, in case API key was encrypted using the AWS CLI - function_name = os.environ.get("AWS_LAMBDA_FUNCTION_NAME") try: plaintext = kms_client.decrypt(CiphertextBlob=decoded_bytes)[ "Plaintext" @@ -43,7 +42,7 @@ def decrypt_kms_api_key(kms_client, ciphertext): plaintext = kms_client.decrypt( CiphertextBlob=decoded_bytes, EncryptionContext={ - KMS_ENCRYPTION_CONTEXT_KEY: function_name, + KMS_ENCRYPTION_CONTEXT_KEY: config.function_name, }, )["Plaintext"].decode("utf-8") @@ -66,7 +65,7 @@ def get_api_key() -> str: DD_API_KEY = os.environ.get("DD_API_KEY", os.environ.get("DATADOG_API_KEY", "")) LAMBDA_REGION = os.environ.get("AWS_REGION", "") - if fips_mode_enabled: + if config.fips_mode_enabled: logger.debug( "FIPS mode is enabled, using FIPS endpoints for secrets management." ) @@ -82,7 +81,7 @@ def get_api_key() -> str: return "" endpoint_url = ( f"https://secretsmanager-fips.{secrets_region}.amazonaws.com" - if fips_mode_enabled + if config.fips_mode_enabled else None ) secrets_manager_client = _boto3_client( @@ -95,7 +94,7 @@ def get_api_key() -> str: # SSM endpoints: https://docs.aws.amazon.com/general/latest/gr/ssm.html fips_endpoint = ( f"https://ssm-fips.{LAMBDA_REGION}.amazonaws.com" - if fips_mode_enabled + if config.fips_mode_enabled else None ) ssm_client = _boto3_client("ssm", endpoint_url=fips_endpoint) @@ -106,7 +105,7 @@ def get_api_key() -> str: # KMS endpoints: https://docs.aws.amazon.com/general/latest/gr/kms.html fips_endpoint = ( f"https://kms-fips.{LAMBDA_REGION}.amazonaws.com" - if fips_mode_enabled + if config.fips_mode_enabled else None ) kms_client = _boto3_client("kms", endpoint_url=fips_endpoint) @@ -118,7 +117,7 @@ def get_api_key() -> str: def init_api(): - if not os.environ.get("DD_FLUSH_TO_LOG", "").lower() == "true": + if not config.flush_to_log: # Make sure that this package would always be lazy-loaded/outside from the critical path # since underlying packages are quite heavy to load # and useless with the extension unless sending metrics with timestamps diff --git a/datadog_lambda/cold_start.py b/datadog_lambda/cold_start.py index ea10ea206..a40e2fcb3 100644 --- a/datadog_lambda/cold_start.py +++ b/datadog_lambda/cold_start.py @@ -1,8 +1,9 @@ import time -import os from typing import List, Hashable import logging +from datadog_lambda.config import config + logger = logging.getLogger(__name__) _cold_start = True @@ -86,14 +87,12 @@ def reset_node_stacks(): def push_node(module_name, file_path): node = ImportNode(module_name, file_path, time.time_ns()) - global import_stack if import_stack: import_stack[-1].children.append(node) import_stack.append(node) def pop_node(module_name): - global import_stack if not import_stack: return node = import_stack.pop() @@ -102,7 +101,6 @@ def pop_node(module_name): end_time_ns = time.time_ns() node.end_time_ns = end_time_ns if not import_stack: # import_stack empty, a root node has been found - global root_nodes root_nodes.append(node) @@ -147,11 +145,7 @@ def wrapped_find_spec(*args, **kwargs): def initialize_cold_start_tracing(): - if ( - is_new_sandbox() - and os.environ.get("DD_TRACE_ENABLED", "true").lower() == "true" - and os.environ.get("DD_COLD_START_TRACING", "true").lower() == "true" - ): + if is_new_sandbox() and config.cold_start_tracing: from sys import meta_path for importer in meta_path: diff --git a/datadog_lambda/config.py b/datadog_lambda/config.py new file mode 100644 index 000000000..7a08d8a7f --- /dev/null +++ b/datadog_lambda/config.py @@ -0,0 +1,145 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019 Datadog, Inc. + +import logging +import os + +logger = logging.getLogger(__name__) + + +def _get_env(key, default=None, cast=None, depends_on_tracing=False): + @property + def _getter(self): + if not hasattr(self, prop_key): + val = self._resolve_env(key, default, cast, depends_on_tracing) + setattr(self, prop_key, val) + return getattr(self, prop_key) + + prop_key = f"_config_{key}" + return _getter + + +def as_bool(val): + return val.lower() == "true" or val == "1" + + +def as_list(val): + return [val.strip() for val in val.split(",") if val.strip()] + + +class Config: + def _resolve_env(self, key, default=None, cast=None, depends_on_tracing=False): + if depends_on_tracing and not self.trace_enabled: + return False + val = os.environ.get(key, default) + if cast is not None: + try: + val = cast(val) + except (ValueError, TypeError): + msg = ( + "Failed to cast environment variable '%s' with " + "value '%s' to type %s. Using default value '%s'." + ) + logger.warning(msg, key, val, cast.__name__, default) + val = default + return val + + service = _get_env("DD_SERVICE") + env = _get_env("DD_ENV") + + cold_start_tracing = _get_env( + "DD_COLD_START_TRACING", "true", as_bool, depends_on_tracing=True + ) + min_cold_start_trace_duration = _get_env("DD_MIN_COLD_START_DURATION", 3, int) + cold_start_trace_skip_lib = _get_env( + "DD_COLD_START_TRACE_SKIP_LIB", + "ddtrace.internal.compat,ddtrace.filters", + as_list, + ) + + capture_payload_max_depth = _get_env("DD_CAPTURE_LAMBDA_PAYLOAD_MAX_DEPTH", 10, int) + capture_payload_enabled = _get_env("DD_CAPTURE_LAMBDA_PAYLOAD", "false", as_bool) + + trace_enabled = _get_env("DD_TRACE_ENABLED", "true", as_bool) + make_inferred_span = _get_env( + "DD_TRACE_MANAGED_SERVICES", "true", as_bool, depends_on_tracing=True + ) + encode_authorizer_context = _get_env( + "DD_ENCODE_AUTHORIZER_CONTEXT", "true", as_bool, depends_on_tracing=True + ) + decode_authorizer_context = _get_env( + "DD_DECODE_AUTHORIZER_CONTEXT", "true", as_bool, depends_on_tracing=True + ) + add_span_pointers = _get_env("DD_BOTOCORE_ADD_SPAN_POINTERS", "true", as_bool) + trace_extractor = _get_env("DD_TRACE_EXTRACTOR") + + enhanced_metrics_enabled = _get_env("DD_ENHANCED_METRICS", "true", as_bool) + + flush_in_thread = _get_env("DD_FLUSH_IN_THREAD", "false", as_bool) + flush_to_log = _get_env("DD_FLUSH_TO_LOG", "false", as_bool) + logs_injection = _get_env("DD_LOGS_INJECTION", "true", as_bool) + merge_xray_traces = _get_env("DD_MERGE_XRAY_TRACES", "false", as_bool) + + telemetry_enabled = _get_env( + "DD_INSTRUMENTATION_TELEMETRY_ENABLED", + "false", + as_bool, + depends_on_tracing=True, + ) + otel_enabled = _get_env("DD_TRACE_OTEL_ENABLED", "false", as_bool) + profiling_enabled = _get_env("DD_PROFILING_ENABLED", "false", as_bool) + llmobs_enabled = _get_env("DD_LLMOBS_ENABLED", "false", as_bool) + exception_replay_enabled = _get_env("DD_EXCEPTION_REPLAY_ENABLED", "false", as_bool) + data_streams_enabled = _get_env( + "DD_DATA_STREAMS_ENABLED", "false", as_bool, depends_on_tracing=True + ) + + is_gov_region = _get_env("AWS_REGION", "", lambda x: x.startswith("us-gov-")) + + local_test = _get_env("DD_LOCAL_TEST", "false", as_bool) + integration_test = _get_env("DD_INTEGRATION_TEST", "false", as_bool) + + aws_lambda_function_name = _get_env("AWS_LAMBDA_FUNCTION_NAME") + + @property + def function_name(self): + if not hasattr(self, "_config_function_name"): + if self.aws_lambda_function_name is None: + self._config_function_name = "function" + else: + self._config_function_name = self.aws_lambda_function_name + return self._config_function_name + + @property + def is_lambda_context(self): + if not hasattr(self, "_config_is_lambda_context"): + self._config_is_lambda_context = bool(self.aws_lambda_function_name) + return self._config_is_lambda_context + + @property + def fips_mode_enabled(self): + if not hasattr(self, "_config_fips_mode_enabled"): + self._config_fips_mode_enabled = ( + os.environ.get( + "DD_LAMBDA_FIPS_MODE", + "true" if self.is_gov_region else "false", + ).lower() + == "true" + ) + return self._config_fips_mode_enabled + + def _reset(self): + for attr in dir(self): + if attr.startswith("_config_"): + delattr(self, attr) + + +config = Config() + +if config.is_gov_region or config.fips_mode_enabled: + logger.debug( + "Python Lambda Layer FIPS mode is %s.", + "enabled" if config.fips_mode_enabled else "not enabled", + ) diff --git a/datadog_lambda/fips.py b/datadog_lambda/fips.py deleted file mode 100644 index 8442ddd94..000000000 --- a/datadog_lambda/fips.py +++ /dev/null @@ -1,19 +0,0 @@ -import logging -import os - -is_gov_region = os.environ.get("AWS_REGION", "").startswith("us-gov-") - -fips_mode_enabled = ( - os.environ.get( - "DD_LAMBDA_FIPS_MODE", - "true" if is_gov_region else "false", - ).lower() - == "true" -) - -if is_gov_region or fips_mode_enabled: - logger = logging.getLogger(__name__) - logger.debug( - "Python Lambda Layer FIPS mode is %s.", - "enabled" if fips_mode_enabled else "not enabled", - ) diff --git a/datadog_lambda/metric.py b/datadog_lambda/metric.py index c9b978d68..73bbeca3c 100644 --- a/datadog_lambda/metric.py +++ b/datadog_lambda/metric.py @@ -5,14 +5,13 @@ import enum import logging -import os import time from datetime import datetime, timedelta import ujson as json +from datadog_lambda.config import config from datadog_lambda.extension import should_use_extension -from datadog_lambda.fips import fips_mode_enabled from datadog_lambda.tags import dd_lambda_layer_tag, get_enhanced_metrics_tags logger = logging.getLogger(__name__) @@ -28,10 +27,10 @@ class MetricsHandler(enum.Enum): def _select_metrics_handler(): if should_use_extension: return MetricsHandler.EXTENSION - if os.environ.get("DD_FLUSH_TO_LOG", "").lower() == "true": + if config.flush_to_log: return MetricsHandler.FORWARDER - if fips_mode_enabled: + if config.fips_mode_enabled: logger.debug( "With FIPS mode enabled, the Datadog API metrics handler is unavailable." ) @@ -58,14 +57,8 @@ def _select_metrics_handler(): from datadog_lambda.api import init_api from datadog_lambda.thread_stats_writer import ThreadStatsWriter - flush_in_thread = os.environ.get("DD_FLUSH_IN_THREAD", "").lower() == "true" init_api() - lambda_stats = ThreadStatsWriter(flush_in_thread) - - -enhanced_metrics_enabled = ( - os.environ.get("DD_ENHANCED_METRICS", "true").lower() == "true" -) + lambda_stats = ThreadStatsWriter(config.flush_in_thread) def lambda_metric(metric_name, value, timestamp=None, tags=None, force_async=False): @@ -191,7 +184,7 @@ def submit_enhanced_metric(metric_name, lambda_context): metric_name (str): metric name w/o enhanced prefix i.e. "invocations" or "errors" lambda_context (object): Lambda context dict passed to the function by AWS """ - if not enhanced_metrics_enabled: + if not config.enhanced_metrics_enabled: logger.debug( "Not submitting enhanced metric %s because enhanced metrics are disabled", metric_name, diff --git a/datadog_lambda/patch.py b/datadog_lambda/patch.py index 5b8a92c53..6d2af0dcf 100644 --- a/datadog_lambda/patch.py +++ b/datadog_lambda/patch.py @@ -3,7 +3,6 @@ # This product includes software developed at Datadog (https://www.datadoghq.com/). # Copyright 2019 Datadog, Inc. -import os import sys import logging import zlib @@ -13,10 +12,8 @@ from wrapt.importer import when_imported from ddtrace import patch_all as patch_all_dd -from datadog_lambda.tracing import ( - get_dd_trace_context, - dd_tracing_enabled, -) +from datadog_lambda.config import config +from datadog_lambda.tracing import get_dd_trace_context from collections.abc import MutableMapping logger = logging.getLogger(__name__) @@ -32,7 +29,7 @@ def patch_all(): """ _patch_for_integration_tests() - if dd_tracing_enabled: + if config.trace_enabled: patch_all_dd() else: _patch_http() @@ -44,8 +41,7 @@ def _patch_for_integration_tests(): Patch `requests` to log the outgoing requests for integration tests. """ global _integration_tests_patched - is_in_tests = os.environ.get("DD_INTEGRATION_TEST", "false").lower() == "true" - if not _integration_tests_patched and is_in_tests: + if not _integration_tests_patched and config.integration_test: wrap("requests", "Session.send", _log_request) _integration_tests_patched = True diff --git a/datadog_lambda/span_pointers.py b/datadog_lambda/span_pointers.py index 40d959e61..45925d929 100644 --- a/datadog_lambda/span_pointers.py +++ b/datadog_lambda/span_pointers.py @@ -1,12 +1,12 @@ from itertools import chain import logging -import os from typing import List from typing import Optional from ddtrace._trace._span_pointer import _SpanPointerDirection from ddtrace._trace._span_pointer import _SpanPointerDescription +from datadog_lambda.config import config from datadog_lambda.metric import submit_dynamodb_stream_type_metric from datadog_lambda.trigger import EventTypes @@ -14,15 +14,10 @@ logger = logging.getLogger(__name__) -dd_botocore_add_span_pointers = os.environ.get( - "DD_BOTOCORE_ADD_SPAN_POINTERS", "true" -).lower() in ("true", "1") - - def calculate_span_pointers( event_source, event, - botocore_add_span_pointers=dd_botocore_add_span_pointers, + botocore_add_span_pointers=config.add_span_pointers, ) -> List[_SpanPointerDescription]: try: if botocore_add_span_pointers: diff --git a/datadog_lambda/tag_object.py b/datadog_lambda/tag_object.py index 6d82f83b5..744e48933 100644 --- a/datadog_lambda/tag_object.py +++ b/datadog_lambda/tag_object.py @@ -4,18 +4,17 @@ # Copyright 2021 Datadog, Inc. from decimal import Decimal -import logging import ujson as json +from datadog_lambda.config import config + redactable_keys = ["authorization", "x-authorization", "password", "token"] -max_depth = 10 -logger = logging.getLogger(__name__) def tag_object(span, key, obj, depth=0): if obj is None: return span.set_tag(key, obj) - if depth >= max_depth: + if depth >= config.capture_payload_max_depth: return span.set_tag(key, _redact_val(key, str(obj)[0:5000])) depth += 1 if _should_try_string(obj): diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index 4b6f300a8..3d5f671e8 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -32,6 +32,8 @@ from ddtrace import __version__ as ddtrace_version from ddtrace.propagation.http import HTTPPropagator from ddtrace.trace import Context, Span, tracer + +from datadog_lambda.config import config from datadog_lambda import __version__ as datadog_lambda_version from datadog_lambda.trigger import ( _EventSource, @@ -42,10 +44,7 @@ EventSubtypes, ) -dd_trace_otel_enabled = ( - os.environ.get("DD_TRACE_OTEL_ENABLED", "false").lower() == "true" -) -if dd_trace_otel_enabled: +if config.otel_enabled: from opentelemetry.trace import set_tracer_provider from ddtrace.opentelemetry import TracerProvider @@ -55,18 +54,11 @@ logger = logging.getLogger(__name__) dd_trace_context = None -dd_tracing_enabled = os.environ.get("DD_TRACE_ENABLED", "false").lower() == "true" -if dd_tracing_enabled: +if config.telemetry_enabled: # Enable the telemetry client if the user has opted in - if ( - os.environ.get("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "false").lower() - == "true" - ): - from ddtrace.internal.telemetry import telemetry_writer + from ddtrace.internal.telemetry import telemetry_writer - telemetry_writer.enable() - -is_lambda_context = os.environ.get(XrayDaemon.FUNCTION_NAME_HEADER_NAME) != "" + telemetry_writer.enable() propagator = HTTPPropagator() @@ -97,7 +89,7 @@ def _convert_xray_sampling(xray_sampled): def _get_xray_trace_context(): - if not is_lambda_context: + if not config.is_lambda_context: return None xray_trace_entity = parse_xray_header( @@ -639,13 +631,11 @@ def get_dd_trace_context_obj(): automatically, but this function can be used to manually inject the trace context to an outgoing request. """ - if dd_tracing_enabled: + if config.trace_enabled: dd_trace_py_context = _get_dd_trace_py_context() if _is_context_complete(dd_trace_py_context): return dd_trace_py_context - global dd_trace_context - try: xray_context = _get_xray_trace_context() # xray (sub)segment except Exception as e: @@ -690,10 +680,10 @@ def set_correlation_ids(): TODO: Remove me when Datadog tracer is natively supported in Lambda. """ - if not is_lambda_context: + if not config.is_lambda_context: logger.debug("set_correlation_ids is only supported in LambdaContext") return - if dd_tracing_enabled: + if config.trace_enabled: logger.debug("using ddtrace implementation for spans") return @@ -1480,7 +1470,7 @@ def emit_telemetry_on_exception_outside_of_handler( Emit an enhanced error metric and create a span for exceptions occurring outside the handler """ submit_errors_metric(None) - if dd_tracing_enabled: + if config.trace_enabled: span = tracer.trace( "aws.lambda", service="aws.lambda", diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 0e23b7218..87063411e 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -18,6 +18,7 @@ is_new_sandbox, ColdStartTracer, ) +from datadog_lambda.config import config from datadog_lambda.constants import ( TraceContextSource, XraySubsegment, @@ -26,11 +27,11 @@ from datadog_lambda.module_name import modify_module_name from datadog_lambda.patch import patch_all from datadog_lambda.span_pointers import calculate_span_pointers +from datadog_lambda.tag_object import tag_object from datadog_lambda.tracing import ( extract_dd_trace_context, create_dd_dummy_metadata_subsegment, inject_correlation_ids, - dd_tracing_enabled, mark_trace_as_error_for_5xx_responses, set_correlation_ids, set_dd_trace_py_root, @@ -46,65 +47,20 @@ extract_http_status_code_tag, ) -profiling_env_var = os.environ.get("DD_PROFILING_ENABLED", "false").lower() == "true" -if profiling_env_var: +if config.profiling_enabled: from ddtrace.profiling import profiler -llmobs_env_var = os.environ.get("DD_LLMOBS_ENABLED", "false").lower() in ("true", "1") -if llmobs_env_var: +if config.llmobs_enabled: from ddtrace.llmobs import LLMObs -exception_replay_env_var = os.environ.get( - "DD_EXCEPTION_REPLAY_ENABLED", "false" -).lower() in ("true", "1") -if exception_replay_env_var: +if config.exception_replay_enabled: from ddtrace.debugging._exception.replay import SpanExceptionHandler from ddtrace.debugging._uploader import LogsIntakeUploaderV1 logger = logging.getLogger(__name__) -DD_FLUSH_TO_LOG = "DD_FLUSH_TO_LOG" -DD_LOGS_INJECTION = "DD_LOGS_INJECTION" -DD_MERGE_XRAY_TRACES = "DD_MERGE_XRAY_TRACES" -AWS_LAMBDA_FUNCTION_NAME = "AWS_LAMBDA_FUNCTION_NAME" -DD_LOCAL_TEST = "DD_LOCAL_TEST" -DD_TRACE_EXTRACTOR = "DD_TRACE_EXTRACTOR" -DD_TRACE_MANAGED_SERVICES = "DD_TRACE_MANAGED_SERVICES" -DD_ENCODE_AUTHORIZER_CONTEXT = "DD_ENCODE_AUTHORIZER_CONTEXT" -DD_DECODE_AUTHORIZER_CONTEXT = "DD_DECODE_AUTHORIZER_CONTEXT" -DD_COLD_START_TRACING = "DD_COLD_START_TRACING" -DD_MIN_COLD_START_DURATION = "DD_MIN_COLD_START_DURATION" -DD_COLD_START_TRACE_SKIP_LIB = "DD_COLD_START_TRACE_SKIP_LIB" -DD_CAPTURE_LAMBDA_PAYLOAD = "DD_CAPTURE_LAMBDA_PAYLOAD" -DD_CAPTURE_LAMBDA_PAYLOAD_MAX_DEPTH = "DD_CAPTURE_LAMBDA_PAYLOAD_MAX_DEPTH" DD_REQUESTS_SERVICE_NAME = "DD_REQUESTS_SERVICE_NAME" DD_SERVICE = "DD_SERVICE" -DD_ENV = "DD_ENV" -DD_DATA_STREAMS_ENABLED = "DD_DATA_STREAMS_ENABLED" - - -def get_env_as_int(env_key, default_value: int) -> int: - try: - return int(os.environ.get(env_key, default_value)) - except Exception as e: - logger.warn( - f"Failed to parse {env_key} as int. Using default value: {default_value}. Error: {e}" - ) - return default_value - - -dd_capture_lambda_payload_enabled = ( - os.environ.get(DD_CAPTURE_LAMBDA_PAYLOAD, "false").lower() == "true" -) - -if dd_capture_lambda_payload_enabled: - import datadog_lambda.tag_object as tag_object - - tag_object.max_depth = get_env_as_int( - DD_CAPTURE_LAMBDA_PAYLOAD_MAX_DEPTH, tag_object.max_depth - ) - -env_env_var = os.environ.get(DD_ENV, None) init_timestamp_ns = time_ns() @@ -161,59 +117,16 @@ def __init__(self, func): """Executes when the wrapped function gets wrapped""" try: self.func = func - self.flush_to_log = os.environ.get(DD_FLUSH_TO_LOG, "").lower() == "true" - self.logs_injection = ( - os.environ.get(DD_LOGS_INJECTION, "true").lower() == "true" - ) - self.merge_xray_traces = ( - os.environ.get(DD_MERGE_XRAY_TRACES, "false").lower() == "true" - ) - self.function_name = os.environ.get(AWS_LAMBDA_FUNCTION_NAME, "function") - self.service = os.environ.get(DD_SERVICE, None) - self.extractor_env = os.environ.get(DD_TRACE_EXTRACTOR, None) self.trace_extractor = None self.span = None self.inferred_span = None - depends_on_dd_tracing_enabled = ( - lambda original_boolean: dd_tracing_enabled and original_boolean - ) - self.make_inferred_span = depends_on_dd_tracing_enabled( - os.environ.get(DD_TRACE_MANAGED_SERVICES, "true").lower() == "true" - ) - self.encode_authorizer_context = depends_on_dd_tracing_enabled( - os.environ.get(DD_ENCODE_AUTHORIZER_CONTEXT, "true").lower() == "true" - ) - self.decode_authorizer_context = depends_on_dd_tracing_enabled( - os.environ.get(DD_DECODE_AUTHORIZER_CONTEXT, "true").lower() == "true" - ) - self.cold_start_tracing = depends_on_dd_tracing_enabled( - os.environ.get(DD_COLD_START_TRACING, "true").lower() == "true" - ) - self.min_cold_start_trace_duration = get_env_as_int( - DD_MIN_COLD_START_DURATION, 3 - ) - self.data_streams_enabled = ( - os.environ.get(DD_DATA_STREAMS_ENABLED, "false").lower() == "true" - ) - self.local_testing_mode = os.environ.get( - DD_LOCAL_TEST, "false" - ).lower() in ("true", "1") - self.cold_start_trace_skip_lib = [ - "ddtrace.internal.compat", - "ddtrace.filters", - ] - if DD_COLD_START_TRACE_SKIP_LIB in os.environ: - try: - self.cold_start_trace_skip_lib = os.environ[ - DD_COLD_START_TRACE_SKIP_LIB - ].split(",") - except Exception: - logger.debug(f"Malformatted for env {DD_COLD_START_TRACE_SKIP_LIB}") self.response = None - if profiling_env_var: - self.prof = profiler.Profiler(env=env_env_var, service=self.service) - if self.extractor_env: - extractor_parts = self.extractor_env.rsplit(".", 1) + + if config.profiling_enabled: + self.prof = profiler.Profiler(env=config.env, service=config.service) + + if config.trace_extractor: + extractor_parts = config.trace_extractor.rsplit(".", 1) if len(extractor_parts) == 2: (mod_name, extractor_name) = extractor_parts modified_extractor_name = modify_module_name(mod_name) @@ -221,7 +134,7 @@ def __init__(self, func): self.trace_extractor = getattr(extractor_module, extractor_name) # Inject trace correlation ids to logs - if self.logs_injection: + if config.logs_injection: inject_correlation_ids() # This prevents a breaking change in ddtrace v0.49 regarding the service name @@ -233,11 +146,11 @@ def __init__(self, func): patch_all() # Enable LLM Observability - if llmobs_env_var: + if config.llmobs_enabled: LLMObs.enable() # Enable Exception Replay - if exception_replay_env_var: + if config.exception_replay_enabled: logger.debug("Enabling exception replay") SpanExceptionHandler.enable() @@ -307,7 +220,7 @@ def _before(self, event, context): event, context, extractor=self.trace_extractor, - decode_authorizer_context=self.decode_authorizer_context, + decode_authorizer_context=config.decode_authorizer_context, ) self.event_source = event_source # Create a Datadog X-Ray subsegment with the trace context @@ -321,28 +234,28 @@ def _before(self, event, context): XraySubsegment.TRACE_KEY, ) - if dd_tracing_enabled: - set_dd_trace_py_root(trace_context_source, self.merge_xray_traces) - if self.make_inferred_span: + if config.trace_enabled: + set_dd_trace_py_root(trace_context_source, config.merge_xray_traces) + if config.make_inferred_span: self.inferred_span = create_inferred_span( - event, context, event_source, self.decode_authorizer_context + event, context, event_source, config.decode_authorizer_context ) - if self.data_streams_enabled: + if config.data_streams_enabled: set_dsm_context(event, event_source) self.span = create_function_execution_span( context=context, - function_name=self.function_name, + function_name=config.function_name, is_cold_start=is_cold_start(), is_proactive_init=is_proactive_init(), trace_context_source=trace_context_source, - merge_xray_traces=self.merge_xray_traces, + merge_xray_traces=config.merge_xray_traces, trigger_tags=self.trigger_tags, parent_span=self.inferred_span, span_pointers=calculate_span_pointers(event_source, event), ) else: set_correlation_ids() - if profiling_env_var and is_new_sandbox(): + if config.profiling_enabled and is_new_sandbox(): self.prof.start(stop_on_exit=False, profile_children=True) logger.debug("datadog_lambda_wrapper _before() done") except Exception as e: @@ -361,14 +274,14 @@ def _after(self, event, context): create_dd_dummy_metadata_subsegment( self.trigger_tags, XraySubsegment.LAMBDA_FUNCTION_TAGS_KEY ) - should_trace_cold_start = self.cold_start_tracing and is_new_sandbox() + should_trace_cold_start = config.cold_start_tracing and is_new_sandbox() if should_trace_cold_start: trace_ctx = tracer.current_trace_context() if self.span: - if dd_capture_lambda_payload_enabled: - tag_object.tag_object(self.span, "function.request", event) - tag_object.tag_object(self.span, "function.response", self.response) + if config.capture_payload_enabled: + tag_object(self.span, "function.request", event) + tag_object(self.span, "function.response", self.response) if status_code: self.span.set_tag("http.status_code", status_code) @@ -378,8 +291,8 @@ def _after(self, event, context): if status_code: self.inferred_span.set_tag("http.status_code", status_code) - if self.service: - self.inferred_span.set_tag("peer.service", self.service) + if config.service: + self.inferred_span.set_tag("peer.service", config.service) if InferredSpanInfo.is_async(self.inferred_span) and self.span: self.inferred_span.finish(finish_time=self.span.start) @@ -391,33 +304,35 @@ def _after(self, event, context): following_span = self.span or self.inferred_span ColdStartTracer( tracer, - self.function_name, + config.function_name, following_span.start_ns, trace_ctx, - self.min_cold_start_trace_duration, - self.cold_start_trace_skip_lib, + config.min_cold_start_trace_duration, + config.cold_start_trace_skip_lib, ).trace() except Exception as e: logger.debug("Failed to create cold start spans. %s", e) - if not self.flush_to_log or should_use_extension: + if not config.flush_to_log or should_use_extension: from datadog_lambda.metric import flush_stats flush_stats(context) - if should_use_extension and self.local_testing_mode: + if should_use_extension and config.local_test: # when testing locally, the extension does not know when an # invocation completes because it does not have access to the # logs api flush_extension() - if llmobs_env_var: + if config.llmobs_enabled: LLMObs.flush() # Flush exception replay - if exception_replay_env_var: + if config.exception_replay_enabled: LogsIntakeUploaderV1._instance.periodic() - if self.encode_authorizer_context and is_authorizer_response(self.response): + if config.encode_authorizer_context and is_authorizer_response( + self.response + ): self._inject_authorizer_span_headers( event.get("requestContext", {}).get("requestId") ) diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 000000000..338698025 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,8 @@ +import pytest + +from datadog_lambda.config import config + + +@pytest.fixture(autouse=True) +def reset_config(): + config._reset() diff --git a/tests/test_api.py b/tests/test_api.py index 59ee4ee8d..7fcc3c221 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -22,7 +22,10 @@ def setUp(self): ) self.env_patcher.start() - @patch("datadog_lambda.api.fips_mode_enabled", True) + def tearDown(self): + del os.environ["AWS_REGION"] + + @patch("datadog_lambda.config.Config.fips_mode_enabled", True) @patch("botocore.session.Session.create_client") def test_secrets_manager_fips_endpoint(self, mock_boto3_client): mock_client = MagicMock() @@ -63,7 +66,7 @@ def test_secrets_manager_different_region(self, mock_boto3_client): ) self.assertEqual(api_key, "test-api-key") - @patch("datadog_lambda.api.fips_mode_enabled", True) + @patch("datadog_lambda.config.Config.fips_mode_enabled", True) @patch("botocore.session.Session.create_client") def test_secrets_manager_different_region_but_still_fips(self, mock_boto3_client): mock_client = MagicMock() @@ -84,7 +87,7 @@ def test_secrets_manager_different_region_but_still_fips(self, mock_boto3_client ) self.assertEqual(api_key, "test-api-key") - @patch("datadog_lambda.api.fips_mode_enabled", True) + @patch("datadog_lambda.config.Config.fips_mode_enabled", True) @patch("botocore.session.Session.create_client") def test_ssm_fips_endpoint(self, mock_boto3_client): mock_client = MagicMock() @@ -103,7 +106,7 @@ def test_ssm_fips_endpoint(self, mock_boto3_client): ) self.assertEqual(api_key, "test-api-key") - @patch("datadog_lambda.api.fips_mode_enabled", True) + @patch("datadog_lambda.config.Config.fips_mode_enabled", True) @patch("botocore.session.Session.create_client") @patch("datadog_lambda.api.decrypt_kms_api_key") def test_kms_fips_endpoint(self, mock_decrypt_kms, mock_boto3_client): diff --git a/tests/test_cold_start.py b/tests/test_cold_start.py index c7444c49e..d75b5f43a 100644 --- a/tests/test_cold_start.py +++ b/tests/test_cold_start.py @@ -8,6 +8,8 @@ import datadog_lambda.cold_start as cold_start import datadog_lambda.wrapper as wrapper +from tests.utils import get_mock_context + class TestColdStartTracingSetup(unittest.TestCase): def test_proactive_init(self): @@ -247,7 +249,7 @@ def finish(span): monkeypatch.setattr(wrapper.tracer, "_on_span_finish", finish) monkeypatch.setattr(wrapper, "is_new_sandbox", lambda: True) - monkeypatch.setattr("datadog_lambda.wrapper.dd_tracing_enabled", True) + monkeypatch.setattr("datadog_lambda.config.Config.trace_enabled", True) monkeypatch.setenv( "DD_COLD_START_TRACE_SKIP_LIB", "ddtrace.contrib.logging,datadog_lambda.wrapper" ) @@ -257,10 +259,7 @@ def finish(span): def handler(event, context): import tabnanny - lambda_context = MagicMock() - lambda_context.invoked_function_arn = ( - "arn:aws:lambda:us-west-1:123457598159:function:python-layer-test:1" - ) + lambda_context = get_mock_context() handler.cold_start_tracing = True handler({}, lambda_context) diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 000000000..92002439d --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,240 @@ +import pytest + +from datadog_lambda.config import config, _get_env, Config + + +@pytest.fixture +def setenv(monkeypatch): + def set_env(key, value): + if value is None: + monkeypatch.delenv(key, raising=False) + else: + monkeypatch.setenv(key, value) + + return set_env + + +def _test_as_bool(env_key, conf_key, default): + return ( + (env_key, conf_key, None, default), + (env_key, conf_key, "", False), + (env_key, conf_key, "true", True), + (env_key, conf_key, "TRUE", True), + (env_key, conf_key, "false", False), + (env_key, conf_key, "FALSE", False), + (env_key, conf_key, "1", True), + (env_key, conf_key, "0", False), + (env_key, conf_key, "purple", False), + ) + + +def _test_int(env_key, conf_key, default): + return ( + (env_key, conf_key, None, default), + (env_key, conf_key, "", default), + (env_key, conf_key, "5", 5), + (env_key, conf_key, "0", 0), + (env_key, conf_key, "2.5", default), + (env_key, conf_key, "-1", -1), + (env_key, conf_key, "purple", default), + ) + + +def _test_as_list(env_key, conf_key, default): + return ( + (env_key, conf_key, None, default.split(",")), + (env_key, conf_key, "", []), + (env_key, conf_key, " ", []), + (env_key, conf_key, ",", []), + (env_key, conf_key, " , ", []), + (env_key, conf_key, "a", ["a"]), + (env_key, conf_key, "a,", ["a"]), + (env_key, conf_key, "a, ", ["a"]), + (env_key, conf_key, "a,b", ["a", "b"]), + (env_key, conf_key, "a, b", ["a", "b"]), + ) + + +_test_config_from_environ = ( + *_test_as_bool("DD_FLUSH_TO_LOG", "flush_to_log", default=False), + *_test_as_bool("DD_LOGS_INJECTION", "logs_injection", default=True), + *_test_as_bool("DD_TRACE_ENABLED", "trace_enabled", default=True), + *_test_as_bool("DD_COLD_START_TRACING", "cold_start_tracing", default=True), + *_test_as_bool("DD_TRACE_MANAGED_SERVICES", "make_inferred_span", default=True), + *_test_as_bool( + "DD_ENCODE_AUTHORIZER_CONTEXT", "encode_authorizer_context", default=True + ), + *_test_as_bool( + "DD_DECODE_AUTHORIZER_CONTEXT", "decode_authorizer_context", default=True + ), + *_test_as_bool("DD_FLUSH_IN_THREAD", "flush_in_thread", default=False), + *_test_as_bool("DD_ENHANCED_METRICS", "enhanced_metrics_enabled", default=True), + *_test_as_bool("DD_INTEGRATION_TEST", "integration_test", default=False), + *_test_as_bool("DD_BOTOCORE_ADD_SPAN_POINTERS", "add_span_pointers", default=True), + *_test_as_bool("DD_TRACE_OTEL_ENABLED", "otel_enabled", default=False), + *_test_as_bool( + "DD_INSTRUMENTATION_TELEMETRY_ENABLED", "telemetry_enabled", default=False + ), + *_test_as_bool("DD_MERGE_XRAY_TRACES", "merge_xray_traces", default=False), + *_test_as_bool("DD_PROFILING_ENABLED", "profiling_enabled", default=False), + *_test_as_bool("DD_LLMOBS_ENABLED", "llmobs_enabled", default=False), + *_test_as_bool( + "DD_EXCEPTION_REPLAY_ENABLED", "exception_replay_enabled", default=False + ), + *_test_as_bool( + "DD_CAPTURE_LAMBDA_PAYLOAD", "capture_payload_enabled", default=False + ), + *_test_as_bool("DD_LOCAL_TEST", "local_test", default=False), + *_test_as_bool("DD_DATA_STREAMS_ENABLED", "data_streams_enabled", default=False), + *_test_int( + "DD_CAPTURE_LAMBDA_PAYLOAD_MAX_DEPTH", "capture_payload_max_depth", default=10 + ), + *_test_int( + "DD_MIN_COLD_START_DURATION", "min_cold_start_trace_duration", default=3 + ), + *_test_as_list( + "DD_COLD_START_TRACE_SKIP_LIB", + "cold_start_trace_skip_lib", + default="ddtrace.internal.compat,ddtrace.filters", + ), + ("DD_SERVICE", "service", None, None), + ("DD_SERVICE", "service", "", ""), + ("DD_SERVICE", "service", "my_service", "my_service"), + ("AWS_LAMBDA_FUNCTION_NAME", "aws_lambda_function_name", None, None), + ("AWS_LAMBDA_FUNCTION_NAME", "aws_lambda_function_name", "", ""), + ( + "AWS_LAMBDA_FUNCTION_NAME", + "aws_lambda_function_name", + "my_function", + "my_function", + ), + ("AWS_LAMBDA_FUNCTION_NAME", "function_name", None, "function"), + ("AWS_LAMBDA_FUNCTION_NAME", "function_name", "", ""), + ("AWS_LAMBDA_FUNCTION_NAME", "function_name", "my_function", "my_function"), + ("AWS_LAMBDA_FUNCTION_NAME", "is_lambda_context", None, False), + ("AWS_LAMBDA_FUNCTION_NAME", "is_lambda_context", "", False), + ("AWS_LAMBDA_FUNCTION_NAME", "is_lambda_context", "my_function", True), + ("AWS_REGION", "is_gov_region", None, False), + ("AWS_REGION", "is_gov_region", "", False), + ("AWS_REGION", "is_gov_region", "us-gov-1", True), + ("AWS_REGION", "is_gov_region", "us-est-1", False), + ("DD_TRACE_EXTRACTOR", "trace_extractor", None, None), + ("DD_TRACE_EXTRACTOR", "trace_extractor", "", ""), + ("DD_TRACE_EXTRACTOR", "trace_extractor", "my_extractor", "my_extractor"), + ("DD_ENV", "env", None, None), + ("DD_ENV", "env", "", ""), + ("DD_ENV", "env", "my_env", "my_env"), +) + + +@pytest.mark.parametrize("env_key,conf_key,env_val,conf_val", _test_config_from_environ) +def test_config_from_environ(env_key, conf_key, env_val, conf_val, setenv): + setenv(env_key, env_val) + assert getattr(config, conf_key) == conf_val + + +_test_config_from_environ_depends_on_tracing = ( + *_test_as_bool("DD_COLD_START_TRACING", "cold_start_tracing", default=True), + *_test_as_bool("DD_TRACE_MANAGED_SERVICES", "make_inferred_span", default=True), + *_test_as_bool( + "DD_ENCODE_AUTHORIZER_CONTEXT", "encode_authorizer_context", default=True + ), + *_test_as_bool( + "DD_DECODE_AUTHORIZER_CONTEXT", "decode_authorizer_context", default=True + ), + *_test_as_bool("DD_DATA_STREAMS_ENABLED", "data_streams_enabled", default=False), + *_test_as_bool( + "DD_INSTRUMENTATION_TELEMETRY_ENABLED", "telemetry_enabled", default=False + ), +) + + +@pytest.mark.parametrize( + "env_key,conf_key,env_val,conf_val", _test_config_from_environ_depends_on_tracing +) +def test_config_from_environ_depends_on_tracing( + env_key, conf_key, env_val, conf_val, setenv +): + setenv(env_key, env_val) + setenv("DD_TRACE_ENABLED", "false") + assert getattr(config, conf_key) is False + + +def test_config_aws_lambda_function_name(setenv): + # these config values all access the same environment variable, test to + # ensure the wrong value is not cached + setenv("AWS_LAMBDA_FUNCTION_NAME", "my_function") + assert config.aws_lambda_function_name == "my_function" + assert config.function_name == "my_function" + assert config.is_lambda_context is True + + +_test_fips_mode_from_environ = ( + (None, None, False), + (None, "", False), + (None, "us-gov-1", True), + (None, "us-east-1", False), + ("", None, False), + ("", "", False), + ("", "us-gov-1", False), + ("", "us-east-1", False), + ("true", None, True), + ("true", "", True), + ("true", "us-gov-1", True), + ("true", "us-east-1", True), + ("TRUE", None, True), + ("TRUE", "", True), + ("TRUE", "us-gov-1", True), + ("TRUE", "us-east-1", True), + ("false", None, False), + ("false", "", False), + ("false", "us-gov-1", False), + ("false", "us-east-1", False), + ("FALSE", None, False), + ("FALSE", "", False), + ("FALSE", "us-gov-1", False), + ("FALSE", "us-east-1", False), + ("1", None, False), + ("1", "", False), + ("1", "us-gov-1", False), + ("1", "us-east-1", False), + ("0", None, False), + ("0", "", False), + ("0", "us-gov-1", False), + ("0", "us-east-1", False), +) + + +@pytest.mark.parametrize("fips_mode,region,conf_val", _test_fips_mode_from_environ) +def test_fips_mode_from_environ(fips_mode, region, conf_val, setenv): + setenv("DD_LAMBDA_FIPS_MODE", fips_mode) + setenv("AWS_REGION", region) + assert config.fips_mode_enabled == conf_val + + +def test__get_env_does_not_log_when_env_not_set(setenv, monkeypatch): + setenv("TEST_1", None) + setenv("TEST_2", None) + setenv("TEST_3", None) + setenv("TEST_4", None) + + class Testing(Config): + test_1 = _get_env("TEST_1") + test_2 = _get_env("TEST_2", "purple") + test_3 = _get_env("TEST_3", "true", bool) + test_4 = _get_env("TEST_4", "true", bool, depends_on_tracing=True) + + logs = [] + + def cap_warn(*args, **kwargs): + logs.append(args) + + monkeypatch.setattr("datadog_lambda.config.logger.warning", cap_warn) + + testing = Testing() + testing.test_1 + testing.test_2 + testing.test_3 + testing.test_4 + + assert not logs diff --git a/tests/test_metric.py b/tests/test_metric.py index e7dab2c3c..aa537d346 100644 --- a/tests/test_metric.py +++ b/tests/test_metric.py @@ -62,7 +62,7 @@ def test_select_metrics_handler_dd_api_fallback(self): self.assertEqual(MetricsHandler.DATADOG_API, _select_metrics_handler()) del os.environ["DD_FLUSH_TO_LOG"] - @patch("datadog_lambda.metric.fips_mode_enabled", True) + @patch("datadog_lambda.config.Config.fips_mode_enabled", True) @patch("datadog_lambda.metric.should_use_extension", False) def test_select_metrics_handler_has_no_fallback_in_fips_mode(self): os.environ["DD_FLUSH_TO_LOG"] = "False" diff --git a/tests/test_patch.py b/tests/test_patch.py index bf9248756..b03d2e23e 100644 --- a/tests/test_patch.py +++ b/tests/test_patch.py @@ -1,3 +1,4 @@ +import pytest import unittest from unittest.mock import patch, MagicMock @@ -5,6 +6,13 @@ from datadog_lambda.patch import _patch_http, _ensure_patch_requests from datadog_lambda.constants import TraceHeader +from ddtrace.contrib.internal.requests.patch import unpatch as unpatch_requests + + +@pytest.fixture(scope="module", autouse=True) +def reset_patches(): + unpatch_requests() + class TestPatchHTTPClients(unittest.TestCase): def setUp(self): diff --git a/tests/test_tag_object.py b/tests/test_tag_object.py index 77512164f..574bb331a 100644 --- a/tests/test_tag_object.py +++ b/tests/test_tag_object.py @@ -29,6 +29,7 @@ def test_tag_object(self): True, ) + @patch("datadog_lambda.config.Config.capture_payload_max_depth", 2) def test_tag_object_max_depth(self): payload = { "hello": "world", @@ -41,11 +42,8 @@ def test_tag_object_max_depth(self): "vals": [{"thingOne": 1}, {"thingTwo": 2}], } spanMock = MagicMock() - import datadog_lambda.tag_object as lib_ref - lib_ref.max_depth = 2 # setting up the test tag_object(spanMock, "function.request", payload) - lib_ref.max_depth = 10 # revert the setup spanMock.set_tag.assert_has_calls( [ call("function.request.vals.0", "{'thingOne': 1}"), @@ -62,6 +60,7 @@ def test_tag_object_max_depth(self): True, ) + @patch("datadog_lambda.config.Config.capture_payload_max_depth", 0) def test_tag_object_max_depth_0(self): payload = { "hello": "world", @@ -74,11 +73,8 @@ def test_tag_object_max_depth_0(self): "vals": [{"thingOne": 1}, {"thingTwo": 2}], } spanMock = MagicMock() - import datadog_lambda.tag_object as lib_ref - lib_ref.max_depth = 0 # setting up the test tag_object(spanMock, "function.request", payload) - lib_ref.max_depth = 10 # revert the setup spanMock.set_tag.assert_has_calls( [ call( diff --git a/tests/test_tracing.py b/tests/test_tracing.py index e38e4ecd1..a629343ea 100644 --- a/tests/test_tracing.py +++ b/tests/test_tracing.py @@ -251,20 +251,16 @@ def test_extract_dd_trace_context(event, expect): class TestExtractAndGetDDTraceContext(unittest.TestCase): def setUp(self): - global dd_tracing_enabled - dd_tracing_enabled = False os.environ["_X_AMZN_TRACE_ID"] = fake_xray_header_value patcher = patch("datadog_lambda.tracing.send_segment") self.mock_send_segment = patcher.start() self.addCleanup(patcher.stop) - patcher = patch("datadog_lambda.tracing.is_lambda_context") + patcher = patch("datadog_lambda.config.Config.is_lambda_context") self.mock_is_lambda_context = patcher.start() self.mock_is_lambda_context.return_value = True self.addCleanup(patcher.stop) def tearDown(self): - global dd_tracing_enabled - dd_tracing_enabled = False del os.environ["_X_AMZN_TRACE_ID"] @with_trace_propagation_style("datadog") @@ -984,11 +980,12 @@ def setUp(self): ) self.addCleanup(patcher.stop) - patcher = patch("datadog_lambda.tracing.is_lambda_context") + patcher = patch("datadog_lambda.config.Config.is_lambda_context") self.mock_is_lambda_context = patcher.start() self.mock_is_lambda_context.return_value = True self.addCleanup(patcher.stop) + @patch("datadog_lambda.config.Config.trace_enabled", False) def test_set_correlation_ids(self): set_correlation_ids() span = tracer.current_span() @@ -1124,13 +1121,11 @@ def test_function_with_span_pointers(self): class TestSetTraceRootSpan(unittest.TestCase): def setUp(self): - global dd_tracing_enabled - dd_tracing_enabled = False os.environ["_X_AMZN_TRACE_ID"] = fake_xray_header_value patcher = patch("datadog_lambda.tracing.send_segment") self.mock_send_segment = patcher.start() self.addCleanup(patcher.stop) - patcher = patch("datadog_lambda.tracing.is_lambda_context") + patcher = patch("datadog_lambda.config.Config.is_lambda_context") self.mock_is_lambda_context = patcher.start() self.mock_is_lambda_context.return_value = True self.addCleanup(patcher.stop) @@ -1143,8 +1138,6 @@ def setUp(self): self.addCleanup(patcher.stop) def tearDown(self): - global dd_tracing_enabled - dd_tracing_enabled = False del os.environ["_X_AMZN_TRACE_ID"] def test_mixed_parent_context_when_merging(self): @@ -1245,6 +1238,7 @@ def test_get_service_mapping(self): create_service_mapping(os.environ["DD_SERVICE_MAPPING"]) ) self.assertEqual(self.get_service_mapping(), expected_output) + del os.environ["DD_SERVICE_MAPPING"] def test_set_service_mapping(self): new_service_mapping = {"api3": "service3", "api4": "service4"} @@ -1285,6 +1279,8 @@ def test_determine_service_name(self): "default", ) + del os.environ["DD_SERVICE_MAPPING"] + def test_remaps_all_inferred_span_service_names_from_api_gateway_event(self): new_service_mapping = {"lambda_api_gateway": "new-name"} self.set_service_mapping(new_service_mapping) @@ -2386,7 +2382,7 @@ def test_deterministic_m5_hash__always_leading_with_zero(self): class TestExceptionOutsideHandler(unittest.TestCase): - @patch("datadog_lambda.tracing.dd_tracing_enabled", True) + @patch("datadog_lambda.config.Config.trace_enabled", True) @patch("datadog_lambda.tracing.submit_errors_metric") @patch("time.time_ns", return_value=42) def test_exception_outside_handler_tracing_enabled( @@ -2427,7 +2423,7 @@ def test_exception_outside_handler_tracing_enabled( assert mock_span.error == 1 assert mock_span.start_ns == 42 - @patch("datadog_lambda.tracing.dd_tracing_enabled", False) + @patch("datadog_lambda.config.Config.trace_enabled", False) @patch("datadog_lambda.tracing.submit_errors_metric") @patch("time.time_ns", return_value=42) def test_exception_outside_handler_tracing_disabled( diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index f482fa3de..f0240905a 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -8,6 +8,8 @@ import datadog_lambda.wrapper as wrapper import datadog_lambda.xray as xray + +from datadog_lambda.config import config from datadog_lambda.metric import lambda_metric from datadog_lambda.thread_stats_writer import ThreadStatsWriter from ddtrace.trace import Span, tracer @@ -24,7 +26,6 @@ def setUp(self): patch("ddtrace.internal.writer.AgentWriter.flush_queue").start() wrapper.datadog_lambda_wrapper._force_wrap = True - wrapper.dd_tracing_enabled = True patcher = patch( "datadog.threadstats.reporters.HttpReporter.flush_distributions" ) @@ -80,9 +81,8 @@ def setUp(self): self.mock_set_dsm_context = patcher.start() self.addCleanup(patcher.stop) + @patch("datadog_lambda.config.Config.trace_enabled", False) def test_datadog_lambda_wrapper(self): - wrapper.dd_tracing_enabled = False - @wrapper.datadog_lambda_wrapper def lambda_handler(event, context): lambda_metric("test.metric", 100) @@ -92,7 +92,6 @@ def lambda_handler(event, context): lambda_context = get_mock_context() lambda_handler(lambda_event, lambda_context) - wrapper.dd_tracing_enabled = True self.mock_threadstats_flush_distributions.assert_has_calls( [ call( @@ -189,9 +188,9 @@ def lambda_handler(event, context): metric_module.lambda_stats.stop() metric_module.lambda_stats = ThreadStatsWriter(False) + @patch("datadog_lambda.config.Config.trace_enabled", False) def test_datadog_lambda_wrapper_inject_correlation_ids(self): os.environ["DD_LOGS_INJECTION"] = "True" - wrapper.dd_tracing_enabled = False @wrapper.datadog_lambda_wrapper def lambda_handler(event, context): @@ -199,7 +198,6 @@ def lambda_handler(event, context): lambda_event = {} lambda_handler(lambda_event, get_mock_context()) - wrapper.dd_tracing_enabled = True self.mock_set_correlation_ids.assert_called() self.mock_inject_correlation_ids.assert_called() @@ -457,11 +455,8 @@ def lambda_handler(event, context): ] ) + @patch("datadog_lambda.config.Config.enhanced_metrics_enabled", False) def test_no_enhanced_metrics_without_env_var(self): - patcher = patch("datadog_lambda.metric.enhanced_metrics_enabled", False) - patcher.start() - self.addCleanup(patcher.stop) - @wrapper.datadog_lambda_wrapper def lambda_handler(event, context): raise RuntimeError() @@ -515,6 +510,7 @@ def lambda_handler(event, context): self.assertEqual(os.environ.get("DD_REQUESTS_SERVICE_NAME"), "myAwesomeService") del os.environ["DD_SERVICE"] + @patch("datadog_lambda.config.Config.make_inferred_span", False) def test_encode_authorizer_span(self): @wrapper.datadog_lambda_wrapper def lambda_handler(event, context): @@ -541,7 +537,6 @@ def lambda_handler(event, context): trace_ctx.sampling_priority = 1 test_span.finish() lambda_handler.inferred_span = test_span - lambda_handler.make_inferred_span = False result = lambda_handler(lambda_event, lambda_context) raw_inject_data = result["context"]["_datadog"] self.assertIsInstance(raw_inject_data, str) @@ -569,7 +564,7 @@ def return_type_test(event, context): def test_set_dsm_context_called_when_DSM_and_tracing_enabled(self): os.environ["DD_DATA_STREAMS_ENABLED"] = "true" - wrapper.dd_tracing_enabled = True + os.environ["DD_TRACE_ENABLED"] = "true" @wrapper.datadog_lambda_wrapper def lambda_handler(event, context): @@ -583,7 +578,7 @@ def lambda_handler(event, context): def test_set_dsm_context_not_called_when_only_DSM_enabled(self): os.environ["DD_DATA_STREAMS_ENABLED"] = "true" - wrapper.dd_tracing_enabled = False + os.environ["DD_TRACE_ENABLED"] = "false" @wrapper.datadog_lambda_wrapper def lambda_handler(event, context): @@ -597,7 +592,7 @@ def lambda_handler(event, context): def test_set_dsm_context_not_called_when_only_tracing_enabled(self): os.environ["DD_DATA_STREAMS_ENABLED"] = "false" - wrapper.dd_tracing_enabled = True + os.environ["DD_TRACE_ENABLED"] = "true" @wrapper.datadog_lambda_wrapper def lambda_handler(event, context): @@ -611,7 +606,7 @@ def lambda_handler(event, context): def test_set_dsm_context_not_called_when_tracing_and_DSM_disabled(self): os.environ["DD_DATA_STREAMS_ENABLED"] = "false" - wrapper.dd_tracing_enabled = False + os.environ["DD_TRACE_ENABLED"] = "false" @wrapper.datadog_lambda_wrapper def lambda_handler(event, context): @@ -624,18 +619,6 @@ def lambda_handler(event, context): del os.environ["DD_DATA_STREAMS_ENABLED"] -class TestLambdaDecoratorSettings(unittest.TestCase): - def test_some_envs_should_depend_on_dd_tracing_enabled(self): - wrapper.dd_tracing_enabled = False - os.environ[wrapper.DD_TRACE_MANAGED_SERVICES] = "true" - os.environ[wrapper.DD_ENCODE_AUTHORIZER_CONTEXT] = "true" - os.environ[wrapper.DD_DECODE_AUTHORIZER_CONTEXT] = "true" - decorator = wrapper._LambdaDecorator(func=None) - self.assertFalse(decorator.make_inferred_span) - self.assertFalse(decorator.encode_authorizer_context) - self.assertFalse(decorator.decode_authorizer_context) - - class TestLambdaWrapperWithTraceContext(unittest.TestCase): xray_root = "1-5e272390-8c398be037738dc042009320" xray_parent = "94ae789b969f1cc5" @@ -706,14 +689,28 @@ def handler(event, context): class TestLambdaWrapperFlushExtension(unittest.TestCase): - def setUp(self): - self.orig_environ = os.environ + @patch("datadog_lambda.config.Config.local_test", True) + @patch("datadog_lambda.wrapper.should_use_extension", True) + def test_local_test_true_flushing(self): + flushes = [] + lambda_event = {} + lambda_context = get_mock_context() + + def flush(): + flushes.append(1) - def tearDown(self): - os.environ = self.orig_environ + @patch("datadog_lambda.wrapper.flush_extension", flush) + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + pass + lambda_handler(lambda_event, lambda_context) + + self.assertEqual(len(flushes), 1) + + @patch("datadog_lambda.config.Config.local_test", False) @patch("datadog_lambda.wrapper.should_use_extension", True) - def test_local_test_envvar_flushing(self): + def test_local_test_false_flushing(self): flushes = [] lambda_event = {} lambda_context = get_mock_context() @@ -721,24 +718,11 @@ def test_local_test_envvar_flushing(self): def flush(): flushes.append(1) - for environ, flush_called in ( - ({"DD_LOCAL_TEST": "True"}, True), - ({"DD_LOCAL_TEST": "true"}, True), - ({"DD_LOCAL_TEST": "1"}, True), - ({"DD_LOCAL_TEST": "False"}, False), - ({"DD_LOCAL_TEST": "false"}, False), - ({"DD_LOCAL_TEST": "0"}, False), - ({"DD_LOCAL_TEST": ""}, False), - ({}, False), - ): - os.environ = environ - flushes.clear() - - @patch("datadog_lambda.wrapper.flush_extension", flush) - @wrapper.datadog_lambda_wrapper - def lambda_handler(event, context): - pass + @patch("datadog_lambda.wrapper.flush_extension", flush) + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + pass - lambda_handler(lambda_event, lambda_context) + lambda_handler(lambda_event, lambda_context) - self.assertEqual(flush_called, len(flushes) == 1) + self.assertEqual(len(flushes), 0) diff --git a/tests/utils.py b/tests/utils.py index 0f246e68f..2d56ca0c0 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -22,6 +22,7 @@ def get_mock_context( lambda_context.invoked_function_arn = invoked_function_arn lambda_context.function_version = function_version lambda_context.function_name = function_name + lambda_context.get_remaining_time_in_millis = lambda: 100 lambda_context.client_context = ClientContext(custom) return lambda_context From e230d94554991136bc185bef2c46261f50073abc Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Wed, 11 Jun 2025 14:54:46 -0400 Subject: [PATCH 036/164] handle a case where the record is some customized item (#616) --- datadog_lambda/trigger.py | 2 +- tests/test_trigger.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/datadog_lambda/trigger.py b/datadog_lambda/trigger.py index 14cb06ac2..bbd0d027a 100644 --- a/datadog_lambda/trigger.py +++ b/datadog_lambda/trigger.py @@ -153,7 +153,7 @@ def parse_event_source(event: dict) -> _EventSource: event_source = _EventSource(EventTypes.STEPFUNCTIONS) event_record = get_first_record(event) - if event_record: + if event_record and isinstance(event_record, dict): aws_event_source = event_record.get("eventSource") or event_record.get( "EventSource" ) diff --git a/tests/test_trigger.py b/tests/test_trigger.py index c12e8f5c4..151039372 100644 --- a/tests/test_trigger.py +++ b/tests/test_trigger.py @@ -280,6 +280,13 @@ def test_detect_lambda_function_url_domain_with_invalid_input(self): # Test with string that would normally cause an exception when split self.assertFalse(detect_lambda_function_url_domain("")) + def test_event_source_with_non_dict_event_record(self): + # Test with event_record that's not a dictionary + event = {"Records": "not_a_dict"} + event_source = parse_event_source(event) + # Should handle the first non-dict record gracefully and return unknown + self.assertEqual(event_source.to_string(), "unknown") + class GetTriggerTags(unittest.TestCase): def test_extract_trigger_tags_api_gateway(self): From 8f2a45af6d90845efaf69246349f572e0de0b445 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 16:01:59 -0400 Subject: [PATCH 037/164] chore(deps): bump protobuf from 5.29.3 to 5.29.5 (#619) Bumps [protobuf](https://github.com/protocolbuffers/protobuf) from 5.29.3 to 5.29.5. - [Release notes](https://github.com/protocolbuffers/protobuf/releases) - [Changelog](https://github.com/protocolbuffers/protobuf/blob/main/protobuf_release.bzl) - [Commits](https://github.com/protocolbuffers/protobuf/compare/v5.29.3...v5.29.5) --- updated-dependencies: - dependency-name: protobuf dependency-version: 5.29.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 145 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 83 insertions(+), 62 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3953f9539..434f887c7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,23 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. - -[[package]] -name = "boto3" -version = "1.36.8" -description = "The AWS SDK for Python" -optional = true -python-versions = ">=3.8" -files = [ - {file = "boto3-1.36.8-py3-none-any.whl", hash = "sha256:7f61c9d0ea64f484a17c1e3115fdf90fd7b17ab6771e07cb4549f42b9fd28fb9"}, - {file = "boto3-1.36.8.tar.gz", hash = "sha256:ac47215d320b0c2534340db58d6d5284cb1860b7bff172b4dd6eee2dee1d5779"}, -] - -[package.dependencies] -botocore = ">=1.36.8,<1.37.0" -jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.11.0,<0.12.0" - -[package.extras] -crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "botocore" @@ -25,6 +6,8 @@ version = "1.36.8" description = "Low-level, data-driven core of boto 3." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "botocore-1.36.8-py3-none-any.whl", hash = "sha256:59d3fdfbae6d916b046e973bebcbeb70a102f9e570ca86d5ba512f1854b78fc2"}, {file = "botocore-1.36.8.tar.gz", hash = "sha256:81c88e5566cf018e1411a68304dc1fb9e4156ca2b50a3a0f0befc274299e67fa"}, @@ -34,8 +17,8 @@ files = [ jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ - {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, + {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, ] [package.extras] @@ -47,6 +30,7 @@ version = "0.16.1" description = "Python module to generate and modify bytecode" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "bytecode-0.16.1-py3-none-any.whl", hash = "sha256:1d4b61ed6bade4bff44127c8283bef8131a664ce4dbe09d64a88caf329939f35"}, {file = "bytecode-0.16.1.tar.gz", hash = "sha256:8fbbb637c880f339e564858bc6c7984ede67ae97bc71343379a535a9a4baf398"}, @@ -61,6 +45,7 @@ version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, @@ -72,6 +57,7 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -173,6 +159,8 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "extra == \"dev\" and sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -184,6 +172,7 @@ version = "0.51.0" description = "The Datadog Python library" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] files = [ {file = "datadog-0.51.0-py2.py3-none-any.whl", hash = "sha256:a9764f091c96af4e0996d4400b168fc5fba380f911d6d672c9dcd4773e29ea3f"}, {file = "datadog-0.51.0.tar.gz", hash = "sha256:3279534f831ae0b4ae2d8ce42ef038b4ab38e667d7ed6ff7437982d7a0cf5250"}, @@ -198,6 +187,7 @@ version = "2.20.0" description = "Datadog APM client library" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e1dee099099b95acf7d0e552179925cfec58a52315cc914d153506367b195bc4"}, {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:9d209bef14caafcd53be8c14e04741d86c08f76496c1bf755e2eaa38605ce3e0"}, @@ -271,10 +261,10 @@ files = [ [package.dependencies] bytecode = [ + {version = ">=0.13.0", markers = "python_version < \"3.11\""}, {version = ">=0.16.0", markers = "python_version >= \"3.13.0\""}, {version = ">=0.15.0", markers = "python_version ~= \"3.12.0\""}, {version = ">=0.14.0", markers = "python_version ~= \"3.11.0\""}, - {version = ">=0.13.0", markers = "python_version < \"3.11.0\""}, ] envier = ">=0.5,<1.0" legacy-cgi = {version = ">=2.0.0", markers = "python_version >= \"3.13.0\""} @@ -294,6 +284,7 @@ version = "1.2.18" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +groups = ["main"] files = [ {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"}, {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"}, @@ -303,7 +294,7 @@ files = [ wrapt = ">=1.10,<2" [package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools", "tox"] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools ; python_version >= \"3.12\"", "tox"] [[package]] name = "envier" @@ -311,6 +302,7 @@ version = "0.6.1" description = "Python application configuration via the environment" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "envier-0.6.1-py3-none-any.whl", hash = "sha256:73609040a76be48bbcb97074d9969666484aa0de706183a6e9ef773156a8a6a9"}, {file = "envier-0.6.1.tar.gz", hash = "sha256:3309a01bb3d8850c9e7a31a5166d5a836846db2faecb79b9cb32654dd50ca9f9"}, @@ -325,6 +317,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"dev\" and python_version <= \"3.10\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -339,6 +333,8 @@ version = "5.0.4" description = "the modular source code checker: pep8 pyflakes and co" optional = true python-versions = ">=3.6.1" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, @@ -355,6 +351,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -369,6 +366,7 @@ version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, @@ -378,12 +376,12 @@ files = [ zipp = ">=3.20" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +test = ["flufl.flake8", "importlib-resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] [[package]] @@ -392,6 +390,8 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -403,6 +403,8 @@ version = "1.0.1" description = "JSON Matching Expressions" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, @@ -414,6 +416,8 @@ version = "2.6.2" description = "Fork of the standard library cgi and cgitb modules, being deprecated in PEP-594" optional = false python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.13.0\"" files = [ {file = "legacy_cgi-2.6.2-py3-none-any.whl", hash = "sha256:a7b83afb1baf6ebeb56522537c5943ef9813cf933f6715e88a803f7edbce0bff"}, {file = "legacy_cgi-2.6.2.tar.gz", hash = "sha256:9952471ceb304043b104c22d00b4f333cac27a6abe446d8a528fc437cf13c85f"}, @@ -425,6 +429,8 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, @@ -436,6 +442,7 @@ version = "1.29.0" description = "OpenTelemetry Python API" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "opentelemetry_api-1.29.0-py3-none-any.whl", hash = "sha256:5fcd94c4141cc49c736271f3e1efb777bebe9cc535759c54c936cca4f1b312b8"}, {file = "opentelemetry_api-1.29.0.tar.gz", hash = "sha256:d04a6cf78aad09614f52964ecb38021e248f5714dc32c2e0d8fd99517b4d69cf"}, @@ -451,6 +458,8 @@ version = "24.2" description = "Core utilities for Python packages" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -462,6 +471,8 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -473,22 +484,23 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "protobuf" -version = "5.29.3" +version = "5.29.5" description = "" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, - {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, - {file = "protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e"}, - {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84"}, - {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f"}, - {file = "protobuf-5.29.3-cp38-cp38-win32.whl", hash = "sha256:84a57163a0ccef3f96e4b6a20516cedcf5bb3a95a657131c5c3ac62200d23252"}, - {file = "protobuf-5.29.3-cp38-cp38-win_amd64.whl", hash = "sha256:b89c115d877892a512f79a8114564fb435943b59067615894c3b13cd3e1fa107"}, - {file = "protobuf-5.29.3-cp39-cp39-win32.whl", hash = "sha256:0eb32bfa5219fc8d4111803e9a690658aa2e6366384fd0851064b963b6d1f2a7"}, - {file = "protobuf-5.29.3-cp39-cp39-win_amd64.whl", hash = "sha256:6ce8cc3389a20693bfde6c6562e03474c40851b44975c9b2bf6df7d8c4f864da"}, - {file = "protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f"}, - {file = "protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620"}, + {file = "protobuf-5.29.5-cp310-abi3-win32.whl", hash = "sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079"}, + {file = "protobuf-5.29.5-cp310-abi3-win_amd64.whl", hash = "sha256:3f76e3a3675b4a4d867b52e4a5f5b78a2ef9565549d4037e06cf7b0942b1d3fc"}, + {file = "protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671"}, + {file = "protobuf-5.29.5-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:fa18533a299d7ab6c55a238bf8629311439995f2e7eca5caaff08663606e9015"}, + {file = "protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61"}, + {file = "protobuf-5.29.5-cp38-cp38-win32.whl", hash = "sha256:ef91363ad4faba7b25d844ef1ada59ff1604184c0bcd8b39b8a6bef15e1af238"}, + {file = "protobuf-5.29.5-cp38-cp38-win_amd64.whl", hash = "sha256:7318608d56b6402d2ea7704ff1e1e4597bee46d760e7e4dd42a3d45e24b87f2e"}, + {file = "protobuf-5.29.5-cp39-cp39-win32.whl", hash = "sha256:6f642dc9a61782fa72b90878af134c5afe1917c89a568cd3476d758d3c3a0736"}, + {file = "protobuf-5.29.5-cp39-cp39-win_amd64.whl", hash = "sha256:470f3af547ef17847a28e1f47200a1cbf0ba3ff57b7de50d22776607cd2ea353"}, + {file = "protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5"}, + {file = "protobuf-5.29.5.tar.gz", hash = "sha256:bc1463bafd4b0929216c35f437a8e28731a2b7fe3d98bb77a600efced5a15c84"}, ] [[package]] @@ -497,6 +509,8 @@ version = "9.0.0" description = "Get CPU info with pure Python" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, @@ -508,6 +522,8 @@ version = "2.9.1" description = "Python style guide checker" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, @@ -519,6 +535,8 @@ version = "2.5.0" description = "passive checker of Python programs" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, @@ -530,6 +548,8 @@ version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -552,6 +572,8 @@ version = "4.0.0" description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "pytest-benchmark-4.0.0.tar.gz", hash = "sha256:fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1"}, {file = "pytest_benchmark-4.0.0-py3-none-any.whl", hash = "sha256:fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6"}, @@ -572,6 +594,8 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -586,6 +610,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -601,29 +626,14 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "s3transfer" -version = "0.11.2" -description = "An Amazon S3 Transfer Manager" -optional = true -python-versions = ">=3.8" -files = [ - {file = "s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:be6ecb39fadd986ef1701097771f87e4d2f821f27f6071c872143884d2950fbc"}, - {file = "s3transfer-0.11.2.tar.gz", hash = "sha256:3b39185cb72f5acc77db1a58b6e25b977f28d20496b6e58d6813d75f464d632f"}, -] - -[package.dependencies] -botocore = ">=1.36.0,<2.0a.0" - -[package.extras] -crt = ["botocore[crt] (>=1.36.0,<2.0a.0)"] - [[package]] name = "six" version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +markers = "extra == \"dev\"" files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -635,6 +645,8 @@ version = "2.2.1" description = "A lil' TOML parser" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"dev\" and python_version <= \"3.10\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -676,6 +688,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -687,6 +700,7 @@ version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, @@ -774,14 +788,16 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] +markers = "python_version < \"3.10\"" files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, ] [package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +brotli = ["brotli (==1.0.9) ; os_name != \"nt\" and python_version < \"3\" and platform_python_implementation == \"CPython\"", "brotli (>=1.0.9) ; python_version >= \"3\" and platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; (os_name != \"nt\" or python_version >= \"3\") and platform_python_implementation != \"CPython\"", "brotlipy (>=0.6.0) ; os_name == \"nt\" and python_version < \"3\""] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress ; python_version == \"2.7\"", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -790,13 +806,15 @@ version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.10\"" files = [ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -807,6 +825,7 @@ version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -895,6 +914,7 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -906,23 +926,24 @@ version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] [extras] -dev = ["boto3", "flake8", "pytest", "pytest-benchmark", "requests"] +dev = ["botocore", "flake8", "pytest", "pytest-benchmark", "requests"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = ">=3.8.0,<4" -content-hash = "9128af5437fd535ec458c64280d8390574c632e704cace5ea783de3c5d453c8c" +content-hash = "f6a2f7355200da107aa5b027d6fe4fb6bdb5a898ce8298a56e6ac39fe8d8e34d" From f93bc0a88dff1cddb184938efddbb5289add21cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 16:02:16 -0400 Subject: [PATCH 038/164] chore(deps): bump brace-expansion in /tests/integration (#617) Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.11 to 1.1.12. - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12) --- updated-dependencies: - dependency-name: brace-expansion dependency-version: 1.1.12 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tests/integration/yarn.lock | 339 ++---------------------------------- 1 file changed, 16 insertions(+), 323 deletions(-) diff --git a/tests/integration/yarn.lock b/tests/integration/yarn.lock index f96feb522..37cb357d5 100644 --- a/tests/integration/yarn.lock +++ b/tests/integration/yarn.lock @@ -2,28 +2,6 @@ # yarn lockfile v1 -"@iarna/toml@^2.2.5": - version "2.2.5" - resolved "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz" - integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - "2-thenable@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/2-thenable/-/2-thenable-1.0.0.tgz" @@ -32,16 +10,16 @@ d "1" es5-ext "^0.10.47" +"@iarna/toml@^2.2.5": + version "2.2.5" + resolved "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz" + integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - ansi-styles@^4.0.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" @@ -49,37 +27,11 @@ ansi-styles@^4.0.0: dependencies: color-convert "^2.0.1" -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - appdirectory@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/appdirectory/-/appdirectory-0.1.0.tgz" integrity sha512-DJ5DV8vZXBbusyiyPlH28xppwS8eAMRuuyMo88xeEcf4bV64lbLtbxRxqixZuJBXsZzLtXFmA13GwVjJc7vdQw== -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axios-proxy-builder@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/axios-proxy-builder/-/axios-proxy-builder-0.1.2.tgz" - integrity sha512-6uBVsBZzkB3tCC8iyx59mCjQckhB8+GQrI9Cop8eC7ybIsvs/KtnNgEBfRMSEa7GqK2VBGUzgjNYMdPIfotyPA== - dependencies: - tunnel "^0.0.6" - -axios@^1.7.4: - version "1.7.9" - resolved "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz" - integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -91,20 +43,13 @@ bluebird@^3.7.2: integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - camelcase@^5.0.0: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" @@ -142,13 +87,6 @@ color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -170,16 +108,7 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0: - version "7.0.6" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -d@^1.0.1, d@^1.0.2, d@1: +d@1, d@^1.0.1, d@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/d/-/d-1.0.2.tgz" integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== @@ -192,11 +121,6 @@ decamelize@^1.2.0: resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - duration@^0.2.2: version "0.2.2" resolved "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz" @@ -205,21 +129,11 @@ duration@^0.2.2: d "1" es5-ext "~0.10.46" -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - es5-ext@^0.10.35, es5-ext@^0.10.47, es5-ext@^0.10.49, es5-ext@^0.10.53, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14, es5-ext@~0.10.46: version "0.10.64" resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz" @@ -280,28 +194,6 @@ find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - -foreground-child@^3.1.0: - version "3.3.0" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz" - integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -form-data@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz" - integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" @@ -329,31 +221,7 @@ glob-all@^3.3.1: glob "^7.2.3" yargs "^15.3.1" -glob@^10.3.7: - version "10.4.5" - resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.2.3: +glob@^7.1.3, glob@^7.2.3: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -383,7 +251,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.3, inherits@~2.0.3, inherits@2: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -437,15 +305,6 @@ isobject@^3.0.1: resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" @@ -507,23 +366,6 @@ log@^6.0.0: type "^2.7.3" uni-global "^1.0.0" -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - minimatch@^3.1.1: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -531,18 +373,6 @@ minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - next-tick@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" @@ -579,11 +409,6 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - pako@~1.0.2: version "1.0.11" resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" @@ -604,29 +429,11 @@ path-key@^2.0.1: resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - readable-stream@^3.0.0: version "3.6.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" @@ -666,23 +473,11 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@^5.0.5: - version "5.0.10" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz" - integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== - dependencies: - glob "^10.3.7" - safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -sax@>=0.6.0: - version "1.4.1" - resolved "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz" - integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== - semver@^5.5.0: version "5.7.2" resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" @@ -720,16 +515,6 @@ serverless-python-requirements@^6.1.1: sha256-file "1.0.0" shell-quote "^1.8.1" -serverless@>=2.32: - version "4.5.0" - resolved "https://registry.npmjs.org/serverless/-/serverless-4.5.0.tgz" - integrity sha512-msbs5I/fuPiW0ZfBuFA7lpKazCTFtF0AhOCA0HsrJBGVaOrNbwzlC/krZKXn1YgDR2+cw/izKRNupZJXtpyxJQ== - dependencies: - axios "^1.7.4" - axios-proxy-builder "^0.1.2" - rimraf "^5.0.5" - xml2js "0.6.2" - set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" @@ -760,33 +545,16 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - shell-quote@^1.8.1: version "1.8.2" resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz" integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - split2@^3.1.1: version "3.2.2" resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz" @@ -810,22 +578,6 @@ stream-promise@^3.2.0: es5-ext "^0.10.49" is-stream "^1.1.0" -string_decoder@^1.1.1, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -835,21 +587,12 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +string_decoder@^1.1.1, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: - ansi-regex "^5.0.1" + safe-buffer "~5.1.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" @@ -858,18 +601,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -tunnel@^0.0.6: - version "0.0.6" - resolved "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz" - integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== - type@^2.5.0, type@^2.7.2, type@^2.7.3: version "2.7.3" resolved "https://registry.npmjs.org/type/-/type-2.7.3.tgz" @@ -904,22 +635,6 @@ which@^1.2.9: dependencies: isexe "^2.0.0" -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" @@ -929,33 +644,11 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -xml2js@0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz" - integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - y18n@^4.0.0: version "4.0.3" resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" From 267a5429a99e85746537a1585608497a9d355fef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Jun 2025 23:51:26 -0400 Subject: [PATCH 039/164] chore(deps): bump requests from 2.32.3 to 2.32.4 (#615) --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 434f887c7..4c37bf871 100644 --- a/poetry.lock +++ b/poetry.lock @@ -606,19 +606,19 @@ six = ">=1.5" [[package]] name = "requests" -version = "2.32.3" +version = "2.32.4" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, + {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, + {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" +charset_normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" From b08b7635675826278170dbb570e2d9307ae02cf9 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Mon, 23 Jun 2025 12:46:01 -0400 Subject: [PATCH 040/164] release v6.111.0 (#625) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 9534f0c73..2bb1df7ff 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "6.110.0" +__version__ = "6.111.0" diff --git a/pyproject.toml b/pyproject.toml index ba5bcb176..1d5feb7fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "6.110.0" +version = "6.111.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 555ed5bd0635afe57c8bdfe4c09767effe24f855 Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Thu, 26 Jun 2025 09:54:10 +0200 Subject: [PATCH 041/164] feat: initial support for ASM inside the tracer (#621) * build: add back libddwaf in the layer * fix: ensure the start_ns of a function url inferred span is an int * feat(asm): enable Threat Detection inside AWS Lambda for HTTP events * test(asm): test parsing events for lambda * build: bump layer size check * fix(asm): work with non dictionary responses * fix(asm): add extra check + comment on listeners --- Dockerfile | 1 - datadog_lambda/asm.py | 174 +++++++++ datadog_lambda/config.py | 1 + datadog_lambda/tracing.py | 2 +- datadog_lambda/wrapper.py | 12 + scripts/check_layer_size.sh | 4 +- ...ation-load-balancer-mutivalue-headers.json | 31 ++ tests/test_asm.py | 329 ++++++++++++++++++ 8 files changed, 550 insertions(+), 4 deletions(-) create mode 100644 datadog_lambda/asm.py create mode 100644 tests/event_samples/application-load-balancer-mutivalue-headers.json create mode 100644 tests/test_asm.py diff --git a/Dockerfile b/Dockerfile index 0e79d884a..c58245287 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,6 @@ RUN pip install --no-cache-dir . -t ./python/lib/$runtime/site-packages RUN rm -rf ./python/lib/$runtime/site-packages/botocore* RUN rm -rf ./python/lib/$runtime/site-packages/setuptools RUN rm -rf ./python/lib/$runtime/site-packages/jsonschema/tests -RUN find . -name 'libddwaf.so' -delete RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_taint_tracking/*.so RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_stacktrace*.so RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/internal/datadog/profiling/libdd_wrapper*.so diff --git a/datadog_lambda/asm.py b/datadog_lambda/asm.py new file mode 100644 index 000000000..aab0f1e9d --- /dev/null +++ b/datadog_lambda/asm.py @@ -0,0 +1,174 @@ +from copy import deepcopy +import logging +from typing import Any, Dict, List, Optional, Union + +from ddtrace.contrib.internal.trace_utils import _get_request_header_client_ip +from ddtrace.internal import core +from ddtrace.trace import Span + +from datadog_lambda.trigger import ( + EventSubtypes, + EventTypes, + _EventSource, + _http_event_types, +) + +logger = logging.getLogger(__name__) + + +def _to_single_value_headers(headers: Dict[str, List[str]]) -> Dict[str, str]: + """ + Convert multi-value headers to single-value headers. + If a header has multiple values, join them with commas. + """ + single_value_headers = {} + for key, values in headers.items(): + single_value_headers[key] = ", ".join(values) + return single_value_headers + + +def _merge_single_and_multi_value_headers( + single_value_headers: Dict[str, str], + multi_value_headers: Dict[str, List[str]], +): + """ + Merge single-value headers with multi-value headers. + If a header exists in both, we merge them removing duplicates + """ + merged_headers = deepcopy(multi_value_headers) + for key, value in single_value_headers.items(): + if key not in merged_headers: + merged_headers[key] = [value] + elif value not in merged_headers[key]: + merged_headers[key].append(value) + return _to_single_value_headers(merged_headers) + + +def asm_start_request( + span: Span, + event: Dict[str, Any], + event_source: _EventSource, + trigger_tags: Dict[str, str], +): + if event_source.event_type not in _http_event_types: + return + + request_headers: Dict[str, str] = {} + peer_ip: Optional[str] = None + request_path_parameters: Optional[Dict[str, Any]] = None + route: Optional[str] = None + + if event_source.event_type == EventTypes.ALB: + headers = event.get("headers") + multi_value_request_headers = event.get("multiValueHeaders") + if multi_value_request_headers: + request_headers = _to_single_value_headers(multi_value_request_headers) + else: + request_headers = headers or {} + + raw_uri = event.get("path") + parsed_query = event.get("multiValueQueryStringParameters") or event.get( + "queryStringParameters" + ) + + elif event_source.event_type == EventTypes.LAMBDA_FUNCTION_URL: + request_headers = event.get("headers", {}) + peer_ip = event.get("requestContext", {}).get("http", {}).get("sourceIp") + raw_uri = event.get("rawPath") + parsed_query = event.get("queryStringParameters") + + elif event_source.event_type == EventTypes.API_GATEWAY: + request_context = event.get("requestContext", {}) + request_path_parameters = event.get("pathParameters") + route = trigger_tags.get("http.route") + + if event_source.subtype == EventSubtypes.API_GATEWAY: + request_headers = event.get("headers", {}) + peer_ip = request_context.get("identity", {}).get("sourceIp") + raw_uri = event.get("path") + parsed_query = event.get("multiValueQueryStringParameters") + + elif event_source.subtype == EventSubtypes.HTTP_API: + request_headers = event.get("headers", {}) + peer_ip = request_context.get("http", {}).get("sourceIp") + raw_uri = event.get("rawPath") + parsed_query = event.get("queryStringParameters") + + elif event_source.subtype == EventSubtypes.WEBSOCKET: + request_headers = _to_single_value_headers( + event.get("multiValueHeaders", {}) + ) + peer_ip = request_context.get("identity", {}).get("sourceIp") + raw_uri = event.get("path") + parsed_query = event.get("multiValueQueryStringParameters") + + else: + return + + else: + return + + body = event.get("body") + is_base64_encoded = event.get("isBase64Encoded", False) + + request_ip = _get_request_header_client_ip(request_headers, peer_ip, True) + if request_ip is not None: + span.set_tag_str("http.client_ip", request_ip) + span.set_tag_str("network.client.ip", request_ip) + + core.dispatch( + # The matching listener is registered in ddtrace.appsec._handlers + "aws_lambda.start_request", + ( + span, + request_headers, + request_ip, + body, + is_base64_encoded, + raw_uri, + route, + trigger_tags.get("http.method"), + parsed_query, + request_path_parameters, + ), + ) + + +def asm_start_response( + span: Span, + status_code: str, + event_source: _EventSource, + response: Union[Dict[str, Any], str, None], +): + if event_source.event_type not in _http_event_types: + return + + if isinstance(response, dict) and ( + "headers" in response or "multiValueHeaders" in response + ): + headers = response.get("headers", {}) + multi_value_request_headers = response.get("multiValueHeaders") + if isinstance(multi_value_request_headers, dict) and isinstance(headers, dict): + response_headers = _merge_single_and_multi_value_headers( + headers, multi_value_request_headers + ) + elif isinstance(headers, dict): + response_headers = headers + else: + response_headers = { + "content-type": "application/json", + } + else: + response_headers = { + "content-type": "application/json", + } + + core.dispatch( + # The matching listener is registered in ddtrace.appsec._handlers + "aws_lambda.start_response", + ( + span, + status_code, + response_headers, + ), + ) diff --git a/datadog_lambda/config.py b/datadog_lambda/config.py index 7a08d8a7f..aaa1af5e8 100644 --- a/datadog_lambda/config.py +++ b/datadog_lambda/config.py @@ -95,6 +95,7 @@ def _resolve_env(self, key, default=None, cast=None, depends_on_tracing=False): data_streams_enabled = _get_env( "DD_DATA_STREAMS_ENABLED", "false", as_bool, depends_on_tracing=True ) + appsec_enabled = _get_env("DD_APPSEC_ENABLED", "false", as_bool) is_gov_region = _get_env("AWS_REGION", "", lambda x: x.startswith("us-gov-")) diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index 3d5f671e8..89a4126bc 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -859,7 +859,7 @@ def create_inferred_span_from_lambda_function_url_event(event, context): InferredSpanInfo.set_tags(tags, tag_source="self", synchronicity="sync") if span: span.set_tags(tags) - span.start_ns = int(request_time_epoch) * 1e6 + span.start_ns = int(request_time_epoch * 1e6) return span diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 87063411e..29972bf43 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -9,6 +9,7 @@ from importlib import import_module from time import time_ns +from datadog_lambda.asm import asm_start_response, asm_start_request from datadog_lambda.dsm import set_dsm_context from datadog_lambda.extension import should_use_extension, flush_extension from datadog_lambda.cold_start import ( @@ -253,6 +254,8 @@ def _before(self, event, context): parent_span=self.inferred_span, span_pointers=calculate_span_pointers(event_source, event), ) + if config.appsec_enabled: + asm_start_request(self.span, event, event_source, self.trigger_tags) else: set_correlation_ids() if config.profiling_enabled and is_new_sandbox(): @@ -285,6 +288,15 @@ def _after(self, event, context): if status_code: self.span.set_tag("http.status_code", status_code) + + if config.appsec_enabled: + asm_start_response( + self.span, + status_code, + self.event_source, + response=self.response, + ) + self.span.finish() if self.inferred_span: diff --git a/scripts/check_layer_size.sh b/scripts/check_layer_size.sh index 90d5861b0..626f9d316 100755 --- a/scripts/check_layer_size.sh +++ b/scripts/check_layer_size.sh @@ -8,8 +8,8 @@ # Compares layer size to threshold, and fails if below that threshold set -e -MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 5 \* 1024) -MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 13 \* 1024) +MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 6 \* 1024) +MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 15 \* 1024) LAYER_FILES_PREFIX="datadog_lambda_py" diff --git a/tests/event_samples/application-load-balancer-mutivalue-headers.json b/tests/event_samples/application-load-balancer-mutivalue-headers.json new file mode 100644 index 000000000..6d446d15c --- /dev/null +++ b/tests/event_samples/application-load-balancer-mutivalue-headers.json @@ -0,0 +1,31 @@ +{ + "requestContext": { + "elb": { + "targetGroupArn": "arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/lambda-xyz/123abc" + } + }, + "httpMethod": "GET", + "path": "/lambda", + "queryStringParameters": { + "query": "1234ABCD" + }, + "multiValueHeaders": { + "accept": ["text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"], + "accept-encoding": ["gzip"], + "accept-language": ["en-US,en;q=0.9"], + "connection": ["keep-alive"], + "host": ["lambda-alb-123578498.us-east-2.elb.amazonaws.com"], + "upgrade-insecure-requests": ["1"], + "user-agent": ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"], + "x-amzn-trace-id": ["Root=1-5c536348-3d683b8b04734faae651f476"], + "x-forwarded-for": ["72.12.164.125"], + "x-forwarded-port": ["80"], + "x-forwarded-proto": ["http"], + "x-imforwards": ["20"], + "x-datadog-trace-id": ["12345"], + "x-datadog-parent-id": ["67890"], + "x-datadog-sampling-priority": ["2"] + }, + "body": "", + "isBase64Encoded": false +} diff --git a/tests/test_asm.py b/tests/test_asm.py new file mode 100644 index 000000000..e57c289fd --- /dev/null +++ b/tests/test_asm.py @@ -0,0 +1,329 @@ +import json +import pytest +from unittest.mock import MagicMock, patch + +from datadog_lambda.asm import asm_start_request, asm_start_response +from datadog_lambda.trigger import parse_event_source, extract_trigger_tags +from tests.utils import get_mock_context + +event_samples = "tests/event_samples/" + + +# Test cases for ASM start request +ASM_START_REQUEST_TEST_CASES = [ + ( + "application_load_balancer", + "application-load-balancer.json", + "72.12.164.125", + "/lambda", + "GET", + "", + False, + {"query": "1234ABCD"}, + None, + None, + ), + ( + "application_load_balancer_multivalue_headers", + "application-load-balancer-mutivalue-headers.json", + "72.12.164.125", + "/lambda", + "GET", + "", + False, + {"query": "1234ABCD"}, + None, + None, + ), + ( + "lambda_function_url", + "lambda-url.json", + "71.195.30.42", + "/", + "GET", + None, + False, + None, + None, + None, + ), + ( + "api_gateway", + "api-gateway.json", + "127.0.0.1", + "/path/to/resource", + "POST", + "eyJ0ZXN0IjoiYm9keSJ9", + True, + {"foo": ["bar"]}, + {"proxy": "/path/to/resource"}, + "/{proxy+}", + ), + ( + "api_gateway_v2_parametrized", + "api-gateway-v2-parametrized.json", + "76.115.124.192", + "/user/42", + "GET", + None, + False, + None, + {"id": "42"}, + "/user/{id}", + ), + ( + "api_gateway_websocket", + "api-gateway-websocket-default.json", + "38.122.226.210", + None, + None, + '"What\'s good in the hood?"', + False, + None, + None, + None, + ), +] + + +# Test cases for ASM start response +ASM_START_RESPONSE_TEST_CASES = [ + ( + "application_load_balancer", + "application-load-balancer.json", + { + "statusCode": 200, + "headers": {"Content-Type": "text/html"}, + }, + "200", + {"Content-Type": "text/html"}, + True, + ), + ( + "application_load_balancer_multivalue_headers", + "application-load-balancer-mutivalue-headers.json", + { + "statusCode": 404, + "multiValueHeaders": { + "Content-Type": ["text/plain"], + "X-Error": ["Not Found"], + }, + }, + "404", + { + "Content-Type": "text/plain", + "X-Error": "Not Found", + }, + True, + ), + ( + "lambda_function_url", + "lambda-url.json", + { + "statusCode": 201, + "headers": { + "Location": "/user/123", + "Content-Type": "application/json", + }, + }, + "201", + { + "Location": "/user/123", + "Content-Type": "application/json", + }, + True, + ), + ( + "api_gateway", + "api-gateway.json", + { + "statusCode": 200, + "headers": { + "Content-Type": "application/json", + "X-Custom-Header": "test-value", + }, + "body": '{"message": "success"}', + }, + "200", + { + "Content-Type": "application/json", + "X-Custom-Header": "test-value", + }, + True, + ), + ( + "api_gateway_v2_parametrized", + "api-gateway-v2-parametrized.json", + { + "statusCode": 200, + "headers": {"Content-Type": "application/json"}, + }, + "200", + {"Content-Type": "application/json"}, + True, + ), + ( + "api_gateway_websocket", + "api-gateway-websocket-default.json", + { + "statusCode": 200, + "headers": {"Content-Type": "text/plain"}, + }, + "200", + {"Content-Type": "text/plain"}, + True, + ), + ( + "non_http_event_s3", + "s3.json", + {"statusCode": 200}, + "200", + {}, + False, # Should not dispatch for non-HTTP events + ), + ( + "api_gateway_v2_string_response", + "api-gateway-v2-parametrized.json", + "Hello, World!", + "200", + {"content-type": "application/json"}, + True, + ), + ( + "api_gateway_v2_dict_response", + "api-gateway-v2-parametrized.json", + {"message": "Hello, World!"}, + "200", + {"content-type": "application/json"}, + True, + ), +] + + +@pytest.mark.parametrize( + "name,file,expected_ip,expected_uri,expected_method,expected_body,expected_base64,expected_query,expected_path_params,expected_route", + ASM_START_REQUEST_TEST_CASES, +) +@patch("datadog_lambda.asm.core") +def test_asm_start_request_parametrized( + mock_core, + name, + file, + expected_ip, + expected_uri, + expected_method, + expected_body, + expected_base64, + expected_query, + expected_path_params, + expected_route, +): + """Test ASM start request for various HTTP event types using parametrization""" + mock_span = MagicMock() + ctx = get_mock_context() + + # Reset mock for each test + mock_core.reset_mock() + mock_span.reset_mock() + + test_file = event_samples + file + with open(test_file, "r") as f: + event = json.load(f) + + event_source = parse_event_source(event) + trigger_tags = extract_trigger_tags(event, ctx) + + asm_start_request(mock_span, event, event_source, trigger_tags) + + # Verify core.dispatch was called + mock_core.dispatch.assert_called_once() + call_args = mock_core.dispatch.call_args + dispatch_args = call_args[0][1] + ( + span, + request_headers, + request_ip, + body, + is_base64_encoded, + raw_uri, + http_route, + http_method, + parsed_query, + request_path_parameters, + ) = dispatch_args + + # Common assertions + assert span == mock_span + assert isinstance(request_headers, dict) + + # Specific assertions based on test case + assert request_ip == expected_ip + assert raw_uri == expected_uri + assert http_method == expected_method + assert body == expected_body + assert is_base64_encoded == expected_base64 + + if expected_query is not None: + assert parsed_query == expected_query + else: + assert parsed_query is None + + if expected_path_params is not None: + assert request_path_parameters == expected_path_params + else: + assert request_path_parameters is None + + # Check route is correctly extracted and passed + assert http_route == expected_route + + # Check IP tags were set if IP is present + if expected_ip: + mock_span.set_tag_str.assert_any_call("http.client_ip", expected_ip) + mock_span.set_tag_str.assert_any_call("network.client.ip", expected_ip) + + +@pytest.mark.parametrize( + "name,event_file,response,status_code,expected_headers,should_dispatch", + ASM_START_RESPONSE_TEST_CASES, +) +@patch("datadog_lambda.asm.core") +def test_asm_start_response_parametrized( + mock_core, + name, + event_file, + response, + status_code, + expected_headers, + should_dispatch, +): + """Test ASM start response for various HTTP event types using parametrization""" + mock_span = MagicMock() + + # Reset mock for each test + mock_core.reset_mock() + mock_span.reset_mock() + + test_file = event_samples + event_file + with open(test_file, "r") as f: + event = json.load(f) + + event_source = parse_event_source(event) + + asm_start_response(mock_span, status_code, event_source, response) + + if should_dispatch: + # Verify core.dispatch was called + mock_core.dispatch.assert_called_once() + call_args = mock_core.dispatch.call_args + assert call_args[0][0] == "aws_lambda.start_response" + + # Extract the dispatched arguments + dispatch_args = call_args[0][1] + span, response_status_code, response_headers = dispatch_args + + assert span == mock_span + assert response_status_code == status_code + assert response_headers == expected_headers + else: + # Verify core.dispatch was not called for non-HTTP events + mock_core.dispatch.assert_not_called() From 495c7704cbace47bc7b6ad87756f9c2857f1dc7c Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Thu, 26 Jun 2025 12:16:07 -0400 Subject: [PATCH 042/164] bugfix: error metrics should be sent during exception handling (#626) Signed-off-by: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> --- datadog_lambda/wrapper.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 29972bf43..98a1e87e3 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -166,10 +166,9 @@ def __call__(self, event, context, **kwargs): self.response = self.func(event, context, **kwargs) return self.response except Exception: - if not should_use_extension: - from datadog_lambda.metric import submit_errors_metric + from datadog_lambda.metric import submit_errors_metric - submit_errors_metric(context) + submit_errors_metric(context) if self.span: self.span.set_traceback() From d72ebaaa960f48d06ba199dd69bef954bf535f92 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Mon, 30 Jun 2025 14:33:24 -0700 Subject: [PATCH 043/164] fix: call `patch_all` before importing handler code. (#598) * Call `patch_all` before importing handler code. * Remove tests for patch_all. * Move patch_all to init. * Update integration tests. --- datadog_lambda/__init__.py | 7 ++ datadog_lambda/wrapper.py | 3 - .../logs/async-metrics_python310.log | 90 ++++++++------ .../logs/async-metrics_python311.log | 90 ++++++++------ .../logs/async-metrics_python312.log | 90 ++++++++------ .../logs/async-metrics_python313.log | 90 ++++++++------ .../snapshots/logs/async-metrics_python38.log | 90 ++++++++------ .../snapshots/logs/async-metrics_python39.log | 90 ++++++++------ .../snapshots/logs/sync-metrics_python310.log | 117 +++++++++++------- .../snapshots/logs/sync-metrics_python311.log | 117 +++++++++++------- .../snapshots/logs/sync-metrics_python312.log | 117 +++++++++++------- .../snapshots/logs/sync-metrics_python313.log | 117 +++++++++++------- .../snapshots/logs/sync-metrics_python38.log | 117 +++++++++++------- .../snapshots/logs/sync-metrics_python39.log | 117 +++++++++++------- tests/test_wrapper.py | 6 - 15 files changed, 763 insertions(+), 495 deletions(-) diff --git a/datadog_lambda/__init__.py b/datadog_lambda/__init__.py index 378fd15c8..f319d2ed8 100644 --- a/datadog_lambda/__init__.py +++ b/datadog_lambda/__init__.py @@ -17,3 +17,10 @@ initialize_logging(__name__) + + +from datadog_lambda.patch import patch_all # noqa: E402 + +# Patch third-party libraries for tracing, must be done before importing any +# handler code. +patch_all() diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 98a1e87e3..c7474f659 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -26,7 +26,6 @@ Headers, ) from datadog_lambda.module_name import modify_module_name -from datadog_lambda.patch import patch_all from datadog_lambda.span_pointers import calculate_span_pointers from datadog_lambda.tag_object import tag_object from datadog_lambda.tracing import ( @@ -143,8 +142,6 @@ def __init__(self, func): os.environ[DD_REQUESTS_SERVICE_NAME] = os.environ.get( DD_SERVICE, "aws.lambda" ) - # Patch third-party libraries for tracing - patch_all() # Enable LLM Observability if config.llmobs_enabled: diff --git a/tests/integration/snapshots/logs/async-metrics_python310.log b/tests/integration/snapshots/logs/async-metrics_python310.log index 0bd7237c9..bda234df4 100644 --- a/tests/integration/snapshots/logs/async-metrics_python310.log +++ b/tests/integration/snapshots/logs/async-metrics_python310.log @@ -119,7 +119,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -133,7 +133,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -145,7 +146,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -160,7 +161,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -326,7 +328,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -340,7 +342,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -352,7 +355,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -367,7 +370,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -485,7 +489,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -499,7 +503,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -511,7 +516,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -526,7 +531,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -660,7 +666,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -674,7 +680,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -686,7 +693,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -701,7 +708,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -826,7 +834,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -840,7 +848,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -852,7 +861,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -867,7 +876,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1001,7 +1011,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1015,7 +1025,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1027,7 +1038,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1042,7 +1053,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1165,7 +1177,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1179,7 +1191,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1191,7 +1204,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1206,7 +1219,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1328,7 +1342,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1342,7 +1356,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1354,7 +1369,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1369,7 +1384,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1499,7 +1515,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1513,7 +1529,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1525,7 +1542,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1540,7 +1557,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 diff --git a/tests/integration/snapshots/logs/async-metrics_python311.log b/tests/integration/snapshots/logs/async-metrics_python311.log index 8550a0623..fd318de30 100644 --- a/tests/integration/snapshots/logs/async-metrics_python311.log +++ b/tests/integration/snapshots/logs/async-metrics_python311.log @@ -119,7 +119,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -133,7 +133,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -145,7 +146,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -160,7 +161,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -326,7 +328,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -340,7 +342,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -352,7 +355,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -367,7 +370,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -485,7 +489,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -499,7 +503,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -511,7 +516,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -526,7 +531,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -660,7 +666,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -674,7 +680,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -686,7 +693,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -701,7 +708,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -826,7 +834,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -840,7 +848,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -852,7 +861,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -867,7 +876,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1001,7 +1011,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1015,7 +1025,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1027,7 +1038,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1042,7 +1053,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1165,7 +1177,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1179,7 +1191,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1191,7 +1204,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1206,7 +1219,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1328,7 +1342,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1342,7 +1356,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1354,7 +1369,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1369,7 +1384,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1499,7 +1515,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1513,7 +1529,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1525,7 +1542,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1540,7 +1557,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 diff --git a/tests/integration/snapshots/logs/async-metrics_python312.log b/tests/integration/snapshots/logs/async-metrics_python312.log index 57c318abf..b51b6a2d9 100644 --- a/tests/integration/snapshots/logs/async-metrics_python312.log +++ b/tests/integration/snapshots/logs/async-metrics_python312.log @@ -119,7 +119,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -133,7 +133,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -145,7 +146,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -160,7 +161,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -326,7 +328,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -340,7 +342,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -352,7 +355,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -367,7 +370,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -485,7 +489,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -499,7 +503,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -511,7 +516,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -526,7 +531,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -660,7 +666,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -674,7 +680,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -686,7 +693,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -701,7 +708,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -826,7 +834,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -840,7 +848,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -852,7 +861,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -867,7 +876,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1001,7 +1011,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1015,7 +1025,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1027,7 +1038,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1042,7 +1053,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1165,7 +1177,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1179,7 +1191,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1191,7 +1204,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1206,7 +1219,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1328,7 +1342,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1342,7 +1356,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1354,7 +1369,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1369,7 +1384,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1499,7 +1515,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1513,7 +1529,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1525,7 +1542,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1540,7 +1557,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 diff --git a/tests/integration/snapshots/logs/async-metrics_python313.log b/tests/integration/snapshots/logs/async-metrics_python313.log index 9204499bd..89b73e922 100644 --- a/tests/integration/snapshots/logs/async-metrics_python313.log +++ b/tests/integration/snapshots/logs/async-metrics_python313.log @@ -119,7 +119,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -133,7 +133,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -145,7 +146,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -160,7 +161,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -326,7 +328,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -340,7 +342,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -352,7 +355,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -367,7 +370,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -485,7 +489,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -499,7 +503,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -511,7 +516,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -526,7 +531,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -660,7 +666,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -674,7 +680,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -686,7 +693,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -701,7 +708,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -826,7 +834,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -840,7 +848,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -852,7 +861,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -867,7 +876,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1001,7 +1011,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1015,7 +1025,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1027,7 +1038,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1042,7 +1053,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1165,7 +1177,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1179,7 +1191,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1191,7 +1204,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1206,7 +1219,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1328,7 +1342,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1342,7 +1356,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1354,7 +1369,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1369,7 +1384,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1499,7 +1515,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1513,7 +1529,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1525,7 +1542,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1540,7 +1557,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 diff --git a/tests/integration/snapshots/logs/async-metrics_python38.log b/tests/integration/snapshots/logs/async-metrics_python38.log index e6df054c3..ff5e5a60c 100644 --- a/tests/integration/snapshots/logs/async-metrics_python38.log +++ b/tests/integration/snapshots/logs/async-metrics_python38.log @@ -119,7 +119,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -133,7 +133,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -145,7 +146,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -160,7 +161,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -326,7 +328,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -340,7 +342,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -352,7 +355,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -367,7 +370,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -485,7 +489,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -499,7 +503,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -511,7 +516,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -526,7 +531,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -660,7 +666,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -674,7 +680,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -686,7 +693,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -701,7 +708,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -826,7 +834,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -840,7 +848,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -852,7 +861,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -867,7 +876,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1001,7 +1011,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1015,7 +1025,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1027,7 +1038,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1042,7 +1053,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1165,7 +1177,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1179,7 +1191,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1191,7 +1204,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1206,7 +1219,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1328,7 +1342,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1342,7 +1356,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1354,7 +1369,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1369,7 +1384,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1499,7 +1515,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1513,7 +1529,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1525,7 +1542,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1540,7 +1557,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 diff --git a/tests/integration/snapshots/logs/async-metrics_python39.log b/tests/integration/snapshots/logs/async-metrics_python39.log index 9bcb7a859..5e3d46b66 100644 --- a/tests/integration/snapshots/logs/async-metrics_python39.log +++ b/tests/integration/snapshots/logs/async-metrics_python39.log @@ -119,7 +119,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -133,7 +133,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -145,7 +146,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -160,7 +161,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -326,7 +328,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -340,7 +342,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -352,7 +355,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -367,7 +370,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -485,7 +489,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -499,7 +503,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -511,7 +516,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -526,7 +531,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -660,7 +666,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -674,7 +680,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -686,7 +693,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -701,7 +708,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -826,7 +834,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -840,7 +848,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -852,7 +861,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -867,7 +876,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1001,7 +1011,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1015,7 +1025,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1027,7 +1038,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1042,7 +1053,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1165,7 +1177,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1179,7 +1191,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1191,7 +1204,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1206,7 +1219,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1328,7 +1342,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1342,7 +1356,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1354,7 +1369,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1369,7 +1384,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1499,7 +1515,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1513,7 +1529,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1525,7 +1542,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1540,7 +1557,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index 40562a6d0..215698312 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -99,7 +99,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -113,7 +113,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -125,7 +126,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -140,7 +141,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -158,7 +160,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -174,6 +176,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -325,7 +328,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -339,7 +342,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -351,7 +355,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -366,7 +370,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -384,7 +389,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -400,6 +405,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -503,7 +509,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -517,7 +523,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -529,7 +536,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -544,7 +551,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -562,7 +570,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -578,6 +586,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -697,7 +706,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -711,7 +720,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -723,7 +733,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -738,7 +748,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -756,7 +767,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -772,6 +783,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -882,7 +894,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -896,7 +908,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -908,7 +921,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -923,7 +936,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -941,7 +955,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -957,6 +971,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1076,7 +1091,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1090,7 +1105,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1102,7 +1118,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1117,7 +1133,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1135,7 +1152,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1151,6 +1168,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1259,7 +1277,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1273,7 +1291,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1285,7 +1304,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1300,7 +1319,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1318,7 +1338,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1334,6 +1354,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1441,7 +1462,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1455,7 +1476,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1467,7 +1489,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1482,7 +1504,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1500,7 +1523,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1516,6 +1539,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1631,7 +1655,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1645,7 +1669,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1657,7 +1682,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1672,7 +1697,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1690,7 +1716,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1706,6 +1732,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index 52ec4c85a..5fcd504d6 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -99,7 +99,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -113,7 +113,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -125,7 +126,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -140,7 +141,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -158,7 +160,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -174,6 +176,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -325,7 +328,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -339,7 +342,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -351,7 +355,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -366,7 +370,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -384,7 +389,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -400,6 +405,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -503,7 +509,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -517,7 +523,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -529,7 +536,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -544,7 +551,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -562,7 +570,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -578,6 +586,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -697,7 +706,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -711,7 +720,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -723,7 +733,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -738,7 +748,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -756,7 +767,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -772,6 +783,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -882,7 +894,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -896,7 +908,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -908,7 +921,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -923,7 +936,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -941,7 +955,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -957,6 +971,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1076,7 +1091,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1090,7 +1105,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1102,7 +1118,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1117,7 +1133,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1135,7 +1152,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1151,6 +1168,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1259,7 +1277,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1273,7 +1291,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1285,7 +1304,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1300,7 +1319,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1318,7 +1338,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1334,6 +1354,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1441,7 +1462,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1455,7 +1476,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1467,7 +1489,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1482,7 +1504,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1500,7 +1523,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1516,6 +1539,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1631,7 +1655,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1645,7 +1669,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1657,7 +1682,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1672,7 +1697,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1690,7 +1716,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1706,6 +1732,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index 3ec0f01f7..9a05404ce 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -99,7 +99,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -113,7 +113,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -125,7 +126,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -140,7 +141,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -158,7 +160,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -174,6 +176,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -325,7 +328,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -339,7 +342,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -351,7 +355,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -366,7 +370,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -384,7 +389,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -400,6 +405,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -503,7 +509,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -517,7 +523,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -529,7 +536,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -544,7 +551,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -562,7 +570,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -578,6 +586,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -697,7 +706,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -711,7 +720,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -723,7 +733,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -738,7 +748,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -756,7 +767,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -772,6 +783,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -882,7 +894,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -896,7 +908,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -908,7 +921,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -923,7 +936,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -941,7 +955,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -957,6 +971,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1076,7 +1091,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1090,7 +1105,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1102,7 +1118,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1117,7 +1133,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1135,7 +1152,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1151,6 +1168,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1259,7 +1277,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1273,7 +1291,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1285,7 +1304,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1300,7 +1319,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1318,7 +1338,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1334,6 +1354,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1441,7 +1462,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1455,7 +1476,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1467,7 +1489,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1482,7 +1504,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1500,7 +1523,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1516,6 +1539,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1631,7 +1655,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1645,7 +1669,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1657,7 +1682,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1672,7 +1697,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1690,7 +1716,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1706,6 +1732,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index d2c20dc04..5d17bed58 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -99,7 +99,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -113,7 +113,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -125,7 +126,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -140,7 +141,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -158,7 +160,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -174,6 +176,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -325,7 +328,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -339,7 +342,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -351,7 +355,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -366,7 +370,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -384,7 +389,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -400,6 +405,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -503,7 +509,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -517,7 +523,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -529,7 +536,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -544,7 +551,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -562,7 +570,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -578,6 +586,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -697,7 +706,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -711,7 +720,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -723,7 +733,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -738,7 +748,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -756,7 +767,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -772,6 +783,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -882,7 +894,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -896,7 +908,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -908,7 +921,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -923,7 +936,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -941,7 +955,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -957,6 +971,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1076,7 +1091,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1090,7 +1105,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1102,7 +1118,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1117,7 +1133,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1135,7 +1152,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1151,6 +1168,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1259,7 +1277,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1273,7 +1291,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1285,7 +1304,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1300,7 +1319,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1318,7 +1338,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1334,6 +1354,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1441,7 +1462,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1455,7 +1476,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1467,7 +1489,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1482,7 +1504,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1500,7 +1523,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1516,6 +1539,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1631,7 +1655,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1645,7 +1669,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1657,7 +1682,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1672,7 +1697,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1690,7 +1716,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1706,6 +1732,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" diff --git a/tests/integration/snapshots/logs/sync-metrics_python38.log b/tests/integration/snapshots/logs/sync-metrics_python38.log index 57a354a6d..37ed391e3 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python38.log +++ b/tests/integration/snapshots/logs/sync-metrics_python38.log @@ -99,7 +99,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -113,7 +113,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -125,7 +126,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -140,7 +141,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -158,7 +160,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -174,6 +176,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -325,7 +328,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -339,7 +342,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -351,7 +355,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -366,7 +370,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -384,7 +389,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -400,6 +405,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -503,7 +509,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -517,7 +523,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -529,7 +536,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -544,7 +551,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -562,7 +570,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -578,6 +586,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -697,7 +706,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -711,7 +720,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -723,7 +733,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -738,7 +748,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -756,7 +767,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -772,6 +783,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -882,7 +894,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -896,7 +908,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -908,7 +921,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -923,7 +936,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -941,7 +955,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -957,6 +971,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1076,7 +1091,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1090,7 +1105,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1102,7 +1118,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1117,7 +1133,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1135,7 +1152,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1151,6 +1168,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1259,7 +1277,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1273,7 +1291,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1285,7 +1304,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1300,7 +1319,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1318,7 +1338,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1334,6 +1354,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1441,7 +1462,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1455,7 +1476,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1467,7 +1489,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1482,7 +1504,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1500,7 +1523,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1516,6 +1539,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1631,7 +1655,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1645,7 +1669,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1657,7 +1682,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1672,7 +1697,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1690,7 +1716,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1706,6 +1732,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" diff --git a/tests/integration/snapshots/logs/sync-metrics_python39.log b/tests/integration/snapshots/logs/sync-metrics_python39.log index 8b7bb31b4..f147744b7 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python39.log +++ b/tests/integration/snapshots/logs/sync-metrics_python39.log @@ -99,7 +99,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -113,7 +113,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -125,7 +126,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -140,7 +141,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -158,7 +160,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -174,6 +176,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -325,7 +328,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -339,7 +342,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -351,7 +355,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -366,7 +370,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -384,7 +389,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -400,6 +405,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -503,7 +509,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -517,7 +523,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -529,7 +536,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -544,7 +551,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -562,7 +570,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -578,6 +586,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -697,7 +706,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -711,7 +720,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -723,7 +733,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -738,7 +748,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -756,7 +767,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -772,6 +783,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -882,7 +894,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -896,7 +908,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -908,7 +921,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -923,7 +936,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -941,7 +955,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -957,6 +971,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1076,7 +1091,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1090,7 +1105,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1102,7 +1118,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1117,7 +1133,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1135,7 +1152,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1151,6 +1168,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1259,7 +1277,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1273,7 +1291,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1285,7 +1304,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1300,7 +1319,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1318,7 +1338,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1334,6 +1354,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1441,7 +1462,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1455,7 +1476,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1467,7 +1489,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1482,7 +1504,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1500,7 +1523,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1516,6 +1539,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1631,7 +1655,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1645,7 +1669,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1, @@ -1657,7 +1682,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "GET /", "name": "requests.request", "error": 0, @@ -1672,7 +1697,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X" + "http.useragent": "python-requests/X.X.X", + "_dd.base_service": "integration-tests-python" }, "metrics": { "_dd.measured": 1 @@ -1690,7 +1716,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "integration-tests-python", + "service": "requests", "resource": "POST /api/v1/distribution_points", "name": "requests.request", "error": 0, @@ -1706,6 +1732,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index f0240905a..09f48c8aa 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -45,10 +45,6 @@ def setUp(self): self.mock_inject_correlation_ids = patcher.start() self.addCleanup(patcher.stop) - patcher = patch("datadog_lambda.wrapper.patch_all") - self.mock_patch_all = patcher.start() - self.addCleanup(patcher.stop) - patcher = patch("datadog_lambda.tags.get_cold_start_tag") self.mock_get_cold_start_tag = patcher.start() self.mock_get_cold_start_tag.return_value = "cold_start:true" @@ -117,7 +113,6 @@ def lambda_handler(event, context): ) self.mock_set_correlation_ids.assert_called() self.mock_inject_correlation_ids.assert_called() - self.mock_patch_all.assert_called() def test_datadog_lambda_wrapper_flush_to_log(self): os.environ["DD_FLUSH_TO_LOG"] = "True" @@ -487,7 +482,6 @@ def lambda_handler(event, context): lambda_handler_double_wrapped(lambda_event, get_mock_context()) - self.mock_patch_all.assert_called_once() self.mock_submit_invocations_metric.assert_called_once() def test_dd_requests_service_name_default(self): From ae7df53a7c92a6e64c982f5bbe30ed890dc3d1ff Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Fri, 4 Jul 2025 09:10:24 +0200 Subject: [PATCH 044/164] feat(appsec): skip processing spans for events that are not http requests (#627) --- datadog_lambda/asm.py | 10 ++++++++++ datadog_lambda/wrapper.py | 6 +++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/datadog_lambda/asm.py b/datadog_lambda/asm.py index aab0f1e9d..9636760c3 100644 --- a/datadog_lambda/asm.py +++ b/datadog_lambda/asm.py @@ -44,6 +44,16 @@ def _merge_single_and_multi_value_headers( return _to_single_value_headers(merged_headers) +def asm_set_context(event_source: _EventSource): + """Add asm specific items to the ExecutionContext. + + This allows the AppSecSpanProcessor to know information about the event + at the moment the span is created and skip it when not relevant. + """ + if event_source.event_type not in _http_event_types: + core.set_item("appsec_skip_next_lambda_event", True) + + def asm_start_request( span: Span, event: Dict[str, Any], diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index c7474f659..7abe0fc1e 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -9,7 +9,7 @@ from importlib import import_module from time import time_ns -from datadog_lambda.asm import asm_start_response, asm_start_request +from datadog_lambda.asm import asm_set_context, asm_start_response, asm_start_request from datadog_lambda.dsm import set_dsm_context from datadog_lambda.extension import should_use_extension, flush_extension from datadog_lambda.cold_start import ( @@ -239,6 +239,10 @@ def _before(self, event, context): ) if config.data_streams_enabled: set_dsm_context(event, event_source) + + if config.appsec_enabled: + asm_set_context(event_source) + self.span = create_function_execution_span( context=context, function_name=config.function_name, From d2a195e3b4d1dfe7af125837d54f9d50acb20376 Mon Sep 17 00:00:00 2001 From: michael-zhao459 Date: Wed, 9 Jul 2025 17:31:48 -0400 Subject: [PATCH 045/164] feat: lambda support for DSM (#622) * removed current dsm implementation * new dsm lambda implementation * check env variable in proper way * add tests * add more detailed comment to function * fixed lint for tests * remove not needed tests * fix * error handling * fix * some fixes * renamed to extract_context_with_datastreams * changed to explicit check of dsm context * move dsm tests to test_tracing.py * add wanted tests * caught sns -> sqs bug * revert back to original tracing.py implementation * fix lint * revert spacing stuff to original * remove unneccessary checks, still set checkpoints even when dsm context fails to be propagated * remove not needed comment * fixes * lambda functions not allowed by lint * use lambda function, add checks before checkpoint * remove unneccesary import * move if statement with least work first * changed function name to original, arn exception handle w test, return None instead of {} * some fixes * remove comments that are not needed * fix * fix * extra check * remove unneccesary work associated with event_source * fix lint * add tests for empty arn logic * more descriptive name * fix lint * fix * moved arn check to checkpoint, remove comments, add variable dec * kinesis fix, tests fix * remove not needed test * formatting fix * made tests clearer and more comprehensive * fix * made comments more obvious on point of tests * update toml file * edit build make more sense * made sure tests match with table * fix * removed not needed comments * addc comment * add some more kinesis tests * add logger check in exception test cases * fix comment * fix * updated tests to use inner checkpoint check, keep build at <4 * fix * change to 3.10.2 --- datadog_lambda/dsm.py | 38 -- datadog_lambda/tracing.py | 50 +- datadog_lambda/wrapper.py | 3 - pyproject.toml | 2 +- tests/test_dsm.py | 112 ----- tests/test_tracing.py | 932 +++++++++++++++++++++++++++++++++++++- tests/test_wrapper.py | 60 --- 7 files changed, 976 insertions(+), 221 deletions(-) delete mode 100644 datadog_lambda/dsm.py delete mode 100644 tests/test_dsm.py diff --git a/datadog_lambda/dsm.py b/datadog_lambda/dsm.py deleted file mode 100644 index 427f5e479..000000000 --- a/datadog_lambda/dsm.py +++ /dev/null @@ -1,38 +0,0 @@ -from datadog_lambda import logger -from datadog_lambda.trigger import EventTypes - - -def set_dsm_context(event, event_source): - - if event_source.equals(EventTypes.SQS): - _dsm_set_sqs_context(event) - - -def _dsm_set_sqs_context(event): - from datadog_lambda.wrapper import format_err_with_traceback - from ddtrace.internal.datastreams import data_streams_processor - from ddtrace.internal.datastreams.processor import DsmPathwayCodec - from ddtrace.internal.datastreams.botocore import ( - get_datastreams_context, - calculate_sqs_payload_size, - ) - - records = event.get("Records") - if records is None: - return - processor = data_streams_processor() - - for record in records: - try: - queue_arn = record.get("eventSourceARN", "") - - contextjson = get_datastreams_context(record) - payload_size = calculate_sqs_payload_size(record) - - ctx = DsmPathwayCodec.decode(contextjson, processor) - ctx.set_checkpoint( - ["direction:in", f"topic:{queue_arn}", "type:sqs"], - payload_size=payload_size, - ) - except Exception as e: - logger.error(format_err_with_traceback(e)) diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index 89a4126bc..f40574804 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -67,6 +67,24 @@ LOWER_64_BITS = "LOWER_64_BITS" +def _dsm_set_checkpoint(context_json, event_type, arn): + if not config.data_streams_enabled: + return + + if not arn: + return + + try: + from ddtrace.data_streams import set_consume_checkpoint + + carrier_get = lambda k: context_json and context_json.get(k) # noqa: E731 + set_consume_checkpoint(event_type, arn, carrier_get, manual_checkpoint=False) + except Exception as e: + logger.debug( + f"DSM:Failed to set consume checkpoint for {event_type} {arn}: {e}" + ) + + def _convert_xray_trace_id(xray_trace_id): """ Convert X-Ray trace id (hex)'s last 63 bits to a Datadog trace id (int). @@ -202,7 +220,9 @@ def create_sns_event(message): } -def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context): +def extract_context_from_sqs_or_sns_event_or_context( + event, lambda_context, event_source +): """ Extract Datadog trace context from an SQS event. @@ -214,7 +234,10 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context): Lambda Context. Falls back to lambda context if no trace data is found in the SQS message attributes. + Set a DSM checkpoint if DSM is enabled and the method for context propagation is supported. """ + source_arn = "" + event_type = "sqs" if event_source.equals(EventTypes.SQS) else "sns" # EventBridge => SQS try: @@ -226,6 +249,7 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context): try: first_record = event.get("Records")[0] + source_arn = first_record.get("eventSourceARN", "") # logic to deal with SNS => SQS event if "body" in first_record: @@ -241,6 +265,9 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context): msg_attributes = first_record.get("messageAttributes") if msg_attributes is None: sns_record = first_record.get("Sns") or {} + # SNS->SQS event would extract SNS arn without this check + if event_source.equals(EventTypes.SNS): + source_arn = sns_record.get("TopicArn", "") msg_attributes = sns_record.get("MessageAttributes") or {} dd_payload = msg_attributes.get("_datadog") if dd_payload: @@ -272,8 +299,9 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context): logger.debug( "Failed to extract Step Functions context from SQS/SNS event." ) - - return propagator.extract(dd_data) + context = propagator.extract(dd_data) + _dsm_set_checkpoint(dd_data, event_type, source_arn) + return context else: # Handle case where trace context is injected into attributes.AWSTraceHeader # example: Root=1-654321ab-000000001234567890abcdef;Parent=0123456789abcdef;Sampled=1 @@ -296,9 +324,13 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context): span_id=int(x_ray_context["parent_id"], 16), sampling_priority=float(x_ray_context["sampled"]), ) + # Still want to set a DSM checkpoint even if DSM context not propagated + _dsm_set_checkpoint(None, event_type, source_arn) return extract_context_from_lambda_context(lambda_context) except Exception as e: logger.debug("The trace extractor returned with error %s", e) + # Still want to set a DSM checkpoint even if DSM context not propagated + _dsm_set_checkpoint(None, event_type, source_arn) return extract_context_from_lambda_context(lambda_context) @@ -357,9 +389,12 @@ def extract_context_from_eventbridge_event(event, lambda_context): def extract_context_from_kinesis_event(event, lambda_context): """ Extract datadog trace context from a Kinesis Stream's base64 encoded data string + Set a DSM checkpoint if DSM is enabled and the method for context propagation is supported. """ + source_arn = "" try: record = get_first_record(event) + source_arn = record.get("eventSourceARN", "") kinesis = record.get("kinesis") if not kinesis: return extract_context_from_lambda_context(lambda_context) @@ -373,10 +408,13 @@ def extract_context_from_kinesis_event(event, lambda_context): data_obj = json.loads(data_str) dd_ctx = data_obj.get("_datadog") if dd_ctx: - return propagator.extract(dd_ctx) + context = propagator.extract(dd_ctx) + _dsm_set_checkpoint(dd_ctx, "kinesis", source_arn) + return context except Exception as e: logger.debug("The trace extractor returned with error %s", e) - + # Still want to set a DSM checkpoint even if DSM context not propagated + _dsm_set_checkpoint(None, "kinesis", source_arn) return extract_context_from_lambda_context(lambda_context) @@ -594,7 +632,7 @@ def extract_dd_trace_context( ) elif event_source.equals(EventTypes.SNS) or event_source.equals(EventTypes.SQS): context = extract_context_from_sqs_or_sns_event_or_context( - event, lambda_context + event, lambda_context, event_source ) elif event_source.equals(EventTypes.EVENTBRIDGE): context = extract_context_from_eventbridge_event(event, lambda_context) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 7abe0fc1e..06f8884c1 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -10,7 +10,6 @@ from time import time_ns from datadog_lambda.asm import asm_set_context, asm_start_response, asm_start_request -from datadog_lambda.dsm import set_dsm_context from datadog_lambda.extension import should_use_extension, flush_extension from datadog_lambda.cold_start import ( set_cold_start, @@ -237,8 +236,6 @@ def _before(self, event, context): self.inferred_span = create_inferred_span( event, context, event_source, config.decode_authorizer_context ) - if config.data_streams_enabled: - set_dsm_context(event, event_source) if config.appsec_enabled: asm_set_context(event_source) diff --git a/pyproject.toml b/pyproject.toml index 1d5feb7fd..f8e4d7ef7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ classifiers = [ python = ">=3.8.0,<4" datadog = ">=0.51.0,<1.0.0" wrapt = "^1.11.2" -ddtrace = ">=2.20.0,<4" +ddtrace = ">=3.10.2,<4" ujson = ">=5.9.0" botocore = { version = "^1.34.0", optional = true } requests = { version ="^2.22.0", optional = true } diff --git a/tests/test_dsm.py b/tests/test_dsm.py deleted file mode 100644 index 544212d88..000000000 --- a/tests/test_dsm.py +++ /dev/null @@ -1,112 +0,0 @@ -import unittest -from unittest.mock import patch, MagicMock - -from datadog_lambda.dsm import set_dsm_context, _dsm_set_sqs_context -from datadog_lambda.trigger import EventTypes, _EventSource - - -class TestDsmSQSContext(unittest.TestCase): - def setUp(self): - patcher = patch("datadog_lambda.dsm._dsm_set_sqs_context") - self.mock_dsm_set_sqs_context = patcher.start() - self.addCleanup(patcher.stop) - - patcher = patch("ddtrace.internal.datastreams.data_streams_processor") - self.mock_data_streams_processor = patcher.start() - self.addCleanup(patcher.stop) - - patcher = patch("ddtrace.internal.datastreams.botocore.get_datastreams_context") - self.mock_get_datastreams_context = patcher.start() - self.mock_get_datastreams_context.return_value = {} - self.addCleanup(patcher.stop) - - patcher = patch( - "ddtrace.internal.datastreams.botocore.calculate_sqs_payload_size" - ) - self.mock_calculate_sqs_payload_size = patcher.start() - self.mock_calculate_sqs_payload_size.return_value = 100 - self.addCleanup(patcher.stop) - - patcher = patch("ddtrace.internal.datastreams.processor.DsmPathwayCodec.decode") - self.mock_dsm_pathway_codec_decode = patcher.start() - self.addCleanup(patcher.stop) - - def test_non_sqs_event_source_does_nothing(self): - """Test that non-SQS event sources don't trigger DSM context setting""" - event = {} - # Use Unknown Event Source - event_source = _EventSource(EventTypes.UNKNOWN) - set_dsm_context(event, event_source) - - # DSM context should not be set for non-SQS events - self.mock_dsm_set_sqs_context.assert_not_called() - - def test_sqs_event_with_no_records_does_nothing(self): - """Test that events where Records is None don't trigger DSM processing""" - events_with_no_records = [ - {}, - {"Records": None}, - {"someOtherField": "value"}, - ] - - for event in events_with_no_records: - _dsm_set_sqs_context(event) - self.mock_data_streams_processor.assert_not_called() - - def test_sqs_event_triggers_dsm_sqs_context(self): - """Test that SQS event sources trigger the SQS-specific DSM context function""" - sqs_event = { - "Records": [ - { - "eventSource": "aws:sqs", - "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:my-queue", - "body": "Hello from SQS!", - } - ] - } - - event_source = _EventSource(EventTypes.SQS) - set_dsm_context(sqs_event, event_source) - - self.mock_dsm_set_sqs_context.assert_called_once_with(sqs_event) - - def test_sqs_multiple_records_process_each_record(self): - """Test that each record in an SQS event gets processed individually""" - multi_record_event = { - "Records": [ - { - "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:queue1", - "body": "Message 1", - }, - { - "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:queue2", - "body": "Message 2", - }, - { - "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:queue3", - "body": "Message 3", - }, - ] - } - - mock_context = MagicMock() - self.mock_dsm_pathway_codec_decode.return_value = mock_context - - _dsm_set_sqs_context(multi_record_event) - - self.assertEqual(mock_context.set_checkpoint.call_count, 3) - - calls = mock_context.set_checkpoint.call_args_list - expected_arns = [ - "arn:aws:sqs:us-east-1:123456789012:queue1", - "arn:aws:sqs:us-east-1:123456789012:queue2", - "arn:aws:sqs:us-east-1:123456789012:queue3", - ] - - for i, call in enumerate(calls): - args, kwargs = call - tags = args[0] - self.assertIn("direction:in", tags) - self.assertIn(f"topic:{expected_arns[i]}", tags) - self.assertIn("type:sqs", tags) - self.assertEqual(kwargs["payload_size"], 100) diff --git a/tests/test_tracing.py b/tests/test_tracing.py index a629343ea..fcedd5164 100644 --- a/tests/test_tracing.py +++ b/tests/test_tracing.py @@ -1,3 +1,4 @@ +import base64 import copy import functools import json @@ -6,7 +7,7 @@ import os import unittest -from unittest.mock import Mock, patch, call +from unittest.mock import Mock, patch, call, ANY import ddtrace @@ -41,8 +42,12 @@ service_mapping as global_service_mapping, propagator, emit_telemetry_on_exception_outside_of_handler, + _dsm_set_checkpoint, + extract_context_from_kinesis_event, + extract_context_from_sqs_or_sns_event_or_context, ) +from datadog_lambda.trigger import parse_event_source from tests.utils import get_mock_context @@ -2438,3 +2443,928 @@ def test_exception_outside_handler_tracing_disabled( mock_submit_errors_metric.assert_called_once_with(None) mock_trace.assert_not_called() + + +class TestExtractDDContextWithDSMLogic(unittest.TestCase): + def setUp(self): + checkpoint_patcher = patch("ddtrace.data_streams.set_consume_checkpoint") + self.mock_checkpoint = checkpoint_patcher.start() + self.addCleanup(checkpoint_patcher.stop) + self.lambda_context = get_mock_context() + config_patcher = patch( + "datadog_lambda.config.Config.data_streams_enabled", True + ) + config_patcher.start() + self.addCleanup(config_patcher.stop) + + # SQS TESTS + + def test_sqs_context_propagated_string_value(self): + dd_data = {"dd-pathway-ctx-base64": "12345"} + dd_json_data = json.dumps(dd_data) + + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue", + "messageAttributes": { + "_datadog": {"dataType": "String", "stringValue": dd_json_data} + }, + "eventSource": "aws:sqs", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sqs") + self.assertEqual(args[1], "arn:aws:sqs:us-east-1:123456789012:test-queue") + carrier_get = args[2] + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), "12345") + + def test_sqs_context_propagated_binary_value(self): + dd_data = {"dd-pathway-ctx-base64": "12345"} + dd_json_data = json.dumps(dd_data) + encoded_data = base64.b64encode(dd_json_data.encode()).decode() + + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue", + "messageAttributes": { + "_datadog": {"dataType": "Binary", "binaryValue": encoded_data} + }, + "eventSource": "aws:sqs", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sqs") + self.assertEqual(args[1], "arn:aws:sqs:us-east-1:123456789012:test-queue") + carrier_get = args[2] + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), "12345") + + def test_sqs_no_datadog_message_attribute(self): + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue", + "messageAttributes": {}, # No _datadog key + "eventSource": "aws:sqs", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sqs") + self.assertEqual(args[1], "arn:aws:sqs:us-east-1:123456789012:test-queue") + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + def test_sqs_empty_datadog_message_attribute(self): + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue", + "messageAttributes": { + "_datadog": { + "dataType": "String", + "stringValue": "null", + } # json.loads("null") => None + }, + "eventSource": "aws:sqs", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sqs") + self.assertEqual(args[1], "arn:aws:sqs:us-east-1:123456789012:test-queue") + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + def test_sqs_no_DSM_context_in_message_attribute(self): + dd_data = {"NOT-DSM-KEY": "12345"} + dd_json_data = json.dumps(dd_data) + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue", + "messageAttributes": { + "_datadog": {"dataType": "String", "stringValue": dd_json_data} + }, + "eventSource": "aws:sqs", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sqs") + self.assertEqual(args[1], "arn:aws:sqs:us-east-1:123456789012:test-queue") + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + @patch("datadog_lambda.tracing.logger") + def test_sqs_invalid_datadog_message_attribute(self, mock_logger): + test_cases = [ + { + "name": "invalid_base64", + "event": { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue", + "messageAttributes": { + "_datadog": { + "dataType": "Binary", + "binaryValue": "invalid-base64", + } + }, + "eventSource": "aws:sqs", + } + ] + }, + "expected_log": ("The trace extractor returned with error %s", ANY), + }, + { + "name": "unsupported_datatype", + "event": { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue", + "messageAttributes": { + "_datadog": { + "dataType": "Number", + "numberValue": 123, + } # Unsupported type + }, + "eventSource": "aws:sqs", + } + ] + }, + "expected_log": ( + "Datadog Lambda Python only supports extracting trace" + "context from String or Binary SQS/SNS message attributes", + ), + }, + ] + + for test_case in test_cases: + with self.subTest(test_case=test_case["name"]): + mock_logger.reset_mock() + self.mock_checkpoint.reset_mock() + + extract_context_from_sqs_or_sns_event_or_context( + test_case["event"], + self.lambda_context, + parse_event_source(test_case["event"]), + ) + + # Exception triggers logger + mock_logger.debug.assert_any_call(*test_case["expected_log"]) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sqs") + self.assertEqual( + args[1], "arn:aws:sqs:us-east-1:123456789012:test-queue" + ) + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + def test_sqs_source_arn_not_found(self): + event = { + "Records": [ + { + "eventSourceARN": "", + "messageAttributes": {}, + "eventSource": "aws:sqs", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + + self.mock_checkpoint.assert_not_called() + + @patch("datadog_lambda.config.Config.data_streams_enabled", False) + def test_sqs_data_streams_disabled(self): + context_json = {"dd-pathway-ctx-base64": "12345"} + event_type = "sqs" + arn = "arn:aws:sqs:us-east-1:123456789012:test-queue" + + _dsm_set_checkpoint(context_json, event_type, arn) + + self.mock_checkpoint.assert_not_called() + + # SNS TESTS + + def test_sns_context_propagated_string_value(self): + dd_data = {"dd-pathway-ctx-base64": "12345"} + dd_json_data = json.dumps(dd_data) + + event = { + "Records": [ + { + "eventSourceARN": "", + "Sns": { + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": { + "_datadog": {"Type": "String", "Value": dd_json_data} + }, + }, + "eventSource": "aws:sns", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sns") + self.assertEqual(args[1], "arn:aws:sns:us-east-1:123456789012:test-topic") + carrier_get = args[2] + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), "12345") + + def test_sns_context_propagated_binary_value(self): + dd_data = {"dd-pathway-ctx-base64": "12345"} + dd_json_data = json.dumps(dd_data) + encoded_data = base64.b64encode(dd_json_data.encode()).decode() + + event = { + "Records": [ + { + "eventSourceARN": "", + "Sns": { + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": { + "_datadog": {"Type": "Binary", "Value": encoded_data} + }, + }, + "eventSource": "aws:sns", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sns") + self.assertEqual(args[1], "arn:aws:sns:us-east-1:123456789012:test-topic") + carrier_get = args[2] + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), "12345") + + def test_sns_no_datadog_message_attribute(self): + event = { + "Records": [ + { + "Sns": { + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": {}, # No _datadog key + }, + "eventSource": "aws:sns", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sns") + self.assertEqual(args[1], "arn:aws:sns:us-east-1:123456789012:test-topic") + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + def test_sns_empty_datadog_message_attribute(self): + event = { + "Records": [ + { + "Sns": { + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": { + "_datadog": { + "Type": "String", + "Value": "null", + } # json.loads("null") => None + }, + }, + "eventSource": "aws:sns", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sns") + self.assertEqual(args[1], "arn:aws:sns:us-east-1:123456789012:test-topic") + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + def test_sns_no_DSM_context_in_message_attribute(self): + dd_data = {"NOT-DSM-KEY": "12345"} + dd_json_data = json.dumps(dd_data) + + event = { + "Records": [ + { + "eventSourceARN": "", + "Sns": { + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": { + "_datadog": {"Type": "String", "Value": dd_json_data} + }, + }, + "eventSource": "aws:sns", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sns") + self.assertEqual(args[1], "arn:aws:sns:us-east-1:123456789012:test-topic") + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + @patch("datadog_lambda.tracing.logger") + def test_sns_invalid_datadog_message_attribute(self, mock_logger): + test_cases = [ + { + "name": "invalid_base64", + "event": { + "Records": [ + { + "Sns": { + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": { + "_datadog": { + "Type": "Binary", + "Value": "invalid-base64", + } + }, + }, + "eventSource": "aws:sns", + } + ] + }, + "expected_log": ("The trace extractor returned with error %s", ANY), + }, + { + "name": "unsupported_datatype", + "event": { + "Records": [ + { + "Sns": { + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": { + "_datadog": { + "Type": "Number", + "numberValue": 123, + } # Unsupported type + }, + }, + "eventSource": "aws:sns", + } + ] + }, + "expected_log": ( + "Datadog Lambda Python only supports extracting trace" + "context from String or Binary SQS/SNS message attributes", + ), + }, + ] + + for test_case in test_cases: + with self.subTest(test_case=test_case["name"]): + mock_logger.reset_mock() + self.mock_checkpoint.reset_mock() + + extract_context_from_sqs_or_sns_event_or_context( + test_case["event"], + self.lambda_context, + parse_event_source(test_case["event"]), + ) + + # Exception triggers logger + mock_logger.debug.assert_any_call(*test_case["expected_log"]) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sns") + self.assertEqual( + args[1], "arn:aws:sns:us-east-1:123456789012:test-topic" + ) + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + def test_sns_source_arn_not_found(self): + event = { + "Records": [ + { + "Sns": { + "TopicArn": "", + "MessageAttributes": {}, + }, + "eventSource": "aws:sns", + "eventSourceARN": "", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + + self.mock_checkpoint.assert_not_called() + + @patch("datadog_lambda.config.Config.data_streams_enabled", False) + def test_sns_data_streams_disabled(self): + context_json = {"dd-pathway-ctx-base64": "12345"} + event_type = "sns" + arn = "arn:aws:sns:us-east-1:123456789012:test-topic" + + _dsm_set_checkpoint(context_json, event_type, arn) + + self.mock_checkpoint.assert_not_called() + + # SNS -> SQS TESTS + + def test_sns_to_sqs_context_propagated_string_value(self): + dd_data = {"dd-pathway-ctx-base64": "12345"} + dd_json_data = json.dumps(dd_data) + + sns_notification = { + "Type": "Notification", + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": { + "_datadog": {"Type": "String", "Value": dd_json_data} + }, + "Message": "test message", + } + + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue", + "body": json.dumps(sns_notification), + "eventSource": "aws:sqs", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sqs") + # Should use SQS ARN, not SNS ARN + self.assertEqual(args[1], "arn:aws:sqs:us-east-1:123456789012:test-queue") + carrier_get = args[2] + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), "12345") + + def test_sns_to_sqs_context_propagated_binary_value(self): + dd_data = {"dd-pathway-ctx-base64": "12345"} + dd_json_data = json.dumps(dd_data) + encoded_data = base64.b64encode(dd_json_data.encode()).decode() + + sns_notification = { + "Type": "Notification", + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": { + "_datadog": {"Type": "Binary", "Value": encoded_data} + }, + "Message": "test message", + } + + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue", + "body": json.dumps(sns_notification), + "eventSource": "aws:sqs", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sqs") + # Should use SQS ARN, not SNS ARN + self.assertEqual(args[1], "arn:aws:sqs:us-east-1:123456789012:test-queue") + carrier_get = args[2] + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), "12345") + + def test_sns_to_sqs_no_datadog_message_attribute(self): + sns_notification = { + "Type": "Notification", + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": {}, # No _datadog key + "Message": "test message", + } + + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue", + "body": json.dumps(sns_notification), + "eventSource": "aws:sqs", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sqs") + # Should use SQS ARN, not SNS ARN + self.assertEqual(args[1], "arn:aws:sqs:us-east-1:123456789012:test-queue") + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + def test_sns_to_sqs_empty_datadog_message_attribute(self): + sns_notification = { + "Type": "Notification", + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": { + "_datadog": { + "Type": "String", + "Value": "null", + } # json.loads("null") => None + }, + "Message": "test message", + } + + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue", + "body": json.dumps(sns_notification), + "eventSource": "aws:sqs", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sqs") + # Should use SQS ARN, not SNS ARN + self.assertEqual(args[1], "arn:aws:sqs:us-east-1:123456789012:test-queue") + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + def test_sns_to_sqs_no_DSM_context_in_message_attribute(self): + dd_data = {"NOT-DSM-KEY": "12345"} + dd_json_data = json.dumps(dd_data) + encoded_data = base64.b64encode(dd_json_data.encode()).decode() + + sns_notification = { + "Type": "Notification", + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": { + "_datadog": {"Type": "Binary", "Value": encoded_data} + }, + "Message": "test message", + } + + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue", + "body": json.dumps(sns_notification), + "eventSource": "aws:sqs", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sqs") + # Should use SQS ARN, not SNS ARN + self.assertEqual(args[1], "arn:aws:sqs:us-east-1:123456789012:test-queue") + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + @patch("datadog_lambda.tracing.logger") + def test_sns_to_sqs_invalid_datadog_message_attribute(self, mock_logger): + test_cases = [ + { + "name": "invalid_base64", + "sns_notification": { + "Type": "Notification", + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": { + "_datadog": {"Type": "Binary", "Value": "not-base64"} + }, + "Message": "test message", + }, + "expected_log": ("The trace extractor returned with error %s", ANY), + }, + { + "name": "unsupported_datatype", + "sns_notification": { + "Type": "Notification", + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": { + "_datadog": { + "Type": "Number", + "numberValue": 123, + } # Unsupported type + }, + "Message": "test message", + }, + "expected_log": ( + "Datadog Lambda Python only supports extracting trace" + "context from String or Binary SQS/SNS message attributes", + ), + }, + ] + + for test_case in test_cases: + with self.subTest(test_case=test_case["name"]): + mock_logger.reset_mock() + self.mock_checkpoint.reset_mock() + + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue", + "body": json.dumps(test_case["sns_notification"]), + "eventSource": "aws:sqs", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + + # Exception triggers logger + mock_logger.debug.assert_any_call(*test_case["expected_log"]) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "sqs") + # Should use SQS ARN, not SNS ARN + self.assertEqual( + args[1], "arn:aws:sqs:us-east-1:123456789012:test-queue" + ) + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + def test_sns_to_sqs_source_arn_not_found(self): + sns_notification = { + "Type": "Notification", + "TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic", + "MessageAttributes": {}, + "Message": "test message", + } + + event = { + "Records": [ + { + "eventSourceARN": "", # Empty SQS ARN + "body": json.dumps(sns_notification), + "eventSource": "aws:sqs", + } + ] + } + + extract_context_from_sqs_or_sns_event_or_context( + event, self.lambda_context, parse_event_source(event) + ) + + self.mock_checkpoint.assert_not_called() + + @patch("datadog_lambda.config.Config.data_streams_enabled", False) + def test_sns_to_sqs_data_streams_disabled(self): + context_json = {"dd-pathway-ctx-base64": "12345"} + event_type = "sqs" + arn = "arn:aws:sqs:us-east-1:123456789012:test-queue" + + _dsm_set_checkpoint(context_json, event_type, arn) + + self.mock_checkpoint.assert_not_called() + + # KINESIS TESTS + + def test_kinesis_context_propagated_binary_value(self): + dd_data = {"dd-pathway-ctx-base64": "12345"} + kinesis_data = {"_datadog": dd_data, "message": "test"} + kinesis_data_str = json.dumps(kinesis_data) + encoded_data = base64.b64encode(kinesis_data_str.encode()).decode() + + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream", + "kinesis": {"data": encoded_data}, + } + ] + } + + extract_context_from_kinesis_event(event, self.lambda_context) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "kinesis") + self.assertEqual( + args[1], "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream" + ) + carrier_get = args[2] + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), "12345") + + def test_kinesis_no_datadog_message_attribute(self): + kinesis_data = {"message": "test"} # No _datadog key + kinesis_data_str = json.dumps(kinesis_data) + encoded_data = base64.b64encode(kinesis_data_str.encode()).decode() + + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream", + "kinesis": {"data": encoded_data}, + } + ] + } + + extract_context_from_kinesis_event(event, self.lambda_context) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "kinesis") + self.assertEqual( + args[1], "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream" + ) + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + def test_kinesis_empty_message_attribute(self): + kinesis_data = {"_datadog": None, "message": "test"} # _datadog is None + kinesis_data_str = json.dumps(kinesis_data) + encoded_data = base64.b64encode(kinesis_data_str.encode()).decode() + + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream", + "kinesis": {"data": encoded_data}, + } + ] + } + + extract_context_from_kinesis_event(event, self.lambda_context) + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "kinesis") + self.assertEqual( + args[1], "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream" + ) + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + def test_kinesis_no_DSM_context_in_message_attribute(self): + dd_data = {"NOT-DSM-KEY": "12345"} + kinesis_data = {"_datadog": dd_data, "message": "test"} + kinesis_data_str = json.dumps(kinesis_data) + encoded_data = base64.b64encode(kinesis_data_str.encode()).decode() + + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream", + "kinesis": {"data": encoded_data}, + } + ] + } + + extract_context_from_kinesis_event(event, self.lambda_context) + + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "kinesis") + self.assertEqual( + args[1], "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream" + ) + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + @patch("datadog_lambda.tracing.logger") + def test_kinesis_invalid_datadog_message_attribute(self, mock_logger): + event = { + "Records": [ + { + "eventSourceARN": "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream", + "kinesis": {"data": "invalid-base64"}, + } + ] + } + + extract_context_from_kinesis_event(event, self.lambda_context) + # Exception triggers logger + mock_logger.debug.assert_any_call( + "The trace extractor returned with error %s", + ANY, + ) + self.assertEqual(self.mock_checkpoint.call_count, 1) + args, _ = self.mock_checkpoint.call_args + self.assertEqual(args[0], "kinesis") + self.assertEqual( + args[1], "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream" + ) + carrier_get = args[2] + # None indicates no DSM context propagation + self.assertEqual(carrier_get("dd-pathway-ctx-base64"), None) + + def test_kinesis_source_arn_not_found(self): + kinesis_data = {"message": "test"} + kinesis_data_str = json.dumps(kinesis_data) + encoded_data = base64.b64encode(kinesis_data_str.encode()).decode() + + event = { + "Records": [ + { + "eventSourceARN": "", + "kinesis": {"data": encoded_data}, + } + ] + } + + extract_context_from_kinesis_event(event, self.lambda_context) + + self.mock_checkpoint.assert_not_called() + + @patch("datadog_lambda.config.Config.data_streams_enabled", False) + def test_kinesis_data_streams_disabled(self): + context_json = {"dd-pathway-ctx-base64": "12345"} + event_type = "kinesis" + arn = "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream" + + _dsm_set_checkpoint(context_json, event_type, arn) diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 09f48c8aa..fc081e904 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -73,10 +73,6 @@ def setUp(self): self.mock_dd_lambda_layer_tag = patcher.start() self.addCleanup(patcher.stop) - patcher = patch("datadog_lambda.wrapper.set_dsm_context") - self.mock_set_dsm_context = patcher.start() - self.addCleanup(patcher.stop) - @patch("datadog_lambda.config.Config.trace_enabled", False) def test_datadog_lambda_wrapper(self): @wrapper.datadog_lambda_wrapper @@ -556,62 +552,6 @@ def return_type_test(event, context): self.assertEqual(result, test_result) self.assertFalse(MockPrintExc.called) - def test_set_dsm_context_called_when_DSM_and_tracing_enabled(self): - os.environ["DD_DATA_STREAMS_ENABLED"] = "true" - os.environ["DD_TRACE_ENABLED"] = "true" - - @wrapper.datadog_lambda_wrapper - def lambda_handler(event, context): - return "ok" - - result = lambda_handler({}, get_mock_context()) - self.assertEqual(result, "ok") - self.mock_set_dsm_context.assert_called_once() - - del os.environ["DD_DATA_STREAMS_ENABLED"] - - def test_set_dsm_context_not_called_when_only_DSM_enabled(self): - os.environ["DD_DATA_STREAMS_ENABLED"] = "true" - os.environ["DD_TRACE_ENABLED"] = "false" - - @wrapper.datadog_lambda_wrapper - def lambda_handler(event, context): - return "ok" - - result = lambda_handler({}, get_mock_context()) - self.assertEqual(result, "ok") - self.mock_set_dsm_context.assert_not_called() - - del os.environ["DD_DATA_STREAMS_ENABLED"] - - def test_set_dsm_context_not_called_when_only_tracing_enabled(self): - os.environ["DD_DATA_STREAMS_ENABLED"] = "false" - os.environ["DD_TRACE_ENABLED"] = "true" - - @wrapper.datadog_lambda_wrapper - def lambda_handler(event, context): - return "ok" - - result = lambda_handler({}, get_mock_context()) - self.assertEqual(result, "ok") - self.mock_set_dsm_context.assert_not_called() - - del os.environ["DD_DATA_STREAMS_ENABLED"] - - def test_set_dsm_context_not_called_when_tracing_and_DSM_disabled(self): - os.environ["DD_DATA_STREAMS_ENABLED"] = "false" - os.environ["DD_TRACE_ENABLED"] = "false" - - @wrapper.datadog_lambda_wrapper - def lambda_handler(event, context): - return "ok" - - result = lambda_handler({}, get_mock_context()) - self.assertEqual(result, "ok") - self.mock_set_dsm_context.assert_not_called() - - del os.environ["DD_DATA_STREAMS_ENABLED"] - class TestLambdaWrapperWithTraceContext(unittest.TestCase): xray_root = "1-5e272390-8c398be037738dc042009320" From a97a1c9c097a0d28d0caf095c3516eb61a0c4502 Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Fri, 11 Jul 2025 13:37:15 +0200 Subject: [PATCH 046/164] build: publish artifacts of built layers on main updates (#629) --- .github/workflows/build_layer.yml | 35 +++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/build_layer.yml diff --git a/.github/workflows/build_layer.yml b/.github/workflows/build_layer.yml new file mode 100644 index 000000000..789868ed0 --- /dev/null +++ b/.github/workflows/build_layer.yml @@ -0,0 +1,35 @@ +name: Build Layers for system-Tests + +on: + push: + branches: + - "main" + +jobs: + build: + runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest' }} + + strategy: + matrix: + arch: [arm64, amd64] + python_version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Patch pyproject.toml + run: | + echo "Patching pyproject.toml to use main branch of dd-trace-py" + sed -i 's|^ddtrace =.*$|ddtrace = { git = "https://github.com/DataDog/dd-trace-py.git" }|' pyproject.toml + + - name: Build layer for Python ${{ matrix.python_version }} on ${{ matrix.arch }} + run: | + echo "Building layer for Python ${{ matrix.python_version }} on ${{ matrix.arch }}" + ARCH=${{ matrix.arch }} PYTHON_VERSION=${{ matrix.python_version }} ./scripts/build_layers.sh + + - name: Upload layer artifact + uses: actions/upload-artifact@v4 + with: + path: .layers/datadog_lambda_py-${{ matrix.arch }}-${{ matrix.python_version }}.zip + name: datadog-lambda-python-${{ matrix.python_version }}-${{ matrix.arch }} From 4c9348660c44d03f23a7560aeae5625ca56498fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 15:03:57 -0400 Subject: [PATCH 047/164] chore(deps): bump requests from 2.32.3 to 2.32.4 in /tests/integration (#632) Bumps [requests](https://github.com/psf/requests) from 2.32.3 to 2.32.4. - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.32.3...v2.32.4) --- updated-dependencies: - dependency-name: requests dependency-version: 2.32.4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tests/integration/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/requirements.txt b/tests/integration/requirements.txt index 5678a66cd..343ea0257 100644 --- a/tests/integration/requirements.txt +++ b/tests/integration/requirements.txt @@ -1,4 +1,4 @@ certifi==2024.12.14 charset-normalizer==3.4.1 idna==3.10 -requests==2.32.3 +requests==2.32.4 From 664124e2acb10ba356ae9af62ea188facb8a365d Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Thu, 17 Jul 2025 10:15:25 -0400 Subject: [PATCH 048/164] version 7.112.0 (#631) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 2bb1df7ff..e1dbe71f1 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "6.111.0" +__version__ = "7.112.0" diff --git a/pyproject.toml b/pyproject.toml index f8e4d7ef7..1a43b9e82 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "6.111.0" +version = "7.112.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From c7739ebcdb0a93bd01745fb5ad5922a96a783b89 Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Mon, 21 Jul 2025 09:13:37 +0200 Subject: [PATCH 049/164] feat(appsec): enable request blocking (#630) --- datadog_lambda/asm.py | 47 ++++++++++++++- datadog_lambda/wrapper.py | 22 ++++++- tests/test_asm.py | 81 ++++++++++++++++++++++++-- tests/test_wrapper.py | 117 +++++++++++++++++++++++++++++++++++++- 4 files changed, 258 insertions(+), 9 deletions(-) diff --git a/datadog_lambda/asm.py b/datadog_lambda/asm.py index 9636760c3..11df24714 100644 --- a/datadog_lambda/asm.py +++ b/datadog_lambda/asm.py @@ -1,9 +1,12 @@ -from copy import deepcopy import logging +import urllib.parse +from copy import deepcopy from typing import Any, Dict, List, Optional, Union from ddtrace.contrib.internal.trace_utils import _get_request_header_client_ip from ddtrace.internal import core +from ddtrace.internal.utils import get_blocked +from ddtrace.internal.utils import http as http_utils from ddtrace.trace import Span from datadog_lambda.trigger import ( @@ -50,6 +53,7 @@ def asm_set_context(event_source: _EventSource): This allows the AppSecSpanProcessor to know information about the event at the moment the span is created and skip it when not relevant. """ + if event_source.event_type not in _http_event_types: core.set_item("appsec_skip_next_lambda_event", True) @@ -126,6 +130,14 @@ def asm_start_request( span.set_tag_str("http.client_ip", request_ip) span.set_tag_str("network.client.ip", request_ip) + # Encode the parsed query and append it to reconstruct the original raw URI expected by AppSec. + if parsed_query: + try: + encoded_query = urllib.parse.urlencode(parsed_query, doseq=True) + raw_uri += "?" + encoded_query # type: ignore + except Exception: + pass + core.dispatch( # The matching listener is registered in ddtrace.appsec._handlers "aws_lambda.start_request", @@ -182,3 +194,36 @@ def asm_start_response( response_headers, ), ) + + +def get_asm_blocked_response( + event_source: _EventSource, +) -> Optional[Dict[str, Any]]: + """Get the blocked response for the given event source.""" + if event_source.event_type not in _http_event_types: + return None + + blocked = get_blocked() + if not blocked: + return None + + desired_type = blocked.get("type", "auto") + if desired_type == "none": + content_type = "text/plain; charset=utf-8" + content = "" + else: + content_type = blocked.get("content-type", "application/json") + content = http_utils._get_blocked_template(content_type) + + response_headers = { + "content-type": content_type, + } + if "location" in blocked: + response_headers["location"] = blocked["location"] + + return { + "statusCode": blocked.get("status_code", 403), + "headers": response_headers, + "body": content, + "isBase64Encoded": False, + } diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 06f8884c1..917a4fa0e 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -9,7 +9,7 @@ from importlib import import_module from time import time_ns -from datadog_lambda.asm import asm_set_context, asm_start_response, asm_start_request +from ddtrace.internal._exceptions import BlockingException from datadog_lambda.extension import should_use_extension, flush_extension from datadog_lambda.cold_start import ( set_cold_start, @@ -46,6 +46,14 @@ extract_http_status_code_tag, ) +if config.appsec_enabled: + from datadog_lambda.asm import ( + asm_set_context, + asm_start_response, + asm_start_request, + get_asm_blocked_response, + ) + if config.profiling_enabled: from ddtrace.profiling import profiler @@ -120,6 +128,7 @@ def __init__(self, func): self.span = None self.inferred_span = None self.response = None + self.blocking_response = None if config.profiling_enabled: self.prof = profiler.Profiler(env=config.env, service=config.service) @@ -159,8 +168,12 @@ def __call__(self, event, context, **kwargs): """Executes when the wrapped function gets called""" self._before(event, context) try: + if self.blocking_response: + return self.blocking_response self.response = self.func(event, context, **kwargs) return self.response + except BlockingException: + self.blocking_response = get_asm_blocked_response(self.event_source) except Exception: from datadog_lambda.metric import submit_errors_metric @@ -171,6 +184,8 @@ def __call__(self, event, context, **kwargs): raise finally: self._after(event, context) + if self.blocking_response: + return self.blocking_response def _inject_authorizer_span_headers(self, request_id): reference_span = self.inferred_span if self.inferred_span else self.span @@ -203,6 +218,7 @@ def _inject_authorizer_span_headers(self, request_id): def _before(self, event, context): try: self.response = None + self.blocking_response = None set_cold_start(init_timestamp_ns) if not should_use_extension: @@ -253,6 +269,7 @@ def _before(self, event, context): ) if config.appsec_enabled: asm_start_request(self.span, event, event_source, self.trigger_tags) + self.blocking_response = get_asm_blocked_response(self.event_source) else: set_correlation_ids() if config.profiling_enabled and is_new_sandbox(): @@ -286,13 +303,14 @@ def _after(self, event, context): if status_code: self.span.set_tag("http.status_code", status_code) - if config.appsec_enabled: + if config.appsec_enabled and not self.blocking_response: asm_start_response( self.span, status_code, self.event_source, response=self.response, ) + self.blocking_response = get_asm_blocked_response(self.event_source) self.span.finish() diff --git a/tests/test_asm.py b/tests/test_asm.py index e57c289fd..e3a5e027b 100644 --- a/tests/test_asm.py +++ b/tests/test_asm.py @@ -2,8 +2,17 @@ import pytest from unittest.mock import MagicMock, patch -from datadog_lambda.asm import asm_start_request, asm_start_response -from datadog_lambda.trigger import parse_event_source, extract_trigger_tags +from datadog_lambda.asm import ( + asm_start_request, + asm_start_response, + get_asm_blocked_response, +) +from datadog_lambda.trigger import ( + EventTypes, + _EventSource, + extract_trigger_tags, + parse_event_source, +) from tests.utils import get_mock_context event_samples = "tests/event_samples/" @@ -15,7 +24,7 @@ "application_load_balancer", "application-load-balancer.json", "72.12.164.125", - "/lambda", + "/lambda?query=1234ABCD", "GET", "", False, @@ -27,7 +36,7 @@ "application_load_balancer_multivalue_headers", "application-load-balancer-mutivalue-headers.json", "72.12.164.125", - "/lambda", + "/lambda?query=1234ABCD", "GET", "", False, @@ -51,7 +60,7 @@ "api_gateway", "api-gateway.json", "127.0.0.1", - "/path/to/resource", + "/path/to/resource?foo=bar", "POST", "eyJ0ZXN0IjoiYm9keSJ9", True, @@ -199,6 +208,40 @@ ), ] +ASM_BLOCKED_RESPONSE_TEST_CASES = [ + # JSON blocking response + ( + {"status_code": 403, "type": "auto", "content-type": "application/json"}, + 403, + {"content-type": "application/json"}, + ), + # HTML blocking response + ( + { + "status_code": 401, + "type": "html", + "content-type": "text/html", + }, + 401, + {"content-type": "text/html"}, + ), + # Plain text redirect response + ( + {"status_code": 301, "type": "none", "location": "https://example.com/blocked"}, + 301, + { + "content-type": "text/plain; charset=utf-8", + "location": "https://example.com/blocked", + }, + ), + # Default to content-type application/json and status code 403 when not provided + ( + {"type": "auto"}, + 403, + {"content-type": "application/json"}, + ), +] + @pytest.mark.parametrize( "name,file,expected_ip,expected_uri,expected_method,expected_body,expected_base64,expected_query,expected_path_params,expected_route", @@ -327,3 +370,31 @@ def test_asm_start_response_parametrized( else: # Verify core.dispatch was not called for non-HTTP events mock_core.dispatch.assert_not_called() + + +@pytest.mark.parametrize( + "blocked_config, expected_status, expected_headers", + ASM_BLOCKED_RESPONSE_TEST_CASES, +) +@patch("datadog_lambda.asm.get_blocked") +def test_get_asm_blocked_response_blocked( + mock_get_blocked, + blocked_config, + expected_status, + expected_headers, +): + mock_get_blocked.return_value = blocked_config + event_source = _EventSource(event_type=EventTypes.API_GATEWAY) + response = get_asm_blocked_response(event_source) + assert response["statusCode"] == expected_status + assert response["headers"] == expected_headers + + +@patch("datadog_lambda.asm.get_blocked") +def test_get_asm_blocked_response_not_blocked( + mock_get_blocked, +): + mock_get_blocked.return_value = None + event_source = _EventSource(event_type=EventTypes.API_GATEWAY) + response = get_asm_blocked_response(event_source) + assert response is None diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index fc081e904..e07b5ca91 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -2,8 +2,9 @@ import json import os import unittest +import importlib -from unittest.mock import patch, call, ANY +from unittest.mock import MagicMock, patch, call, ANY from datadog_lambda.constants import TraceHeader import datadog_lambda.wrapper as wrapper @@ -660,3 +661,117 @@ def lambda_handler(event, context): lambda_handler(lambda_event, lambda_context) self.assertEqual(len(flushes), 0) + + +class TestLambdaWrapperAppsecBlocking(unittest.TestCase): + def setUp(self): + os.environ["DD_APPSEC_ENABLED"] = "true" + os.environ["DD_TRACE_ENABLED"] = "true" + + importlib.reload(wrapper) + + self.addCleanup(os.environ.pop, "DD_APPSEC_ENABLED", None) + self.addCleanup(os.environ.pop, "DD_TRACE_ENABLED", None) + self.addCleanup(lambda: importlib.reload(wrapper)) + + patcher = patch("datadog_lambda.wrapper.asm_set_context") + self.mock_asm_set_context = patcher.start() + self.addCleanup(patcher.stop) + + patcher = patch("datadog_lambda.wrapper.asm_start_request") + self.mock_asm_start_request = patcher.start() + self.addCleanup(patcher.stop) + + patcher = patch("datadog_lambda.wrapper.asm_start_response") + self.mock_asm_start_response = patcher.start() + self.addCleanup(patcher.stop) + + patcher = patch("datadog_lambda.wrapper.get_asm_blocked_response") + self.mock_get_asm_blocking_response = patcher.start() + self.addCleanup(patcher.stop) + + self.fake_blocking_response = { + "statusCode": "403", + "headers": { + "Content-Type": "application/json", + }, + "body": '{"message": "Blocked by AppSec"}', + "isBase64Encoded": False, + } + + def test_blocking_before(self): + self.mock_get_asm_blocking_response.return_value = self.fake_blocking_response + + mock_handler = MagicMock() + + lambda_handler = wrapper.datadog_lambda_wrapper(mock_handler) + + response = lambda_handler({}, get_mock_context()) + self.assertEqual(response, self.fake_blocking_response) + + mock_handler.assert_not_called() + + self.mock_asm_set_context.assert_called_once() + self.mock_asm_start_request.assert_called_once() + self.mock_asm_start_response.assert_not_called() + + def test_blocking_during(self): + self.mock_get_asm_blocking_response.return_value = None + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + self.mock_get_asm_blocking_response.return_value = ( + self.fake_blocking_response + ) + raise wrapper.BlockingException() + + response = lambda_handler({}, get_mock_context()) + self.assertEqual(response, self.fake_blocking_response) + + self.mock_asm_set_context.assert_called_once() + self.mock_asm_start_request.assert_called_once() + self.mock_asm_start_response.assert_not_called() + + def test_blocking_after(self): + self.mock_get_asm_blocking_response.return_value = None + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + self.mock_get_asm_blocking_response.return_value = ( + self.fake_blocking_response + ) + return { + "statusCode": 200, + "body": "This should not be returned", + } + + response = lambda_handler({}, get_mock_context()) + self.assertEqual(response, self.fake_blocking_response) + + self.mock_asm_set_context.assert_called_once() + self.mock_asm_start_request.assert_called_once() + self.mock_asm_start_response.assert_called_once() + + def test_no_blocking_appsec_disabled(self): + os.environ["DD_APPSEC_ENABLED"] = "false" + + importlib.reload(wrapper) + + self.mock_get_asm_blocking_response.return_value = self.fake_blocking_response + + expected_response = { + "statusCode": 200, + "body": "This should be returned", + } + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return expected_response + + response = lambda_handler({}, get_mock_context()) + self.assertEqual(response, expected_response) + + self.mock_get_asm_blocking_response.assert_not_called() + self.mock_asm_set_context.assert_not_called() + self.mock_asm_start_request.assert_not_called() + self.mock_asm_start_response.assert_not_called() From 37078c336b29c32ed379dc23cd0ee1ccc3359736 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Thu, 24 Jul 2025 10:06:49 -0400 Subject: [PATCH 050/164] v7.113.0-dev (#634) * v7.113.0.dev0 PEP 400 requires it to be devN * remove .devN versioning from logs --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- scripts/run_integration_tests.sh | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index e1dbe71f1..ae708026a 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "7.112.0" +__version__ = "7.113.0.dev0" diff --git a/pyproject.toml b/pyproject.toml index 1a43b9e82..9efbd0fae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "7.112.0" +version = "7.113.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" diff --git a/scripts/run_integration_tests.sh b/scripts/run_integration_tests.sh index 9ea2f0130..f6e4f537c 100755 --- a/scripts/run_integration_tests.sh +++ b/scripts/run_integration_tests.sh @@ -212,6 +212,8 @@ for handler_name in "${LAMBDA_HANDLERS[@]}"; do sed -E "s/(datadog_lambda:v)([0-9]+\.[0-9]+\.[0-9]+)/\1XX/g" | sed -E "s/(datadogpy\/)([0-9]+\.[0-9]+\.[0-9]+)/\1XX/g" | sed -E "s/(python )([0-9]\.[0-9]+\.[0-9]+)/\1XX/g" | + # Remove .devN versioning from logs + sed -E "s/\.dev[0-9]+//g" | # Strip out run ID (from function name, resource, etc.) sed -E "s/${!run_id}/XXXX/g" | # Normalize python-requests version From 502303d672aac543e3e36cf08d44d325d464635c Mon Sep 17 00:00:00 2001 From: Taegyun Kim Date: Fri, 25 Jul 2025 03:14:42 +0900 Subject: [PATCH 051/164] fix(profiling): include ddup and dd_wrapper so files to enable profiling (#638) * chore(profiling): include ddup and dd_wrapper so files * bump up layer size limit * set to 21 --- Dockerfile | 2 -- scripts/check_layer_size.sh | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index c58245287..02910a783 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,8 +23,6 @@ RUN rm -rf ./python/lib/$runtime/site-packages/setuptools RUN rm -rf ./python/lib/$runtime/site-packages/jsonschema/tests RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_taint_tracking/*.so RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_stacktrace*.so -RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/internal/datadog/profiling/libdd_wrapper*.so -RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/internal/datadog/profiling/ddup/_ddup.*.so # _stack_v2 may not exist for some versions of ddtrace (e.g. under python 3.13) RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/internal/datadog/profiling/stack_v2/_stack_v2.*.so # remove *.dist-info directories except any entry_points.txt files diff --git a/scripts/check_layer_size.sh b/scripts/check_layer_size.sh index 626f9d316..0b835cb04 100755 --- a/scripts/check_layer_size.sh +++ b/scripts/check_layer_size.sh @@ -8,8 +8,8 @@ # Compares layer size to threshold, and fails if below that threshold set -e -MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 6 \* 1024) -MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 15 \* 1024) +MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 8 \* 1024) +MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 21 \* 1024) LAYER_FILES_PREFIX="datadog_lambda_py" From 50d893a402a9ef28d958457a0293b6ab1eb18498 Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Mon, 28 Jul 2025 16:46:21 +0200 Subject: [PATCH 052/164] feat(appsec): enable api security (#636) --- datadog_lambda/asm.py | 11 ++++++ datadog_lambda/wrapper.py | 3 ++ .../logs/async-metrics_python310.log | 2 ++ .../logs/async-metrics_python311.log | 2 ++ .../logs/async-metrics_python312.log | 2 ++ .../logs/async-metrics_python313.log | 2 ++ .../snapshots/logs/async-metrics_python38.log | 2 ++ .../snapshots/logs/async-metrics_python39.log | 2 ++ .../snapshots/logs/sync-metrics_python310.log | 2 ++ .../snapshots/logs/sync-metrics_python311.log | 2 ++ .../snapshots/logs/sync-metrics_python312.log | 2 ++ .../snapshots/logs/sync-metrics_python313.log | 2 ++ .../snapshots/logs/sync-metrics_python38.log | 2 ++ .../snapshots/logs/sync-metrics_python39.log | 2 ++ tests/test_asm.py | 35 ++++++++++++------- 15 files changed, 60 insertions(+), 13 deletions(-) diff --git a/datadog_lambda/asm.py b/datadog_lambda/asm.py index 11df24714..31f750d82 100644 --- a/datadog_lambda/asm.py +++ b/datadog_lambda/asm.py @@ -195,6 +195,17 @@ def asm_start_response( ), ) + if isinstance(response, dict) and "statusCode" in response: + body = response.get("body") + else: + body = response + + core.dispatch( + # The matching listener is registered in ddtrace.appsec._handlers + "aws_lambda.parse_body", + (body,), + ) + def get_asm_blocked_response( event_source: _EventSource, diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 917a4fa0e..494556257 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -318,6 +318,9 @@ def _after(self, event, context): if status_code: self.inferred_span.set_tag("http.status_code", status_code) + if self.trigger_tags and (route := self.trigger_tags.get("http.route")): + self.inferred_span.set_tag("http.route", route) + if config.service: self.inferred_span.set_tag("peer.service", config.service) diff --git a/tests/integration/snapshots/logs/async-metrics_python310.log b/tests/integration/snapshots/logs/async-metrics_python310.log index bda234df4..6de63bec3 100644 --- a/tests/integration/snapshots/logs/async-metrics_python310.log +++ b/tests/integration/snapshots/logs/async-metrics_python310.log @@ -66,6 +66,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", @@ -613,6 +614,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", diff --git a/tests/integration/snapshots/logs/async-metrics_python311.log b/tests/integration/snapshots/logs/async-metrics_python311.log index fd318de30..18bd119dd 100644 --- a/tests/integration/snapshots/logs/async-metrics_python311.log +++ b/tests/integration/snapshots/logs/async-metrics_python311.log @@ -66,6 +66,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", @@ -613,6 +614,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", diff --git a/tests/integration/snapshots/logs/async-metrics_python312.log b/tests/integration/snapshots/logs/async-metrics_python312.log index b51b6a2d9..e884a96d3 100644 --- a/tests/integration/snapshots/logs/async-metrics_python312.log +++ b/tests/integration/snapshots/logs/async-metrics_python312.log @@ -66,6 +66,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", @@ -613,6 +614,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", diff --git a/tests/integration/snapshots/logs/async-metrics_python313.log b/tests/integration/snapshots/logs/async-metrics_python313.log index 89b73e922..3393f6842 100644 --- a/tests/integration/snapshots/logs/async-metrics_python313.log +++ b/tests/integration/snapshots/logs/async-metrics_python313.log @@ -66,6 +66,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", @@ -613,6 +614,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", diff --git a/tests/integration/snapshots/logs/async-metrics_python38.log b/tests/integration/snapshots/logs/async-metrics_python38.log index ff5e5a60c..0495ba459 100644 --- a/tests/integration/snapshots/logs/async-metrics_python38.log +++ b/tests/integration/snapshots/logs/async-metrics_python38.log @@ -66,6 +66,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", @@ -613,6 +614,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", diff --git a/tests/integration/snapshots/logs/async-metrics_python39.log b/tests/integration/snapshots/logs/async-metrics_python39.log index 5e3d46b66..d2aad04c4 100644 --- a/tests/integration/snapshots/logs/async-metrics_python39.log +++ b/tests/integration/snapshots/logs/async-metrics_python39.log @@ -66,6 +66,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", @@ -613,6 +614,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index 215698312..aa96b02d9 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -46,6 +46,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", @@ -653,6 +654,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index 5fcd504d6..91ae2e516 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -46,6 +46,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", @@ -653,6 +654,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index 9a05404ce..81e897cad 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -46,6 +46,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", @@ -653,6 +654,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index 5d17bed58..77376e6b5 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -46,6 +46,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", @@ -653,6 +654,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", diff --git a/tests/integration/snapshots/logs/sync-metrics_python38.log b/tests/integration/snapshots/logs/sync-metrics_python38.log index 37ed391e3..ddc8d7510 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python38.log +++ b/tests/integration/snapshots/logs/sync-metrics_python38.log @@ -46,6 +46,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", @@ -653,6 +654,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", diff --git a/tests/integration/snapshots/logs/sync-metrics_python39.log b/tests/integration/snapshots/logs/sync-metrics_python39.log index f147744b7..128319f6c 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python39.log +++ b/tests/integration/snapshots/logs/sync-metrics_python39.log @@ -46,6 +46,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", @@ -653,6 +654,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.base_service": "integration-tests-python", diff --git a/tests/test_asm.py b/tests/test_asm.py index e3a5e027b..7a5e6c560 100644 --- a/tests/test_asm.py +++ b/tests/test_asm.py @@ -106,6 +106,7 @@ }, "200", {"Content-Type": "text/html"}, + None, True, ), ( @@ -123,6 +124,7 @@ "Content-Type": "text/plain", "X-Error": "Not Found", }, + None, True, ), ( @@ -140,6 +142,7 @@ "Location": "/user/123", "Content-Type": "application/json", }, + None, True, ), ( @@ -158,6 +161,7 @@ "Content-Type": "application/json", "X-Custom-Header": "test-value", }, + '{"message": "success"}', True, ), ( @@ -169,6 +173,7 @@ }, "200", {"Content-Type": "application/json"}, + None, True, ), ( @@ -180,6 +185,7 @@ }, "200", {"Content-Type": "text/plain"}, + None, True, ), ( @@ -188,6 +194,7 @@ {"statusCode": 200}, "200", {}, + None, False, # Should not dispatch for non-HTTP events ), ( @@ -196,6 +203,7 @@ "Hello, World!", "200", {"content-type": "application/json"}, + "Hello, World!", True, ), ( @@ -204,6 +212,7 @@ {"message": "Hello, World!"}, "200", {"content-type": "application/json"}, + {"message": "Hello, World!"}, True, ), ] @@ -326,7 +335,7 @@ def test_asm_start_request_parametrized( @pytest.mark.parametrize( - "name,event_file,response,status_code,expected_headers,should_dispatch", + "name,event_file,response,status_code,expected_headers,expected_body,should_dispatch", ASM_START_RESPONSE_TEST_CASES, ) @patch("datadog_lambda.asm.core") @@ -337,6 +346,7 @@ def test_asm_start_response_parametrized( response, status_code, expected_headers, + expected_body, should_dispatch, ): """Test ASM start response for various HTTP event types using parametrization""" @@ -355,18 +365,17 @@ def test_asm_start_response_parametrized( asm_start_response(mock_span, status_code, event_source, response) if should_dispatch: - # Verify core.dispatch was called - mock_core.dispatch.assert_called_once() - call_args = mock_core.dispatch.call_args - assert call_args[0][0] == "aws_lambda.start_response" - - # Extract the dispatched arguments - dispatch_args = call_args[0][1] - span, response_status_code, response_headers = dispatch_args - - assert span == mock_span - assert response_status_code == status_code - assert response_headers == expected_headers + assert mock_core.dispatch.call_count == 2 + + assert mock_core.dispatch.call_args_list[0].args == ( + "aws_lambda.start_response", + (mock_span, status_code, expected_headers), + ) + + assert mock_core.dispatch.call_args_list[1].args == ( + "aws_lambda.parse_body", + (expected_body,), + ) else: # Verify core.dispatch was not called for non-HTTP events mock_core.dispatch.assert_not_called() From 7806d7283bbf175da805adf35a8b3747bc60ab19 Mon Sep 17 00:00:00 2001 From: Zarir Hamza Date: Mon, 28 Jul 2025 15:41:47 -0400 Subject: [PATCH 053/164] Enhance Synthetic Span Service Representation (#635) * Update naming and corresponding tracer changes --- datadog_lambda/tracing.py | 65 +++++++-- pyproject.toml | 2 +- tests/event_samples/kinesisStream.json | 20 +++ .../logs/async-metrics_python310.log | 128 +++++++--------- .../logs/async-metrics_python311.log | 128 +++++++--------- .../logs/async-metrics_python312.log | 128 +++++++--------- .../logs/async-metrics_python313.log | 128 +++++++--------- .../snapshots/logs/async-metrics_python38.log | 128 +++++++--------- .../snapshots/logs/async-metrics_python39.log | 128 +++++++--------- .../snapshots/logs/sync-metrics_python310.log | 137 +++++++----------- .../snapshots/logs/sync-metrics_python311.log | 137 +++++++----------- .../snapshots/logs/sync-metrics_python312.log | 137 +++++++----------- .../snapshots/logs/sync-metrics_python313.log | 137 +++++++----------- .../snapshots/logs/sync-metrics_python38.log | 137 +++++++----------- .../snapshots/logs/sync-metrics_python39.log | 137 +++++++----------- tests/test_tracing.py | 72 ++++++--- 16 files changed, 726 insertions(+), 1023 deletions(-) create mode 100644 tests/event_samples/kinesisStream.json diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index f40574804..51157f6a7 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -4,6 +4,7 @@ # Copyright 2019 Datadog, Inc. import logging import os +import re import traceback import ujson as json from datetime import datetime, timezone @@ -856,15 +857,31 @@ def create_service_mapping(val): return new_service_mapping -def determine_service_name(service_mapping, specific_key, generic_key, default_value): - service_name = service_mapping.get(specific_key) - if service_name is None: - service_name = service_mapping.get(generic_key, default_value) - return service_name +def determine_service_name( + service_mapping, specific_key, generic_key, extracted_key, fallback=None +): + # Check for mapped service (specific key first, then generic key) + mapped_service = service_mapping.get(specific_key) or service_mapping.get( + generic_key + ) + if mapped_service: + return mapped_service + + # Check if AWS service representation is disabled + aws_service_representation = os.environ.get( + "DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED", "" + ).lower() + if aws_service_representation in ("false", "0"): + return fallback + + # Use extracted_key if it exists and is not empty, otherwise use fallback + return ( + extracted_key.strip() if extracted_key and extracted_key.strip() else fallback + ) # Initialization code -service_mapping_str = os.getenv("DD_SERVICE_MAPPING", "") +service_mapping_str = os.environ.get("DD_SERVICE_MAPPING", "") service_mapping = create_service_mapping(service_mapping_str) _dd_origin = {"_dd.origin": "lambda"} @@ -988,6 +1005,7 @@ def create_inferred_span_from_api_gateway_websocket_event( "http.url": http_url, "endpoint": endpoint, "resource_names": endpoint, + "span.kind": "server", "apiid": api_id, "apiname": api_id, "stage": request_context.get("stage"), @@ -1046,6 +1064,7 @@ def create_inferred_span_from_api_gateway_event( "endpoint": path, "http.method": method, "resource_names": resource, + "span.kind": "server", "apiid": api_id, "apiname": api_id, "stage": request_context.get("stage"), @@ -1150,12 +1169,13 @@ def create_inferred_span_from_sqs_event(event, context): event_source_arn = event_record.get("eventSourceARN") queue_name = event_source_arn.split(":")[-1] service_name = determine_service_name( - service_mapping, queue_name, "lambda_sqs", "sqs" + service_mapping, queue_name, "lambda_sqs", queue_name, "sqs" ) attrs = event_record.get("attributes") or {} tags = { "operation_name": "aws.sqs", "resource_names": queue_name, + "span.kind": "server", "queuename": queue_name, "event_source_arn": event_source_arn, "receipt_handle": event_record.get("receiptHandle"), @@ -1217,11 +1237,12 @@ def create_inferred_span_from_sns_event(event, context): topic_arn = sns_message.get("TopicArn") topic_name = topic_arn.split(":")[-1] service_name = determine_service_name( - service_mapping, topic_name, "lambda_sns", "sns" + service_mapping, topic_name, "lambda_sns", topic_name, "sns" ) tags = { "operation_name": "aws.sns", "resource_names": topic_name, + "span.kind": "server", "topicname": topic_name, "topic_arn": topic_arn, "message_id": sns_message.get("MessageId"), @@ -1252,15 +1273,16 @@ def create_inferred_span_from_kinesis_event(event, context): event_record = get_first_record(event) event_source_arn = event_record.get("eventSourceARN") event_id = event_record.get("eventID") - stream_name = event_source_arn.split(":")[-1] + stream_name = re.sub(r"^stream/", "", (event_source_arn or "").split(":")[-1]) shard_id = event_id.split(":")[0] service_name = determine_service_name( - service_mapping, stream_name, "lambda_kinesis", "kinesis" + service_mapping, stream_name, "lambda_kinesis", stream_name, "kinesis" ) kinesis = event_record.get("kinesis") or {} tags = { "operation_name": "aws.kinesis", "resource_names": stream_name, + "span.kind": "server", "streamname": stream_name, "shardid": shard_id, "event_source_arn": event_source_arn, @@ -1287,12 +1309,13 @@ def create_inferred_span_from_dynamodb_event(event, context): event_source_arn = event_record.get("eventSourceARN") table_name = event_source_arn.split("/")[1] service_name = determine_service_name( - service_mapping, table_name, "lambda_dynamodb", "dynamodb" + service_mapping, table_name, "lambda_dynamodb", table_name, "dynamodb" ) dynamodb_message = event_record.get("dynamodb") or {} tags = { "operation_name": "aws.dynamodb", "resource_names": table_name, + "span.kind": "server", "tablename": table_name, "event_source_arn": event_source_arn, "event_id": event_record.get("eventID"), @@ -1321,11 +1344,12 @@ def create_inferred_span_from_s3_event(event, context): obj = s3.get("object") or {} bucket_name = bucket.get("name") service_name = determine_service_name( - service_mapping, bucket_name, "lambda_s3", "s3" + service_mapping, bucket_name, "lambda_s3", bucket_name, "s3" ) tags = { "operation_name": "aws.s3", "resource_names": bucket_name, + "span.kind": "server", "event_name": event_record.get("eventName"), "bucketname": bucket_name, "bucket_arn": bucket.get("arn"), @@ -1351,11 +1375,12 @@ def create_inferred_span_from_s3_event(event, context): def create_inferred_span_from_eventbridge_event(event, context): source = event.get("source") service_name = determine_service_name( - service_mapping, source, "lambda_eventbridge", "eventbridge" + service_mapping, source, "lambda_eventbridge", source, "eventbridge" ) tags = { "operation_name": "aws.eventbridge", "resource_names": source, + "span.kind": "server", "detail_type": event.get("detail-type"), } InferredSpanInfo.set_tags( @@ -1429,9 +1454,21 @@ def create_function_execution_span( tags["_dd.parent_source"] = trace_context_source tags.update(trigger_tags) tracer.set_tags(_dd_origin) + # Determine service name based on config and env var + if config.service: + service_name = config.service + else: + aws_service_representation = os.environ.get( + "DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED", "" + ).lower() + if aws_service_representation in ("false", "0"): + service_name = "aws.lambda" + else: + service_name = function_name if function_name else "aws.lambda" + span = tracer.trace( "aws.lambda", - service="aws.lambda", + service=service_name, resource=function_name, span_type="serverless", ) diff --git a/pyproject.toml b/pyproject.toml index 9efbd0fae..77c08cb5c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ classifiers = [ python = ">=3.8.0,<4" datadog = ">=0.51.0,<1.0.0" wrapt = "^1.11.2" -ddtrace = ">=3.10.2,<4" +ddtrace = ">=3.11.0,<4" ujson = ">=5.9.0" botocore = { version = "^1.34.0", optional = true } requests = { version ="^2.22.0", optional = true } diff --git a/tests/event_samples/kinesisStream.json b/tests/event_samples/kinesisStream.json new file mode 100644 index 000000000..a320fc44f --- /dev/null +++ b/tests/event_samples/kinesisStream.json @@ -0,0 +1,20 @@ +{ + "Records": [ + { + "kinesis": { + "kinesisSchemaVersion": "1.0", + "partitionKey": "partitionkey", + "sequenceNumber": "49624230154685806402418173680709770494154422022871973922", + "data": "eyJmb28iOiAiYmFyIiwgIl9kYXRhZG9nIjogeyJ4LWRhdGFkb2ctdHJhY2UtaWQiOiAiNDk0ODM3NzMxNjM1NzI5MTQyMSIsICJ4LWRhdGFkb2ctcGFyZW50LWlkIjogIjI4NzYyNTMzODAwMTg2ODEwMjYiLCAieC1kYXRhZG9nLXNhbXBsaW5nLXByaW9yaXR5IjogIjEifX0=", + "approximateArrivalTimestamp": 1643638425.163 + }, + "eventSource": "aws:kinesis", + "eventVersion": "1.0", + "eventID": "shardId-000000000002:49624230154685806402418173680709770494154422022871973922", + "eventName": "aws:kinesis:record", + "invokeIdentityArn": "arn:aws:iam::601427279990:role/inferred-spans-python-dev-eu-west-1-lambdaRole", + "awsRegion": "eu-west-1", + "eventSourceARN": "arn:aws:kinesis:eu-west-1:601427279990:stream/kinesisStream" + } + ] +} diff --git a/tests/integration/snapshots/logs/async-metrics_python310.log b/tests/integration/snapshots/logs/async-metrics_python310.log index 6de63bec3..66351a990 100644 --- a/tests/integration/snapshots/logs/async-metrics_python310.log +++ b/tests/integration/snapshots/logs/async-metrics_python310.log @@ -59,6 +59,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "Prod", @@ -69,7 +70,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -85,7 +85,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python310", "name": "aws.lambda", "error": 0, @@ -108,8 +108,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -134,8 +133,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -162,8 +160,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -229,7 +226,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "dynamodb", + "service": "ExampleTableWithStream", "resource": "ExampleTableWithStream", "name": "aws.dynamodb", "error": 0, @@ -240,6 +237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.dynamodb", "resource_names": "ExampleTableWithStream", + "span.kind": "server", "tablename": "ExampleTableWithStream", "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "event_id": "XXXX", @@ -251,7 +249,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -299,7 +296,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python310", "name": "aws.lambda", "error": 0, @@ -317,8 +314,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -343,8 +339,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -371,8 +366,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -429,7 +423,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "eventbridge", + "service": "eventbridge.custom.event.sender", "resource": "eventbridge.custom.event.sender", "name": "aws.eventbridge", "error": 0, @@ -440,12 +434,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.eventbridge", "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", "detail_type": "testdetail", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -461,7 +455,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python310", "name": "aws.lambda", "error": 0, @@ -478,8 +472,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "function_trigger.event_source": "eventbridge", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source": "eventbridge" }, "metrics": { "_dd.top_level": 1 @@ -504,8 +497,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -532,8 +524,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -617,7 +608,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -633,7 +623,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python310", "name": "aws.lambda", "error": 0, @@ -656,8 +646,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -682,8 +671,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -710,8 +698,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -768,7 +755,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "kinesis", + "service": "EXAMPLE", "resource": "EXAMPLE", "name": "aws.kinesis", "error": 0, @@ -779,6 +766,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.kinesis", "resource_names": "EXAMPLE", + "span.kind": "server", "streamname": "EXAMPLE", "shardid": "shardId-XXXX", "event_source_arn": "arn:aws:kinesis:EXAMPLE", @@ -790,7 +778,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -806,7 +793,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python310", "name": "aws.lambda", "error": 0, @@ -824,8 +811,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "kinesis", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -850,8 +836,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -878,8 +863,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -936,7 +920,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "s3", + "service": "example-bucket", "resource": "example-bucket", "name": "aws.s3", "error": 0, @@ -945,6 +929,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.s3", "resource_names": "example-bucket", + "span.kind": "server", "event_name": "ObjectCreated:Put", "bucketname": "example-bucket", "bucket_arn": "arn:aws:s3:::example-bucket", @@ -955,7 +940,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -983,7 +967,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python310", "name": "aws.lambda", "error": 0, @@ -1001,8 +985,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "s3", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1027,8 +1010,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1055,8 +1037,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1113,7 +1094,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sns", + "service": "sns-lambda", "resource": "sns-lambda", "name": "aws.sns", "error": 0, @@ -1124,6 +1105,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sns", "resource_names": "sns-lambda", + "span.kind": "server", "topicname": "sns-lambda", "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "message_id": "XXXX", @@ -1133,7 +1115,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1149,7 +1130,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python310", "name": "aws.lambda", "error": 0, @@ -1167,8 +1148,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sns", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1193,8 +1173,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1221,8 +1200,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1279,7 +1257,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sqs", + "service": "my-queue", "resource": "my-queue", "name": "aws.sqs", "error": 0, @@ -1290,6 +1268,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sqs", "resource_names": "my-queue", + "span.kind": "server", "queuename": "my-queue", "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", @@ -1298,7 +1277,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1314,7 +1292,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python310", "name": "aws.lambda", "error": 0, @@ -1332,8 +1310,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sqs", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1358,8 +1335,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1386,8 +1362,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1457,6 +1432,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "dev", @@ -1469,7 +1445,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.status_code": "200", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1485,7 +1460,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python310", "name": "aws.lambda", "error": 0, @@ -1505,8 +1480,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -1531,8 +1505,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1559,8 +1532,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 diff --git a/tests/integration/snapshots/logs/async-metrics_python311.log b/tests/integration/snapshots/logs/async-metrics_python311.log index 18bd119dd..8e19e239d 100644 --- a/tests/integration/snapshots/logs/async-metrics_python311.log +++ b/tests/integration/snapshots/logs/async-metrics_python311.log @@ -59,6 +59,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "Prod", @@ -69,7 +70,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -85,7 +85,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python311", "name": "aws.lambda", "error": 0, @@ -108,8 +108,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -134,8 +133,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -162,8 +160,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -229,7 +226,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "dynamodb", + "service": "ExampleTableWithStream", "resource": "ExampleTableWithStream", "name": "aws.dynamodb", "error": 0, @@ -240,6 +237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.dynamodb", "resource_names": "ExampleTableWithStream", + "span.kind": "server", "tablename": "ExampleTableWithStream", "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "event_id": "XXXX", @@ -251,7 +249,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -299,7 +296,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python311", "name": "aws.lambda", "error": 0, @@ -317,8 +314,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -343,8 +339,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -371,8 +366,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -429,7 +423,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "eventbridge", + "service": "eventbridge.custom.event.sender", "resource": "eventbridge.custom.event.sender", "name": "aws.eventbridge", "error": 0, @@ -440,12 +434,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.eventbridge", "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", "detail_type": "testdetail", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -461,7 +455,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python311", "name": "aws.lambda", "error": 0, @@ -478,8 +472,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "function_trigger.event_source": "eventbridge", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source": "eventbridge" }, "metrics": { "_dd.top_level": 1 @@ -504,8 +497,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -532,8 +524,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -617,7 +608,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -633,7 +623,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python311", "name": "aws.lambda", "error": 0, @@ -656,8 +646,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -682,8 +671,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -710,8 +698,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -768,7 +755,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "kinesis", + "service": "EXAMPLE", "resource": "EXAMPLE", "name": "aws.kinesis", "error": 0, @@ -779,6 +766,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.kinesis", "resource_names": "EXAMPLE", + "span.kind": "server", "streamname": "EXAMPLE", "shardid": "shardId-XXXX", "event_source_arn": "arn:aws:kinesis:EXAMPLE", @@ -790,7 +778,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -806,7 +793,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python311", "name": "aws.lambda", "error": 0, @@ -824,8 +811,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "kinesis", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -850,8 +836,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -878,8 +863,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -936,7 +920,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "s3", + "service": "example-bucket", "resource": "example-bucket", "name": "aws.s3", "error": 0, @@ -945,6 +929,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.s3", "resource_names": "example-bucket", + "span.kind": "server", "event_name": "ObjectCreated:Put", "bucketname": "example-bucket", "bucket_arn": "arn:aws:s3:::example-bucket", @@ -955,7 +940,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -983,7 +967,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python311", "name": "aws.lambda", "error": 0, @@ -1001,8 +985,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "s3", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1027,8 +1010,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1055,8 +1037,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1113,7 +1094,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sns", + "service": "sns-lambda", "resource": "sns-lambda", "name": "aws.sns", "error": 0, @@ -1124,6 +1105,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sns", "resource_names": "sns-lambda", + "span.kind": "server", "topicname": "sns-lambda", "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "message_id": "XXXX", @@ -1133,7 +1115,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1149,7 +1130,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python311", "name": "aws.lambda", "error": 0, @@ -1167,8 +1148,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sns", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1193,8 +1173,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1221,8 +1200,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1279,7 +1257,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sqs", + "service": "my-queue", "resource": "my-queue", "name": "aws.sqs", "error": 0, @@ -1290,6 +1268,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sqs", "resource_names": "my-queue", + "span.kind": "server", "queuename": "my-queue", "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", @@ -1298,7 +1277,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1314,7 +1292,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python311", "name": "aws.lambda", "error": 0, @@ -1332,8 +1310,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sqs", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1358,8 +1335,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1386,8 +1362,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1457,6 +1432,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "dev", @@ -1469,7 +1445,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.status_code": "200", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1485,7 +1460,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python311", "name": "aws.lambda", "error": 0, @@ -1505,8 +1480,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -1531,8 +1505,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1559,8 +1532,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 diff --git a/tests/integration/snapshots/logs/async-metrics_python312.log b/tests/integration/snapshots/logs/async-metrics_python312.log index e884a96d3..9879d8754 100644 --- a/tests/integration/snapshots/logs/async-metrics_python312.log +++ b/tests/integration/snapshots/logs/async-metrics_python312.log @@ -59,6 +59,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "Prod", @@ -69,7 +70,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -85,7 +85,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python312", "name": "aws.lambda", "error": 0, @@ -108,8 +108,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -134,8 +133,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -162,8 +160,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -229,7 +226,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "dynamodb", + "service": "ExampleTableWithStream", "resource": "ExampleTableWithStream", "name": "aws.dynamodb", "error": 0, @@ -240,6 +237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.dynamodb", "resource_names": "ExampleTableWithStream", + "span.kind": "server", "tablename": "ExampleTableWithStream", "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "event_id": "XXXX", @@ -251,7 +249,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -299,7 +296,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python312", "name": "aws.lambda", "error": 0, @@ -317,8 +314,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -343,8 +339,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -371,8 +366,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -429,7 +423,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "eventbridge", + "service": "eventbridge.custom.event.sender", "resource": "eventbridge.custom.event.sender", "name": "aws.eventbridge", "error": 0, @@ -440,12 +434,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.eventbridge", "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", "detail_type": "testdetail", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -461,7 +455,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python312", "name": "aws.lambda", "error": 0, @@ -478,8 +472,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "function_trigger.event_source": "eventbridge", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source": "eventbridge" }, "metrics": { "_dd.top_level": 1 @@ -504,8 +497,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -532,8 +524,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -617,7 +608,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -633,7 +623,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python312", "name": "aws.lambda", "error": 0, @@ -656,8 +646,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -682,8 +671,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -710,8 +698,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -768,7 +755,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "kinesis", + "service": "EXAMPLE", "resource": "EXAMPLE", "name": "aws.kinesis", "error": 0, @@ -779,6 +766,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.kinesis", "resource_names": "EXAMPLE", + "span.kind": "server", "streamname": "EXAMPLE", "shardid": "shardId-XXXX", "event_source_arn": "arn:aws:kinesis:EXAMPLE", @@ -790,7 +778,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -806,7 +793,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python312", "name": "aws.lambda", "error": 0, @@ -824,8 +811,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "kinesis", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -850,8 +836,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -878,8 +863,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -936,7 +920,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "s3", + "service": "example-bucket", "resource": "example-bucket", "name": "aws.s3", "error": 0, @@ -945,6 +929,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.s3", "resource_names": "example-bucket", + "span.kind": "server", "event_name": "ObjectCreated:Put", "bucketname": "example-bucket", "bucket_arn": "arn:aws:s3:::example-bucket", @@ -955,7 +940,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -983,7 +967,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python312", "name": "aws.lambda", "error": 0, @@ -1001,8 +985,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "s3", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1027,8 +1010,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1055,8 +1037,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1113,7 +1094,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sns", + "service": "sns-lambda", "resource": "sns-lambda", "name": "aws.sns", "error": 0, @@ -1124,6 +1105,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sns", "resource_names": "sns-lambda", + "span.kind": "server", "topicname": "sns-lambda", "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "message_id": "XXXX", @@ -1133,7 +1115,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1149,7 +1130,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python312", "name": "aws.lambda", "error": 0, @@ -1167,8 +1148,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sns", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1193,8 +1173,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1221,8 +1200,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1279,7 +1257,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sqs", + "service": "my-queue", "resource": "my-queue", "name": "aws.sqs", "error": 0, @@ -1290,6 +1268,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sqs", "resource_names": "my-queue", + "span.kind": "server", "queuename": "my-queue", "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", @@ -1298,7 +1277,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1314,7 +1292,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python312", "name": "aws.lambda", "error": 0, @@ -1332,8 +1310,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sqs", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1358,8 +1335,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1386,8 +1362,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1457,6 +1432,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "dev", @@ -1469,7 +1445,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.status_code": "200", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1485,7 +1460,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python312", "name": "aws.lambda", "error": 0, @@ -1505,8 +1480,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -1531,8 +1505,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1559,8 +1532,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 diff --git a/tests/integration/snapshots/logs/async-metrics_python313.log b/tests/integration/snapshots/logs/async-metrics_python313.log index 3393f6842..92bb83efe 100644 --- a/tests/integration/snapshots/logs/async-metrics_python313.log +++ b/tests/integration/snapshots/logs/async-metrics_python313.log @@ -59,6 +59,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "Prod", @@ -69,7 +70,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -85,7 +85,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python313", "name": "aws.lambda", "error": 0, @@ -108,8 +108,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -134,8 +133,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -162,8 +160,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -229,7 +226,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "dynamodb", + "service": "ExampleTableWithStream", "resource": "ExampleTableWithStream", "name": "aws.dynamodb", "error": 0, @@ -240,6 +237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.dynamodb", "resource_names": "ExampleTableWithStream", + "span.kind": "server", "tablename": "ExampleTableWithStream", "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "event_id": "XXXX", @@ -251,7 +249,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -299,7 +296,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python313", "name": "aws.lambda", "error": 0, @@ -317,8 +314,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -343,8 +339,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -371,8 +366,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -429,7 +423,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "eventbridge", + "service": "eventbridge.custom.event.sender", "resource": "eventbridge.custom.event.sender", "name": "aws.eventbridge", "error": 0, @@ -440,12 +434,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.eventbridge", "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", "detail_type": "testdetail", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -461,7 +455,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python313", "name": "aws.lambda", "error": 0, @@ -478,8 +472,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "function_trigger.event_source": "eventbridge", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source": "eventbridge" }, "metrics": { "_dd.top_level": 1 @@ -504,8 +497,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -532,8 +524,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -617,7 +608,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -633,7 +623,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python313", "name": "aws.lambda", "error": 0, @@ -656,8 +646,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -682,8 +671,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -710,8 +698,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -768,7 +755,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "kinesis", + "service": "EXAMPLE", "resource": "EXAMPLE", "name": "aws.kinesis", "error": 0, @@ -779,6 +766,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.kinesis", "resource_names": "EXAMPLE", + "span.kind": "server", "streamname": "EXAMPLE", "shardid": "shardId-XXXX", "event_source_arn": "arn:aws:kinesis:EXAMPLE", @@ -790,7 +778,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -806,7 +793,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python313", "name": "aws.lambda", "error": 0, @@ -824,8 +811,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "kinesis", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -850,8 +836,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -878,8 +863,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -936,7 +920,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "s3", + "service": "example-bucket", "resource": "example-bucket", "name": "aws.s3", "error": 0, @@ -945,6 +929,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.s3", "resource_names": "example-bucket", + "span.kind": "server", "event_name": "ObjectCreated:Put", "bucketname": "example-bucket", "bucket_arn": "arn:aws:s3:::example-bucket", @@ -955,7 +940,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -983,7 +967,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python313", "name": "aws.lambda", "error": 0, @@ -1001,8 +985,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "s3", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1027,8 +1010,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1055,8 +1037,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1113,7 +1094,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sns", + "service": "sns-lambda", "resource": "sns-lambda", "name": "aws.sns", "error": 0, @@ -1124,6 +1105,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sns", "resource_names": "sns-lambda", + "span.kind": "server", "topicname": "sns-lambda", "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "message_id": "XXXX", @@ -1133,7 +1115,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1149,7 +1130,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python313", "name": "aws.lambda", "error": 0, @@ -1167,8 +1148,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sns", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1193,8 +1173,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1221,8 +1200,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1279,7 +1257,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sqs", + "service": "my-queue", "resource": "my-queue", "name": "aws.sqs", "error": 0, @@ -1290,6 +1268,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sqs", "resource_names": "my-queue", + "span.kind": "server", "queuename": "my-queue", "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", @@ -1298,7 +1277,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1314,7 +1292,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python313", "name": "aws.lambda", "error": 0, @@ -1332,8 +1310,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sqs", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1358,8 +1335,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1386,8 +1362,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1457,6 +1432,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "dev", @@ -1469,7 +1445,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.status_code": "200", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1485,7 +1460,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python313", "name": "aws.lambda", "error": 0, @@ -1505,8 +1480,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -1531,8 +1505,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1559,8 +1532,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 diff --git a/tests/integration/snapshots/logs/async-metrics_python38.log b/tests/integration/snapshots/logs/async-metrics_python38.log index 0495ba459..6c5021469 100644 --- a/tests/integration/snapshots/logs/async-metrics_python38.log +++ b/tests/integration/snapshots/logs/async-metrics_python38.log @@ -59,6 +59,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "Prod", @@ -69,7 +70,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -85,7 +85,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python38", "name": "aws.lambda", "error": 0, @@ -108,8 +108,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -134,8 +133,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -162,8 +160,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -229,7 +226,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "dynamodb", + "service": "ExampleTableWithStream", "resource": "ExampleTableWithStream", "name": "aws.dynamodb", "error": 0, @@ -240,6 +237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.dynamodb", "resource_names": "ExampleTableWithStream", + "span.kind": "server", "tablename": "ExampleTableWithStream", "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "event_id": "XXXX", @@ -251,7 +249,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -299,7 +296,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python38", "name": "aws.lambda", "error": 0, @@ -317,8 +314,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -343,8 +339,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -371,8 +366,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -429,7 +423,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "eventbridge", + "service": "eventbridge.custom.event.sender", "resource": "eventbridge.custom.event.sender", "name": "aws.eventbridge", "error": 0, @@ -440,12 +434,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.eventbridge", "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", "detail_type": "testdetail", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -461,7 +455,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python38", "name": "aws.lambda", "error": 0, @@ -478,8 +472,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "function_trigger.event_source": "eventbridge", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source": "eventbridge" }, "metrics": { "_dd.top_level": 1 @@ -504,8 +497,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -532,8 +524,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -617,7 +608,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -633,7 +623,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python38", "name": "aws.lambda", "error": 0, @@ -656,8 +646,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -682,8 +671,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -710,8 +698,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -768,7 +755,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "kinesis", + "service": "EXAMPLE", "resource": "EXAMPLE", "name": "aws.kinesis", "error": 0, @@ -779,6 +766,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.kinesis", "resource_names": "EXAMPLE", + "span.kind": "server", "streamname": "EXAMPLE", "shardid": "shardId-XXXX", "event_source_arn": "arn:aws:kinesis:EXAMPLE", @@ -790,7 +778,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -806,7 +793,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python38", "name": "aws.lambda", "error": 0, @@ -824,8 +811,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "kinesis", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -850,8 +836,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -878,8 +863,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -936,7 +920,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "s3", + "service": "example-bucket", "resource": "example-bucket", "name": "aws.s3", "error": 0, @@ -945,6 +929,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.s3", "resource_names": "example-bucket", + "span.kind": "server", "event_name": "ObjectCreated:Put", "bucketname": "example-bucket", "bucket_arn": "arn:aws:s3:::example-bucket", @@ -955,7 +940,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -983,7 +967,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python38", "name": "aws.lambda", "error": 0, @@ -1001,8 +985,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "s3", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1027,8 +1010,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1055,8 +1037,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1113,7 +1094,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sns", + "service": "sns-lambda", "resource": "sns-lambda", "name": "aws.sns", "error": 0, @@ -1124,6 +1105,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sns", "resource_names": "sns-lambda", + "span.kind": "server", "topicname": "sns-lambda", "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "message_id": "XXXX", @@ -1133,7 +1115,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1149,7 +1130,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python38", "name": "aws.lambda", "error": 0, @@ -1167,8 +1148,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sns", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1193,8 +1173,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1221,8 +1200,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1279,7 +1257,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sqs", + "service": "my-queue", "resource": "my-queue", "name": "aws.sqs", "error": 0, @@ -1290,6 +1268,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sqs", "resource_names": "my-queue", + "span.kind": "server", "queuename": "my-queue", "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", @@ -1298,7 +1277,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1314,7 +1292,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python38", "name": "aws.lambda", "error": 0, @@ -1332,8 +1310,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sqs", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1358,8 +1335,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1386,8 +1362,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1457,6 +1432,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "dev", @@ -1469,7 +1445,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.status_code": "200", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1485,7 +1460,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python38", "name": "aws.lambda", "error": 0, @@ -1505,8 +1480,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -1531,8 +1505,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1559,8 +1532,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 diff --git a/tests/integration/snapshots/logs/async-metrics_python39.log b/tests/integration/snapshots/logs/async-metrics_python39.log index d2aad04c4..42bdaeb84 100644 --- a/tests/integration/snapshots/logs/async-metrics_python39.log +++ b/tests/integration/snapshots/logs/async-metrics_python39.log @@ -59,6 +59,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "Prod", @@ -69,7 +70,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -85,7 +85,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python39", "name": "aws.lambda", "error": 0, @@ -108,8 +108,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -134,8 +133,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -162,8 +160,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -229,7 +226,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "dynamodb", + "service": "ExampleTableWithStream", "resource": "ExampleTableWithStream", "name": "aws.dynamodb", "error": 0, @@ -240,6 +237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.dynamodb", "resource_names": "ExampleTableWithStream", + "span.kind": "server", "tablename": "ExampleTableWithStream", "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "event_id": "XXXX", @@ -251,7 +249,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -299,7 +296,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python39", "name": "aws.lambda", "error": 0, @@ -317,8 +314,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -343,8 +339,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -371,8 +366,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -429,7 +423,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "eventbridge", + "service": "eventbridge.custom.event.sender", "resource": "eventbridge.custom.event.sender", "name": "aws.eventbridge", "error": 0, @@ -440,12 +434,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.eventbridge", "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", "detail_type": "testdetail", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -461,7 +455,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python39", "name": "aws.lambda", "error": 0, @@ -478,8 +472,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "function_trigger.event_source": "eventbridge", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source": "eventbridge" }, "metrics": { "_dd.top_level": 1 @@ -504,8 +497,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -532,8 +524,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -617,7 +608,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -633,7 +623,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python39", "name": "aws.lambda", "error": 0, @@ -656,8 +646,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -682,8 +671,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -710,8 +698,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -768,7 +755,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "kinesis", + "service": "EXAMPLE", "resource": "EXAMPLE", "name": "aws.kinesis", "error": 0, @@ -779,6 +766,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.kinesis", "resource_names": "EXAMPLE", + "span.kind": "server", "streamname": "EXAMPLE", "shardid": "shardId-XXXX", "event_source_arn": "arn:aws:kinesis:EXAMPLE", @@ -790,7 +778,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -806,7 +793,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python39", "name": "aws.lambda", "error": 0, @@ -824,8 +811,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "kinesis", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -850,8 +836,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -878,8 +863,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -936,7 +920,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "s3", + "service": "example-bucket", "resource": "example-bucket", "name": "aws.s3", "error": 0, @@ -945,6 +929,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.s3", "resource_names": "example-bucket", + "span.kind": "server", "event_name": "ObjectCreated:Put", "bucketname": "example-bucket", "bucket_arn": "arn:aws:s3:::example-bucket", @@ -955,7 +940,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -983,7 +967,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python39", "name": "aws.lambda", "error": 0, @@ -1001,8 +985,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "s3", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1027,8 +1010,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1055,8 +1037,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1113,7 +1094,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sns", + "service": "sns-lambda", "resource": "sns-lambda", "name": "aws.sns", "error": 0, @@ -1124,6 +1105,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sns", "resource_names": "sns-lambda", + "span.kind": "server", "topicname": "sns-lambda", "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "message_id": "XXXX", @@ -1133,7 +1115,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1149,7 +1130,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python39", "name": "aws.lambda", "error": 0, @@ -1167,8 +1148,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sns", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1193,8 +1173,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1221,8 +1200,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1279,7 +1257,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sqs", + "service": "my-queue", "resource": "my-queue", "name": "aws.sqs", "error": 0, @@ -1290,6 +1268,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sqs", "resource_names": "my-queue", + "span.kind": "server", "queuename": "my-queue", "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", @@ -1298,7 +1277,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1314,7 +1292,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python39", "name": "aws.lambda", "error": 0, @@ -1332,8 +1310,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sqs", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1358,8 +1335,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1386,8 +1362,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1457,6 +1432,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "dev", @@ -1469,7 +1445,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.status_code": "200", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1485,7 +1460,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-async-metrics_python39", "name": "aws.lambda", "error": 0, @@ -1505,8 +1480,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -1531,8 +1505,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1559,8 +1532,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index aa96b02d9..201ca82a7 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -39,6 +39,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "Prod", @@ -49,7 +50,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -65,7 +65,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python310", "name": "aws.lambda", "error": 0, @@ -88,8 +88,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -114,8 +113,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -142,8 +140,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -177,7 +174,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -229,7 +225,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "dynamodb", + "service": "ExampleTableWithStream", "resource": "ExampleTableWithStream", "name": "aws.dynamodb", "error": 0, @@ -240,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.dynamodb", "resource_names": "ExampleTableWithStream", + "span.kind": "server", "tablename": "ExampleTableWithStream", "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "event_id": "XXXX", @@ -251,7 +248,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -299,7 +295,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python310", "name": "aws.lambda", "error": 0, @@ -317,8 +313,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -343,8 +338,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -371,8 +365,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -406,7 +399,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -449,7 +441,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "eventbridge", + "service": "eventbridge.custom.event.sender", "resource": "eventbridge.custom.event.sender", "name": "aws.eventbridge", "error": 0, @@ -460,12 +452,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.eventbridge", "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", "detail_type": "testdetail", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -481,7 +473,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python310", "name": "aws.lambda", "error": 0, @@ -498,8 +490,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "function_trigger.event_source": "eventbridge", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source": "eventbridge" }, "metrics": { "_dd.top_level": 1 @@ -524,8 +515,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -552,8 +542,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -587,7 +576,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -657,7 +645,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -673,7 +660,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python310", "name": "aws.lambda", "error": 0, @@ -696,8 +683,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -722,8 +708,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -750,8 +735,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -785,7 +769,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -828,7 +811,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "kinesis", + "service": "EXAMPLE", "resource": "EXAMPLE", "name": "aws.kinesis", "error": 0, @@ -839,6 +822,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.kinesis", "resource_names": "EXAMPLE", + "span.kind": "server", "streamname": "EXAMPLE", "shardid": "shardId-XXXX", "event_source_arn": "arn:aws:kinesis:EXAMPLE", @@ -850,7 +834,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -866,7 +849,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python310", "name": "aws.lambda", "error": 0, @@ -884,8 +867,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "kinesis", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -910,8 +892,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -938,8 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -973,7 +953,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1016,7 +995,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "s3", + "service": "example-bucket", "resource": "example-bucket", "name": "aws.s3", "error": 0, @@ -1025,6 +1004,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.s3", "resource_names": "example-bucket", + "span.kind": "server", "event_name": "ObjectCreated:Put", "bucketname": "example-bucket", "bucket_arn": "arn:aws:s3:::example-bucket", @@ -1035,7 +1015,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1063,7 +1042,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python310", "name": "aws.lambda", "error": 0, @@ -1081,8 +1060,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "s3", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1107,8 +1085,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1135,8 +1112,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1170,7 +1146,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1213,7 +1188,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sns", + "service": "sns-lambda", "resource": "sns-lambda", "name": "aws.sns", "error": 0, @@ -1224,6 +1199,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sns", "resource_names": "sns-lambda", + "span.kind": "server", "topicname": "sns-lambda", "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "message_id": "XXXX", @@ -1233,7 +1209,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1249,7 +1224,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python310", "name": "aws.lambda", "error": 0, @@ -1267,8 +1242,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sns", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1293,8 +1267,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1321,8 +1294,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1356,7 +1328,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1399,7 +1370,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sqs", + "service": "my-queue", "resource": "my-queue", "name": "aws.sqs", "error": 0, @@ -1410,6 +1381,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sqs", "resource_names": "my-queue", + "span.kind": "server", "queuename": "my-queue", "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", @@ -1418,7 +1390,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1434,7 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python310", "name": "aws.lambda", "error": 0, @@ -1452,8 +1423,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sqs", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1478,8 +1448,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1506,8 +1475,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1541,7 +1509,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1597,6 +1564,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "dev", @@ -1609,7 +1577,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.status_code": "200", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1625,7 +1592,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python310", "name": "aws.lambda", "error": 0, @@ -1645,8 +1612,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -1671,8 +1637,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1699,8 +1664,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1734,7 +1698,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index 91ae2e516..564db4a94 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -39,6 +39,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "Prod", @@ -49,7 +50,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -65,7 +65,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python311", "name": "aws.lambda", "error": 0, @@ -88,8 +88,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -114,8 +113,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -142,8 +140,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -177,7 +174,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -229,7 +225,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "dynamodb", + "service": "ExampleTableWithStream", "resource": "ExampleTableWithStream", "name": "aws.dynamodb", "error": 0, @@ -240,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.dynamodb", "resource_names": "ExampleTableWithStream", + "span.kind": "server", "tablename": "ExampleTableWithStream", "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "event_id": "XXXX", @@ -251,7 +248,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -299,7 +295,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python311", "name": "aws.lambda", "error": 0, @@ -317,8 +313,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -343,8 +338,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -371,8 +365,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -406,7 +399,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -449,7 +441,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "eventbridge", + "service": "eventbridge.custom.event.sender", "resource": "eventbridge.custom.event.sender", "name": "aws.eventbridge", "error": 0, @@ -460,12 +452,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.eventbridge", "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", "detail_type": "testdetail", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -481,7 +473,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python311", "name": "aws.lambda", "error": 0, @@ -498,8 +490,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "function_trigger.event_source": "eventbridge", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source": "eventbridge" }, "metrics": { "_dd.top_level": 1 @@ -524,8 +515,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -552,8 +542,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -587,7 +576,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -657,7 +645,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -673,7 +660,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python311", "name": "aws.lambda", "error": 0, @@ -696,8 +683,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -722,8 +708,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -750,8 +735,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -785,7 +769,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -828,7 +811,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "kinesis", + "service": "EXAMPLE", "resource": "EXAMPLE", "name": "aws.kinesis", "error": 0, @@ -839,6 +822,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.kinesis", "resource_names": "EXAMPLE", + "span.kind": "server", "streamname": "EXAMPLE", "shardid": "shardId-XXXX", "event_source_arn": "arn:aws:kinesis:EXAMPLE", @@ -850,7 +834,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -866,7 +849,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python311", "name": "aws.lambda", "error": 0, @@ -884,8 +867,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "kinesis", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -910,8 +892,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -938,8 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -973,7 +953,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1016,7 +995,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "s3", + "service": "example-bucket", "resource": "example-bucket", "name": "aws.s3", "error": 0, @@ -1025,6 +1004,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.s3", "resource_names": "example-bucket", + "span.kind": "server", "event_name": "ObjectCreated:Put", "bucketname": "example-bucket", "bucket_arn": "arn:aws:s3:::example-bucket", @@ -1035,7 +1015,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1063,7 +1042,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python311", "name": "aws.lambda", "error": 0, @@ -1081,8 +1060,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "s3", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1107,8 +1085,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1135,8 +1112,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1170,7 +1146,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1213,7 +1188,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sns", + "service": "sns-lambda", "resource": "sns-lambda", "name": "aws.sns", "error": 0, @@ -1224,6 +1199,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sns", "resource_names": "sns-lambda", + "span.kind": "server", "topicname": "sns-lambda", "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "message_id": "XXXX", @@ -1233,7 +1209,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1249,7 +1224,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python311", "name": "aws.lambda", "error": 0, @@ -1267,8 +1242,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sns", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1293,8 +1267,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1321,8 +1294,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1356,7 +1328,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1399,7 +1370,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sqs", + "service": "my-queue", "resource": "my-queue", "name": "aws.sqs", "error": 0, @@ -1410,6 +1381,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sqs", "resource_names": "my-queue", + "span.kind": "server", "queuename": "my-queue", "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", @@ -1418,7 +1390,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1434,7 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python311", "name": "aws.lambda", "error": 0, @@ -1452,8 +1423,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sqs", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1478,8 +1448,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1506,8 +1475,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1541,7 +1509,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1597,6 +1564,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "dev", @@ -1609,7 +1577,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.status_code": "200", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1625,7 +1592,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python311", "name": "aws.lambda", "error": 0, @@ -1645,8 +1612,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -1671,8 +1637,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1699,8 +1664,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1734,7 +1698,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index 81e897cad..6010a3641 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -39,6 +39,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "Prod", @@ -49,7 +50,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -65,7 +65,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python312", "name": "aws.lambda", "error": 0, @@ -88,8 +88,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -114,8 +113,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -142,8 +140,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -177,7 +174,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -229,7 +225,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "dynamodb", + "service": "ExampleTableWithStream", "resource": "ExampleTableWithStream", "name": "aws.dynamodb", "error": 0, @@ -240,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.dynamodb", "resource_names": "ExampleTableWithStream", + "span.kind": "server", "tablename": "ExampleTableWithStream", "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "event_id": "XXXX", @@ -251,7 +248,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -299,7 +295,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python312", "name": "aws.lambda", "error": 0, @@ -317,8 +313,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -343,8 +338,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -371,8 +365,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -406,7 +399,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -449,7 +441,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "eventbridge", + "service": "eventbridge.custom.event.sender", "resource": "eventbridge.custom.event.sender", "name": "aws.eventbridge", "error": 0, @@ -460,12 +452,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.eventbridge", "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", "detail_type": "testdetail", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -481,7 +473,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python312", "name": "aws.lambda", "error": 0, @@ -498,8 +490,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "function_trigger.event_source": "eventbridge", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source": "eventbridge" }, "metrics": { "_dd.top_level": 1 @@ -524,8 +515,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -552,8 +542,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -587,7 +576,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -657,7 +645,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -673,7 +660,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python312", "name": "aws.lambda", "error": 0, @@ -696,8 +683,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -722,8 +708,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -750,8 +735,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -785,7 +769,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -828,7 +811,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "kinesis", + "service": "EXAMPLE", "resource": "EXAMPLE", "name": "aws.kinesis", "error": 0, @@ -839,6 +822,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.kinesis", "resource_names": "EXAMPLE", + "span.kind": "server", "streamname": "EXAMPLE", "shardid": "shardId-XXXX", "event_source_arn": "arn:aws:kinesis:EXAMPLE", @@ -850,7 +834,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -866,7 +849,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python312", "name": "aws.lambda", "error": 0, @@ -884,8 +867,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "kinesis", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -910,8 +892,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -938,8 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -973,7 +953,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1016,7 +995,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "s3", + "service": "example-bucket", "resource": "example-bucket", "name": "aws.s3", "error": 0, @@ -1025,6 +1004,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.s3", "resource_names": "example-bucket", + "span.kind": "server", "event_name": "ObjectCreated:Put", "bucketname": "example-bucket", "bucket_arn": "arn:aws:s3:::example-bucket", @@ -1035,7 +1015,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1063,7 +1042,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python312", "name": "aws.lambda", "error": 0, @@ -1081,8 +1060,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "s3", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1107,8 +1085,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1135,8 +1112,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1170,7 +1146,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1213,7 +1188,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sns", + "service": "sns-lambda", "resource": "sns-lambda", "name": "aws.sns", "error": 0, @@ -1224,6 +1199,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sns", "resource_names": "sns-lambda", + "span.kind": "server", "topicname": "sns-lambda", "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "message_id": "XXXX", @@ -1233,7 +1209,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1249,7 +1224,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python312", "name": "aws.lambda", "error": 0, @@ -1267,8 +1242,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sns", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1293,8 +1267,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1321,8 +1294,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1356,7 +1328,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1399,7 +1370,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sqs", + "service": "my-queue", "resource": "my-queue", "name": "aws.sqs", "error": 0, @@ -1410,6 +1381,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sqs", "resource_names": "my-queue", + "span.kind": "server", "queuename": "my-queue", "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", @@ -1418,7 +1390,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1434,7 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python312", "name": "aws.lambda", "error": 0, @@ -1452,8 +1423,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sqs", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1478,8 +1448,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1506,8 +1475,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1541,7 +1509,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1597,6 +1564,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "dev", @@ -1609,7 +1577,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.status_code": "200", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1625,7 +1592,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python312", "name": "aws.lambda", "error": 0, @@ -1645,8 +1612,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -1671,8 +1637,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1699,8 +1664,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1734,7 +1698,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index 77376e6b5..21d033620 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -39,6 +39,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "Prod", @@ -49,7 +50,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -65,7 +65,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python313", "name": "aws.lambda", "error": 0, @@ -88,8 +88,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -114,8 +113,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -142,8 +140,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -177,7 +174,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -229,7 +225,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "dynamodb", + "service": "ExampleTableWithStream", "resource": "ExampleTableWithStream", "name": "aws.dynamodb", "error": 0, @@ -240,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.dynamodb", "resource_names": "ExampleTableWithStream", + "span.kind": "server", "tablename": "ExampleTableWithStream", "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "event_id": "XXXX", @@ -251,7 +248,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -299,7 +295,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python313", "name": "aws.lambda", "error": 0, @@ -317,8 +313,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -343,8 +338,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -371,8 +365,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -406,7 +399,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -449,7 +441,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "eventbridge", + "service": "eventbridge.custom.event.sender", "resource": "eventbridge.custom.event.sender", "name": "aws.eventbridge", "error": 0, @@ -460,12 +452,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.eventbridge", "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", "detail_type": "testdetail", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -481,7 +473,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python313", "name": "aws.lambda", "error": 0, @@ -498,8 +490,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "function_trigger.event_source": "eventbridge", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source": "eventbridge" }, "metrics": { "_dd.top_level": 1 @@ -524,8 +515,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -552,8 +542,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -587,7 +576,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -657,7 +645,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -673,7 +660,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python313", "name": "aws.lambda", "error": 0, @@ -696,8 +683,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -722,8 +708,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -750,8 +735,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -785,7 +769,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -828,7 +811,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "kinesis", + "service": "EXAMPLE", "resource": "EXAMPLE", "name": "aws.kinesis", "error": 0, @@ -839,6 +822,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.kinesis", "resource_names": "EXAMPLE", + "span.kind": "server", "streamname": "EXAMPLE", "shardid": "shardId-XXXX", "event_source_arn": "arn:aws:kinesis:EXAMPLE", @@ -850,7 +834,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -866,7 +849,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python313", "name": "aws.lambda", "error": 0, @@ -884,8 +867,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "kinesis", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -910,8 +892,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -938,8 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -973,7 +953,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1016,7 +995,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "s3", + "service": "example-bucket", "resource": "example-bucket", "name": "aws.s3", "error": 0, @@ -1025,6 +1004,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.s3", "resource_names": "example-bucket", + "span.kind": "server", "event_name": "ObjectCreated:Put", "bucketname": "example-bucket", "bucket_arn": "arn:aws:s3:::example-bucket", @@ -1035,7 +1015,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1063,7 +1042,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python313", "name": "aws.lambda", "error": 0, @@ -1081,8 +1060,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "s3", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1107,8 +1085,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1135,8 +1112,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1170,7 +1146,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1213,7 +1188,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sns", + "service": "sns-lambda", "resource": "sns-lambda", "name": "aws.sns", "error": 0, @@ -1224,6 +1199,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sns", "resource_names": "sns-lambda", + "span.kind": "server", "topicname": "sns-lambda", "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "message_id": "XXXX", @@ -1233,7 +1209,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1249,7 +1224,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python313", "name": "aws.lambda", "error": 0, @@ -1267,8 +1242,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sns", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1293,8 +1267,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1321,8 +1294,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1356,7 +1328,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1399,7 +1370,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sqs", + "service": "my-queue", "resource": "my-queue", "name": "aws.sqs", "error": 0, @@ -1410,6 +1381,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sqs", "resource_names": "my-queue", + "span.kind": "server", "queuename": "my-queue", "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", @@ -1418,7 +1390,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1434,7 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python313", "name": "aws.lambda", "error": 0, @@ -1452,8 +1423,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sqs", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1478,8 +1448,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1506,8 +1475,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1541,7 +1509,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1597,6 +1564,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "dev", @@ -1609,7 +1577,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.status_code": "200", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1625,7 +1592,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python313", "name": "aws.lambda", "error": 0, @@ -1645,8 +1612,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -1671,8 +1637,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1699,8 +1664,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1734,7 +1698,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" diff --git a/tests/integration/snapshots/logs/sync-metrics_python38.log b/tests/integration/snapshots/logs/sync-metrics_python38.log index ddc8d7510..a68289046 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python38.log +++ b/tests/integration/snapshots/logs/sync-metrics_python38.log @@ -39,6 +39,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "Prod", @@ -49,7 +50,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -65,7 +65,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python38", "name": "aws.lambda", "error": 0, @@ -88,8 +88,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -114,8 +113,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -142,8 +140,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -177,7 +174,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -229,7 +225,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "dynamodb", + "service": "ExampleTableWithStream", "resource": "ExampleTableWithStream", "name": "aws.dynamodb", "error": 0, @@ -240,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.dynamodb", "resource_names": "ExampleTableWithStream", + "span.kind": "server", "tablename": "ExampleTableWithStream", "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "event_id": "XXXX", @@ -251,7 +248,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -299,7 +295,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python38", "name": "aws.lambda", "error": 0, @@ -317,8 +313,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -343,8 +338,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -371,8 +365,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -406,7 +399,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -449,7 +441,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "eventbridge", + "service": "eventbridge.custom.event.sender", "resource": "eventbridge.custom.event.sender", "name": "aws.eventbridge", "error": 0, @@ -460,12 +452,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.eventbridge", "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", "detail_type": "testdetail", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -481,7 +473,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python38", "name": "aws.lambda", "error": 0, @@ -498,8 +490,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "function_trigger.event_source": "eventbridge", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source": "eventbridge" }, "metrics": { "_dd.top_level": 1 @@ -524,8 +515,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -552,8 +542,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -587,7 +576,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -657,7 +645,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -673,7 +660,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python38", "name": "aws.lambda", "error": 0, @@ -696,8 +683,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -722,8 +708,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -750,8 +735,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -785,7 +769,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -828,7 +811,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "kinesis", + "service": "EXAMPLE", "resource": "EXAMPLE", "name": "aws.kinesis", "error": 0, @@ -839,6 +822,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.kinesis", "resource_names": "EXAMPLE", + "span.kind": "server", "streamname": "EXAMPLE", "shardid": "shardId-XXXX", "event_source_arn": "arn:aws:kinesis:EXAMPLE", @@ -850,7 +834,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -866,7 +849,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python38", "name": "aws.lambda", "error": 0, @@ -884,8 +867,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "kinesis", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -910,8 +892,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -938,8 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -973,7 +953,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1016,7 +995,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "s3", + "service": "example-bucket", "resource": "example-bucket", "name": "aws.s3", "error": 0, @@ -1025,6 +1004,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.s3", "resource_names": "example-bucket", + "span.kind": "server", "event_name": "ObjectCreated:Put", "bucketname": "example-bucket", "bucket_arn": "arn:aws:s3:::example-bucket", @@ -1035,7 +1015,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1063,7 +1042,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python38", "name": "aws.lambda", "error": 0, @@ -1081,8 +1060,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "s3", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1107,8 +1085,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1135,8 +1112,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1170,7 +1146,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1213,7 +1188,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sns", + "service": "sns-lambda", "resource": "sns-lambda", "name": "aws.sns", "error": 0, @@ -1224,6 +1199,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sns", "resource_names": "sns-lambda", + "span.kind": "server", "topicname": "sns-lambda", "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "message_id": "XXXX", @@ -1233,7 +1209,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1249,7 +1224,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python38", "name": "aws.lambda", "error": 0, @@ -1267,8 +1242,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sns", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1293,8 +1267,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1321,8 +1294,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1356,7 +1328,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1399,7 +1370,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sqs", + "service": "my-queue", "resource": "my-queue", "name": "aws.sqs", "error": 0, @@ -1410,6 +1381,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sqs", "resource_names": "my-queue", + "span.kind": "server", "queuename": "my-queue", "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", @@ -1418,7 +1390,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1434,7 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python38", "name": "aws.lambda", "error": 0, @@ -1452,8 +1423,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sqs", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1478,8 +1448,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1506,8 +1475,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1541,7 +1509,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1597,6 +1564,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "dev", @@ -1609,7 +1577,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.status_code": "200", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1625,7 +1592,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python38", "name": "aws.lambda", "error": 0, @@ -1645,8 +1612,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -1671,8 +1637,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1699,8 +1664,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1734,7 +1698,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" diff --git a/tests/integration/snapshots/logs/sync-metrics_python39.log b/tests/integration/snapshots/logs/sync-metrics_python39.log index 128319f6c..6a8d692e9 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python39.log +++ b/tests/integration/snapshots/logs/sync-metrics_python39.log @@ -39,6 +39,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "Prod", @@ -49,7 +50,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -65,7 +65,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python39", "name": "aws.lambda", "error": 0, @@ -88,8 +88,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/Prod/", "http.method": "GET", "http.route": "/", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -114,8 +113,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -142,8 +140,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -177,7 +174,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -229,7 +225,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "dynamodb", + "service": "ExampleTableWithStream", "resource": "ExampleTableWithStream", "name": "aws.dynamodb", "error": 0, @@ -240,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.dynamodb", "resource_names": "ExampleTableWithStream", + "span.kind": "server", "tablename": "ExampleTableWithStream", "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "event_id": "XXXX", @@ -251,7 +248,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -299,7 +295,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python39", "name": "aws.lambda", "error": 0, @@ -317,8 +313,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -343,8 +338,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -371,8 +365,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -406,7 +399,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -449,7 +441,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "eventbridge", + "service": "eventbridge.custom.event.sender", "resource": "eventbridge.custom.event.sender", "name": "aws.eventbridge", "error": 0, @@ -460,12 +452,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.eventbridge", "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", "detail_type": "testdetail", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -481,7 +473,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python39", "name": "aws.lambda", "error": 0, @@ -498,8 +490,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "function_trigger.event_source": "eventbridge", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source": "eventbridge" }, "metrics": { "_dd.top_level": 1 @@ -524,8 +515,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -552,8 +542,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -587,7 +576,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -657,7 +645,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.route": "/httpapi/get", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -673,7 +660,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python39", "name": "aws.lambda", "error": 0, @@ -696,8 +683,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url_details.path": "/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -722,8 +708,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -750,8 +735,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -785,7 +769,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -828,7 +811,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "kinesis", + "service": "EXAMPLE", "resource": "EXAMPLE", "name": "aws.kinesis", "error": 0, @@ -839,6 +822,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.kinesis", "resource_names": "EXAMPLE", + "span.kind": "server", "streamname": "EXAMPLE", "shardid": "shardId-XXXX", "event_source_arn": "arn:aws:kinesis:EXAMPLE", @@ -850,7 +834,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -866,7 +849,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python39", "name": "aws.lambda", "error": 0, @@ -884,8 +867,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "kinesis", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -910,8 +892,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -938,8 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -973,7 +953,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1016,7 +995,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "s3", + "service": "example-bucket", "resource": "example-bucket", "name": "aws.s3", "error": 0, @@ -1025,6 +1004,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.s3", "resource_names": "example-bucket", + "span.kind": "server", "event_name": "ObjectCreated:Put", "bucketname": "example-bucket", "bucket_arn": "arn:aws:s3:::example-bucket", @@ -1035,7 +1015,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1063,7 +1042,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python39", "name": "aws.lambda", "error": 0, @@ -1081,8 +1060,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "s3", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1107,8 +1085,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1135,8 +1112,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1170,7 +1146,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1213,7 +1188,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sns", + "service": "sns-lambda", "resource": "sns-lambda", "name": "aws.sns", "error": 0, @@ -1224,6 +1199,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sns", "resource_names": "sns-lambda", + "span.kind": "server", "topicname": "sns-lambda", "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "message_id": "XXXX", @@ -1233,7 +1209,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1249,7 +1224,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python39", "name": "aws.lambda", "error": 0, @@ -1267,8 +1242,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sns", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1293,8 +1267,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1321,8 +1294,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1356,7 +1328,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1399,7 +1370,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "sqs", + "service": "my-queue", "resource": "my-queue", "name": "aws.sqs", "error": 0, @@ -1410,6 +1381,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.origin": "lambda", "operation_name": "aws.sqs", "resource_names": "my-queue", + "span.kind": "server", "queuename": "my-queue", "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", @@ -1418,7 +1390,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1434,7 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python39", "name": "aws.lambda", "error": 0, @@ -1452,8 +1423,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "dd_trace": "X.X.X", "span.name": "aws.lambda", "function_trigger.event_source": "sqs", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" + "function_trigger.event_source_arn": "XXXX" }, "metrics": { "_dd.top_level": 1 @@ -1478,8 +1448,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1506,8 +1475,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1541,7 +1509,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1597,6 +1564,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", "endpoint": "$default", "resource_names": "$default", + "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", "stage": "dev", @@ -1609,7 +1577,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.status_code": "200", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" @@ -1625,7 +1592,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "trace_id": "XXXX", "parent_id": "XXXX", "span_id": "XXXX", - "service": "aws.lambda", + "service": "integration-tests-python", "resource": "integration-tests-python-XXXX-sync-metrics_python39", "name": "aws.lambda", "error": 0, @@ -1645,8 +1612,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.status_code": "200", - "_dd.base_service": "integration-tests-python" + "http.status_code": "200" }, "metrics": { "_dd.top_level": 1 @@ -1671,8 +1637,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://datadoghq.com/", "out.host": "datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1, @@ -1699,8 +1664,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "http.url": "https://www.datadoghq.com/", "out.host": "www.datadoghq.com", "http.status_code": "200", - "http.useragent": "python-requests/X.X.X", - "_dd.base_service": "integration-tests-python" + "http.useragent": "python-requests/X.X.X" }, "metrics": { "_dd.measured": 1 @@ -1734,7 +1698,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "out.host": "api.datadoghq.com", "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", - "_dd.base_service": "integration-tests-python", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", "language": "python" diff --git a/tests/test_tracing.py b/tests/test_tracing.py index fcedd5164..c87a09711 100644 --- a/tests/test_tracing.py +++ b/tests/test_tracing.py @@ -1284,6 +1284,42 @@ def test_determine_service_name(self): "default", ) + # Test with DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED set to false + os.environ["DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED"] = "false" + self.assertEqual( + determine_service_name( + self.get_service_mapping(), "api4", "api4", "extracted", "fallback" + ), + "fallback", + ) + + # Test with DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED set to 0 + os.environ["DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED"] = "0" + self.assertEqual( + determine_service_name( + self.get_service_mapping(), "api4", "api4", "extracted", "fallback" + ), + "fallback", + ) + + # Test with DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED not set (default behavior) + if "DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED" in os.environ: + del os.environ["DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED"] + self.assertEqual( + determine_service_name( + self.get_service_mapping(), "api4", "api4", "extracted", "fallback" + ), + "extracted", + ) + + # Test with empty extracted key + self.assertEqual( + determine_service_name( + self.get_service_mapping(), "api4", "api4", " ", "fallback" + ), + "fallback", + ) + del os.environ["DD_SERVICE_MAPPING"] def test_remaps_all_inferred_span_service_names_from_api_gateway_event(self): @@ -1478,7 +1514,7 @@ def test_remaps_specific_inferred_span_service_names_from_sqs_event(self): ] = "arn:aws:sqs:eu-west-1:123456789012:different-sqs-url" span2 = create_inferred_span(event2, ctx) self.assertEqual(span2.get_tag("operation_name"), "aws.sqs") - self.assertEqual(span2.service, "sqs") + self.assertEqual(span2.service, "different-sqs-url") def test_remaps_all_inferred_span_service_names_from_sns_event(self): self.set_service_mapping({"lambda_sns": "new-name"}) @@ -1524,7 +1560,7 @@ def test_remaps_specific_inferred_span_service_names_from_sns_event(self): ] = "arn:aws:sns:us-west-2:123456789012:different-sns-topic" span2 = create_inferred_span(event2, ctx) self.assertEqual(span2.get_tag("operation_name"), "aws.sns") - self.assertEqual(span2.service, "sns") + self.assertEqual(span2.service, "different-sns-topic") def test_remaps_all_inferred_span_service_names_from_kinesis_event(self): self.set_service_mapping({"lambda_kinesis": "new-name"}) @@ -1561,7 +1597,7 @@ def test_remaps_specific_inferred_span_service_names_from_kinesis_event(self): span1 = create_inferred_span(original_event, ctx) self.assertEqual(span1.get_tag("operation_name"), "aws.kinesis") - self.assertEqual(span1.service, "kinesis") + self.assertEqual(span1.service, "kinesisStream") # Testing the second event event2 = copy.deepcopy(original_event) @@ -1570,7 +1606,7 @@ def test_remaps_specific_inferred_span_service_names_from_kinesis_event(self): ] = "arn:aws:kinesis:eu-west-1:601427279990:stream/DifferentKinesisStream" span2 = create_inferred_span(event2, ctx) self.assertEqual(span2.get_tag("operation_name"), "aws.kinesis") - self.assertEqual(span2.service, "kinesis") + self.assertEqual(span2.service, "DifferentKinesisStream") def test_remaps_all_inferred_span_service_names_from_s3_event(self): self.set_service_mapping({"lambda_s3": "new-name"}) @@ -1614,7 +1650,7 @@ def test_remaps_specific_inferred_span_service_names_from_s3_event(self): event2["Records"][0]["s3"]["bucket"]["name"] = "different-example-bucket" span2 = create_inferred_span(event2, ctx) self.assertEqual(span2.get_tag("operation_name"), "aws.s3") - self.assertEqual(span2.service, "s3") + self.assertEqual(span2.service, "different-example-bucket") def test_remaps_all_inferred_span_service_names_from_dynamodb_event(self): self.set_service_mapping({"lambda_dynamodb": "new-name"}) @@ -1660,7 +1696,7 @@ def test_remaps_specific_inferred_span_service_names_from_dynamodb_event(self): ] = "arn:aws:dynamodb:us-east-1:123456789012:table/DifferentExampleTableWithStream/stream/2015-06-27T00:48:05.899" span2 = create_inferred_span(event2, ctx) self.assertEqual(span2.get_tag("operation_name"), "aws.dynamodb") - self.assertEqual(span2.service, "dynamodb") + self.assertEqual(span2.service, "DifferentExampleTableWithStream") def test_remaps_all_inferred_span_service_names_from_eventbridge_event(self): self.set_service_mapping({"lambda_eventbridge": "new-name"}) @@ -1704,7 +1740,7 @@ def test_remaps_specific_inferred_span_service_names_from_eventbridge_event( event2["source"] = "different.eventbridge.custom.event.sender" span2 = create_inferred_span(event2, ctx) self.assertEqual(span2.get_tag("operation_name"), "aws.eventbridge") - self.assertEqual(span2.service, "eventbridge") + self.assertEqual(span2.service, "different.eventbridge.custom.event.sender") class _Span(object): @@ -1927,7 +1963,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): ( "sqs-string-msg-attribute", _Span( - service="sqs", + service="InferredSpansQueueNode", start=1634662094.538, span_type="web", tags={ @@ -1945,7 +1981,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): ( "sns-string-msg-attribute", _Span( - service="sns", + service="serverlessTracingTopicPy", start=1643638421.637, span_type="web", tags={ @@ -1964,7 +2000,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): ( "sns-b64-msg-attribute", _Span( - service="sns", + service="serverlessTracingTopicPy", start=1643638421.637, span_type="web", tags={ @@ -1981,9 +2017,9 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): ), ), ( - "kinesis", + "kinesisStream", _Span( - service="kinesis", + service="kinesisStream", start=1643638425.163, span_type="web", tags={ @@ -2000,16 +2036,16 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "operation_name": "aws.kinesis", "partition_key": "partitionkey", "request_id": None, - "resource_names": "stream/kinesisStream", + "resource_names": "kinesisStream", "shardid": "shardId-000000000002", - "streamname": "stream/kinesisStream", + "streamname": "kinesisStream", }, ), ), ( "dynamodb", _Span( - service="dynamodb", + service="ExampleTableWithStream", start=1428537600.0, span_type="web", tags={ @@ -2035,7 +2071,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): ( "s3", _Span( - service="s3", + service="example-bucket", start=0.0, span_type="web", tags={ @@ -2060,7 +2096,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): ( "eventbridge-custom", _Span( - service="eventbridge", + service="eventbridge.custom.event.sender", start=1635989865.0, span_type="web", tags={ @@ -2079,7 +2115,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): ( "eventbridge-sqs", _Span( - service="sqs", + service="eventbridge-sqs-queue", start=1691102943.638, span_type="web", parent_name="aws.eventbridge", From f8b610dacdc1bcd27873d81fd79b040f3729d914 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Tue, 29 Jul 2025 11:23:43 -0400 Subject: [PATCH 054/164] v8.113.0 (#640) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index ae708026a..7fb332f27 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "7.113.0.dev0" +__version__ = "8.113.0" diff --git a/pyproject.toml b/pyproject.toml index 77c08cb5c..1ef66fd54 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "7.113.0.dev0" +version = "8.113.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From f1a4cb4f52abd42f99a42d8764963fd0c0a9297d Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Tue, 29 Jul 2025 13:04:08 -0400 Subject: [PATCH 055/164] v8.114.0.dev0 (#642) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 7fb332f27..d5b71e8d9 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.113.0" +__version__ = "8.114.0.dev0" diff --git a/pyproject.toml b/pyproject.toml index 1ef66fd54..a2fc7b74c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.113.0" +version = "8.114.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From f2808fbe252fb9c97f8ec330a61ebf2e6b1e8fd9 Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Thu, 31 Jul 2025 09:36:08 +0200 Subject: [PATCH 056/164] feat(appsec): enable telemetry when appsec is enabled through the tracer and not the extension (#641) * feat(appsec): default to telemetry enabled * build: keep dist-info/METADATA files for SCA to work correctly --- Dockerfile | 7 +++++-- datadog_lambda/__init__.py | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 02910a783..771251295 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,8 +25,11 @@ RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_taint_tracki RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_stacktrace*.so # _stack_v2 may not exist for some versions of ddtrace (e.g. under python 3.13) RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/internal/datadog/profiling/stack_v2/_stack_v2.*.so -# remove *.dist-info directories except any entry_points.txt files -RUN find ./python/lib/$runtime/site-packages/*.dist-info -not -name "entry_points.txt" -type f -delete +# remove *.dist-info directories except any entry_points.txt files and METADATA files required for Appsec Software Composition Analysis +RUN find ./python/lib/$runtime/site-packages/*.dist-info \ + -type f \ + ! \( -name 'entry_points.txt' -o -name 'METADATA' \) \ + -delete RUN find ./python/lib/$runtime/site-packages -type d -empty -delete # Remove requests and dependencies diff --git a/datadog_lambda/__init__.py b/datadog_lambda/__init__.py index f319d2ed8..0166f077b 100644 --- a/datadog_lambda/__init__.py +++ b/datadog_lambda/__init__.py @@ -3,7 +3,10 @@ if os.environ.get("DD_INSTRUMENTATION_TELEMETRY_ENABLED") is None: - os.environ["DD_INSTRUMENTATION_TELEMETRY_ENABLED"] = "false" + # Telemetry is required for Appsec Software Composition Analysis + os.environ["DD_INSTRUMENTATION_TELEMETRY_ENABLED"] = os.environ.get( + "DD_APPSEC_ENABLED", "false" + ) if os.environ.get("DD_API_SECURITY_ENABLED") is None: os.environ["DD_API_SECURITY_ENABLED"] = "False" From 7bdc7d6659d0432170023fbd7371ef432de5f4d7 Mon Sep 17 00:00:00 2001 From: Yiming Luo Date: Mon, 4 Aug 2025 11:54:40 -0400 Subject: [PATCH 057/164] chore: Fix update_deps workflow (#607) --- .github/workflows/update_deps.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/update_deps.yml b/.github/workflows/update_deps.yml index 33a524b25..15a3ac665 100644 --- a/.github/workflows/update_deps.yml +++ b/.github/workflows/update_deps.yml @@ -25,18 +25,17 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: 3.7 + python-version: 3.13 - name: Update Dependencies run: | - curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python - - source $HOME/.poetry/env - poetry build + pip install poetry poetry update - name: Create Pull Request uses: peter-evans/create-pull-request@v3 with: + token: ${{ steps.generate_token.outputs.token }} commit-message: update dependencies title: Update Dependencies body: | From 2163fb49295bd8b654edea85f0713605967b272d Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Thu, 14 Aug 2025 11:40:24 -0700 Subject: [PATCH 058/164] Increase allowed layer package size. (#649) --- scripts/check_layer_size.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/check_layer_size.sh b/scripts/check_layer_size.sh index 0b835cb04..b7460976a 100755 --- a/scripts/check_layer_size.sh +++ b/scripts/check_layer_size.sh @@ -8,8 +8,8 @@ # Compares layer size to threshold, and fails if below that threshold set -e -MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 8 \* 1024) -MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 21 \* 1024) +MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 17 \* 1024 / 2) # 8704 KB +MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 23 \* 1024) # 23552 KB LAYER_FILES_PREFIX="datadog_lambda_py" From 6c296ab7d3121379cde00ea7e48f786736cfce4a Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Fri, 15 Aug 2025 13:01:51 -0700 Subject: [PATCH 059/164] Run e2e tests on each PR. (#584) --- ci/input_files/build.yaml.tpl | 74 ++++++++++++++++++++++++++++++++--- ci/publish_layers.sh | 8 ++++ 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/ci/input_files/build.yaml.tpl b/ci/input_files/build.yaml.tpl index 769f87f5c..8624a8060 100644 --- a/ci/input_files/build.yaml.tpl +++ b/ci/input_files/build.yaml.tpl @@ -1,8 +1,11 @@ +{{- $e2e_region := "us-west-2" -}} + stages: - build - test - sign - publish + - e2e .python-before-script: &python-before-script - pip install virtualenv @@ -56,11 +59,11 @@ check-layer-size ({{ $runtime.name }}-{{ $runtime.arch }}): stage: test tags: ["arch:amd64"] image: registry.ddbuild.io/images/docker:20.10 - needs: + needs: - build-layer ({{ $runtime.name }}-{{ $runtime.arch }}) dependencies: - build-layer ({{ $runtime.name }}-{{ $runtime.arch }}) - script: + script: - PYTHON_VERSION={{ $runtime.python_version }} ARCH={{ $runtime.arch }} ./scripts/check_layer_size.sh lint python: @@ -69,7 +72,7 @@ lint python: image: registry.ddbuild.io/images/mirror/python:{{ $runtime.image }} cache: &{{ $runtime.name }}-{{ $runtime.arch }}-cache before_script: *python-before-script - script: + script: - source venv/bin/activate - ./scripts/check_format.sh @@ -79,7 +82,7 @@ unit-test ({{ $runtime.name }}-{{ $runtime.arch }}): image: registry.ddbuild.io/images/mirror/python:{{ $runtime.image }} cache: &{{ $runtime.name }}-{{ $runtime.arch }}-cache before_script: *python-before-script - script: + script: - source venv/bin/activate - pytest -vv @@ -87,7 +90,7 @@ integration-test ({{ $runtime.name }}-{{ $runtime.arch }}): stage: test tags: ["arch:amd64"] image: registry.ddbuild.io/images/docker:20.10-py3 - needs: + needs: - build-layer ({{ $runtime.name }}-{{ $runtime.arch }}) dependencies: - build-layer ({{ $runtime.name }}-{{ $runtime.arch }}) @@ -132,16 +135,22 @@ sign-layer ({{ $runtime.name }}-{{ $runtime.arch }}): - LAYER_FILE=datadog_lambda_py-{{ $runtime.arch}}-{{ $runtime.python_version }}.zip ./scripts/sign_layers.sh prod {{ range $environment_name, $environment := (ds "environments").environments }} +{{ $dotenv := print $runtime.name "_" $runtime.arch "_" $environment_name ".env" }} publish-layer-{{ $environment_name }} ({{ $runtime.name }}-{{ $runtime.arch }}): stage: publish tags: ["arch:amd64"] image: registry.ddbuild.io/images/docker:20.10-py3 rules: + - if: '"{{ $environment_name }}" == "sandbox" && $REGION == "{{ $e2e_region }}" && "{{ $runtime.arch }}" == "amd64"' + when: on_success - if: '"{{ $environment_name }}" == "sandbox"' when: manual allow_failure: true - if: '$CI_COMMIT_TAG =~ /^v.*/' + artifacts: + reports: + dotenv: {{ $dotenv }} needs: {{ if or (eq $environment_name "prod") }} - sign-layer ({{ $runtime.name }}-{{ $runtime.arch}}) @@ -166,7 +175,7 @@ publish-layer-{{ $environment_name }} ({{ $runtime.name }}-{{ $runtime.arch }}): before_script: - EXTERNAL_ID_NAME={{ $environment.external_id }} ROLE_TO_ASSUME={{ $environment.role_to_assume }} AWS_ACCOUNT={{ $environment.account }} source ./ci/get_secrets.sh script: - - STAGE={{ $environment_name }} PYTHON_VERSION={{ $runtime.python_version }} ARCH={{ $runtime.arch }} ./ci/publish_layers.sh + - STAGE={{ $environment_name }} PYTHON_VERSION={{ $runtime.python_version }} ARCH={{ $runtime.arch }} DOTENV={{ $dotenv }} ./ci/publish_layers.sh {{- end }} @@ -232,3 +241,56 @@ signed layer bundle: - rm -rf datadog_lambda_py-signed-bundle-${CI_JOB_ID} - mkdir -p datadog_lambda_py-signed-bundle-${CI_JOB_ID} - cp .layers/datadog_lambda_py-*.zip datadog_lambda_py-signed-bundle-${CI_JOB_ID} + +e2e-test: + stage: e2e + trigger: + project: DataDog/serverless-e2e-tests + strategy: depend + variables: + LANGUAGES_SUBSET: python + # These env vars are inherited from the dotenv reports of the publish-layer jobs + {{- range (ds "runtimes").runtimes }} + {{- if eq .arch "amd64" }} + {{- $version := print (.name | strings.Trim "python") }} + PYTHON_{{ $version }}_VERSION: $PYTHON_{{ $version }}_VERSION + {{- end }} + {{- end }} + needs: {{ range (ds "runtimes").runtimes }} + {{- if eq .arch "amd64" }} + - "publish-layer-sandbox ({{ .name }}-{{ .arch }}): [{{ $e2e_region }}]" + {{- end }} + {{- end }} + +e2e-test-status: + stage: e2e + image: registry.ddbuild.io/images/docker:20.10-py3 + tags: ["arch:amd64"] + timeout: 3h + script: | + GITLAB_API_TOKEN=$(aws ssm get-parameter --region us-east-1 --name "ci.${CI_PROJECT_NAME}.serverless-e2e-gitlab-token" --with-decryption --query "Parameter.Value" --out text) + URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/pipelines/${CI_PIPELINE_ID}/bridges" + echo "Fetching E2E job status from: $URL" + while true; do + RESPONSE=$(curl -s --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" "$URL") + E2E_JOB_STATUS=$(echo "$RESPONSE" | jq -r '.[] | select(.name=="e2e-test") | .downstream_pipeline.status') + echo -n "E2E job status: $E2E_JOB_STATUS, " + if [ "$E2E_JOB_STATUS" == "success" ]; then + echo "✅ E2E tests completed successfully" + exit 0 + elif [ "$E2E_JOB_STATUS" == "failed" ]; then + echo "❌ E2E tests failed" + exit 1 + elif [ "$E2E_JOB_STATUS" == "running" ]; then + echo "⏳ E2E tests are still running, retrying in 1 minute..." + elif [ "$E2E_JOB_STATUS" == "canceled" ]; then + echo "🚫 E2E tests were canceled" + exit 1 + elif [ "$E2E_JOB_STATUS" == "skipped" ]; then + echo "⏭️ E2E tests were skipped" + exit 0 + else + echo "❓ Unknown E2E test status: $E2E_JOB_STATUS, retrying in 1 minute..." + fi + sleep 60 + done diff --git a/ci/publish_layers.sh b/ci/publish_layers.sh index 58257bf11..9654582a2 100755 --- a/ci/publish_layers.sh +++ b/ci/publish_layers.sh @@ -199,6 +199,8 @@ fi while [ $latest_version -lt $VERSION ]; do latest_version=$(publish_layer $REGION $layer $aws_cli_python_version_key $layer_path) printf "[$REGION] Published version $latest_version for layer $layer in region $REGION\n" + latest_arn=$(aws lambda get-layer-version --layer-name $layer --version-number $latest_version --region $REGION --query 'LayerVersionArn' --output text) + printf "[$REGION] Published arn $latest_arn\n" # This shouldn't happen unless someone manually deleted the latest version, say 28, and # then tries to republish 28 again. The published version would actually be 29, because @@ -209,4 +211,10 @@ while [ $latest_version -lt $VERSION ]; do fi done +if [ -n "$DOTENV" ]; then + printf "[$REGION] Exporting layer version to $DOTENV file...\n" + echo "PYTHON_${PYTHON_VERSION/./}_VERSION=$latest_arn" >> "$DOTENV" + cat "$DOTENV" +fi + printf "[$REGION] Finished publishing layers...\n\n" From db673844725793182e20f8a45fcfac90a9789fe9 Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Mon, 18 Aug 2025 09:18:19 +0200 Subject: [PATCH 060/164] fix(appsec): enable appsec through the ddtrace product interface (#647) --- datadog_lambda/wrapper.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 494556257..28c7ae88d 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -53,6 +53,9 @@ asm_start_request, get_asm_blocked_response, ) + from ddtrace.internal.appsec.product import start + + start() if config.profiling_enabled: from ddtrace.profiling import profiler From 3b5260d2f2f846379787df284c6e3c0916ce027d Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Wed, 20 Aug 2025 10:31:31 +0200 Subject: [PATCH 061/164] build: use lambda image to ensure binary compatibility when building from source (#650) * build: use lambda python image instead of debian * use sam build-python images --- Dockerfile | 10 ++++++++++ scripts/build_layers.sh | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 771251295..ee4c7efdd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,6 +7,16 @@ ARG runtime RUN mkdir -p /build/python/lib/$runtime/site-packages WORKDIR /build +# Install newer version of GCC on AL2 +RUN set -eux; \ + if command -v yum >/dev/null 2>&1; then \ + yum -y install git gcc10 gcc10-c++; \ + cd /usr/bin; \ + rm gcc && ln -s gcc10-gcc gcc; \ + rm g++ && ln -s gcc10-g++ g++; \ + rm cc && ln -s gcc10-cc cc; \ + fi + # Add Rust compiler which is needed to build dd-trace-py from source RUN curl https://sh.rustup.rs -sSf | \ sh -s -- --default-toolchain stable -y diff --git a/scripts/build_layers.sh b/scripts/build_layers.sh index a0d6ee39d..23941b7a0 100755 --- a/scripts/build_layers.sh +++ b/scripts/build_layers.sh @@ -61,7 +61,7 @@ function docker_build_zip { # between different python runtimes. temp_dir=$(mktemp -d) docker buildx build -t datadog-lambda-python-${arch}:$1 . --no-cache \ - --build-arg image=public.ecr.aws/docker/library/python:$1 \ + --build-arg image=public.ecr.aws/sam/build-python$1:1 \ --build-arg runtime=python$1 \ --platform linux/${arch} \ --progress=plain \ From 33fcbce8e28c0938ebab6cb6a2b0775deec754d1 Mon Sep 17 00:00:00 2001 From: Taegyun Kim Date: Thu, 21 Aug 2025 05:33:46 +0900 Subject: [PATCH 062/164] chore(build): strip debug symbols using `strip -g` (#652) * chore(build): build dd-trace-py with release mode by default * does this make difference * debug print * try setting here * Revert "debug print" This reverts commit 07df11ac23f48c66d638ddefef811032afbaa4b6. * Revert "try setting here" This reverts commit 6f061439e3561ca88eb3d838e457f00ab7953ca9. * comment * debug print * aggressively strip debug symbols * remove debug print * update comments * can this work too? --- Dockerfile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Dockerfile b/Dockerfile index ee4c7efdd..36b236f08 100644 --- a/Dockerfile +++ b/Dockerfile @@ -72,5 +72,11 @@ RUN find ./python/lib/$runtime/site-packages/ddtrace -name \*.h -delete RUN find ./python/lib/$runtime/site-packages/ddtrace -name \*.hpp -delete RUN find ./python/lib/$runtime/site-packages/ddtrace -name \*.pyx -delete +# Strip debug symbols using strip -g for all .so files in ddtrace. This is to +# reduce the size when ddtrace is built from sources. The release wheels are +# already stripped of debug symbols. We should revisit this when serverless +# benchmark uses pre-built wheels instead of building from sources. +RUN find ./python/lib/$runtime/site-packages/ddtrace -name "*.so" -exec strip -g {} \; + FROM scratch COPY --from=builder /build/python / From 7184dafff0a729c4e32df325dfc4d49070a0f732 Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Fri, 29 Aug 2025 07:47:22 +0200 Subject: [PATCH 063/164] Re-remove more iast .so files (#653) * Re-remove more iast .so files * itr:noskip * Update MAX_LAYER_UNCOMPRESSED_SIZE_KB value --- Dockerfile | 1 + scripts/check_layer_size.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 36b236f08..8da968fb2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,6 +31,7 @@ RUN pip install --no-cache-dir . -t ./python/lib/$runtime/site-packages RUN rm -rf ./python/lib/$runtime/site-packages/botocore* RUN rm -rf ./python/lib/$runtime/site-packages/setuptools RUN rm -rf ./python/lib/$runtime/site-packages/jsonschema/tests +RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_ast/iastpatch*.so RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_taint_tracking/*.so RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_stacktrace*.so # _stack_v2 may not exist for some versions of ddtrace (e.g. under python 3.13) diff --git a/scripts/check_layer_size.sh b/scripts/check_layer_size.sh index b7460976a..27988e858 100755 --- a/scripts/check_layer_size.sh +++ b/scripts/check_layer_size.sh @@ -9,7 +9,7 @@ set -e MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 17 \* 1024 / 2) # 8704 KB -MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 23 \* 1024) # 23552 KB +MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 22 \* 1024) # 22528 KB LAYER_FILES_PREFIX="datadog_lambda_py" From b55e5382d91890d453302dc80a8378c01d1b5047 Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Wed, 3 Sep 2025 13:20:12 +0200 Subject: [PATCH 064/164] appsec: fixes for API Security (#654) --- datadog_lambda/__init__.py | 2 -- datadog_lambda/trigger.py | 2 +- .../logs/async-metrics_python310.log | 3 +++ .../logs/async-metrics_python311.log | 3 +++ .../logs/async-metrics_python312.log | 3 +++ .../logs/async-metrics_python313.log | 3 +++ .../snapshots/logs/async-metrics_python38.log | 3 +++ .../snapshots/logs/async-metrics_python39.log | 3 +++ .../snapshots/logs/sync-metrics_python310.log | 3 +++ .../snapshots/logs/sync-metrics_python311.log | 3 +++ .../snapshots/logs/sync-metrics_python312.log | 3 +++ .../snapshots/logs/sync-metrics_python313.log | 3 +++ .../snapshots/logs/sync-metrics_python38.log | 3 +++ .../snapshots/logs/sync-metrics_python39.log | 3 +++ tests/test_trigger.py | 20 +++++++++++++++---- 15 files changed, 53 insertions(+), 7 deletions(-) diff --git a/datadog_lambda/__init__.py b/datadog_lambda/__init__.py index 0166f077b..2034d3cbf 100644 --- a/datadog_lambda/__init__.py +++ b/datadog_lambda/__init__.py @@ -8,8 +8,6 @@ "DD_APPSEC_ENABLED", "false" ) -if os.environ.get("DD_API_SECURITY_ENABLED") is None: - os.environ["DD_API_SECURITY_ENABLED"] = "False" initialize_cold_start_tracing() diff --git a/datadog_lambda/trigger.py b/datadog_lambda/trigger.py index bbd0d027a..65800cf72 100644 --- a/datadog_lambda/trigger.py +++ b/datadog_lambda/trigger.py @@ -288,7 +288,7 @@ def extract_http_tags(event): """ Extracts HTTP facet tags from the triggering event """ - http_tags = {} + http_tags = {"span.kind": "server"} # Safely get request_context and ensure it's a dictionary request_context = event.get("requestContext") diff --git a/tests/integration/snapshots/logs/async-metrics_python310.log b/tests/integration/snapshots/logs/async-metrics_python310.log index 66351a990..d72afba39 100644 --- a/tests/integration/snapshots/logs/async-metrics_python310.log +++ b/tests/integration/snapshots/logs/async-metrics_python310.log @@ -104,6 +104,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", @@ -642,6 +643,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", @@ -1479,6 +1481,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python311.log b/tests/integration/snapshots/logs/async-metrics_python311.log index 8e19e239d..dac9c4277 100644 --- a/tests/integration/snapshots/logs/async-metrics_python311.log +++ b/tests/integration/snapshots/logs/async-metrics_python311.log @@ -104,6 +104,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", @@ -642,6 +643,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", @@ -1479,6 +1481,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python312.log b/tests/integration/snapshots/logs/async-metrics_python312.log index 9879d8754..c2b624ff3 100644 --- a/tests/integration/snapshots/logs/async-metrics_python312.log +++ b/tests/integration/snapshots/logs/async-metrics_python312.log @@ -104,6 +104,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", @@ -642,6 +643,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", @@ -1479,6 +1481,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python313.log b/tests/integration/snapshots/logs/async-metrics_python313.log index 92bb83efe..9a5e763f9 100644 --- a/tests/integration/snapshots/logs/async-metrics_python313.log +++ b/tests/integration/snapshots/logs/async-metrics_python313.log @@ -104,6 +104,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", @@ -642,6 +643,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", @@ -1479,6 +1481,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python38.log b/tests/integration/snapshots/logs/async-metrics_python38.log index 6c5021469..9e6370b5b 100644 --- a/tests/integration/snapshots/logs/async-metrics_python38.log +++ b/tests/integration/snapshots/logs/async-metrics_python38.log @@ -104,6 +104,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", @@ -642,6 +643,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", @@ -1479,6 +1481,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python39.log b/tests/integration/snapshots/logs/async-metrics_python39.log index 42bdaeb84..70f7a59f1 100644 --- a/tests/integration/snapshots/logs/async-metrics_python39.log +++ b/tests/integration/snapshots/logs/async-metrics_python39.log @@ -104,6 +104,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", @@ -642,6 +643,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", @@ -1479,6 +1481,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index 201ca82a7..7d504bdcb 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -84,6 +84,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", @@ -679,6 +680,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", @@ -1611,6 +1613,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index 564db4a94..aa242652d 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -84,6 +84,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", @@ -679,6 +680,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", @@ -1611,6 +1613,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index 6010a3641..99471eaf8 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -84,6 +84,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", @@ -679,6 +680,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", @@ -1611,6 +1613,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index 21d033620..e53aae508 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -84,6 +84,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", @@ -679,6 +680,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", @@ -1611,6 +1613,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python38.log b/tests/integration/snapshots/logs/sync-metrics_python38.log index a68289046..9cbf45648 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python38.log +++ b/tests/integration/snapshots/logs/sync-metrics_python38.log @@ -84,6 +84,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", @@ -679,6 +680,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", @@ -1611,6 +1613,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python39.log b/tests/integration/snapshots/logs/sync-metrics_python39.log index 6a8d692e9..cc0407c1b 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python39.log +++ b/tests/integration/snapshots/logs/sync-metrics_python39.log @@ -84,6 +84,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/Prod/", "http.method": "GET", @@ -679,6 +680,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", @@ -1611,6 +1613,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/test_trigger.py b/tests/test_trigger.py index 151039372..452635cfc 100644 --- a/tests/test_trigger.py +++ b/tests/test_trigger.py @@ -305,6 +305,7 @@ def test_extract_trigger_tags_api_gateway(self): "http.url_details.path": "/prod/path/to/resource", "http.method": "POST", "http.route": "/{proxy+}", + "span.kind": "server", }, ) @@ -324,6 +325,7 @@ def test_extract_trigger_tags_api_gateway_non_proxy(self): "http.url_details.path": "/dev/http/get", "http.method": "GET", "http.route": "/http/get", + "span.kind": "server", }, ) @@ -340,6 +342,7 @@ def test_extract_trigger_tags_api_gateway_websocket_connect(self): "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "arn:aws:apigateway:us-west-1::/restapis/p62c47itsb/stages/dev", "http.url": "https://p62c47itsb.execute-api.eu-west-1.amazonaws.com", + "span.kind": "server", }, ) @@ -356,6 +359,7 @@ def test_extract_trigger_tags_api_gateway_websocket_default(self): "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "arn:aws:apigateway:us-west-1::/restapis/p62c47itsb/stages/dev", "http.url": "https://p62c47itsb.execute-api.eu-west-1.amazonaws.com", + "span.kind": "server", }, ) @@ -372,6 +376,7 @@ def test_extract_trigger_tags_api_gateway_websocket_disconnect(self): "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "arn:aws:apigateway:us-west-1::/restapis/p62c47itsb/stages/dev", "http.url": "https://p62c47itsb.execute-api.eu-west-1.amazonaws.com", + "span.kind": "server", }, ) @@ -390,6 +395,7 @@ def test_extract_trigger_tags_api_gateway_http_api(self): "http.url": "https://x02yirxc7a.execute-api.eu-west-1.amazonaws.com", "http.url_details.path": "/httpapi/get", "http.method": "GET", + "span.kind": "server", "http.route": "/httpapi/get", }, ) @@ -408,6 +414,7 @@ def test_extract_trigger_tags_application_load_balancer(self): "function_trigger.event_source_arn": "arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/lambda-xyz/123abc", "http.url_details.path": "/lambda", "http.method": "GET", + "span.kind": "server", }, ) @@ -569,7 +576,12 @@ def test_extract_http_tags_with_invalid_request_context(self): http_tags = extract_http_tags(event) # Should still extract valid tags from the event self.assertEqual( - http_tags, {"http.url_details.path": "/test", "http.method": "GET"} + http_tags, + { + "span.kind": "server", + "http.url_details.path": "/test", + "http.method": "GET", + }, ) def test_extract_http_tags_with_invalid_apigateway_http(self): @@ -582,7 +594,7 @@ def test_extract_http_tags_with_invalid_apigateway_http(self): } http_tags = extract_http_tags(event) # Should not raise an exception - self.assertEqual(http_tags, {}) + self.assertEqual(http_tags, {"span.kind": "server"}) def test_extract_http_tags_with_invalid_headers(self): from datadog_lambda.trigger import extract_http_tags @@ -591,7 +603,7 @@ def test_extract_http_tags_with_invalid_headers(self): event = {"headers": "not_a_dict"} http_tags = extract_http_tags(event) # Should not raise an exception - self.assertEqual(http_tags, {}) + self.assertEqual(http_tags, {"span.kind": "server"}) def test_extract_http_tags_with_invalid_route(self): from datadog_lambda.trigger import extract_http_tags @@ -600,7 +612,7 @@ def test_extract_http_tags_with_invalid_route(self): event = {"routeKey": 12345} # Not a string http_tags = extract_http_tags(event) # Should not raise an exception - self.assertEqual(http_tags, {}) + self.assertEqual(http_tags, {"span.kind": "server"}) class ExtractHTTPStatusCodeTag(unittest.TestCase): From 9c93e475318d2044d5b2a142f374d529483e9d33 Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Fri, 5 Sep 2025 16:10:25 +0200 Subject: [PATCH 065/164] ci: add appsec system-tests to the ci (#651) --- .github/workflows/system_tests.yml | 38 ++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/workflows/system_tests.yml diff --git a/.github/workflows/system_tests.yml b/.github/workflows/system_tests.yml new file mode 100644 index 000000000..b61725b1a --- /dev/null +++ b/.github/workflows/system_tests.yml @@ -0,0 +1,38 @@ +name: System Tests + +on: + push: + branches: + - main + pull_request: + branches: + - "**" + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Build layer + run: | + ARCH=amd64 PYTHON_VERSION=3.13 ./scripts/build_layers.sh + + - uses: actions/upload-artifact@v4 + with: + path: .layers/datadog_lambda_py-amd64-3.13.zip + name: binaries + + system-tests: + needs: + - build + uses: DataDog/system-tests/.github/workflows/system-tests.yml@main + secrets: inherit + permissions: + contents: read + packages: write + with: + library: python_lambda + binaries_artifact: binaries + scenarios_groups: appsec + skip_empty_scenarios: true From b171bda519984959227f941012a8b28e3254e737 Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Tue, 9 Sep 2025 10:18:38 +0200 Subject: [PATCH 066/164] [APPSEC]: blocking for alb multi value headers events (#655) * fix: alb multi val headers also has multi val query params * appsec: fix blocking for alb multivalue headers events --- datadog_lambda/asm.py | 47 ++++++++++++------- datadog_lambda/trigger.py | 11 ++++- ...ion-load-balancer-multivalue-headers.json} | 2 +- tests/test_asm.py | 24 +++++++++- tests/test_trigger.py | 17 +++++++ 5 files changed, 79 insertions(+), 22 deletions(-) rename tests/event_samples/{application-load-balancer-mutivalue-headers.json => application-load-balancer-multivalue-headers.json} (96%) diff --git a/datadog_lambda/asm.py b/datadog_lambda/asm.py index 31f750d82..7bd8272f8 100644 --- a/datadog_lambda/asm.py +++ b/datadog_lambda/asm.py @@ -73,17 +73,16 @@ def asm_start_request( route: Optional[str] = None if event_source.event_type == EventTypes.ALB: - headers = event.get("headers") - multi_value_request_headers = event.get("multiValueHeaders") - if multi_value_request_headers: - request_headers = _to_single_value_headers(multi_value_request_headers) - else: - request_headers = headers or {} - raw_uri = event.get("path") - parsed_query = event.get("multiValueQueryStringParameters") or event.get( - "queryStringParameters" - ) + + if event_source.subtype == EventSubtypes.ALB: + request_headers = event.get("headers", {}) + parsed_query = event.get("queryStringParameters") + if event_source.subtype == EventSubtypes.ALB_MULTI_VALUE_HEADERS: + request_headers = _to_single_value_headers( + event.get("multiValueHeaders", {}) + ) + parsed_query = event.get("multiValueQueryStringParameters") elif event_source.event_type == EventTypes.LAMBDA_FUNCTION_URL: request_headers = event.get("headers", {}) @@ -226,15 +225,27 @@ def get_asm_blocked_response( content_type = blocked.get("content-type", "application/json") content = http_utils._get_blocked_template(content_type) - response_headers = { - "content-type": content_type, - } - if "location" in blocked: - response_headers["location"] = blocked["location"] - - return { + response = { "statusCode": blocked.get("status_code", 403), - "headers": response_headers, "body": content, "isBase64Encoded": False, } + + needs_multi_value_headers = event_source.equals( + EventTypes.ALB, EventSubtypes.ALB_MULTI_VALUE_HEADERS + ) + + if needs_multi_value_headers: + response["multiValueHeaders"] = { + "content-type": [content_type], + } + if "location" in blocked: + response["multiValueHeaders"]["location"] = [blocked["location"]] + else: + response["headers"] = { + "content-type": content_type, + } + if "location" in blocked: + response["headers"]["location"] = blocked["location"] + + return response diff --git a/datadog_lambda/trigger.py b/datadog_lambda/trigger.py index 65800cf72..e0c3c4fa1 100644 --- a/datadog_lambda/trigger.py +++ b/datadog_lambda/trigger.py @@ -54,6 +54,10 @@ class EventSubtypes(_stringTypedEnum): WEBSOCKET = "websocket" HTTP_API = "http-api" + ALB = "alb" # regular alb + # ALB with the multi-value headers option checked on the target group + ALB_MULTI_VALUE_HEADERS = "alb-multi-value-headers" + class _EventSource: """ @@ -133,7 +137,12 @@ def parse_event_source(event: dict) -> _EventSource: event_source.subtype = EventSubtypes.WEBSOCKET if request_context and request_context.get("elb"): - event_source = _EventSource(EventTypes.ALB) + if "multiValueHeaders" in event: + event_source = _EventSource( + EventTypes.ALB, EventSubtypes.ALB_MULTI_VALUE_HEADERS + ) + else: + event_source = _EventSource(EventTypes.ALB, EventSubtypes.ALB) if event.get("awslogs"): event_source = _EventSource(EventTypes.CLOUDWATCH_LOGS) diff --git a/tests/event_samples/application-load-balancer-mutivalue-headers.json b/tests/event_samples/application-load-balancer-multivalue-headers.json similarity index 96% rename from tests/event_samples/application-load-balancer-mutivalue-headers.json rename to tests/event_samples/application-load-balancer-multivalue-headers.json index 6d446d15c..a35ca5023 100644 --- a/tests/event_samples/application-load-balancer-mutivalue-headers.json +++ b/tests/event_samples/application-load-balancer-multivalue-headers.json @@ -6,7 +6,7 @@ }, "httpMethod": "GET", "path": "/lambda", - "queryStringParameters": { + "multiValueQueryStringParameters": { "query": "1234ABCD" }, "multiValueHeaders": { diff --git a/tests/test_asm.py b/tests/test_asm.py index 7a5e6c560..1e11b102d 100644 --- a/tests/test_asm.py +++ b/tests/test_asm.py @@ -8,6 +8,7 @@ get_asm_blocked_response, ) from datadog_lambda.trigger import ( + EventSubtypes, EventTypes, _EventSource, extract_trigger_tags, @@ -34,7 +35,7 @@ ), ( "application_load_balancer_multivalue_headers", - "application-load-balancer-mutivalue-headers.json", + "application-load-balancer-multivalue-headers.json", "72.12.164.125", "/lambda?query=1234ABCD", "GET", @@ -111,7 +112,7 @@ ), ( "application_load_balancer_multivalue_headers", - "application-load-balancer-mutivalue-headers.json", + "application-load-balancer-multivalue-headers.json", { "statusCode": 404, "multiValueHeaders": { @@ -397,6 +398,25 @@ def test_get_asm_blocked_response_blocked( response = get_asm_blocked_response(event_source) assert response["statusCode"] == expected_status assert response["headers"] == expected_headers + assert "multiValueHeaders" not in response + + +@patch("datadog_lambda.asm.get_blocked") +def test_get_asm_blocked_response_blocked_multi_value_headers( + mock_get_blocked, +): + # HTML blocking response + mock_get_blocked.return_value = { + "status_code": 401, + "type": "html", + "content-type": "text/html", + } + + event_source = _EventSource(EventTypes.ALB, EventSubtypes.ALB_MULTI_VALUE_HEADERS) + response = get_asm_blocked_response(event_source) + assert response["statusCode"] == 401 + assert response["multiValueHeaders"] == {"content-type": ["text/html"]} + assert "headers" not in response @patch("datadog_lambda.asm.get_blocked") diff --git a/tests/test_trigger.py b/tests/test_trigger.py index 452635cfc..182e61d8e 100644 --- a/tests/test_trigger.py +++ b/tests/test_trigger.py @@ -5,6 +5,7 @@ from datadog_lambda.trigger import ( EventSubtypes, + EventTypes, parse_event_source, get_event_source_arn, extract_trigger_tags, @@ -117,6 +118,22 @@ def test_event_source_application_load_balancer(self): event_source = parse_event_source(event) event_source_arn = get_event_source_arn(event_source, event, ctx) self.assertEqual(event_source.to_string(), event_sample_source) + self.assertEqual(event_source.subtype, EventSubtypes.ALB) + self.assertEqual( + event_source_arn, + "arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/lambda-xyz/123abc", + ) + + def test_event_source_application_load_balancer_multi_value_headers(self): + event_sample_source = "application-load-balancer-multivalue-headers" + test_file = event_samples + event_sample_source + ".json" + with open(test_file, "r") as event: + event = json.load(event) + ctx = get_mock_context() + event_source = parse_event_source(event) + event_source_arn = get_event_source_arn(event_source, event, ctx) + self.assertEqual(event_source.event_type, EventTypes.ALB) + self.assertEqual(event_source.subtype, EventSubtypes.ALB_MULTI_VALUE_HEADERS) self.assertEqual( event_source_arn, "arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/lambda-xyz/123abc", From 2389ec30f666eebcb8f5350ebb90853a72ee4e8b Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Wed, 10 Sep 2025 13:14:34 +0200 Subject: [PATCH 067/164] fix(appsec): perform _after extractions on the blocking_response (#656) --- datadog_lambda/wrapper.py | 47 +++++++++++++++++++++++---------------- tests/test_wrapper.py | 28 +++++++++++++++++------ 2 files changed, 49 insertions(+), 26 deletions(-) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 28c7ae88d..51e5bcfac 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -284,6 +284,34 @@ def _before(self, event, context): def _after(self, event, context): try: status_code = extract_http_status_code_tag(self.trigger_tags, self.response) + + if self.span: + if config.appsec_enabled and not self.blocking_response: + asm_start_response( + self.span, + status_code, + self.event_source, + response=self.response, + ) + self.blocking_response = get_asm_blocked_response(self.event_source) + + if self.blocking_response: + status_code = str(self.blocking_response.get("statusCode")) + if config.capture_payload_enabled and self.response: + tag_object( + self.span, "function.blocked_response", self.response + ) + self.response = self.blocking_response + + if config.capture_payload_enabled: + tag_object(self.span, "function.request", event) + tag_object(self.span, "function.response", self.response) + + if status_code: + self.span.set_tag("http.status_code", status_code) + + self.span.finish() + if status_code: self.trigger_tags["http.status_code"] = status_code mark_trace_as_error_for_5xx_responses(context, status_code, self.span) @@ -298,25 +326,6 @@ def _after(self, event, context): if should_trace_cold_start: trace_ctx = tracer.current_trace_context() - if self.span: - if config.capture_payload_enabled: - tag_object(self.span, "function.request", event) - tag_object(self.span, "function.response", self.response) - - if status_code: - self.span.set_tag("http.status_code", status_code) - - if config.appsec_enabled and not self.blocking_response: - asm_start_response( - self.span, - status_code, - self.event_source, - response=self.response, - ) - self.blocking_response = get_asm_blocked_response(self.event_source) - - self.span.finish() - if self.inferred_span: if status_code: self.inferred_span.set_tag("http.status_code", status_code) diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index e07b5ca91..0083b3faa 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -690,6 +690,9 @@ def setUp(self): self.mock_get_asm_blocking_response = patcher.start() self.addCleanup(patcher.stop) + with open("tests/event_samples/api-gateway.json") as f: + self.api_gateway_request = json.loads(f.read()) + self.fake_blocking_response = { "statusCode": "403", "headers": { @@ -706,7 +709,7 @@ def test_blocking_before(self): lambda_handler = wrapper.datadog_lambda_wrapper(mock_handler) - response = lambda_handler({}, get_mock_context()) + response = lambda_handler(self.api_gateway_request, get_mock_context()) self.assertEqual(response, self.fake_blocking_response) mock_handler.assert_not_called() @@ -715,27 +718,31 @@ def test_blocking_before(self): self.mock_asm_start_request.assert_called_once() self.mock_asm_start_response.assert_not_called() + assert lambda_handler.span.get_tag("http.status_code") == "403" + def test_blocking_during(self): self.mock_get_asm_blocking_response.return_value = None - @wrapper.datadog_lambda_wrapper def lambda_handler(event, context): self.mock_get_asm_blocking_response.return_value = ( self.fake_blocking_response ) raise wrapper.BlockingException() - response = lambda_handler({}, get_mock_context()) + lambda_handler = wrapper.datadog_lambda_wrapper(lambda_handler) + + response = lambda_handler(self.api_gateway_request, get_mock_context()) self.assertEqual(response, self.fake_blocking_response) self.mock_asm_set_context.assert_called_once() self.mock_asm_start_request.assert_called_once() self.mock_asm_start_response.assert_not_called() + assert lambda_handler.span.get_tag("http.status_code") == "403" + def test_blocking_after(self): self.mock_get_asm_blocking_response.return_value = None - @wrapper.datadog_lambda_wrapper def lambda_handler(event, context): self.mock_get_asm_blocking_response.return_value = ( self.fake_blocking_response @@ -745,13 +752,17 @@ def lambda_handler(event, context): "body": "This should not be returned", } - response = lambda_handler({}, get_mock_context()) + lambda_handler = wrapper.datadog_lambda_wrapper(lambda_handler) + + response = lambda_handler(self.api_gateway_request, get_mock_context()) self.assertEqual(response, self.fake_blocking_response) self.mock_asm_set_context.assert_called_once() self.mock_asm_start_request.assert_called_once() self.mock_asm_start_response.assert_called_once() + assert lambda_handler.span.get_tag("http.status_code") == "403" + def test_no_blocking_appsec_disabled(self): os.environ["DD_APPSEC_ENABLED"] = "false" @@ -764,14 +775,17 @@ def test_no_blocking_appsec_disabled(self): "body": "This should be returned", } - @wrapper.datadog_lambda_wrapper def lambda_handler(event, context): return expected_response - response = lambda_handler({}, get_mock_context()) + lambda_handler = wrapper.datadog_lambda_wrapper(lambda_handler) + + response = lambda_handler(self.api_gateway_request, get_mock_context()) self.assertEqual(response, expected_response) self.mock_get_asm_blocking_response.assert_not_called() self.mock_asm_set_context.assert_not_called() self.mock_asm_start_request.assert_not_called() self.mock_asm_start_response.assert_not_called() + + assert lambda_handler.span.get_tag("http.status_code") == "200" From 7b54882d322c2233835c6f45ee500a404919eaf9 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Tue, 16 Sep 2025 11:28:10 -0400 Subject: [PATCH 068/164] v8.114.0 (#658) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index d5b71e8d9..ac6691b07 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.114.0.dev0" +__version__ = "8.114.0" diff --git a/pyproject.toml b/pyproject.toml index a2fc7b74c..ae46ce3d3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.114.0.dev0" +version = "8.114.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 784a41b74498b062e2a3a1e326199a197150a23d Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Tue, 16 Sep 2025 22:44:05 -0400 Subject: [PATCH 069/164] update version to v8.115.0.dev0 --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index ac6691b07..653b589b9 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.114.0" +__version__ = "8.115.0.dev0" diff --git a/pyproject.toml b/pyproject.toml index ae46ce3d3..aebd15b4d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.114.0" +version = "8.115.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From bb2271c40a9d645696057d5ec146a4bdcc9e3205 Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Wed, 24 Sep 2025 11:53:32 -0400 Subject: [PATCH 070/164] Increasing allowed uncompressed layer size to 25 MB (#659) --- scripts/check_layer_size.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/check_layer_size.sh b/scripts/check_layer_size.sh index 27988e858..b074d74e4 100755 --- a/scripts/check_layer_size.sh +++ b/scripts/check_layer_size.sh @@ -9,7 +9,7 @@ set -e MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 17 \* 1024 / 2) # 8704 KB -MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 22 \* 1024) # 22528 KB +MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 25 \* 1024) # 25600 KB LAYER_FILES_PREFIX="datadog_lambda_py" From b6131e5c7a052d8e08727c9196d1a83b50be1b68 Mon Sep 17 00:00:00 2001 From: Christian Wygoda <103508637+c-wygoda@users.noreply.github.com> Date: Wed, 1 Oct 2025 18:44:39 +0200 Subject: [PATCH 071/164] fix: support ddtrace 3.x.x, including >=3.15 (#661) --- datadog_lambda/wrapper.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 51e5bcfac..de24d71d4 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -65,7 +65,11 @@ if config.exception_replay_enabled: from ddtrace.debugging._exception.replay import SpanExceptionHandler - from ddtrace.debugging._uploader import LogsIntakeUploaderV1 + + try: + from ddtrace.debugging._uploader import SignalUploader + except ImportError: + from ddtrace.debugging._uploader import LogsIntakeUploaderV1 as SignalUploader logger = logging.getLogger(__name__) @@ -370,7 +374,7 @@ def _after(self, event, context): # Flush exception replay if config.exception_replay_enabled: - LogsIntakeUploaderV1._instance.periodic() + SignalUploader._instance.periodic() if config.encode_authorizer_context and is_authorizer_response( self.response From 09143fe76ba033c698fc63bd90495155d36a47f1 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Fri, 3 Oct 2025 11:04:27 -0700 Subject: [PATCH 072/164] Improve testing for ddtrace imports. (#662) --- .github/workflows/build.yml | 2 + datadog_lambda/wrapper.py | 4 ++ scripts/check_layer_size.sh | 2 +- tests/test_wrapper.py | 110 ++++++++++++++++++++++++++++++++++++ 4 files changed, 117 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d218bdefd..050624478 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,6 +5,8 @@ on: branches: - "main" pull_request: + schedule: + - cron: '0 0,12 * * *' # Runs every day at midnight and noon utc jobs: lint: diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index de24d71d4..0cbedd9f7 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -46,6 +46,10 @@ extract_http_status_code_tag, ) +# ddtrace imports are also tested in +# dd-trace-py/tests/internal/test_serverless.py please update those tests when +# making changes to any ddtrace import. + if config.appsec_enabled: from datadog_lambda.asm import ( asm_set_context, diff --git a/scripts/check_layer_size.sh b/scripts/check_layer_size.sh index b074d74e4..ce67d92d9 100755 --- a/scripts/check_layer_size.sh +++ b/scripts/check_layer_size.sh @@ -8,7 +8,7 @@ # Compares layer size to threshold, and fails if below that threshold set -e -MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 17 \* 1024 / 2) # 8704 KB +MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 9 \* 1024) # 9216 KB MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 25 \* 1024) # 25600 KB diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 0083b3faa..fe7678ac3 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -789,3 +789,113 @@ def lambda_handler(event, context): self.mock_asm_start_response.assert_not_called() assert lambda_handler.span.get_tag("http.status_code") == "200" + + +@patch("datadog_lambda.config.Config.exception_replay_enabled", True) +def test_exception_replay_enabled(monkeypatch): + importlib.reload(wrapper) + + original_SpanExceptionHandler_enable = wrapper.SpanExceptionHandler.enable + SpanExceptionHandler_enable_calls = [] + + def SpanExceptionHandler_enable(*args, **kwargs): + SpanExceptionHandler_enable_calls.append((args, kwargs)) + return original_SpanExceptionHandler_enable(*args, **kwargs) + + original_SignalUploader_periodic = wrapper.SignalUploader.periodic + SignalUploader_periodic_calls = [] + + def SignalUploader_periodic(*args, **kwargs): + SignalUploader_periodic_calls.append((args, kwargs)) + return original_SignalUploader_periodic(*args, **kwargs) + + monkeypatch.setattr( + "datadog_lambda.wrapper.SpanExceptionHandler.enable", + SpanExceptionHandler_enable, + ) + monkeypatch.setattr( + "datadog_lambda.wrapper.SignalUploader.periodic", SignalUploader_periodic + ) + + expected_response = { + "statusCode": 200, + "body": "This should be returned", + } + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return expected_response + + response = lambda_handler({}, get_mock_context()) + + assert response == expected_response + assert len(SpanExceptionHandler_enable_calls) == 1 + assert len(SignalUploader_periodic_calls) == 1 + + +@patch("datadog_lambda.config.Config.profiling_enabled", True) +def test_profiling_enabled(monkeypatch): + importlib.reload(wrapper) + + original_Profiler_start = wrapper.profiler.Profiler.start + Profiler_start_calls = [] + + def Profiler_start(*args, **kwargs): + Profiler_start_calls.append((args, kwargs)) + return original_Profiler_start(*args, **kwargs) + + monkeypatch.setattr("datadog_lambda.wrapper.is_new_sandbox", lambda: True) + monkeypatch.setattr( + "datadog_lambda.wrapper.profiler.Profiler.start", Profiler_start + ) + + expected_response = { + "statusCode": 200, + "body": "This should be returned", + } + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return expected_response + + response = lambda_handler({}, get_mock_context()) + + assert response == expected_response + assert len(Profiler_start_calls) == 1 + + +@patch("datadog_lambda.config.Config.llmobs_enabled", True) +def test_llmobs_enabled(monkeypatch): + importlib.reload(wrapper) + + original_LLMObs_enable = wrapper.LLMObs.enable + LLMObs_enable_calls = [] + + def LLMObs_enable(*args, **kwargs): + LLMObs_enable_calls.append((args, kwargs)) + return original_LLMObs_enable(*args, **kwargs) + + original_LLMObs_flush = wrapper.LLMObs.flush + LLMObs_flush_calls = [] + + def LLMObs_flush(*args, **kwargs): + LLMObs_flush_calls.append((args, kwargs)) + return original_LLMObs_flush(*args, **kwargs) + + monkeypatch.setattr("datadog_lambda.wrapper.LLMObs.enable", LLMObs_enable) + monkeypatch.setattr("datadog_lambda.wrapper.LLMObs.flush", LLMObs_flush) + + expected_response = { + "statusCode": 200, + "body": "This should be returned", + } + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return expected_response + + response = lambda_handler({}, get_mock_context()) + + assert response == expected_response + assert len(LLMObs_enable_calls) == 1 + assert len(LLMObs_flush_calls) == 1 From 93d4a07fa61a4d4d2feec08e722505a9e0cc8657 Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Wed, 8 Oct 2025 13:21:43 -0400 Subject: [PATCH 073/164] APMSVLS-65 Extract Trace Context For AppSync Events (#657) APMSVLS-65 first draft of extractor helper function and inclusion in extract_dd_trace_context Second draft of implementation for extracting trace context from event['request']['headers'] Merge branch 'main' into rithika.narayan/APMSVLS-65/extract-context-from-appsync Removing unnecessary allocations from header extraction Added unit tests for extracting context from event['request']['headers'] Refactoring change to use extract_context_from_http_event_or_context Removing extra testing file linting Merge branch 'main' into rithika.narayan/APMSVLS-65/extract-context-from-appsync Cleaned up repeated get calls Checking for request header field without raising exception Removing extraneous file Refactored code, added more unit tests More comprehensive unit testing for coverage Removing imported files Removing more unnecessary files WIP testing whether decode_authorizer_context is set Cleanup More cleanup Testing refactoring for size Removed comments removing changes in tracer Restoring implementation Bump zipped layer size Integer layer size Merge branch 'main' into rithika.narayan/APMSVLS-65/extract-context-from-appsync Fixing layer size calculation Adding unit test for using extract_context_from_lambda_context linting Merge branch 'main' into rithika.narayan/APMSVLS-65/extract-context-from-appsync --- datadog_lambda/tracing.py | 18 + .../event_samples/rum-appsync-no-headers.json | 14 + .../rum-appsync-request-not-dict.json | 12 + tests/event_samples/rum-appsync.json | 53 + tests/integration/input_events/appsync.json | 49 + tests/integration/package-lock.json | 1119 +++++++++++++++++ tests/integration/package.json | 2 +- .../logs/async-metrics_python310.log | 128 ++ .../logs/async-metrics_python311.log | 128 ++ .../logs/async-metrics_python312.log | 128 ++ .../logs/async-metrics_python313.log | 128 ++ .../snapshots/logs/async-metrics_python38.log | 128 ++ .../snapshots/logs/async-metrics_python39.log | 128 ++ .../snapshots/logs/sync-metrics_python310.log | 147 +++ .../snapshots/logs/sync-metrics_python311.log | 147 +++ .../snapshots/logs/sync-metrics_python312.log | 147 +++ .../snapshots/logs/sync-metrics_python313.log | 147 +++ .../snapshots/logs/sync-metrics_python38.log | 147 +++ .../snapshots/logs/sync-metrics_python39.log | 147 +++ .../return_values/async-metrics_appsync.json | 8 + .../return_values/sync-metrics_appsync.json | 8 + tests/integration/yarn.lock | 38 +- tests/test_tracing.py | 48 +- 23 files changed, 2998 insertions(+), 21 deletions(-) create mode 100644 tests/event_samples/rum-appsync-no-headers.json create mode 100644 tests/event_samples/rum-appsync-request-not-dict.json create mode 100644 tests/event_samples/rum-appsync.json create mode 100644 tests/integration/input_events/appsync.json create mode 100644 tests/integration/package-lock.json create mode 100644 tests/integration/snapshots/return_values/async-metrics_appsync.json create mode 100644 tests/integration/snapshots/return_values/sync-metrics_appsync.json diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index 51157f6a7..4faaed2df 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -209,6 +209,20 @@ def extract_context_from_http_event_or_context( return context +def extract_context_from_request_header_or_context(event, lambda_context, event_source): + request = event.get("request") + if isinstance(request, (set, dict)) and "headers" in request: + context = extract_context_from_http_event_or_context( + request, + lambda_context, + event_source, + decode_authorizer_context=False, + ) + else: + context = extract_context_from_lambda_context(lambda_context) + return context + + def create_sns_event(message): return { "Records": [ @@ -627,6 +641,10 @@ def extract_dd_trace_context( if extractor is not None: context = extract_context_custom_extractor(extractor, event, lambda_context) + elif isinstance(event, (set, dict)) and "request" in event: + context = extract_context_from_request_header_or_context( + event, lambda_context, event_source + ) elif isinstance(event, (set, dict)) and "headers" in event: context = extract_context_from_http_event_or_context( event, lambda_context, event_source, decode_authorizer_context diff --git a/tests/event_samples/rum-appsync-no-headers.json b/tests/event_samples/rum-appsync-no-headers.json new file mode 100644 index 000000000..ce42c9722 --- /dev/null +++ b/tests/event_samples/rum-appsync-no-headers.json @@ -0,0 +1,14 @@ +{ + "identity": "None", + "info": { + "fieldName": "getItems", + "parentTypeName": "Query", + "selectionSetGraphQL": "{\n id\n}", + "selectionSetList":["id"] + }, + "prev": "None", + "request": { + "domainName": "None" + }, + "source": "None" +} \ No newline at end of file diff --git a/tests/event_samples/rum-appsync-request-not-dict.json b/tests/event_samples/rum-appsync-request-not-dict.json new file mode 100644 index 000000000..1ab6dba82 --- /dev/null +++ b/tests/event_samples/rum-appsync-request-not-dict.json @@ -0,0 +1,12 @@ +{ + "identity": "None", + "info": { + "fieldName": "getItems", + "parentTypeName": "Query", + "selectionSetGraphQL": "{\n id\n}", + "selectionSetList":["id"] + }, + "prev": "None", + "request": "hello", + "source": "None" +} \ No newline at end of file diff --git a/tests/event_samples/rum-appsync.json b/tests/event_samples/rum-appsync.json new file mode 100644 index 000000000..ae085359f --- /dev/null +++ b/tests/event_samples/rum-appsync.json @@ -0,0 +1,53 @@ +{ + "identity": "None", + "info": { + "fieldName": "getItems", + "parentTypeName": "Query", + "selectionSetGraphQL": "{\n id\n}", + "selectionSetList":["id"] + }, + "prev": "None", + "request": { + "domainName": "None", + "headers": { + "accept": "*/*", + "accept-encoding": "gzip, deflate, br, zstd", + "accept-language": "en-US,en;q=0.9", + "cloudfront-forwarded-proto": "https", + "cloudfront-is-desktop-viewer": "True", + "cloudfront-is-mobile-viewer": "False", + "cloudfront-is-smarttv-viewer":"False", + "cloudfront-is-tablet-viewer":" False", + "cloudfront-viewer-asn": "6461", + "cloudfront-viewer-country": "US", + "content-length": "47", + "content-type": "application/graphql", + "host": "4aowrg2uhvbw5mn7osu6searqi.appsync-api.us-east-1.amazonaws.com", + "origin": "http://localhost:5173", + "priority": "u=1, i", + "referer": "http://localhost:5173/", + "sec-ch-ua": "\"Chromium\";v=\"140\", \"Not=A?Brand\";v=\"24\", \"Google Chrome\";v=\"140\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "macOS", + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "cross-site", + "traceparent": "00-0000000000000000d9f454c80b9a529a-73ac6ca3427073a3-01", + "tracestate": "dd=s:1;o:rum", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36","via":"2.0 62f9f3967e93a923f21c8acb20cf10b6.cloudfront.net (CloudFront)", + "x-amz-cf-id": "Femhicb_Vbva-J8qWjdI4hKMmqusCeQSp207UGyY3u8VOUrdE8BBvg==", + "x-amzn-appsync-is-vpce-request": "False", + "x-amzn-remote-ip": "64.124.12.19", + "x-amzn-requestid": "1ee1669a-eda3-4d4f-911c-35f74ebef31d", + "x-amzn-trace-id": "Root=1-68cdb7e9-438bf88259d7ce3535723bdd", + "x-datadog-origin": "rum", + "x-datadog-parent-id": "67890", + "x-datadog-sampling-priority": "1", + "x-datadog-trace-id": "12345", + "x-forwarded-for": "64.124.12.19,15.158.225.229", + "x-forwarded-port": "443", + "x-forwarded-proto": "https" + } + }, + "source": "None" +} \ No newline at end of file diff --git a/tests/integration/input_events/appsync.json b/tests/integration/input_events/appsync.json new file mode 100644 index 000000000..dacf24e7e --- /dev/null +++ b/tests/integration/input_events/appsync.json @@ -0,0 +1,49 @@ +{ + "identity": "None", + "info": { + "fieldName": "getItems", + "parentTypeName": "Query", + "selectionSetGraphQL": "{\n id\n}", + "selectionSetList":["id"] + }, + "prev": "None", + "request": { + "domainName": "None", + "headers": { + "accept": "*/*", + "accept-encoding": "gzip, deflate, br, zstd", + "accept-language": "en-US,en;q=0.9", + "cloudfront-forwarded-proto": "https", + "cloudfront-is-desktop-viewer": "True", + "cloudfront-is-mobile-viewer": "False", + "cloudfront-is-smarttv-viewer":"False", + "cloudfront-is-tablet-viewer":" False", + "cloudfront-viewer-asn": "6461", + "cloudfront-viewer-country": "US", + "content-length": "47", + "content-type": "application/graphql", + "host": "4aowrg2uhvbw5mn7osu6searqi.appsync-api.us-east-1.amazonaws.com", + "origin": "http://localhost:5173", + "priority": "u=1, i", + "referer": "http://localhost:5173/", + "sec-ch-ua": "\"Chromium\";v=\"140\", \"Not=A?Brand\";v=\"24\", \"Google Chrome\";v=\"140\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "macOS", + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "cross-site", + "traceparent": "00-0000000000000000d9f454c80b9a529a-73ac6ca3427073a3-01", + "tracestate": "dd=s:1;o:rum", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36","via":"2.0 62f9f3967e93a923f21c8acb20cf10b6.cloudfront.net (CloudFront)", + "x-amz-cf-id": "Femhicb_Vbva-J8qWjdI4hKMmqusCeQSp207UGyY3u8VOUrdE8BBvg==", + "x-amzn-appsync-is-vpce-request": "False", + "x-amzn-remote-ip": "64.124.12.19", + "x-amzn-requestid": "1ee1669a-eda3-4d4f-911c-35f74ebef31d", + "x-amzn-trace-id": "Root=1-68cdb7e9-438bf88259d7ce3535723bdd", + "x-forwarded-for": "64.124.12.19,15.158.225.229", + "x-forwarded-port": "443", + "x-forwarded-proto": "https" + } + }, + "source": "None" +} \ No newline at end of file diff --git a/tests/integration/package-lock.json b/tests/integration/package-lock.json new file mode 100644 index 000000000..5990cc8db --- /dev/null +++ b/tests/integration/package-lock.json @@ -0,0 +1,1119 @@ +{ + "name": "integration", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "serverless-plugin-datadog": "^2.18.0", + "serverless-python-requirements": "^6.1.2" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true, + "license": "ISC" + }, + "node_modules/2-thenable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/2-thenable/-/2-thenable-1.0.0.tgz", + "integrity": "sha512-HqiDzaLDFCXkcCO/SwoyhRwqYtINFHF7t9BDRq4x90TOKNAJpiqUt9X5lQ08bwxYzc067HUywDjGySpebHcUpw==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.47" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/appdirectory": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/appdirectory/-/appdirectory-0.1.0.tgz", + "integrity": "sha512-DJ5DV8vZXBbusyiyPlH28xppwS8eAMRuuyMo88xeEcf4bV64lbLtbxRxqixZuJBXsZzLtXFmA13GwVjJc7vdQw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/child-process-ext": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/child-process-ext/-/child-process-ext-2.1.1.tgz", + "integrity": "sha512-0UQ55f51JBkOFa+fvR76ywRzxiPwQS3Xe8oe5bZRphpv+dIMeerW5Zn5e4cUy4COJwVtJyU0R79RMnw+aCqmGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^6.0.5", + "es5-ext": "^0.10.53", + "log": "^6.0.0", + "split2": "^3.1.1", + "stream-promise": "^3.2.0" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/duration": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", + "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.46" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "dev": true, + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-all": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.3.1.tgz", + "integrity": "sha512-Y+ESjdI7ZgMwfzanHZYQ87C59jOO0i+Hd+QYtVt9PhLi6d8wlOpzQnfBxWUlaTuAoR3TkybLqqbIoWveU4Ji7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.2.3", + "yargs": "^15.3.1" + }, + "bin": { + "glob-all": "bin/glob-all" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-primitive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz", + "integrity": "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.values": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz", + "integrity": "sha512-r0RwvdCv8id9TUblb/O7rYPwVy6lerCbcawrfdo9iC/1t1wsNMJknO79WNBgwkH0hIeJ08jmvvESbFpNb4jH0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/log": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/log/-/log-6.3.2.tgz", + "integrity": "sha512-ek8NRg/OPvS9ISOJNWNAz5vZcpYacWNFDWNJjj5OXsc6YuKacfey6wF04cXz/tOJIVrZ2nGSkHpAY5qKtF6ISg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "duration": "^0.2.2", + "es5-ext": "^0.10.64", + "event-emitter": "^0.3.5", + "sprintf-kit": "^2.0.2", + "type": "^2.7.3", + "uni-global": "^1.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serverless-plugin-datadog": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/serverless-plugin-datadog/-/serverless-plugin-datadog-2.18.0.tgz", + "integrity": "sha512-RUdCNjUk+uUKQYgQBjK0WNeYJ7lM2/RScqg/LjVSfv5EACeJ3iIUPz1c4bS2jtiH05al8qXudNb6QDkv9zxG7w==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/serverless-python-requirements": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/serverless-python-requirements/-/serverless-python-requirements-6.1.2.tgz", + "integrity": "sha512-pas27CBxxaLTU5XMYnCVPJc+LVdm65Ys5olNvRWRqfUaZwTfD/7KSSt2XPSRme8BeJubroslaiOtWPP+IrxTVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@iarna/toml": "^2.2.5", + "appdirectory": "^0.1.0", + "bluebird": "^3.7.2", + "child-process-ext": "^2.1.1", + "fs-extra": "^10.1.0", + "glob-all": "^3.3.1", + "is-wsl": "^2.2.0", + "jszip": "^3.10.1", + "lodash.get": "^4.4.2", + "lodash.uniqby": "^4.7.0", + "lodash.values": "^4.3.0", + "rimraf": "^3.0.2", + "semver": "^7.6.0", + "set-value": "^4.1.0", + "sha256-file": "1.0.0", + "shell-quote": "^1.8.1" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/set-value": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-4.1.0.tgz", + "integrity": "sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/jonschlinkert", + "https://paypal.me/jonathanschlinkert", + "https://jonschlinkert.dev/sponsor" + ], + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "is-primitive": "^3.0.1" + }, + "engines": { + "node": ">=11.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/sha256-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sha256-file/-/sha256-file-1.0.0.tgz", + "integrity": "sha512-nqf+g0veqgQAkDx0U2y2Tn2KWyADuuludZTw9A7J3D+61rKlIIl9V5TS4mfnwKuXZOH9B7fQyjYJ9pKRHIsAyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/split2/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sprintf-kit": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.2.tgz", + "integrity": "sha512-lnapdj6W4LflHZGKvl9eVkz5YF0xaTrqpRWVA4cNVOTedwqifIP8ooGImldzT/4IAN5KXFQAyXTdLidYVQdyag==", + "dev": true, + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/stream-promise": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-promise/-/stream-promise-3.2.0.tgz", + "integrity": "sha512-P+7muTGs2C8yRcgJw/PPt61q7O517tDHiwYEzMWo1GSBCcZedUMT/clz7vUNsSxFphIlJ6QUL4GexQKlfJoVtA==", + "dev": true, + "license": "ISC", + "dependencies": { + "2-thenable": "^1.0.0", + "es5-ext": "^0.10.49", + "is-stream": "^1.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/uni-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz", + "integrity": "sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "type": "^2.5.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/tests/integration/package.json b/tests/integration/package.json index 1a1784620..8dae6acaa 100644 --- a/tests/integration/package.json +++ b/tests/integration/package.json @@ -1,6 +1,6 @@ { "devDependencies": { "serverless-plugin-datadog": "^2.18.0", - "serverless-python-requirements": "^6.1.1" + "serverless-python-requirements": "^6.1.2" } } diff --git a/tests/integration/snapshots/logs/async-metrics_python310.log b/tests/integration/snapshots/logs/async-metrics_python310.log index d72afba39..ea8bf42f6 100644 --- a/tests/integration/snapshots/logs/async-metrics_python310.log +++ b/tests/integration/snapshots/logs/async-metrics_python310.log @@ -189,6 +189,134 @@ START "dd_lambda_layer:datadog-python310_X.X.X" ] } +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python310", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python310", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python310", + "functionname": "integration-tests-python-XXXX-async-metrics_python310", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python310", + "resource:integration-tests-python-XXXX-async-metrics_python310", + "memorysize:1024", + "cold_start:false", + "runtime:python3.10", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} { "m": "datadog.serverless.dynamodb.stream.type", "v": 1, diff --git a/tests/integration/snapshots/logs/async-metrics_python311.log b/tests/integration/snapshots/logs/async-metrics_python311.log index dac9c4277..5aa9c5545 100644 --- a/tests/integration/snapshots/logs/async-metrics_python311.log +++ b/tests/integration/snapshots/logs/async-metrics_python311.log @@ -189,6 +189,134 @@ START "dd_lambda_layer:datadog-python311_X.X.X" ] } +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python311", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python311", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python311", + "functionname": "integration-tests-python-XXXX-async-metrics_python311", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python311", + "resource:integration-tests-python-XXXX-async-metrics_python311", + "memorysize:1024", + "cold_start:false", + "runtime:python3.11", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} { "m": "datadog.serverless.dynamodb.stream.type", "v": 1, diff --git a/tests/integration/snapshots/logs/async-metrics_python312.log b/tests/integration/snapshots/logs/async-metrics_python312.log index c2b624ff3..67732da61 100644 --- a/tests/integration/snapshots/logs/async-metrics_python312.log +++ b/tests/integration/snapshots/logs/async-metrics_python312.log @@ -189,6 +189,134 @@ START "dd_lambda_layer:datadog-python312_X.X.X" ] } +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python312", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python312", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python312", + "functionname": "integration-tests-python-XXXX-async-metrics_python312", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python312", + "resource:integration-tests-python-XXXX-async-metrics_python312", + "memorysize:1024", + "cold_start:false", + "runtime:python3.12", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} { "m": "datadog.serverless.dynamodb.stream.type", "v": 1, diff --git a/tests/integration/snapshots/logs/async-metrics_python313.log b/tests/integration/snapshots/logs/async-metrics_python313.log index 9a5e763f9..18b3109eb 100644 --- a/tests/integration/snapshots/logs/async-metrics_python313.log +++ b/tests/integration/snapshots/logs/async-metrics_python313.log @@ -189,6 +189,134 @@ START "dd_lambda_layer:datadog-python313_X.X.X" ] } +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python313_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python313_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python313", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python313", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python313", + "functionname": "integration-tests-python-XXXX-async-metrics_python313", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python313", + "resource:integration-tests-python-XXXX-async-metrics_python313", + "memorysize:1024", + "cold_start:false", + "runtime:python3.13", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python313_X.X.X" + ] +} { "m": "datadog.serverless.dynamodb.stream.type", "v": 1, diff --git a/tests/integration/snapshots/logs/async-metrics_python38.log b/tests/integration/snapshots/logs/async-metrics_python38.log index 9e6370b5b..c9fe147f9 100644 --- a/tests/integration/snapshots/logs/async-metrics_python38.log +++ b/tests/integration/snapshots/logs/async-metrics_python38.log @@ -189,6 +189,134 @@ START "dd_lambda_layer:datadog-python38_X.X.X" ] } +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python38", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python38", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python38", + "functionname": "integration-tests-python-XXXX-async-metrics_python38", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python38", + "resource:integration-tests-python-XXXX-async-metrics_python38", + "memorysize:1024", + "cold_start:false", + "runtime:python3.8", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} { "m": "datadog.serverless.dynamodb.stream.type", "v": 1, diff --git a/tests/integration/snapshots/logs/async-metrics_python39.log b/tests/integration/snapshots/logs/async-metrics_python39.log index 70f7a59f1..47fd9c87e 100644 --- a/tests/integration/snapshots/logs/async-metrics_python39.log +++ b/tests/integration/snapshots/logs/async-metrics_python39.log @@ -189,6 +189,134 @@ START "dd_lambda_layer:datadog-python39_X.X.X" ] } +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python39", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python39", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python39", + "functionname": "integration-tests-python-XXXX-async-metrics_python39", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python39", + "resource:integration-tests-python-XXXX-async-metrics_python39", + "memorysize:1024", + "cold_start:false", + "runtime:python3.9", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} { "m": "datadog.serverless.dynamodb.stream.type", "v": 1, diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index 7d504bdcb..1e1b8a7b4 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -208,6 +208,153 @@ START "dd_lambda_layer:datadog-python310_X.X.X" ] } +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python310", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python310", + "functionname": "integration-tests-python-XXXX-sync-metrics_python310", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python310", + "resource:integration-tests-python-XXXX-sync-metrics_python310", + "memorysize:1024", + "cold_start:false", + "runtime:python3.10", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} { "m": "datadog.serverless.dynamodb.stream.type", "v": 1, diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index aa242652d..adc6d215d 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -208,6 +208,153 @@ START "dd_lambda_layer:datadog-python311_X.X.X" ] } +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python311", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python311", + "functionname": "integration-tests-python-XXXX-sync-metrics_python311", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python311", + "resource:integration-tests-python-XXXX-sync-metrics_python311", + "memorysize:1024", + "cold_start:false", + "runtime:python3.11", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} { "m": "datadog.serverless.dynamodb.stream.type", "v": 1, diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index 99471eaf8..a7934c86d 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -208,6 +208,153 @@ START "dd_lambda_layer:datadog-python312_X.X.X" ] } +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python312", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python312", + "functionname": "integration-tests-python-XXXX-sync-metrics_python312", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python312", + "resource:integration-tests-python-XXXX-sync-metrics_python312", + "memorysize:1024", + "cold_start:false", + "runtime:python3.12", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} { "m": "datadog.serverless.dynamodb.stream.type", "v": 1, diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index e53aae508..a5516973c 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -208,6 +208,153 @@ START "dd_lambda_layer:datadog-python313_X.X.X" ] } +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python313", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python313", + "functionname": "integration-tests-python-XXXX-sync-metrics_python313", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python313", + "resource:integration-tests-python-XXXX-sync-metrics_python313", + "memorysize:1024", + "cold_start:false", + "runtime:python3.13", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python313_X.X.X" + ] +} { "m": "datadog.serverless.dynamodb.stream.type", "v": 1, diff --git a/tests/integration/snapshots/logs/sync-metrics_python38.log b/tests/integration/snapshots/logs/sync-metrics_python38.log index 9cbf45648..8cd4eb2cc 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python38.log +++ b/tests/integration/snapshots/logs/sync-metrics_python38.log @@ -208,6 +208,153 @@ START "dd_lambda_layer:datadog-python38_X.X.X" ] } +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python38", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python38", + "functionname": "integration-tests-python-XXXX-sync-metrics_python38", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python38", + "resource:integration-tests-python-XXXX-sync-metrics_python38", + "memorysize:1024", + "cold_start:false", + "runtime:python3.8", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} { "m": "datadog.serverless.dynamodb.stream.type", "v": 1, diff --git a/tests/integration/snapshots/logs/sync-metrics_python39.log b/tests/integration/snapshots/logs/sync-metrics_python39.log index cc0407c1b..5e5e9cf30 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python39.log +++ b/tests/integration/snapshots/logs/sync-metrics_python39.log @@ -208,6 +208,153 @@ START "dd_lambda_layer:datadog-python39_X.X.X" ] } +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python39", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python39", + "functionname": "integration-tests-python-XXXX-sync-metrics_python39", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python39", + "resource:integration-tests-python-XXXX-sync-metrics_python39", + "memorysize:1024", + "cold_start:false", + "runtime:python3.9", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} { "m": "datadog.serverless.dynamodb.stream.type", "v": 1, diff --git a/tests/integration/snapshots/return_values/async-metrics_appsync.json b/tests/integration/snapshots/return_values/async-metrics_appsync.json new file mode 100644 index 000000000..1ad668ecc --- /dev/null +++ b/tests/integration/snapshots/return_values/async-metrics_appsync.json @@ -0,0 +1,8 @@ +{ + "statusCode": 200, + "body": { + "message": "hello, dog!", + "request_id": null, + "event_record_ids": [] + } +} diff --git a/tests/integration/snapshots/return_values/sync-metrics_appsync.json b/tests/integration/snapshots/return_values/sync-metrics_appsync.json new file mode 100644 index 000000000..1ad668ecc --- /dev/null +++ b/tests/integration/snapshots/return_values/sync-metrics_appsync.json @@ -0,0 +1,8 @@ +{ + "statusCode": 200, + "body": { + "message": "hello, dog!", + "request_id": null, + "event_record_ids": [] + } +} diff --git a/tests/integration/yarn.lock b/tests/integration/yarn.lock index 37cb357d5..7477e8dae 100644 --- a/tests/integration/yarn.lock +++ b/tests/integration/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@iarna/toml@^2.2.5": + version "2.2.5" + resolved "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz" + integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== + "2-thenable@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/2-thenable/-/2-thenable-1.0.0.tgz" @@ -10,11 +15,6 @@ d "1" es5-ext "^0.10.47" -"@iarna/toml@^2.2.5": - version "2.2.5" - resolved "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz" - integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" @@ -44,7 +44,7 @@ bluebird@^3.7.2: brace-expansion@^1.1.7: version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== dependencies: balanced-match "^1.0.0" @@ -108,7 +108,7 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -d@1, d@^1.0.1, d@^1.0.2: +d@^1.0.1, d@^1.0.2, d@1: version "1.0.2" resolved "https://registry.npmjs.org/d/-/d-1.0.2.tgz" integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== @@ -251,7 +251,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@~2.0.3: +inherits@^2.0.3, inherits@~2.0.3, inherits@2: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -493,10 +493,10 @@ serverless-plugin-datadog@^2.18.0: resolved "https://registry.npmjs.org/serverless-plugin-datadog/-/serverless-plugin-datadog-2.18.0.tgz" integrity sha512-RUdCNjUk+uUKQYgQBjK0WNeYJ7lM2/RScqg/LjVSfv5EACeJ3iIUPz1c4bS2jtiH05al8qXudNb6QDkv9zxG7w== -serverless-python-requirements@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/serverless-python-requirements/-/serverless-python-requirements-6.1.1.tgz" - integrity sha512-SQsDKjoZXWvRJNsKL7NvHiMM+B6kG0a4RkVexhPCxId/rVMLVyz0UHg7v34kzaklfsXTQIkez+9x7HP3FwdRVQ== +serverless-python-requirements@^6.1.2: + version "6.1.2" + resolved "https://registry.npmjs.org/serverless-python-requirements/-/serverless-python-requirements-6.1.2.tgz" + integrity sha512-pas27CBxxaLTU5XMYnCVPJc+LVdm65Ys5olNvRWRqfUaZwTfD/7KSSt2XPSRme8BeJubroslaiOtWPP+IrxTVA== dependencies: "@iarna/toml" "^2.2.5" appdirectory "^0.1.0" @@ -578,6 +578,13 @@ stream-promise@^3.2.0: es5-ext "^0.10.49" is-stream "^1.1.0" +string_decoder@^1.1.1, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -587,13 +594,6 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string_decoder@^1.1.1, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" diff --git a/tests/test_tracing.py b/tests/test_tracing.py index c87a09711..0fddd52ba 100644 --- a/tests/test_tracing.py +++ b/tests/test_tracing.py @@ -48,7 +48,7 @@ ) from datadog_lambda.trigger import parse_event_source -from tests.utils import get_mock_context +from tests.utils import get_mock_context, ClientContext function_arn = "arn:aws:lambda:us-west-1:123457598159:function:python-layer-test" @@ -179,6 +179,16 @@ def _wrap(*args, **kwargs): ), ), ("lambda-url", None), + ( + "rum-appsync", + Context( + trace_id=12345, + span_id=67890, + sampling_priority=1, + ), + ), + ("rum-appsync-no-headers", None), + ("rum-appsync-request-not-dict", None), ("s3", None), ( "sns-b64-msg-attribute", @@ -611,6 +621,42 @@ def test_with_complete_datadog_trace_headers_with_trigger_tags(self): ] ) + def test_request_header_malformed(self): + """Testing that if a RUM AppSync event is malformed, the tracer will attempt + to get the trace context from the lambda context in the + extract_context_from_request_header_or_context function.""" + lambda_ctx = get_mock_context() + lambda_ctx.client_context = ClientContext( + custom={ + "_datadog": { + "x-datadog-parent-id": "67890", + "x-datadog-sampling-priority": "1", + "x-datadog-trace-id": "12345", + } + } + ) + request_header_event = { + "identity": "None", + "info": { + "fieldName": "getItems", + "parentTypeName": "Query", + "selectionSetGraphQL": "{\n id\n}", + "selectionSetList": ["id"], + }, + "prev": "None", + "request": "hello", + "source": "None", + } + ctx, source, _ = extract_dd_trace_context(request_header_event, lambda_ctx) + expected_context = Context( + trace_id=12345, + span_id=67890, + sampling_priority=1, + ) + + self.assertEqual(ctx, expected_context) + self.assertEqual(source, "event") + def _test_step_function_trace_data_common( self, event, expected_trace_id, expected_span_id, expected_tid ): From d7763789f262b2da228f8210509e302e6e510d0a Mon Sep 17 00:00:00 2001 From: AJ Stuyvenberg Date: Fri, 10 Oct 2025 08:46:32 -0400 Subject: [PATCH 074/164] feat: Add batchItemFailures metric (#664) * feat: Add batchItemFailures metric * fmt --- datadog_lambda/metric.py | 27 ++++++++++++++ datadog_lambda/wrapper.py | 4 ++ tests/test_metric.py | 78 +++++++++++++++++++++++++++++++++++++++ tests/test_wrapper.py | 58 +++++++++++++++++++++++++++++ 4 files changed, 167 insertions(+) diff --git a/datadog_lambda/metric.py b/datadog_lambda/metric.py index 73bbeca3c..5df0812f1 100644 --- a/datadog_lambda/metric.py +++ b/datadog_lambda/metric.py @@ -214,6 +214,33 @@ def submit_errors_metric(lambda_context): submit_enhanced_metric("errors", lambda_context) +def submit_batch_item_failures_metric(response, lambda_context): + """Submit aws.lambda.enhanced.batch_item_failures metric with the count of batch item failures + + Args: + response (dict): Lambda function response object + lambda_context (object): Lambda context dict passed to the function by AWS + """ + if not config.enhanced_metrics_enabled: + logger.debug( + "Not submitting batch_item_failures metric because enhanced metrics are disabled" + ) + return + + if not isinstance(response, dict): + return + + batch_item_failures = response.get("batchItemFailures") + if batch_item_failures is not None and isinstance(batch_item_failures, list): + lambda_metric( + "aws.lambda.enhanced.batch_item_failures", + len(batch_item_failures), + timestamp=None, + tags=get_enhanced_metrics_tags(lambda_context), + force_async=True, + ) + + def submit_dynamodb_stream_type_metric(event): stream_view_type = ( event.get("Records", [{}])[0].get("dynamodb", {}).get("StreamViewType") diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 0cbedd9f7..8dbd7e359 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -291,6 +291,10 @@ def _before(self, event, context): def _after(self, event, context): try: + from datadog_lambda.metric import submit_batch_item_failures_metric + + submit_batch_item_failures_metric(self.response, context) + status_code = extract_http_status_code_tag(self.trigger_tags, self.response) if self.span: diff --git a/tests/test_metric.py b/tests/test_metric.py index aa537d346..fe3df247d 100644 --- a/tests/test_metric.py +++ b/tests/test_metric.py @@ -12,6 +12,7 @@ _select_metrics_handler, flush_stats, lambda_metric, + submit_batch_item_failures_metric, ) from datadog_lambda.tags import dd_lambda_layer_tag from datadog_lambda.thread_stats_writer import ThreadStatsWriter @@ -324,3 +325,80 @@ def decrypt(self, CiphertextBlob=None, EncryptionContext={}): mock_kms_client, MOCK_ENCRYPTED_API_KEY_BASE64 ) self.assertEqual(decrypted_key, EXPECTED_DECRYPTED_API_KEY) + + +class TestBatchItemFailuresMetric(unittest.TestCase): + def setUp(self): + patcher = patch("datadog_lambda.metric.lambda_metric") + self.mock_lambda_metric = patcher.start() + self.addCleanup(patcher.stop) + + patcher = patch("datadog_lambda.config.Config.enhanced_metrics_enabled", True) + self.mock_enhanced_metrics_enabled = patcher.start() + self.addCleanup(patcher.stop) + + def test_submit_batch_item_failures_with_failures(self): + response = { + "batchItemFailures": [ + {"itemIdentifier": "msg-1"}, + {"itemIdentifier": "msg-2"}, + {"itemIdentifier": "msg-3"}, + ] + } + context = unittest.mock.Mock() + + with patch("datadog_lambda.metric.get_enhanced_metrics_tags") as mock_get_tags: + mock_get_tags.return_value = ["tag1:value1"] + submit_batch_item_failures_metric(response, context) + + self.mock_lambda_metric.assert_called_once_with( + "aws.lambda.enhanced.batch_item_failures", + 3, + timestamp=None, + tags=["tag1:value1"], + force_async=True, + ) + + def test_submit_batch_item_failures_with_no_failures(self): + response = {"batchItemFailures": []} + context = unittest.mock.Mock() + + with patch("datadog_lambda.metric.get_enhanced_metrics_tags") as mock_get_tags: + mock_get_tags.return_value = ["tag1:value1"] + submit_batch_item_failures_metric(response, context) + self.mock_lambda_metric.assert_called_once_with( + "aws.lambda.enhanced.batch_item_failures", + 0, + timestamp=None, + tags=["tag1:value1"], + force_async=True, + ) + + def test_submit_batch_item_failures_with_no_field(self): + response = {"statusCode": 200} + context = unittest.mock.Mock() + submit_batch_item_failures_metric(response, context) + self.mock_lambda_metric.assert_not_called() + + def test_submit_batch_item_failures_with_none_response(self): + response = None + context = unittest.mock.Mock() + submit_batch_item_failures_metric(response, context) + self.mock_lambda_metric.assert_not_called() + + def test_submit_batch_item_failures_with_non_list_value(self): + response = {"batchItemFailures": "invalid"} + context = unittest.mock.Mock() + submit_batch_item_failures_metric(response, context) + self.mock_lambda_metric.assert_not_called() + + @patch("datadog_lambda.config.Config.enhanced_metrics_enabled", False) + def test_submit_batch_item_failures_enhanced_metrics_disabled(self): + response = { + "batchItemFailures": [ + {"itemIdentifier": "msg-1"}, + ] + } + context = unittest.mock.Mock() + submit_batch_item_failures_metric(response, context) + self.mock_lambda_metric.assert_not_called() diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index fe7678ac3..512a51f89 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -899,3 +899,61 @@ def lambda_handler(event, context): assert response == expected_response assert len(LLMObs_enable_calls) == 1 assert len(LLMObs_flush_calls) == 1 + + +@patch("datadog_lambda.config.Config.trace_enabled", False) +def test_batch_item_failures_metric(): + with patch( + "datadog_lambda.metric.submit_batch_item_failures_metric" + ) as mock_submit: + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return { + "batchItemFailures": [ + {"itemIdentifier": "msg-1"}, + {"itemIdentifier": "msg-2"}, + ] + } + + lambda_handler({}, get_mock_context()) + mock_submit.assert_called_once() + call_args = mock_submit.call_args[0] + assert call_args[0] == { + "batchItemFailures": [ + {"itemIdentifier": "msg-1"}, + {"itemIdentifier": "msg-2"}, + ] + } + + +@patch("datadog_lambda.config.Config.trace_enabled", False) +def test_batch_item_failures_metric_no_failures(): + with patch( + "datadog_lambda.metric.submit_batch_item_failures_metric" + ) as mock_submit: + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return {"batchItemFailures": []} + + lambda_handler({}, get_mock_context()) + mock_submit.assert_called_once() + call_args = mock_submit.call_args[0] + assert call_args[0] == {"batchItemFailures": []} + + +@patch("datadog_lambda.config.Config.trace_enabled", False) +def test_batch_item_failures_metric_no_response(): + with patch( + "datadog_lambda.metric.submit_batch_item_failures_metric" + ) as mock_submit: + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return None + + lambda_handler({}, get_mock_context()) + mock_submit.assert_called_once() + call_args = mock_submit.call_args[0] + assert call_args[0] is None From 968710ec40cf32e70acbaf1d6eb47d733a603c2c Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Fri, 10 Oct 2025 14:55:33 -0400 Subject: [PATCH 075/164] release v8.115.0 (#665) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 653b589b9..0149c284a 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.115.0.dev0" +__version__ = "8.115.0" diff --git a/pyproject.toml b/pyproject.toml index aebd15b4d..43e88b360 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.115.0.dev0" +version = "8.115.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From a55cac58806d7c9a4e79cba18c8077e862c39123 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Fri, 10 Oct 2025 16:09:53 -0400 Subject: [PATCH 076/164] 8.116.0.dev0 --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 0149c284a..05a11f2b4 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.115.0" +__version__ = "8.116.0.dev0" diff --git a/pyproject.toml b/pyproject.toml index 43e88b360..029397485 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.115.0" +version = "8.116.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 56152da97569d2ee3e9770c4da346e2fb3df0edf Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Tue, 14 Oct 2025 17:23:11 +0200 Subject: [PATCH 077/164] fix(http): http.url tag should contain the path (#663) --- datadog_lambda/trigger.py | 3 ++- .../snapshots/logs/async-metrics_python310.log | 6 ++---- .../snapshots/logs/async-metrics_python311.log | 6 ++---- .../snapshots/logs/async-metrics_python312.log | 6 ++---- .../snapshots/logs/async-metrics_python313.log | 6 ++---- .../snapshots/logs/async-metrics_python38.log | 6 ++---- .../snapshots/logs/async-metrics_python39.log | 6 ++---- .../snapshots/logs/sync-metrics_python310.log | 6 ++---- .../snapshots/logs/sync-metrics_python311.log | 6 ++---- .../snapshots/logs/sync-metrics_python312.log | 6 ++---- .../snapshots/logs/sync-metrics_python313.log | 6 ++---- .../snapshots/logs/sync-metrics_python38.log | 6 ++---- .../snapshots/logs/sync-metrics_python39.log | 6 ++---- tests/test_trigger.py | 11 +++-------- 14 files changed, 29 insertions(+), 57 deletions(-) diff --git a/datadog_lambda/trigger.py b/datadog_lambda/trigger.py index e0c3c4fa1..e60de8f0c 100644 --- a/datadog_lambda/trigger.py +++ b/datadog_lambda/trigger.py @@ -325,7 +325,8 @@ def extract_http_tags(event): method = apigateway_v2_http.get("method") if path: - http_tags["http.url_details.path"] = path + if http_tags.get("http.url"): + http_tags["http.url"] += path if method: http_tags["http.method"] = method diff --git a/tests/integration/snapshots/logs/async-metrics_python310.log b/tests/integration/snapshots/logs/async-metrics_python310.log index ea8bf42f6..6779d7ddb 100644 --- a/tests/integration/snapshots/logs/async-metrics_python310.log +++ b/tests/integration/snapshots/logs/async-metrics_python310.log @@ -105,8 +105,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "span.kind": "server", - "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", - "http.url_details.path": "/Prod/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", "http.status_code": "200" @@ -772,8 +771,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", "span.kind": "server", - "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", "http.status_code": "200" diff --git a/tests/integration/snapshots/logs/async-metrics_python311.log b/tests/integration/snapshots/logs/async-metrics_python311.log index 5aa9c5545..9f14ff15c 100644 --- a/tests/integration/snapshots/logs/async-metrics_python311.log +++ b/tests/integration/snapshots/logs/async-metrics_python311.log @@ -105,8 +105,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "span.kind": "server", - "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", - "http.url_details.path": "/Prod/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", "http.status_code": "200" @@ -772,8 +771,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", "span.kind": "server", - "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", "http.status_code": "200" diff --git a/tests/integration/snapshots/logs/async-metrics_python312.log b/tests/integration/snapshots/logs/async-metrics_python312.log index 67732da61..789a39551 100644 --- a/tests/integration/snapshots/logs/async-metrics_python312.log +++ b/tests/integration/snapshots/logs/async-metrics_python312.log @@ -105,8 +105,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "span.kind": "server", - "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", - "http.url_details.path": "/Prod/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", "http.status_code": "200" @@ -772,8 +771,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", "span.kind": "server", - "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", "http.status_code": "200" diff --git a/tests/integration/snapshots/logs/async-metrics_python313.log b/tests/integration/snapshots/logs/async-metrics_python313.log index 18b3109eb..78ade6a7a 100644 --- a/tests/integration/snapshots/logs/async-metrics_python313.log +++ b/tests/integration/snapshots/logs/async-metrics_python313.log @@ -105,8 +105,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "span.kind": "server", - "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", - "http.url_details.path": "/Prod/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", "http.status_code": "200" @@ -772,8 +771,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", "span.kind": "server", - "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", "http.status_code": "200" diff --git a/tests/integration/snapshots/logs/async-metrics_python38.log b/tests/integration/snapshots/logs/async-metrics_python38.log index c9fe147f9..5375fafec 100644 --- a/tests/integration/snapshots/logs/async-metrics_python38.log +++ b/tests/integration/snapshots/logs/async-metrics_python38.log @@ -105,8 +105,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "span.kind": "server", - "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", - "http.url_details.path": "/Prod/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", "http.status_code": "200" @@ -772,8 +771,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", "span.kind": "server", - "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", "http.status_code": "200" diff --git a/tests/integration/snapshots/logs/async-metrics_python39.log b/tests/integration/snapshots/logs/async-metrics_python39.log index 47fd9c87e..f16e9e2d5 100644 --- a/tests/integration/snapshots/logs/async-metrics_python39.log +++ b/tests/integration/snapshots/logs/async-metrics_python39.log @@ -105,8 +105,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "span.kind": "server", - "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", - "http.url_details.path": "/Prod/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", "http.status_code": "200" @@ -772,8 +771,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", "span.kind": "server", - "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", "http.status_code": "200" diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index 1e1b8a7b4..1cbd91dd8 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -85,8 +85,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "span.kind": "server", - "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", - "http.url_details.path": "/Prod/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", "http.status_code": "200" @@ -828,8 +827,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", "span.kind": "server", - "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", "http.status_code": "200" diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index adc6d215d..b043a8f47 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -85,8 +85,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "span.kind": "server", - "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", - "http.url_details.path": "/Prod/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", "http.status_code": "200" @@ -828,8 +827,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", "span.kind": "server", - "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", "http.status_code": "200" diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index a7934c86d..ff9bbdb75 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -85,8 +85,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "span.kind": "server", - "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", - "http.url_details.path": "/Prod/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", "http.status_code": "200" @@ -828,8 +827,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", "span.kind": "server", - "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", "http.status_code": "200" diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index a5516973c..87352f25e 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -85,8 +85,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "span.kind": "server", - "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", - "http.url_details.path": "/Prod/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", "http.status_code": "200" @@ -828,8 +827,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", "span.kind": "server", - "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", "http.status_code": "200" diff --git a/tests/integration/snapshots/logs/sync-metrics_python38.log b/tests/integration/snapshots/logs/sync-metrics_python38.log index 8cd4eb2cc..ae41bc18d 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python38.log +++ b/tests/integration/snapshots/logs/sync-metrics_python38.log @@ -85,8 +85,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "span.kind": "server", - "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", - "http.url_details.path": "/Prod/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", "http.status_code": "200" @@ -828,8 +827,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", "span.kind": "server", - "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", "http.status_code": "200" diff --git a/tests/integration/snapshots/logs/sync-metrics_python39.log b/tests/integration/snapshots/logs/sync-metrics_python39.log index 5e5e9cf30..1acb7f0da 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python39.log +++ b/tests/integration/snapshots/logs/sync-metrics_python39.log @@ -85,8 +85,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", "span.kind": "server", - "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com", - "http.url_details.path": "/Prod/", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", "http.status_code": "200" @@ -828,8 +827,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", "span.kind": "server", - "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", "http.status_code": "200" diff --git a/tests/test_trigger.py b/tests/test_trigger.py index 182e61d8e..f10fcbbf0 100644 --- a/tests/test_trigger.py +++ b/tests/test_trigger.py @@ -318,8 +318,7 @@ def test_extract_trigger_tags_api_gateway(self): { "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "arn:aws:apigateway:us-west-1::/restapis/1234567890/stages/prod", - "http.url": "https://70ixmpl4fl.execute-api.us-east-2.amazonaws.com", - "http.url_details.path": "/prod/path/to/resource", + "http.url": "https://70ixmpl4fl.execute-api.us-east-2.amazonaws.com/prod/path/to/resource", "http.method": "POST", "http.route": "/{proxy+}", "span.kind": "server", @@ -338,8 +337,7 @@ def test_extract_trigger_tags_api_gateway_non_proxy(self): { "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "arn:aws:apigateway:us-west-1::/restapis/lgxbo6a518/stages/dev", - "http.url": "https://lgxbo6a518.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/dev/http/get", + "http.url": "https://lgxbo6a518.execute-api.eu-west-1.amazonaws.com/dev/http/get", "http.method": "GET", "http.route": "/http/get", "span.kind": "server", @@ -409,8 +407,7 @@ def test_extract_trigger_tags_api_gateway_http_api(self): { "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "arn:aws:apigateway:us-west-1::/restapis/x02yirxc7a/stages/$default", - "http.url": "https://x02yirxc7a.execute-api.eu-west-1.amazonaws.com", - "http.url_details.path": "/httpapi/get", + "http.url": "https://x02yirxc7a.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "span.kind": "server", "http.route": "/httpapi/get", @@ -429,7 +426,6 @@ def test_extract_trigger_tags_application_load_balancer(self): { "function_trigger.event_source": "application-load-balancer", "function_trigger.event_source_arn": "arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/lambda-xyz/123abc", - "http.url_details.path": "/lambda", "http.method": "GET", "span.kind": "server", }, @@ -596,7 +592,6 @@ def test_extract_http_tags_with_invalid_request_context(self): http_tags, { "span.kind": "server", - "http.url_details.path": "/test", "http.method": "GET", }, ) From fba070d59d57818d62c89f39b179d72932f1a0d5 Mon Sep 17 00:00:00 2001 From: Brett Langdon Date: Wed, 22 Oct 2025 12:42:48 -0400 Subject: [PATCH 078/164] chore: do not use Span.set_tag_str (#669) * chore: do not use Span.set_tag_str Use Span.set_tag instead. Span.set_tag_str is being deprecated and removed * update to use node 20 for ci --------- Co-authored-by: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> --- ci/input_files/build.yaml.tpl | 4 ++-- datadog_lambda/asm.py | 4 ++-- tests/test_asm.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ci/input_files/build.yaml.tpl b/ci/input_files/build.yaml.tpl index 8624a8060..599160fbf 100644 --- a/ci/input_files/build.yaml.tpl +++ b/ci/input_files/build.yaml.tpl @@ -27,8 +27,8 @@ default: - apt-get install -y ca-certificates curl gnupg xxd - mkdir -p /etc/apt/keyrings - curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg - # We are explicitly setting the node_18.x version for the installation - - echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list + # We are explicitly setting the node_20.x version for the installation + - echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list - apt-get update - apt-get install nodejs -y - npm install --global yarn diff --git a/datadog_lambda/asm.py b/datadog_lambda/asm.py index 7bd8272f8..6c65a9465 100644 --- a/datadog_lambda/asm.py +++ b/datadog_lambda/asm.py @@ -126,8 +126,8 @@ def asm_start_request( request_ip = _get_request_header_client_ip(request_headers, peer_ip, True) if request_ip is not None: - span.set_tag_str("http.client_ip", request_ip) - span.set_tag_str("network.client.ip", request_ip) + span.set_tag("http.client_ip", request_ip) + span.set_tag("network.client.ip", request_ip) # Encode the parsed query and append it to reconstruct the original raw URI expected by AppSec. if parsed_query: diff --git a/tests/test_asm.py b/tests/test_asm.py index 1e11b102d..3aab8dd73 100644 --- a/tests/test_asm.py +++ b/tests/test_asm.py @@ -331,8 +331,8 @@ def test_asm_start_request_parametrized( # Check IP tags were set if IP is present if expected_ip: - mock_span.set_tag_str.assert_any_call("http.client_ip", expected_ip) - mock_span.set_tag_str.assert_any_call("network.client.ip", expected_ip) + mock_span.set_tag.assert_any_call("http.client_ip", expected_ip) + mock_span.set_tag.assert_any_call("network.client.ip", expected_ip) @pytest.mark.parametrize( From b8779f89d3cf0faaac4fa58502459ee8bae4e822 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Thu, 23 Oct 2025 10:25:59 -0400 Subject: [PATCH 079/164] release v8.116.0 with ddtrace@3.16.2 (#671) --- datadog_lambda/version.py | 2 +- pyproject.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 05a11f2b4..2e2e781ad 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.116.0.dev0" +__version__ = "8.116.0" diff --git a/pyproject.toml b/pyproject.toml index 029397485..cf7d18059 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.116.0.dev0" +version = "8.116.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" @@ -28,7 +28,7 @@ classifiers = [ python = ">=3.8.0,<4" datadog = ">=0.51.0,<1.0.0" wrapt = "^1.11.2" -ddtrace = ">=3.11.0,<4" +ddtrace = ">=3.16.2,<4" ujson = ">=5.9.0" botocore = { version = "^1.34.0", optional = true } requests = { version ="^2.22.0", optional = true } From 1fac67c442ae0b4521c31e9d2269497e14dd34d6 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Thu, 23 Oct 2025 13:51:31 -0400 Subject: [PATCH 080/164] v8.117.0.dev0 --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 2e2e781ad..373eef7d0 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.116.0" +__version__ = "8.117.0.dev0" diff --git a/pyproject.toml b/pyproject.toml index cf7d18059..d135e085b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.116.0" +version = "8.117.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From af3d0e2ac6e57a895df839f7226b985a58017b77 Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Fri, 31 Oct 2025 09:32:28 +0100 Subject: [PATCH 081/164] feat(config): enable telemetry when SCA is on independently from appsec (#672) --- datadog_lambda/__init__.py | 9 +-------- datadog_lambda/config.py | 15 +++++++++------ datadog_lambda/tracing.py | 5 ----- tests/test_config.py | 34 ++++++++++++++++++++++++++++------ 4 files changed, 38 insertions(+), 25 deletions(-) diff --git a/datadog_lambda/__init__.py b/datadog_lambda/__init__.py index 2034d3cbf..059cead9e 100644 --- a/datadog_lambda/__init__.py +++ b/datadog_lambda/__init__.py @@ -1,12 +1,5 @@ +import datadog_lambda.config # noqa: F401 needs to be imported before `ddtrace` from datadog_lambda.cold_start import initialize_cold_start_tracing -import os - - -if os.environ.get("DD_INSTRUMENTATION_TELEMETRY_ENABLED") is None: - # Telemetry is required for Appsec Software Composition Analysis - os.environ["DD_INSTRUMENTATION_TELEMETRY_ENABLED"] = os.environ.get( - "DD_APPSEC_ENABLED", "false" - ) initialize_cold_start_tracing() diff --git a/datadog_lambda/config.py b/datadog_lambda/config.py index aaa1af5e8..eda6b5828 100644 --- a/datadog_lambda/config.py +++ b/datadog_lambda/config.py @@ -82,12 +82,6 @@ def _resolve_env(self, key, default=None, cast=None, depends_on_tracing=False): logs_injection = _get_env("DD_LOGS_INJECTION", "true", as_bool) merge_xray_traces = _get_env("DD_MERGE_XRAY_TRACES", "false", as_bool) - telemetry_enabled = _get_env( - "DD_INSTRUMENTATION_TELEMETRY_ENABLED", - "false", - as_bool, - depends_on_tracing=True, - ) otel_enabled = _get_env("DD_TRACE_OTEL_ENABLED", "false", as_bool) profiling_enabled = _get_env("DD_PROFILING_ENABLED", "false", as_bool) llmobs_enabled = _get_env("DD_LLMOBS_ENABLED", "false", as_bool) @@ -96,6 +90,7 @@ def _resolve_env(self, key, default=None, cast=None, depends_on_tracing=False): "DD_DATA_STREAMS_ENABLED", "false", as_bool, depends_on_tracing=True ) appsec_enabled = _get_env("DD_APPSEC_ENABLED", "false", as_bool) + sca_enabled = _get_env("DD_APPSEC_SCA_ENABLED", "false", as_bool) is_gov_region = _get_env("AWS_REGION", "", lambda x: x.startswith("us-gov-")) @@ -144,3 +139,11 @@ def _reset(self): "Python Lambda Layer FIPS mode is %s.", "enabled" if config.fips_mode_enabled else "not enabled", ) + + +if ( + "DD_INSTRUMENTATION_TELEMETRY_ENABLED" not in os.environ + and not config.sca_enabled + and not config.appsec_enabled +): + os.environ["DD_INSTRUMENTATION_TELEMETRY_ENABLED"] = "false" diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index 4faaed2df..225f5dd82 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -55,11 +55,6 @@ logger = logging.getLogger(__name__) dd_trace_context = None -if config.telemetry_enabled: - # Enable the telemetry client if the user has opted in - from ddtrace.internal.telemetry import telemetry_writer - - telemetry_writer.enable() propagator = HTTPPropagator() diff --git a/tests/test_config.py b/tests/test_config.py index 92002439d..9c5da63a2 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,3 +1,6 @@ +import importlib +import sys + import pytest from datadog_lambda.config import config, _get_env, Config @@ -14,6 +17,29 @@ def set_env(key, value): return set_env +def test_config_import_does_not_import_ddtrace(monkeypatch): + import datadog_lambda + + with monkeypatch.context() as mp: + for name in list(sys.modules): + if name == "ddtrace" or name.startswith("ddtrace."): + mp.delitem(sys.modules, name, raising=False) + + class _BlockDdtrace(importlib.abc.MetaPathFinder): + def find_spec(self, fullname, path=None, target=None): + if fullname == "ddtrace" or fullname.startswith("ddtrace."): + raise ImportError("ddtrace must not be imported during this test") + return None + + blocker = _BlockDdtrace() + mp.setattr(sys, "meta_path", [blocker] + sys.meta_path, raising=False) + + mp.delattr(datadog_lambda, "config", raising=False) + mp.delitem(sys.modules, "datadog_lambda.config", raising=False) + importlib.invalidate_caches() + importlib.import_module("datadog_lambda.config") + + def _test_as_bool(env_key, conf_key, default): return ( (env_key, conf_key, None, default), @@ -72,9 +98,6 @@ def _test_as_list(env_key, conf_key, default): *_test_as_bool("DD_INTEGRATION_TEST", "integration_test", default=False), *_test_as_bool("DD_BOTOCORE_ADD_SPAN_POINTERS", "add_span_pointers", default=True), *_test_as_bool("DD_TRACE_OTEL_ENABLED", "otel_enabled", default=False), - *_test_as_bool( - "DD_INSTRUMENTATION_TELEMETRY_ENABLED", "telemetry_enabled", default=False - ), *_test_as_bool("DD_MERGE_XRAY_TRACES", "merge_xray_traces", default=False), *_test_as_bool("DD_PROFILING_ENABLED", "profiling_enabled", default=False), *_test_as_bool("DD_LLMOBS_ENABLED", "llmobs_enabled", default=False), @@ -86,6 +109,8 @@ def _test_as_list(env_key, conf_key, default): ), *_test_as_bool("DD_LOCAL_TEST", "local_test", default=False), *_test_as_bool("DD_DATA_STREAMS_ENABLED", "data_streams_enabled", default=False), + *_test_as_bool("DD_APPSEC_ENABLED", "appsec_enabled", default=False), + *_test_as_bool("DD_APPSEC_SCA_ENABLED", "sca_enabled", default=False), *_test_int( "DD_CAPTURE_LAMBDA_PAYLOAD_MAX_DEPTH", "capture_payload_max_depth", default=10 ), @@ -143,9 +168,6 @@ def test_config_from_environ(env_key, conf_key, env_val, conf_val, setenv): "DD_DECODE_AUTHORIZER_CONTEXT", "decode_authorizer_context", default=True ), *_test_as_bool("DD_DATA_STREAMS_ENABLED", "data_streams_enabled", default=False), - *_test_as_bool( - "DD_INSTRUMENTATION_TELEMETRY_ENABLED", "telemetry_enabled", default=False - ), ) From d2ca8240bd86c6facc28be053dd79eaabb0790a2 Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Fri, 31 Oct 2025 10:20:08 -0400 Subject: [PATCH 082/164] APMSVLS-212 Reducing Python Lambda Layer Size (#667) strip -g original dockerfile typo No node version Node v 20 strip debug all strip unneeded discard all Merged main removing unnecessary files fixing diff Strip unneeded, cleaned up dockerfile update comment Co-authored-by: rithika.narayan --- Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8da968fb2..cc9e9d70f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -73,11 +73,12 @@ RUN find ./python/lib/$runtime/site-packages/ddtrace -name \*.h -delete RUN find ./python/lib/$runtime/site-packages/ddtrace -name \*.hpp -delete RUN find ./python/lib/$runtime/site-packages/ddtrace -name \*.pyx -delete -# Strip debug symbols using strip -g for all .so files in ddtrace. This is to +# Strip debug symbols and symbols that are not needed for relocation +# processing using strip --strip-unneeded for all .so files. This is to # reduce the size when ddtrace is built from sources. The release wheels are # already stripped of debug symbols. We should revisit this when serverless # benchmark uses pre-built wheels instead of building from sources. -RUN find ./python/lib/$runtime/site-packages/ddtrace -name "*.so" -exec strip -g {} \; +RUN find ./python/lib/$runtime/site-packages -name "*.so" -exec strip --strip-unneeded {} \; FROM scratch COPY --from=builder /build/python / From 92a4e837c244306bca6b31d7b183c449ec63506d Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Mon, 10 Nov 2025 14:24:17 -0500 Subject: [PATCH 083/164] v8.117.0 (#673) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 373eef7d0..bb21a06a2 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.117.0.dev0" +__version__ = "8.117.0" diff --git a/pyproject.toml b/pyproject.toml index d135e085b..be1000264 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.117.0.dev0" +version = "8.117.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 3a1e0d347494f98ec38e9cd0615f24c6356a6f33 Mon Sep 17 00:00:00 2001 From: Rithika Narayan Date: Mon, 10 Nov 2025 15:26:59 -0500 Subject: [PATCH 084/164] Updating to v8.118.0.dev0 --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index bb21a06a2..26394e220 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.117.0" +__version__ = "8.118.0.dev0" diff --git a/pyproject.toml b/pyproject.toml index be1000264..2c59df99d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.117.0" +version = "8.118.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From e303ad186cc84b218bbdc4c70507f2551c9ac3ec Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Wed, 12 Nov 2025 16:14:52 -0500 Subject: [PATCH 085/164] Keeping stack v2 for profiling (#674) --- Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index cc9e9d70f..d3ba70da0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,8 +34,6 @@ RUN rm -rf ./python/lib/$runtime/site-packages/jsonschema/tests RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_ast/iastpatch*.so RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_taint_tracking/*.so RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_stacktrace*.so -# _stack_v2 may not exist for some versions of ddtrace (e.g. under python 3.13) -RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/internal/datadog/profiling/stack_v2/_stack_v2.*.so # remove *.dist-info directories except any entry_points.txt files and METADATA files required for Appsec Software Composition Analysis RUN find ./python/lib/$runtime/site-packages/*.dist-info \ -type f \ From 5f0ad54779a286a877bfb05aa7fa4ae1553ac09e Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Fri, 14 Nov 2025 17:35:13 +0100 Subject: [PATCH 086/164] remove python 3.8 build (#675) --- .github/workflows/build_layer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_layer.yml b/.github/workflows/build_layer.yml index 789868ed0..76a65bfac 100644 --- a/.github/workflows/build_layer.yml +++ b/.github/workflows/build_layer.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: arch: [arm64, amd64] - python_version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] + python_version: ["3.9", "3.10", "3.11", "3.12", "3.13"] steps: - name: Checkout From 25515314295427cef4aac2e64a857fa5b1943ec7 Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Wed, 19 Nov 2025 19:14:22 +0100 Subject: [PATCH 087/164] Adds fail-fast on build job (#678) * Remove useless build for system-tests * Use fail-fast with the complete list * Removes Pr event --- .github/workflows/build_layer.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build_layer.yml b/.github/workflows/build_layer.yml index 76a65bfac..7368a5172 100644 --- a/.github/workflows/build_layer.yml +++ b/.github/workflows/build_layer.yml @@ -1,6 +1,7 @@ name: Build Layers for system-Tests on: + workflow_dispatch: push: branches: - "main" @@ -10,6 +11,7 @@ jobs: runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest' }} strategy: + fail-fast: false matrix: arch: [arm64, amd64] python_version: ["3.9", "3.10", "3.11", "3.12", "3.13"] From 61373e5963813ab2a4666d06493d1e0cfba35e96 Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Tue, 25 Nov 2025 14:07:30 -0500 Subject: [PATCH 088/164] exclude ddtrace v3.19.0 (#684) * exclude ddtrace v3.19.0 * Exclude below 3.16.2 Co-authored-by: Rey Abolofia --------- Co-authored-by: Rey Abolofia --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2c59df99d..02b61733f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ classifiers = [ python = ">=3.8.0,<4" datadog = ">=0.51.0,<1.0.0" wrapt = "^1.11.2" -ddtrace = ">=3.16.2,<4" +ddtrace = ">=3.16.2,!=3.19.0,<4" ujson = ">=5.9.0" botocore = { version = "^1.34.0", optional = true } requests = { version ="^2.22.0", optional = true } From 8c28b41a6ec88d58f1140047d5ee2203c64d45aa Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Tue, 25 Nov 2025 15:01:21 -0500 Subject: [PATCH 089/164] ddtrace version less than 3.19.0 (#686) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 02b61733f..abb5f4054 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ classifiers = [ python = ">=3.8.0,<4" datadog = ">=0.51.0,<1.0.0" wrapt = "^1.11.2" -ddtrace = ">=3.16.2,!=3.19.0,<4" +ddtrace = ">=3.16.2,<3.19.0" ujson = ">=5.9.0" botocore = { version = "^1.34.0", optional = true } requests = { version ="^2.22.0", optional = true } From ea7ad6ec0b28951d5d1f5905c2e28c673ece5d12 Mon Sep 17 00:00:00 2001 From: AJ Stuyvenberg Date: Tue, 25 Nov 2025 15:40:40 -0500 Subject: [PATCH 090/164] Fix case-insensitive header redaction (#685) * Normalize header redaction keys Co-authored-by: astuyve * feat: fmt * less than 3.19.0 --------- Co-authored-by: datadog-official[bot] <214633350+datadog-official[bot]@users.noreply.github.com> Co-authored-by: Rithika Narayan --- datadog_lambda/tag_object.py | 2 +- tests/test_tag_object.py | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/tag_object.py b/datadog_lambda/tag_object.py index 744e48933..67f6a14d7 100644 --- a/datadog_lambda/tag_object.py +++ b/datadog_lambda/tag_object.py @@ -62,6 +62,6 @@ def _should_try_string(obj): def _redact_val(k, v): split_key = k.split(".").pop() or k - if split_key in redactable_keys: + if split_key.lower() in redactable_keys: return "redacted" return v diff --git a/tests/test_tag_object.py b/tests/test_tag_object.py index 574bb331a..bd04bf4c7 100644 --- a/tests/test_tag_object.py +++ b/tests/test_tag_object.py @@ -73,13 +73,14 @@ def test_tag_object_max_depth_0(self): "vals": [{"thingOne": 1}, {"thingTwo": 2}], } spanMock = MagicMock() + expected_value = str(payload) tag_object(spanMock, "function.request", payload) spanMock.set_tag.assert_has_calls( [ call( "function.request", - "{'hello': 'world', 'level1': {'level2_dict': {'level3': 3}, 'level2_list': [None, True, 'nice', {'l3': 'v3'}], 'level2_bool': True, 'level2_int': 2}, 'vals': [{'thingOne': 1}, {'thingTwo': 2}]}", + expected_value, ), ], True, @@ -105,6 +106,18 @@ def test_redacted_tag_object(self): True, ) + def test_redacted_tag_object_case_insensitive(self): + payload = { + "Authorization": "secret", + "headers": {"X-AUTHORIZATION": "another"}, + } + spanMock = MagicMock() + tag_object(spanMock, "function.request", payload) + spanMock.set_tag.assert_any_call("function.request.Authorization", "redacted") + spanMock.set_tag.assert_any_call( + "function.request.headers.X-AUTHORIZATION", "redacted" + ) + def test_json_tag_object(self): payload = { "token": "world", From c678c09491d065a435a17de0ae15f0ac3dfdafd9 Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Mon, 1 Dec 2025 17:54:05 +0100 Subject: [PATCH 091/164] ci(system-tests): fix ddtrace py build from source (#690) * ci(system-tests): fix ddtrace py build from source * ci(system-tests): run on pull requests --- .github/workflows/build_layer.yml | 1 + Dockerfile | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/build_layer.yml b/.github/workflows/build_layer.yml index 7368a5172..e146ee0ff 100644 --- a/.github/workflows/build_layer.yml +++ b/.github/workflows/build_layer.yml @@ -2,6 +2,7 @@ name: Build Layers for system-Tests on: workflow_dispatch: + pull_request: push: branches: - "main" diff --git a/Dockerfile b/Dockerfile index d3ba70da0..ce59438db 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,6 +15,7 @@ RUN set -eux; \ rm gcc && ln -s gcc10-gcc gcc; \ rm g++ && ln -s gcc10-g++ g++; \ rm cc && ln -s gcc10-cc cc; \ + rm c++ && ln -s gcc10-c++ c++; \ fi # Add Rust compiler which is needed to build dd-trace-py from source From fc56ce1f086e63427b121dbedea64f45069eb255 Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Mon, 1 Dec 2025 11:54:26 -0500 Subject: [PATCH 092/164] Adding Python 3.14 (#677) * first pass of adding runtime 3.14, checked against uses of 3.12 * snapshots * removing comma * Skip testing profiling for 3.14 runtime * Updating asm to reflect dd-tract-py changes to http_utils._get_blocked_template * pinning to older ddtrace * Use pytest to skip profiling test * Update version of black which supports python3.14 * Update linting to newest version of black. --------- Co-authored-by: Rey Abolofia --- .github/workflows/build.yml | 2 +- .github/workflows/build_layer.yml | 2 +- README.md | 2 +- ci/datasources/runtimes.yaml | 8 + ci/publish_layers.sh | 8 + pyproject.toml | 1 + scripts/add_new_region.sh | 4 + scripts/build_layers.sh | 2 +- scripts/check_format.sh | 2 +- scripts/list_layers.sh | 2 + scripts/publish_govcloud.sh | 2 +- scripts/publish_layers.sh | 6 + scripts/run_integration_tests.sh | 3 +- scripts/run_tests.sh | 2 +- scripts/sign_layers.sh | 2 + .../logs/async-metrics_python314.log | 1674 +++++++++++++++ .../snapshots/logs/sync-metrics_python314.log | 1864 +++++++++++++++++ tests/test_api.py | 24 +- tests/test_wrapper.py | 5 + tests/test_xray.py | 12 +- 20 files changed, 3601 insertions(+), 26 deletions(-) create mode 100644 tests/integration/snapshots/logs/async-metrics_python314.log create mode 100644 tests/integration/snapshots/logs/sync-metrics_python314.log diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 050624478..787b5da36 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -43,7 +43,7 @@ jobs: strategy: max-parallel: 4 matrix: - python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14'] steps: - name: Checkout diff --git a/.github/workflows/build_layer.yml b/.github/workflows/build_layer.yml index e146ee0ff..8eef0c661 100644 --- a/.github/workflows/build_layer.yml +++ b/.github/workflows/build_layer.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false matrix: arch: [arm64, amd64] - python_version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python_version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - name: Checkout diff --git a/README.md b/README.md index 658babc28..a1199e8eb 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![Slack](https://chat.datadoghq.com/badge.svg?bg=632CA6)](https://chat.datadoghq.com/) [![License](https://img.shields.io/badge/license-Apache--2.0-blue)](https://github.com/DataDog/datadog-lambda-python/blob/main/LICENSE) -Datadog Lambda Library for Python (3.8, 3.9, 3.10, 3.11, 3.12, and 3.13) enables [enhanced Lambda metrics](https://docs.datadoghq.com/serverless/enhanced_lambda_metrics), [distributed tracing](https://docs.datadoghq.com/serverless/distributed_tracing), and [custom metric submission](https://docs.datadoghq.com/serverless/custom_metrics) from AWS Lambda functions. +Datadog Lambda Library for Python (3.8, 3.9, 3.10, 3.11, 3.12, 3.13, and 3.14) enables [enhanced Lambda metrics](https://docs.datadoghq.com/serverless/enhanced_lambda_metrics), [distributed tracing](https://docs.datadoghq.com/serverless/distributed_tracing), and [custom metric submission](https://docs.datadoghq.com/serverless/custom_metrics) from AWS Lambda functions. ## Installation diff --git a/ci/datasources/runtimes.yaml b/ci/datasources/runtimes.yaml index f9456d396..2b19cf1c4 100644 --- a/ci/datasources/runtimes.yaml +++ b/ci/datasources/runtimes.yaml @@ -47,3 +47,11 @@ runtimes: python_version: "3.13" arch: "arm64" image: "3.13.0" + - name: "python314" + python_version: "3.14" + arch: "amd64" + image: "3.14.0" + - name: "python314" + python_version: "3.14" + arch: "arm64" + image: "3.14.0" diff --git a/ci/publish_layers.sh b/ci/publish_layers.sh index 9654582a2..d15931ac1 100755 --- a/ci/publish_layers.sh +++ b/ci/publish_layers.sh @@ -23,6 +23,8 @@ AWS_CLI_PYTHON_VERSIONS=( "python3.12" "python3.13" "python3.13" + "python3.14" + "python3.14" ) PYTHON_VERSIONS=( "3.8-amd64" @@ -37,6 +39,8 @@ PYTHON_VERSIONS=( "3.12-arm64" "3.13-amd64" "3.13-arm64" + "3.14-amd64" + "3.14-arm64" ) LAYER_PATHS=( ".layers/datadog_lambda_py-amd64-3.8.zip" @@ -51,6 +55,8 @@ LAYER_PATHS=( ".layers/datadog_lambda_py-arm64-3.12.zip" ".layers/datadog_lambda_py-amd64-3.13.zip" ".layers/datadog_lambda_py-arm64-3.13.zip" + ".layers/datadog_lambda_py-amd64-3.14.zip" + ".layers/datadog_lambda_py-arm64-3.14.zip" ) LAYERS=( "Datadog-Python38" @@ -65,6 +71,8 @@ LAYERS=( "Datadog-Python312-ARM" "Datadog-Python313" "Datadog-Python313-ARM" + "Datadog-Python314" + "Datadog-Python314-ARM" ) STAGES=('prod', 'sandbox', 'staging', 'gov-staging', 'gov-prod') diff --git a/pyproject.toml b/pyproject.toml index abb5f4054..5f91a97d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,6 +22,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ] [tool.poetry.dependencies] diff --git a/scripts/add_new_region.sh b/scripts/add_new_region.sh index 576d13e7f..210436294 100755 --- a/scripts/add_new_region.sh +++ b/scripts/add_new_region.sh @@ -25,6 +25,8 @@ LAYER_NAMES=( "Datadog-Python312-ARM" "Datadog-Python313" "Datadog-Python313-ARM" + "Datadog-Python314" + "Datadog-Python314-ARM" ) PYTHON_VERSIONS_FOR_AWS_CLI=( "python3.8" @@ -39,6 +41,8 @@ PYTHON_VERSIONS_FOR_AWS_CLI=( "python3.12" "python3.13" "python3.13" + "python3.14" + "python3.14" ) NEW_REGION=$1 diff --git a/scripts/build_layers.sh b/scripts/build_layers.sh index 23941b7a0..b78ca9abe 100755 --- a/scripts/build_layers.sh +++ b/scripts/build_layers.sh @@ -14,7 +14,7 @@ set -e LAYER_DIR=".layers" LAYER_FILES_PREFIX="datadog_lambda_py" -AVAILABLE_PYTHON_VERSIONS=("3.8" "3.9" "3.10" "3.11" "3.12" "3.13") +AVAILABLE_PYTHON_VERSIONS=("3.8" "3.9" "3.10" "3.11" "3.12" "3.13" "3.14") AVAILABLE_ARCHS=("arm64" "amd64") if [ -z "$ARCH" ]; then diff --git a/scripts/check_format.sh b/scripts/check_format.sh index df5a67187..783a17d6a 100755 --- a/scripts/check_format.sh +++ b/scripts/check_format.sh @@ -2,7 +2,7 @@ set -e PYTHON_VERSION=$(python -c 'import sys; print(sys.version_info.major)') -pip install -Iv black==22.3.0 +pip install -Iv black==25.11.0 python -m black --check datadog_lambda/ --diff python -m black --check tests --diff diff --git a/scripts/list_layers.sh b/scripts/list_layers.sh index 6449e5115..d2710a7e7 100755 --- a/scripts/list_layers.sh +++ b/scripts/list_layers.sh @@ -23,6 +23,8 @@ LAYER_NAMES=( "Datadog-Python312-ARM" "Datadog-Python313" "Datadog-Python313-ARM" + "Datadog-Python314" + "Datadog-Python314-ARM" ) AVAILABLE_REGIONS=$(aws ec2 describe-regions | jq -r '.[] | .[] | .RegionName') LAYERS_MISSING_REGIONS=() diff --git a/scripts/publish_govcloud.sh b/scripts/publish_govcloud.sh index 5fd107b0e..5edd3b08e 100755 --- a/scripts/publish_govcloud.sh +++ b/scripts/publish_govcloud.sh @@ -88,7 +88,7 @@ do export REGION=$region - for python_version in "3.8" "3.9" "3.10" "3.11" "3.12" "3.13"; do + for python_version in "3.8" "3.9" "3.10" "3.11" "3.12" "3.13" "3.14"; do for arch in "amd64" "arm64"; do export PYTHON_VERSION=$python_version export ARCH=$arch diff --git a/scripts/publish_layers.sh b/scripts/publish_layers.sh index 8c78093f8..31a514d13 100755 --- a/scripts/publish_layers.sh +++ b/scripts/publish_layers.sh @@ -26,6 +26,8 @@ PYTHON_VERSIONS_FOR_AWS_CLI=( "python3.12" "python3.13" "python3.13" + "python3.14" + "python3.14" ) LAYER_PATHS=( ".layers/datadog_lambda_py-amd64-3.8.zip" @@ -40,6 +42,8 @@ LAYER_PATHS=( ".layers/datadog_lambda_py-arm64-3.12.zip" ".layers/datadog_lambda_py-amd64-3.13.zip" ".layers/datadog_lambda_py-arm64-3.13.zip" + ".layers/datadog_lambda_py-amd64-3.14.zip" + ".layers/datadog_lambda_py-arm64-3.14.zip" ) AVAILABLE_LAYERS=( "Datadog-Python38" @@ -54,6 +58,8 @@ AVAILABLE_LAYERS=( "Datadog-Python312-ARM" "Datadog-Python313" "Datadog-Python313-ARM" + "Datadog-Python314" + "Datadog-Python314-ARM" ) AVAILABLE_REGIONS=$(aws ec2 describe-regions | jq -r '.[] | .[] | .RegionName') diff --git a/scripts/run_integration_tests.sh b/scripts/run_integration_tests.sh index f6e4f537c..1dfa72b6b 100755 --- a/scripts/run_integration_tests.sh +++ b/scripts/run_integration_tests.sh @@ -33,8 +33,9 @@ python310=("python3.10" "3.10" $(xxd -l 4 -c 4 -p < /dev/random)) python311=("python3.11" "3.11" $(xxd -l 4 -c 4 -p < /dev/random)) python312=("python3.12" "3.12" $(xxd -l 4 -c 4 -p < /dev/random)) python313=("python3.13" "3.13" $(xxd -l 4 -c 4 -p < /dev/random)) +python314=("python3.14" "3.14" $(xxd -l 4 -c 4 -p < /dev/random)) -PARAMETERS_SETS=("python38" "python39" "python310" "python311" "python312" "python313") +PARAMETERS_SETS=("python38" "python39" "python310" "python311" "python312" "python313" "python314") if [ -z "$RUNTIME_PARAM" ]; then echo "Python version not specified, running for all python versions." diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index 26f4e2156..59d572187 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -8,7 +8,7 @@ # Run unit tests in Docker set -e -PYTHON_VERSIONS=("3.8" "3.9" "3.10" "3.11" "3.12" "3.13") +PYTHON_VERSIONS=("3.8" "3.9" "3.10" "3.11" "3.12" "3.13" "3.14") for python_version in "${PYTHON_VERSIONS[@]}" do diff --git a/scripts/sign_layers.sh b/scripts/sign_layers.sh index eb40062f0..d3c890d38 100755 --- a/scripts/sign_layers.sh +++ b/scripts/sign_layers.sh @@ -21,6 +21,8 @@ LAYER_FILES=( "datadog_lambda_py-arm64-3.12.zip" "datadog_lambda_py-amd64-3.13.zip" "datadog_lambda_py-arm64-3.13.zip" + "datadog_lambda_py-amd64-3.14.zip" + "datadog_lambda_py-arm64-3.14.zip" ) SIGNING_PROFILE_NAME="DatadogLambdaSigningProfile" diff --git a/tests/integration/snapshots/logs/async-metrics_python314.log b/tests/integration/snapshots/logs/async-metrics_python314.log new file mode 100644 index 000000000..8983a83c4 --- /dev/null +++ b/tests/integration/snapshots/logs/async-metrics_python314.log @@ -0,0 +1,1674 @@ +INIT_START Runtime Version: python:3.14.vX Runtime Version ARN: arn:aws:lambda:eu-west-1:XXXX:eu-west-1 +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python314", + "resource:integration-tests-python-XXXX-async-metrics_python314", + "memorysize:1024", + "cold_start:true", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "XXXX.execute-api.us-east-2.amazonaws.com", + "resource": "GET /", + "name": "aws.apigateway", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.apigateway.rest", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", + "endpoint": "/", + "http.method": "GET", + "resource_names": "GET /", + "span.kind": "server", + "apiid": "XXXX", + "apiname": "XXXX", + "stage": "Prod", + "request_id": "XXXX", + "_inferred_span.synchronicity": "sync", + "_inferred_span.tag_source": "self", + "http.status_code": "200", + "http.route": "/", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "true", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python314", + "functionname": "integration-tests-python-XXXX-async-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "api-gateway", + "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", + "http.method": "GET", + "http.route": "/", + "http.status_code": "200" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms (init: XXXX ms) Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python314", + "resource:integration-tests-python-XXXX-async-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python314", + "functionname": "integration-tests-python-XXXX-async-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python314", + "resource:integration-tests-python-XXXX-async-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "ExampleTableWithStream", + "resource": "ExampleTableWithStream", + "name": "aws.dynamodb", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.dynamodb", + "resource_names": "ExampleTableWithStream", + "span.kind": "server", + "tablename": "ExampleTableWithStream", + "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", + "event_id": "XXXX", + "event_name": "INSERT", + "event_version": "1.1", + "stream_view_type": "NEW_AND_OLD_IMAGES", + "size_bytes": "26", + "_inferred_span.synchronicity": "async", + "_inferred_span.tag_source": "self", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.dynamodb.item", + "ptr.dir": "u", + "ptr.hash": "e2af34d333891f765c7f02d2da80895e", + "link.kind": "span-pointer" + } + }, + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.dynamodb.item", + "ptr.dir": "u", + "ptr.hash": "e2af34d333891f765c7f02d2da80895e", + "link.kind": "span-pointer" + } + }, + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.dynamodb.item", + "ptr.dir": "u", + "ptr.hash": "e2af34d333891f765c7f02d2da80895e", + "link.kind": "span-pointer" + } + } + ] + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python314", + "functionname": "integration-tests-python-XXXX-async-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python314", + "resource:integration-tests-python-XXXX-async-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "eventbridge.custom.event.sender", + "resource": "eventbridge.custom.event.sender", + "name": "aws.eventbridge", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.eventbridge", + "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", + "detail_type": "testdetail", + "_inferred_span.synchronicity": "async", + "_inferred_span.tag_source": "self", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python314", + "functionname": "integration-tests-python-XXXX-async-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "eventbridge" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python314", + "resource:integration-tests-python-XXXX-async-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "XXXX.execute-api.eu-west-1.amazonaws.com", + "resource": "GET /httpapi/get", + "name": "aws.httpapi", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.httpapi", + "endpoint": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.method": "GET", + "http.protocol": "HTTP/1.1", + "http.source_ip": "XXXX", + "http.user_agent": "XXXX/7.64.1", + "resource_names": "GET /httpapi/get", + "request_id": "XXXX", + "apiid": "XXXX", + "apiname": "XXXX", + "stage": "$default", + "_inferred_span.synchronicity": "sync", + "_inferred_span.tag_source": "self", + "http.status_code": "200", + "http.route": "/httpapi/get", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python314", + "functionname": "integration-tests-python-XXXX-async-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "api-gateway", + "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.method": "GET", + "http.route": "/httpapi/get", + "http.status_code": "200" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python314", + "resource:integration-tests-python-XXXX-async-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "EXAMPLE", + "resource": "EXAMPLE", + "name": "aws.kinesis", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.kinesis", + "resource_names": "EXAMPLE", + "span.kind": "server", + "streamname": "EXAMPLE", + "shardid": "shardId-XXXX", + "event_source_arn": "arn:aws:kinesis:EXAMPLE", + "event_id": "XXXX", + "event_name": "aws:kinesis:record", + "event_version": "1.0", + "partition_key": "XXXX", + "_inferred_span.synchronicity": "async", + "_inferred_span.tag_source": "self", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python314", + "functionname": "integration-tests-python-XXXX-async-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "kinesis", + "function_trigger.event_source_arn": "XXXX" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python314", + "resource:integration-tests-python-XXXX-async-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "example-bucket", + "resource": "example-bucket", + "name": "aws.s3", + "error": 0, + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.s3", + "resource_names": "example-bucket", + "span.kind": "server", + "event_name": "ObjectCreated:Put", + "bucketname": "example-bucket", + "bucket_arn": "arn:aws:s3:::example-bucket", + "object_key": "test/key", + "object_size": "1024", + "object_etag": "XXXX", + "_inferred_span.synchronicity": "async", + "_inferred_span.tag_source": "self", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python314", + "functionname": "integration-tests-python-XXXX-async-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "s3", + "function_trigger.event_source_arn": "XXXX" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python314", + "resource:integration-tests-python-XXXX-async-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "sns-lambda", + "resource": "sns-lambda", + "name": "aws.sns", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.sns", + "resource_names": "sns-lambda", + "span.kind": "server", + "topicname": "sns-lambda", + "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", + "message_id": "XXXX", + "type": "Notification", + "subject": "TestInvoke", + "_inferred_span.synchronicity": "async", + "_inferred_span.tag_source": "self", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python314", + "functionname": "integration-tests-python-XXXX-async-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "sns", + "function_trigger.event_source_arn": "XXXX" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python314", + "resource:integration-tests-python-XXXX-async-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "my-queue", + "resource": "my-queue", + "name": "aws.sqs", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.sqs", + "resource_names": "my-queue", + "span.kind": "server", + "queuename": "my-queue", + "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", + "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", + "sender_id": "AIDAIENQZJOLO23YVJ4VO", + "_inferred_span.synchronicity": "async", + "_inferred_span.tag_source": "self", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python314", + "functionname": "integration-tests-python-XXXX-async-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "sqs", + "function_trigger.event_source_arn": "XXXX" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-async-metrics_python314", + "resource:integration-tests-python-XXXX-async-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "hello.dog", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "tests.integration.count", + "v": 21, + "e": XXXX, + "t": [ + "test:integration", + "role:hello", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "XXXX.execute-api.eu-west-1.amazonaws.com", + "resource": "$default", + "name": "aws.apigateway.websocket", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.apigateway.websocket", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", + "endpoint": "$default", + "resource_names": "$default", + "span.kind": "server", + "apiid": "XXXX", + "apiname": "XXXX", + "stage": "dev", + "request_id": "XXXX", + "connection_id": "XXXX=", + "event_type": "MESSAGE", + "message_direction": "IN", + "_inferred_span.synchronicity": "sync", + "_inferred_span.tag_source": "self", + "http.status_code": "200", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-async-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python314", + "functionname": "integration-tests-python-XXXX-async-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "api-gateway", + "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", + "http.status_code": "200" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB diff --git a/tests/integration/snapshots/logs/sync-metrics_python314.log b/tests/integration/snapshots/logs/sync-metrics_python314.log new file mode 100644 index 000000000..442d83b48 --- /dev/null +++ b/tests/integration/snapshots/logs/sync-metrics_python314.log @@ -0,0 +1,1864 @@ +INIT_START Runtime Version: python:3.14.vX Runtime Version ARN: arn:aws:lambda:eu-west-1:XXXX:eu-west-1 +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python314", + "resource:integration-tests-python-XXXX-sync-metrics_python314", + "memorysize:1024", + "cold_start:true", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "XXXX.execute-api.us-east-2.amazonaws.com", + "resource": "GET /", + "name": "aws.apigateway", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.apigateway.rest", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", + "endpoint": "/", + "http.method": "GET", + "resource_names": "GET /", + "span.kind": "server", + "apiid": "XXXX", + "apiname": "XXXX", + "stage": "Prod", + "request_id": "XXXX", + "_inferred_span.synchronicity": "sync", + "_inferred_span.tag_source": "self", + "http.status_code": "200", + "http.route": "/", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "true", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python314", + "functionname": "integration-tests-python-XXXX-sync-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "api-gateway", + "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", + "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", + "http.method": "GET", + "http.route": "/", + "http.status_code": "200" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms (init: XXXX ms) Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python314", + "resource:integration-tests-python-XXXX-sync-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python314", + "functionname": "integration-tests-python-XXXX-sync-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python314", + "resource:integration-tests-python-XXXX-sync-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +{ + "m": "datadog.serverless.dynamodb.stream.type", + "v": 1, + "e": XXXX, + "t": [ + "streamtype:NEW_AND_OLD_IMAGES", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "ExampleTableWithStream", + "resource": "ExampleTableWithStream", + "name": "aws.dynamodb", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.dynamodb", + "resource_names": "ExampleTableWithStream", + "span.kind": "server", + "tablename": "ExampleTableWithStream", + "event_source_arn": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", + "event_id": "XXXX", + "event_name": "INSERT", + "event_version": "1.1", + "stream_view_type": "NEW_AND_OLD_IMAGES", + "size_bytes": "26", + "_inferred_span.synchronicity": "async", + "_inferred_span.tag_source": "self", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.dynamodb.item", + "ptr.dir": "u", + "ptr.hash": "e2af34d333891f765c7f02d2da80895e", + "link.kind": "span-pointer" + } + }, + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.dynamodb.item", + "ptr.dir": "u", + "ptr.hash": "e2af34d333891f765c7f02d2da80895e", + "link.kind": "span-pointer" + } + }, + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.dynamodb.item", + "ptr.dir": "u", + "ptr.hash": "e2af34d333891f765c7f02d2da80895e", + "link.kind": "span-pointer" + } + } + ] + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python314", + "functionname": "integration-tests-python-XXXX-sync-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python314", + "resource:integration-tests-python-XXXX-sync-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "eventbridge.custom.event.sender", + "resource": "eventbridge.custom.event.sender", + "name": "aws.eventbridge", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.eventbridge", + "resource_names": "eventbridge.custom.event.sender", + "span.kind": "server", + "detail_type": "testdetail", + "_inferred_span.synchronicity": "async", + "_inferred_span.tag_source": "self", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python314", + "functionname": "integration-tests-python-XXXX-sync-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "eventbridge" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python314", + "resource:integration-tests-python-XXXX-sync-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "XXXX.execute-api.eu-west-1.amazonaws.com", + "resource": "GET /httpapi/get", + "name": "aws.httpapi", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.httpapi", + "endpoint": "/httpapi/get", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.method": "GET", + "http.protocol": "HTTP/1.1", + "http.source_ip": "XXXX", + "http.user_agent": "XXXX/7.64.1", + "resource_names": "GET /httpapi/get", + "request_id": "XXXX", + "apiid": "XXXX", + "apiname": "XXXX", + "stage": "$default", + "_inferred_span.synchronicity": "sync", + "_inferred_span.tag_source": "self", + "http.status_code": "200", + "http.route": "/httpapi/get", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python314", + "functionname": "integration-tests-python-XXXX-sync-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "api-gateway", + "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", + "http.method": "GET", + "http.route": "/httpapi/get", + "http.status_code": "200" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python314", + "resource:integration-tests-python-XXXX-sync-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "EXAMPLE", + "resource": "EXAMPLE", + "name": "aws.kinesis", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.kinesis", + "resource_names": "EXAMPLE", + "span.kind": "server", + "streamname": "EXAMPLE", + "shardid": "shardId-XXXX", + "event_source_arn": "arn:aws:kinesis:EXAMPLE", + "event_id": "XXXX", + "event_name": "aws:kinesis:record", + "event_version": "1.0", + "partition_key": "XXXX", + "_inferred_span.synchronicity": "async", + "_inferred_span.tag_source": "self", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python314", + "functionname": "integration-tests-python-XXXX-sync-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "kinesis", + "function_trigger.event_source_arn": "XXXX" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python314", + "resource:integration-tests-python-XXXX-sync-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "example-bucket", + "resource": "example-bucket", + "name": "aws.s3", + "error": 0, + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.s3", + "resource_names": "example-bucket", + "span.kind": "server", + "event_name": "ObjectCreated:Put", + "bucketname": "example-bucket", + "bucket_arn": "arn:aws:s3:::example-bucket", + "object_key": "test/key", + "object_size": "1024", + "object_etag": "XXXX", + "_inferred_span.synchronicity": "async", + "_inferred_span.tag_source": "self", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python314", + "functionname": "integration-tests-python-XXXX-sync-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "s3", + "function_trigger.event_source_arn": "XXXX" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python314", + "resource:integration-tests-python-XXXX-sync-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "sns-lambda", + "resource": "sns-lambda", + "name": "aws.sns", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.sns", + "resource_names": "sns-lambda", + "span.kind": "server", + "topicname": "sns-lambda", + "topic_arn": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", + "message_id": "XXXX", + "type": "Notification", + "subject": "TestInvoke", + "_inferred_span.synchronicity": "async", + "_inferred_span.tag_source": "self", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python314", + "functionname": "integration-tests-python-XXXX-sync-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "sns", + "function_trigger.event_source_arn": "XXXX" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python314", + "resource:integration-tests-python-XXXX-sync-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "my-queue", + "resource": "my-queue", + "name": "aws.sqs", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.sqs", + "resource_names": "my-queue", + "span.kind": "server", + "queuename": "my-queue", + "event_source_arn": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", + "receipt_handle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", + "sender_id": "AIDAIENQZJOLO23YVJ4VO", + "_inferred_span.synchronicity": "async", + "_inferred_span.tag_source": "self", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python314", + "functionname": "integration-tests-python-XXXX-sync-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "sqs", + "function_trigger.event_source_arn": "XXXX" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB +START +{ + "m": "aws.lambda.enhanced.invocations", + "v": 1, + "e": XXXX, + "t": [ + "region:eu-west-1", + "account_id:XXXX", + "functionname:integration-tests-python-XXXX-sync-metrics_python314", + "resource:integration-tests-python-XXXX-sync-metrics_python314", + "memorysize:1024", + "cold_start:false", + "runtime:python3.14", + "datadog_lambda:vXX", + "dd_lambda_layer:datadog-python314_X.X.X" + ] +} +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "XXXX.execute-api.eu-west-1.amazonaws.com", + "resource": "$default", + "name": "aws.apigateway.websocket", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "operation_name": "aws.apigateway.websocket", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com$default", + "endpoint": "$default", + "resource_names": "$default", + "span.kind": "server", + "apiid": "XXXX", + "apiname": "XXXX", + "stage": "dev", + "request_id": "XXXX", + "connection_id": "XXXX=", + "event_type": "MESSAGE", + "message_direction": "IN", + "_inferred_span.synchronicity": "sync", + "_inferred_span.tag_source": "self", + "http.status_code": "200", + "peer.service": "integration-tests-python", + "_dd.peer.service.source": "peer.service", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "web" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "integration-tests-python", + "resource": "integration-tests-python-XXXX-sync-metrics_python314", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python314", + "functionname": "integration-tests-python-XXXX-sync-metrics_python314", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "api-gateway", + "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", + "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", + "http.status_code": "200" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://datadoghq.com/", + "out.host": "datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1 + }, + "type": "http" + }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "GET /", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.p.tid": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "GET", + "http.url": "https://www.datadoghq.com/", + "out.host": "www.datadoghq.com", + "http.status_code": "200", + "http.useragent": "python-requests/X.X.X" + }, + "metrics": { + "_dd.measured": 1 + }, + "type": "http" + } + ] + ] +} +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +{ + "traces": [ + [ + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "requests", + "resource": "POST /api/v1/distribution_points", + "name": "requests.request", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "runtime-id": "XXXX", + "_dd.origin": "lambda", + "component": "requests", + "span.kind": "client", + "http.method": "POST", + "http.url": "https://api.datadoghq.com/api/v1/distribution_points", + "out.host": "api.datadoghq.com", + "http.status_code": "202", + "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", + "_dd.p.dm": "-0", + "_dd.p.tid": "XXXX", + "language": "python" + }, + "metrics": { + "process_id": XXXX, + "_dd.measured": 1, + "_dd.top_level": 1, + "_sampling_priority_v1": 1 + }, + "type": "http" + } + ] + ] +} +END Duration: XXXX ms Memory Used: XXXX MB diff --git a/tests/test_api.py b/tests/test_api.py index 7fcc3c221..35a179b1c 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -33,9 +33,9 @@ def test_secrets_manager_fips_endpoint(self, mock_boto3_client): mock_boto3_client.return_value = mock_client os.environ["AWS_REGION"] = "us-gov-east-1" - os.environ[ - "DD_API_KEY_SECRET_ARN" - ] = "arn:aws:secretsmanager:us-gov-east-1:1234567890:secret:key-name-123ABC" + os.environ["DD_API_KEY_SECRET_ARN"] = ( + "arn:aws:secretsmanager:us-gov-east-1:1234567890:secret:key-name-123ABC" + ) api_key = api.get_api_key() @@ -53,9 +53,9 @@ def test_secrets_manager_different_region(self, mock_boto3_client): mock_boto3_client.return_value = mock_client os.environ["AWS_REGION"] = "us-east-1" - os.environ[ - "DD_API_KEY_SECRET_ARN" - ] = "arn:aws:secretsmanager:us-west-1:1234567890:secret:key-name-123ABC" + os.environ["DD_API_KEY_SECRET_ARN"] = ( + "arn:aws:secretsmanager:us-west-1:1234567890:secret:key-name-123ABC" + ) api_key = api.get_api_key() @@ -74,9 +74,9 @@ def test_secrets_manager_different_region_but_still_fips(self, mock_boto3_client mock_boto3_client.return_value = mock_client os.environ["AWS_REGION"] = "us-east-1" - os.environ[ - "DD_API_KEY_SECRET_ARN" - ] = "arn:aws:secretsmanager:us-west-1:1234567890:secret:key-name-123ABC" + os.environ["DD_API_KEY_SECRET_ARN"] = ( + "arn:aws:secretsmanager:us-west-1:1234567890:secret:key-name-123ABC" + ) api_key = api.get_api_key() @@ -132,9 +132,9 @@ def test_no_fips_for_standard_regions(self, mock_boto3_client): os.environ.clear() os.environ["AWS_REGION"] = "us-west-2" - os.environ[ - "DD_API_KEY_SECRET_ARN" - ] = "arn:aws:secretsmanager:us-west-2:1234567890:secret:key-name-123ABC" + os.environ["DD_API_KEY_SECRET_ARN"] = ( + "arn:aws:secretsmanager:us-west-2:1234567890:secret:key-name-123ABC" + ) api.get_api_key() diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 512a51f89..1a5edfc55 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -3,6 +3,8 @@ import os import unittest import importlib +import sys +import pytest from unittest.mock import MagicMock, patch, call, ANY from datadog_lambda.constants import TraceHeader @@ -834,6 +836,9 @@ def lambda_handler(event, context): @patch("datadog_lambda.config.Config.profiling_enabled", True) +@pytest.mark.skipif( + sys.version_info >= (3, 14), reason="profiling not yet supported in python 3.14" +) def test_profiling_enabled(monkeypatch): importlib.reload(wrapper) diff --git a/tests/test_xray.py b/tests/test_xray.py index 7f33f8915..8177e46e8 100644 --- a/tests/test_xray.py +++ b/tests/test_xray.py @@ -34,9 +34,9 @@ def test_get_xray_host_port_success(self): def test_send_segment_sampled_out(self): os.environ["AWS_XRAY_DAEMON_ADDRESS"] = "fake-agent.com:8080" - os.environ[ - "_X_AMZN_TRACE_ID" - ] = "Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=0;Lineage=c6c5b1b9:0" + os.environ["_X_AMZN_TRACE_ID"] = ( + "Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=0;Lineage=c6c5b1b9:0" + ) with patch( "datadog_lambda.xray.sock.send", MagicMock(return_value=None) @@ -47,9 +47,9 @@ def test_send_segment_sampled_out(self): def test_send_segment_sampled(self): os.environ["AWS_XRAY_DAEMON_ADDRESS"] = "fake-agent.com:8080" - os.environ[ - "_X_AMZN_TRACE_ID" - ] = "Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=1;Lineage=c6c5b1b9:0" + os.environ["_X_AMZN_TRACE_ID"] = ( + "Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=1;Lineage=c6c5b1b9:0" + ) with patch( "datadog_lambda.xray.sock.send", MagicMock(return_value=None) ) as mock_send: From f74f9ca9d10f8153d7bd4fcd726540bd903845ba Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Mon, 1 Dec 2025 12:53:35 -0500 Subject: [PATCH 093/164] Stop running update-snapshots nightly. (#692) --- .github/workflows/update-snapshots.yml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/update-snapshots.yml b/.github/workflows/update-snapshots.yml index ed7097aed..81e0c5394 100644 --- a/.github/workflows/update-snapshots.yml +++ b/.github/workflows/update-snapshots.yml @@ -1,8 +1,7 @@ name: update-snapshots on: - schedule: - - cron: "0 15 * * *" # every day 11am EST + workflow_dispatch: jobs: check: @@ -47,8 +46,19 @@ jobs: working-directory: tests/integration run: yarn install - - name: Update Snapshots + - name: Update Snapshots (amd64) env: + ARCH: amd64 + UPDATE_SNAPSHOTS: true + BUILD_LAYERS: true + DD_API_KEY: ${{ secrets.DD_API_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + run: ./scripts/run_integration_tests.sh + + - name: Update Snapshots (arm64) + env: + ARCH: arm64 UPDATE_SNAPSHOTS: true BUILD_LAYERS: true DD_API_KEY: ${{ secrets.DD_API_KEY }} From 36d7df23b802ab41639498e049727160dcd3033a Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Mon, 1 Dec 2025 13:03:58 -0500 Subject: [PATCH 094/164] chore: release v8.118.0 (#691) * v8.118.0 * remove build for 3.8 for system tests (3.8 is no longer supported after https://github.com/DataDog/dd-trace-py/commit/469a7b8f2543b9a0efc79669c395de65cf046921) --- .github/workflows/build_layer.yml | 2 +- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_layer.yml b/.github/workflows/build_layer.yml index 8eef0c661..d5d65ec4a 100644 --- a/.github/workflows/build_layer.yml +++ b/.github/workflows/build_layer.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false matrix: arch: [arm64, amd64] - python_version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + python_version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - name: Checkout diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 26394e220..a23e0df67 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.118.0.dev0" +__version__ = "8.118.0" diff --git a/pyproject.toml b/pyproject.toml index 5f91a97d7..0d08814fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.118.0.dev0" +version = "8.118.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From eba810afe9f0b46ccfb68ce5aa77c989b349e5a8 Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Mon, 1 Dec 2025 19:27:40 +0100 Subject: [PATCH 095/164] ci(system-tests): reuse dd-trace-py artifacts instead of building (#689) --- .github/workflows/build_layer.yml | 55 +++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_layer.yml b/.github/workflows/build_layer.yml index d5d65ec4a..fc22e9ce4 100644 --- a/.github/workflows/build_layer.yml +++ b/.github/workflows/build_layer.yml @@ -8,9 +8,32 @@ on: - "main" jobs: + get-ddtrace-run-id: + runs-on: ubuntu-latest + outputs: + run-id: ${{ steps.get-ddtrace-run-id.outputs.run_id }} + steps: + - name: Resolve Run ID of latest dd-trace-py build + id: get-ddtrace-run-id + env: + GH_TOKEN: ${{ github.token }} + run: | + RUN_ID=$(gh run list \ + --repo DataDog/dd-trace-py \ + --workflow build_deploy.yml \ + --branch main \ + --status success \ + --limit 1 \ + --json databaseId \ + --jq '.[0].databaseId') + + echo "run_id=$RUN_ID" >> $GITHUB_OUTPUT + build: runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest' }} + needs: get-ddtrace-run-id + strategy: fail-fast: false matrix: @@ -21,10 +44,38 @@ jobs: - name: Checkout uses: actions/checkout@v4 + - name: Build artifact name + id: build-artifact-name + run: | + if [ "${{ matrix.arch }}" == "amd64" ]; then + ARCH="x86_64" + else + ARCH="aarch64" + fi + + VER="${{ matrix.python_version }}" + PY_VERSION_NO_DOT="${VER//./}" + + echo "artifact_name=wheels-cp${PY_VERSION_NO_DOT}-manylinux_${ARCH}" >> $GITHUB_OUTPUT + + - name: Download ddtrace Wheel + uses: actions/download-artifact@v4 + with: + name: ${{ steps.build-artifact-name.outputs.artifact_name }} + repository: DataDog/dd-trace-py + run-id: ${{ needs.get-ddtrace-run-id.outputs.run-id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + path: ./artifacts + + - name: Find ddtrace Wheel + id: find-ddtrace-wheel + run: | + echo "wheel_path=$(find ./artifacts -name "*.whl" | head -n 1)" >> $GITHUB_OUTPUT + - name: Patch pyproject.toml run: | - echo "Patching pyproject.toml to use main branch of dd-trace-py" - sed -i 's|^ddtrace =.*$|ddtrace = { git = "https://github.com/DataDog/dd-trace-py.git" }|' pyproject.toml + echo "Patching pyproject.toml to use latest build of dd-trace-py" + sed -i 's|^ddtrace =.*$|ddtrace = { file = "${{ steps.find-ddtrace-wheel.outputs.wheel_path }}" }|' pyproject.toml - name: Build layer for Python ${{ matrix.python_version }} on ${{ matrix.arch }} run: | From 31df03d95965c834fe7e455a2e5e52cd6ef392c7 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Tue, 2 Dec 2025 11:47:43 -0500 Subject: [PATCH 096/164] v8.119.0.dev0 --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index a23e0df67..b3c11170f 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.118.0" +__version__ = "8.119.0.dev0" diff --git a/pyproject.toml b/pyproject.toml index 0d08814fd..c0046097c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.118.0" +version = "8.119.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 58d0e3496d73b50f0fac3f45c62a4797ac3094c1 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Wed, 3 Dec 2025 15:37:30 -0500 Subject: [PATCH 097/164] Catch errors when importing profiler. (#695) * Catch errors when importing profiler. * Test import of profiler catches error and disables profiling. * Update linting. --- datadog_lambda/wrapper.py | 14 +++++++++----- tests/test_wrapper.py | 10 ++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 8dbd7e359..ee740221c 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -46,6 +46,8 @@ extract_http_status_code_tag, ) +logger = logging.getLogger(__name__) + # ddtrace imports are also tested in # dd-trace-py/tests/internal/test_serverless.py please update those tests when # making changes to any ddtrace import. @@ -61,8 +63,12 @@ start() +profiler = None if config.profiling_enabled: - from ddtrace.profiling import profiler + try: + from ddtrace.profiling import profiler + except Exception as e: + logger.error(f"Failed to initialize profiler: [{e.__class__.__name__})] {e}") if config.llmobs_enabled: from ddtrace.llmobs import LLMObs @@ -75,8 +81,6 @@ except ImportError: from ddtrace.debugging._uploader import LogsIntakeUploaderV1 as SignalUploader -logger = logging.getLogger(__name__) - DD_REQUESTS_SERVICE_NAME = "DD_REQUESTS_SERVICE_NAME" DD_SERVICE = "DD_SERVICE" @@ -141,7 +145,7 @@ def __init__(self, func): self.response = None self.blocking_response = None - if config.profiling_enabled: + if config.profiling_enabled and profiler: self.prof = profiler.Profiler(env=config.env, service=config.service) if config.trace_extractor: @@ -283,7 +287,7 @@ def _before(self, event, context): self.blocking_response = get_asm_blocked_response(self.event_source) else: set_correlation_ids() - if config.profiling_enabled and is_new_sandbox(): + if config.profiling_enabled and profiler and is_new_sandbox(): self.prof.start(stop_on_exit=False, profile_children=True) logger.debug("datadog_lambda_wrapper _before() done") except Exception as e: diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 1a5edfc55..95dfc3040 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -962,3 +962,13 @@ def lambda_handler(event, context): mock_submit.assert_called_once() call_args = mock_submit.call_args[0] assert call_args[0] is None + + +@patch("datadog_lambda.config.Config.profiling_enabled", True) +def test_profiling_import_errors_caught(monkeypatch): + # when importing profiler fails, disable profiling instead of crashing app + monkeypatch.setitem( + sys.modules, "ddtrace.profiling", None + ) # force ModuleNotFoundError + importlib.reload(wrapper) + assert not hasattr(wrapper.datadog_lambda_wrapper, "prof") From df6df8e20209ff07510165a5de3ceab5503e6c8c Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Thu, 4 Dec 2025 13:44:16 -0500 Subject: [PATCH 098/164] Updating to v119 (#696) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index b3c11170f..ce72d946d 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.119.0.dev0" +__version__ = "8.119.0" diff --git a/pyproject.toml b/pyproject.toml index c0046097c..3a2fb53b1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.119.0.dev0" +version = "8.119.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From ed75966b952cf4c897f6535e8d3b88cb3818a21d Mon Sep 17 00:00:00 2001 From: shreyamalpani Date: Fri, 5 Dec 2025 16:27:14 -0500 Subject: [PATCH 099/164] Fix SSM endpoint for Gov regions (#693) * only override ssm endpoint url in commercial fips * lint * check ssm-fips supported regions * fix --- datadog_lambda/api.py | 25 +++++++++++++++++----- tests/test_api.py | 48 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/datadog_lambda/api.py b/datadog_lambda/api.py index 4921dae90..88f2cbe27 100644 --- a/datadog_lambda/api.py +++ b/datadog_lambda/api.py @@ -5,6 +5,14 @@ logger = logging.getLogger(__name__) KMS_ENCRYPTION_CONTEXT_KEY = "LambdaFunctionName" +SSM_FIPS_SUPPORTED_REGIONS = { + "us-east-1", + "us-east-2", + "us-west-1", + "us-west-2", + "ca-central-1", + "ca-west-1", +} api_key = None @@ -92,11 +100,18 @@ def get_api_key() -> str: )["SecretString"] elif DD_API_KEY_SSM_NAME: # SSM endpoints: https://docs.aws.amazon.com/general/latest/gr/ssm.html - fips_endpoint = ( - f"https://ssm-fips.{LAMBDA_REGION}.amazonaws.com" - if config.fips_mode_enabled - else None - ) + fips_endpoint = None + if config.fips_mode_enabled: + if LAMBDA_REGION in SSM_FIPS_SUPPORTED_REGIONS: + fips_endpoint = f"https://ssm-fips.{LAMBDA_REGION}.amazonaws.com" + else: + # Log warning if SSM FIPS endpoint is not supported for commercial region + if not config.is_gov_region: + logger.warning( + "FIPS mode is enabled, but '%s' does not support SSM FIPS endpoints. " + "Using standard SSM endpoint.", + LAMBDA_REGION, + ) ssm_client = _boto3_client("ssm", endpoint_url=fips_endpoint) api_key = ssm_client.get_parameter( Name=DD_API_KEY_SSM_NAME, WithDecryption=True diff --git a/tests/test_api.py b/tests/test_api.py index 35a179b1c..3b42cfd76 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -89,23 +89,65 @@ def test_secrets_manager_different_region_but_still_fips(self, mock_boto3_client @patch("datadog_lambda.config.Config.fips_mode_enabled", True) @patch("botocore.session.Session.create_client") - def test_ssm_fips_endpoint(self, mock_boto3_client): + def test_ssm_fips_endpoint_supported_region(self, mock_boto3_client): mock_client = MagicMock() mock_client.get_parameter.return_value = { "Parameter": {"Value": "test-api-key"} } mock_boto3_client.return_value = mock_client - os.environ["AWS_REGION"] = "us-gov-west-1" + os.environ["AWS_REGION"] = "us-east-1" os.environ["DD_API_KEY_SSM_NAME"] = "test-ssm-param" api_key = api.get_api_key() mock_boto3_client.assert_called_with( - "ssm", endpoint_url="https://ssm-fips.us-gov-west-1.amazonaws.com" + "ssm", endpoint_url="https://ssm-fips.us-east-1.amazonaws.com" ) self.assertEqual(api_key, "test-api-key") + @patch("datadog_lambda.config.Config.fips_mode_enabled", True) + @patch("datadog_lambda.config.Config.is_gov_region", True) + @patch("botocore.session.Session.create_client") + def test_ssm_gov_endpoint(self, mock_boto3_client): + mock_client = MagicMock() + mock_client.get_parameter.return_value = { + "Parameter": {"Value": "test-api-key"} + } + mock_boto3_client.return_value = mock_client + + os.environ["AWS_REGION"] = "us-gov-west-1" + os.environ["DD_API_KEY_SSM_NAME"] = "test-ssm-param" + + api_key = api.get_api_key() + + mock_boto3_client.assert_called_with("ssm", endpoint_url=None) + self.assertEqual(api_key, "test-api-key") + + @patch("datadog_lambda.config.Config.fips_mode_enabled", True) + @patch("botocore.session.Session.create_client") + def test_ssm_fips_endpoint_unsupported_region(self, mock_boto3_client): + mock_client = MagicMock() + mock_client.get_parameter.return_value = { + "Parameter": {"Value": "test-api-key"} + } + mock_boto3_client.return_value = mock_client + + os.environ["AWS_REGION"] = "eu-west-1" + os.environ["DD_API_KEY_SSM_NAME"] = "test-ssm-param" + + with self.assertLogs("datadog_lambda.api", level="WARNING") as log_context: + api_key = api.get_api_key() + + mock_boto3_client.assert_called_with("ssm", endpoint_url=None) + self.assertEqual(api_key, "test-api-key") + self.assertTrue( + any( + "does not support SSM FIPS endpoints" in log_msg + for log_msg in log_context.output + ) + ) + @patch("datadog_lambda.config.Config.fips_mode_enabled", True) @patch("botocore.session.Session.create_client") @patch("datadog_lambda.api.decrypt_kms_api_key") From 82e7f701f1ca436d7892954742468d25e10a7931 Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Wed, 10 Dec 2025 16:59:26 +0100 Subject: [PATCH 100/164] Clean up unnecessary files in Dockerfile (#683) * Clean up unnecessary files in Dockerfile Removes files that are unnecessary for Lambda * Update Dockerfile --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index ce59438db..974419ed8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,6 +33,7 @@ RUN rm -rf ./python/lib/$runtime/site-packages/botocore* RUN rm -rf ./python/lib/$runtime/site-packages/setuptools RUN rm -rf ./python/lib/$runtime/site-packages/jsonschema/tests RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_ast/iastpatch*.so +RUN rm -rf ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_taint_tracking/_vendor RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_taint_tracking/*.so RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_stacktrace*.so # remove *.dist-info directories except any entry_points.txt files and METADATA files required for Appsec Software Composition Analysis From 90140fbb24e51b9c76cbd05168adea894258cf24 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Thu, 11 Dec 2025 14:21:10 -0500 Subject: [PATCH 101/164] v8.120.0 (#699) * v8.120.0 * update integration test snapshots --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- .../logs/async-metrics_python314.log | 40 ++++++------- .../snapshots/logs/sync-metrics_python314.log | 60 +++++++++---------- 4 files changed, 52 insertions(+), 52 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index ce72d946d..aacab86a1 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.119.0" +__version__ = "8.120.0" diff --git a/pyproject.toml b/pyproject.toml index 3a2fb53b1..87c309f70 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.119.0" +version = "8.120.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" diff --git a/tests/integration/snapshots/logs/async-metrics_python314.log b/tests/integration/snapshots/logs/async-metrics_python314.log index 8983a83c4..b14df308a 100644 --- a/tests/integration/snapshots/logs/async-metrics_python314.log +++ b/tests/integration/snapshots/logs/async-metrics_python314.log @@ -36,8 +36,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -208,8 +208,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -345,8 +345,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -542,8 +542,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -700,8 +700,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -874,8 +874,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -1039,8 +1039,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -1213,8 +1213,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -1376,8 +1376,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -1538,8 +1538,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ diff --git a/tests/integration/snapshots/logs/sync-metrics_python314.log b/tests/integration/snapshots/logs/sync-metrics_python314.log index 442d83b48..cab7fcbba 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python314.log +++ b/tests/integration/snapshots/logs/sync-metrics_python314.log @@ -16,8 +16,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -150,7 +150,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] ] } -HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -207,8 +207,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -297,7 +297,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] ] } -HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -363,8 +363,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -522,7 +522,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] ] } -HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -579,8 +579,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -699,7 +699,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] ] } -HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -756,8 +756,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -892,7 +892,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] ] } -HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -949,8 +949,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -1076,7 +1076,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] ] } -HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -1133,8 +1133,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -1269,7 +1269,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] ] } -HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -1326,8 +1326,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -1451,7 +1451,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] ] } -HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -1508,8 +1508,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -1632,7 +1632,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] ] } -HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -1689,8 +1689,8 @@ START "dd_lambda_layer:datadog-python314_X.X.X" ] } -HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX -HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX +HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","User-Agent:python-requests/X.X.X","traceparent:XXX","tracestate:XXX { "traces": [ [ @@ -1822,7 +1822,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] ] } -HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate, zstd","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX { "traces": [ [ From e1a0bac4bc73a40ab0edd1c3e024c9c4e337eb4a Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Thu, 11 Dec 2025 16:15:55 -0500 Subject: [PATCH 102/164] v8.121.0.dev0 --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index aacab86a1..9ce3b4e79 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.120.0" +__version__ = "8.121.0.dev0" diff --git a/pyproject.toml b/pyproject.toml index 87c309f70..29e9c7f2a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.120.0" +version = "8.121.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 49710e639f323d700f5b2f0f8514bcb2028d9e62 Mon Sep 17 00:00:00 2001 From: Florentin Labelle Date: Fri, 12 Dec 2025 10:02:01 +0100 Subject: [PATCH 103/164] feat(aap): update api gateway inferred span tags for better correlation (#697) --- datadog_lambda/tracing.py | 24 ++++++-- datadog_lambda/wrapper.py | 12 +++- .../logs/async-metrics_python310.log | 26 ++++++-- .../logs/async-metrics_python311.log | 26 ++++++-- .../logs/async-metrics_python312.log | 26 ++++++-- .../logs/async-metrics_python313.log | 26 ++++++-- .../logs/async-metrics_python314.log | 26 ++++++-- .../snapshots/logs/async-metrics_python38.log | 26 ++++++-- .../snapshots/logs/async-metrics_python39.log | 26 ++++++-- .../snapshots/logs/sync-metrics_python310.log | 26 ++++++-- .../snapshots/logs/sync-metrics_python311.log | 26 ++++++-- .../snapshots/logs/sync-metrics_python312.log | 26 ++++++-- .../snapshots/logs/sync-metrics_python313.log | 26 ++++++-- .../snapshots/logs/sync-metrics_python314.log | 26 ++++++-- .../snapshots/logs/sync-metrics_python38.log | 26 ++++++-- .../snapshots/logs/sync-metrics_python39.log | 26 ++++++-- tests/test_tracing.py | 59 ++++++++----------- 17 files changed, 348 insertions(+), 111 deletions(-) diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index 225f5dd82..e7dca1f32 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -927,6 +927,7 @@ def create_inferred_span_from_lambda_function_url_event(event, context): InferredSpanInfo.set_tags(tags, tag_source="self", synchronicity="sync") if span: span.set_tags(tags) + span.set_metric(InferredSpanInfo.METRIC, 1.0) span.start_ns = int(request_time_epoch * 1e6) return span @@ -1047,6 +1048,7 @@ def create_inferred_span_from_api_gateway_websocket_event( span = tracer.trace("aws.apigateway.websocket", **args) if span: span.set_tags(tags) + span.set_metric(InferredSpanInfo.METRIC, 1.0) span.start_ns = int( finish_time_ns if finish_time_ns is not None @@ -1061,6 +1063,8 @@ def create_inferred_span_from_api_gateway_event( event, context, decode_authorizer_context: bool = True ): request_context = event.get("requestContext") + identity = request_context.get("identity") + domain = request_context.get("domainName", "") api_id = request_context.get("apiId") service_name = determine_service_name( @@ -1072,11 +1076,11 @@ def create_inferred_span_from_api_gateway_event( resource_path = _get_resource_path(event, request_context) resource = f"{method} {resource_path}" tags = { - "operation_name": "aws.apigateway.rest", "http.url": http_url, "endpoint": path, "http.method": method, "resource_names": resource, + "http.useragent": identity.get("userAgent"), "span.kind": "server", "apiid": api_id, "apiname": api_id, @@ -1091,7 +1095,7 @@ def create_inferred_span_from_api_gateway_event( args = { "service": service_name, "resource": resource, - "span_type": "http", + "span_type": "web", } tracer.set_tags(_dd_origin) upstream_authorizer_span = None @@ -1103,6 +1107,7 @@ def create_inferred_span_from_api_gateway_event( span = tracer.trace("aws.apigateway", **args) if span: span.set_tags(tags) + span.set_metric(InferredSpanInfo.METRIC, 1.0) # start time pushed by the inserted authorizer span span.start_ns = int( finish_time_ns @@ -1140,13 +1145,12 @@ def create_inferred_span_from_http_api_event( resource_path = _get_resource_path(event, request_context) resource = f"{method} {resource_path}" tags = { - "operation_name": "aws.httpapi", "endpoint": path, "http.url": http_url, "http.method": http.get("method"), "http.protocol": http.get("protocol"), "http.source_ip": http.get("sourceIp"), - "http.user_agent": http.get("userAgent"), + "http.useragent": http.get("userAgent"), "resource_names": resource, "request_id": context.aws_request_id, "apiid": api_id, @@ -1167,10 +1171,11 @@ def create_inferred_span_from_http_api_event( Headers.Parent_Span_Finish_Time ) span = tracer.trace( - "aws.httpapi", service=service_name, resource=resource, span_type="http" + "aws.httpapi", service=service_name, resource=resource, span_type="web" ) if span: span.set_tags(tags) + span.set_metric(InferredSpanInfo.METRIC, 1.0) span.start_ns = int(inferred_span_start_ns) return span @@ -1237,6 +1242,7 @@ def create_inferred_span_from_sqs_event(event, context): ) if span: span.set_tags(tags) + span.set_metric(InferredSpanInfo.METRIC, 1.0) span.start = start_time if upstream_span: span.parent_id = upstream_span.span_id @@ -1278,6 +1284,7 @@ def create_inferred_span_from_sns_event(event, context): ) if span: span.set_tags(tags) + span.set_metric(InferredSpanInfo.METRIC, 1.0) span.start = dt.replace(tzinfo=timezone.utc).timestamp() return span @@ -1313,6 +1320,7 @@ def create_inferred_span_from_kinesis_event(event, context): ) if span: span.set_tags(tags) + span.set_metric(InferredSpanInfo.METRIC, 1.0) span.start = request_time_epoch return span @@ -1345,6 +1353,7 @@ def create_inferred_span_from_dynamodb_event(event, context): ) if span: span.set_tags(tags) + span.set_metric(InferredSpanInfo.METRIC, 1.0) span.start = int(request_time_epoch) return span @@ -1381,6 +1390,7 @@ def create_inferred_span_from_s3_event(event, context): ) if span: span.set_tags(tags) + span.set_metric(InferredSpanInfo.METRIC, 1.0) span.start = dt.replace(tzinfo=timezone.utc).timestamp() return span @@ -1421,10 +1431,11 @@ def create_inferred_span_from_eventbridge_event(event, context): ) if span: span.set_tags(tags) + span.set_metric(InferredSpanInfo.METRIC, 1.0) span.start = dt.replace(tzinfo=timezone.utc).timestamp() # Since inferred span will later parent Lambda, preserve Lambda's current parent - if dd_trace_context.span_id: + if dd_trace_context and getattr(dd_trace_context, "span_id", None): span.parent_id = dd_trace_context.span_id return span @@ -1512,6 +1523,7 @@ class InferredSpanInfo(object): BASE_NAME = "_inferred_span" SYNCHRONICITY = f"{BASE_NAME}.synchronicity" TAG_SOURCE = f"{BASE_NAME}.tag_source" + METRIC = f"_dd.{BASE_NAME}" @staticmethod def set_tags( diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index ee740221c..5a32e2ff9 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -346,8 +346,16 @@ def _after(self, event, context): if status_code: self.inferred_span.set_tag("http.status_code", status_code) - if self.trigger_tags and (route := self.trigger_tags.get("http.route")): - self.inferred_span.set_tag("http.route", route) + if self.trigger_tags: + route = self.trigger_tags.get("http.route") + if route: + self.inferred_span.set_tag("http.route", route) + + event_source_arn = self.trigger_tags.get( + "function_trigger.event_source_arn" + ) + if event_source_arn: + self.inferred_span.set_tag("dd_resource_key", event_source_arn) if config.service: self.inferred_span.set_tag("peer.service", config.service) diff --git a/tests/integration/snapshots/logs/async-metrics_python310.log b/tests/integration/snapshots/logs/async-metrics_python310.log index 6779d7ddb..356d82439 100644 --- a/tests/integration/snapshots/logs/async-metrics_python310.log +++ b/tests/integration/snapshots/logs/async-metrics_python310.log @@ -54,11 +54,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -68,6 +68,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -76,10 +77,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -375,6 +377,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -383,6 +386,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -574,6 +578,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -718,13 +723,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -734,6 +738,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -742,10 +747,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -904,6 +910,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -912,6 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1066,6 +1074,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1074,6 +1083,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1241,6 +1251,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1249,6 +1260,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1403,6 +1415,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1411,6 +1424,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1571,6 +1585,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1579,6 +1594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/integration/snapshots/logs/async-metrics_python311.log b/tests/integration/snapshots/logs/async-metrics_python311.log index 9f14ff15c..fa140a85a 100644 --- a/tests/integration/snapshots/logs/async-metrics_python311.log +++ b/tests/integration/snapshots/logs/async-metrics_python311.log @@ -54,11 +54,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -68,6 +68,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -76,10 +77,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -375,6 +377,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -383,6 +386,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -574,6 +578,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -718,13 +723,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -734,6 +738,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -742,10 +747,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -904,6 +910,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -912,6 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1066,6 +1074,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1074,6 +1083,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1241,6 +1251,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1249,6 +1260,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1403,6 +1415,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1411,6 +1424,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1571,6 +1585,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1579,6 +1594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/integration/snapshots/logs/async-metrics_python312.log b/tests/integration/snapshots/logs/async-metrics_python312.log index 789a39551..c2ea06475 100644 --- a/tests/integration/snapshots/logs/async-metrics_python312.log +++ b/tests/integration/snapshots/logs/async-metrics_python312.log @@ -54,11 +54,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -68,6 +68,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -76,10 +77,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -375,6 +377,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -383,6 +386,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -574,6 +578,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -718,13 +723,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -734,6 +738,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -742,10 +747,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -904,6 +910,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -912,6 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1066,6 +1074,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1074,6 +1083,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1241,6 +1251,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1249,6 +1260,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1403,6 +1415,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1411,6 +1424,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1571,6 +1585,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1579,6 +1594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/integration/snapshots/logs/async-metrics_python313.log b/tests/integration/snapshots/logs/async-metrics_python313.log index 78ade6a7a..b6a4f68e8 100644 --- a/tests/integration/snapshots/logs/async-metrics_python313.log +++ b/tests/integration/snapshots/logs/async-metrics_python313.log @@ -54,11 +54,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -68,6 +68,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -76,10 +77,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -375,6 +377,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -383,6 +386,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -574,6 +578,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -718,13 +723,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -734,6 +738,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -742,10 +747,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -904,6 +910,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -912,6 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1066,6 +1074,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1074,6 +1083,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1241,6 +1251,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1249,6 +1260,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1403,6 +1415,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1411,6 +1424,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1571,6 +1585,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1579,6 +1594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/integration/snapshots/logs/async-metrics_python314.log b/tests/integration/snapshots/logs/async-metrics_python314.log index b14df308a..a430b6449 100644 --- a/tests/integration/snapshots/logs/async-metrics_python314.log +++ b/tests/integration/snapshots/logs/async-metrics_python314.log @@ -54,11 +54,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -68,6 +68,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -76,10 +77,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -375,6 +377,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -383,6 +386,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -574,6 +578,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -718,13 +723,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -734,6 +738,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -742,10 +747,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -904,6 +910,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -912,6 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1066,6 +1074,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1074,6 +1083,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1241,6 +1251,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1249,6 +1260,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1403,6 +1415,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1411,6 +1424,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1571,6 +1585,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1579,6 +1594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/integration/snapshots/logs/async-metrics_python38.log b/tests/integration/snapshots/logs/async-metrics_python38.log index 5375fafec..e37090ff9 100644 --- a/tests/integration/snapshots/logs/async-metrics_python38.log +++ b/tests/integration/snapshots/logs/async-metrics_python38.log @@ -54,11 +54,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -68,6 +68,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -76,10 +77,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -375,6 +377,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -383,6 +386,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -574,6 +578,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -718,13 +723,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -734,6 +738,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -742,10 +747,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -904,6 +910,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -912,6 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1066,6 +1074,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1074,6 +1083,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1241,6 +1251,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1249,6 +1260,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1403,6 +1415,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1411,6 +1424,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1571,6 +1585,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1579,6 +1594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/integration/snapshots/logs/async-metrics_python39.log b/tests/integration/snapshots/logs/async-metrics_python39.log index f16e9e2d5..46c361126 100644 --- a/tests/integration/snapshots/logs/async-metrics_python39.log +++ b/tests/integration/snapshots/logs/async-metrics_python39.log @@ -54,11 +54,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -68,6 +68,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -76,10 +77,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -375,6 +377,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -383,6 +386,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -574,6 +578,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -718,13 +723,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -734,6 +738,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -742,10 +747,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -904,6 +910,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -912,6 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1066,6 +1074,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1074,6 +1083,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1241,6 +1251,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1249,6 +1260,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1403,6 +1415,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1411,6 +1424,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1571,6 +1585,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1579,6 +1594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index 1cbd91dd8..a9170abd9 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -34,11 +34,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -48,6 +48,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -56,10 +57,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -393,6 +395,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -401,6 +404,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -611,6 +615,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -774,13 +779,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -790,6 +794,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -798,10 +803,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -979,6 +985,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -987,6 +994,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1160,6 +1168,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1168,6 +1177,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1354,6 +1364,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1362,6 +1373,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1535,6 +1547,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1543,6 +1556,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1722,6 +1736,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1730,6 +1745,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index b043a8f47..490fcc635 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -34,11 +34,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -48,6 +48,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -56,10 +57,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -393,6 +395,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -401,6 +404,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -611,6 +615,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -774,13 +779,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -790,6 +794,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -798,10 +803,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -979,6 +985,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -987,6 +994,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1160,6 +1168,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1168,6 +1177,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1354,6 +1364,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1362,6 +1373,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1535,6 +1547,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1543,6 +1556,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1722,6 +1736,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1730,6 +1745,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index ff9bbdb75..509d1bfe4 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -34,11 +34,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -48,6 +48,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -56,10 +57,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -393,6 +395,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -401,6 +404,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -611,6 +615,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -774,13 +779,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -790,6 +794,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -798,10 +803,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -979,6 +985,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -987,6 +994,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1160,6 +1168,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1168,6 +1177,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1354,6 +1364,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1362,6 +1373,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1535,6 +1547,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1543,6 +1556,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1722,6 +1736,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1730,6 +1745,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index 87352f25e..03a8e8c26 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -34,11 +34,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -48,6 +48,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -56,10 +57,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -393,6 +395,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -401,6 +404,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -611,6 +615,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -774,13 +779,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -790,6 +794,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -798,10 +803,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -979,6 +985,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -987,6 +994,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1160,6 +1168,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1168,6 +1177,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1354,6 +1364,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1362,6 +1373,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1535,6 +1547,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1543,6 +1556,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1722,6 +1736,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1730,6 +1745,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python314.log b/tests/integration/snapshots/logs/sync-metrics_python314.log index cab7fcbba..7261153e1 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python314.log +++ b/tests/integration/snapshots/logs/sync-metrics_python314.log @@ -34,11 +34,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -48,6 +48,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -56,10 +57,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -393,6 +395,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -401,6 +404,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -611,6 +615,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -774,13 +779,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -790,6 +794,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -798,10 +803,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -979,6 +985,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -987,6 +994,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1160,6 +1168,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1168,6 +1177,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1354,6 +1364,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1362,6 +1373,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1535,6 +1547,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1543,6 +1556,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1722,6 +1736,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1730,6 +1745,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python38.log b/tests/integration/snapshots/logs/sync-metrics_python38.log index ae41bc18d..37bbff6e9 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python38.log +++ b/tests/integration/snapshots/logs/sync-metrics_python38.log @@ -34,11 +34,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -48,6 +48,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -56,10 +57,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -393,6 +395,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -401,6 +404,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -611,6 +615,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -774,13 +779,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -790,6 +794,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -798,10 +803,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -979,6 +985,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -987,6 +994,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1160,6 +1168,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1168,6 +1177,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1354,6 +1364,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1362,6 +1373,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1535,6 +1547,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1543,6 +1556,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1722,6 +1736,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1730,6 +1745,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python39.log b/tests/integration/snapshots/logs/sync-metrics_python39.log index 1acb7f0da..cd2a74e04 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python39.log +++ b/tests/integration/snapshots/logs/sync-metrics_python39.log @@ -34,11 +34,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.apigateway.rest", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/", "endpoint": "/", "http.method": "GET", "resource_names": "GET /", + "http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "span.kind": "server", "apiid": "XXXX", "apiname": "XXXX", @@ -48,6 +48,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -56,10 +57,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -393,6 +395,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "size_bytes": "26", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -401,6 +404,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -611,6 +615,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -774,13 +779,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "operation_name": "aws.httpapi", "endpoint": "/httpapi/get", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.protocol": "HTTP/1.1", "http.source_ip": "XXXX", - "http.user_agent": "XXXX/7.64.1", + "http.useragent": "curl/7.64.1", "resource_names": "GET /httpapi/get", "request_id": "XXXX", "apiid": "XXXX", @@ -790,6 +794,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.tag_source": "self", "http.status_code": "200", "http.route": "/httpapi/get", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -798,10 +803,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "http" + "type": "web" }, { "trace_id": "XXXX", @@ -979,6 +985,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "partition_key": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:kinesis:EXAMPLE", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -987,6 +994,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1160,6 +1168,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "object_etag": "XXXX", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:s3:::example-bucket", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1168,6 +1177,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1354,6 +1364,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "subject": "TestInvoke", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1362,6 +1373,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1535,6 +1547,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "sender_id": "AIDAIENQZJOLO23YVJ4VO", "_inferred_span.synchronicity": "async", "_inferred_span.tag_source": "self", + "dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1543,6 +1556,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, @@ -1722,6 +1736,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_inferred_span.synchronicity": "sync", "_inferred_span.tag_source": "self", "http.status_code": "200", + "dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev", "peer.service": "integration-tests-python", "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", @@ -1730,6 +1745,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A }, "metrics": { "process_id": XXXX, + "_dd._inferred_span": 1, "_dd.top_level": 1, "_sampling_priority_v1": 1 }, diff --git a/tests/test_tracing.py b/tests/test_tracing.py index 0fddd52ba..ec78265a6 100644 --- a/tests/test_tracing.py +++ b/tests/test_tracing.py @@ -1380,7 +1380,6 @@ def test_remaps_all_inferred_span_service_names_from_api_gateway_event(self): ctx.aws_request_id = "123" span1 = create_inferred_span(original_event, ctx) - self.assertEqual(span1.get_tag("operation_name"), "aws.apigateway.rest") self.assertEqual(span1.service, "new-name") # Testing the second event @@ -1389,7 +1388,6 @@ def test_remaps_all_inferred_span_service_names_from_api_gateway_event(self): "domainName" ] = "different.execute-api.us-east-2.amazonaws.com" span2 = create_inferred_span(event2, ctx) - self.assertEqual(span2.get_tag("operation_name"), "aws.apigateway.rest") self.assertEqual(span2.service, "new-name") def test_remaps_specific_inferred_span_service_names_from_api_gateway_event( @@ -1406,14 +1404,12 @@ def test_remaps_specific_inferred_span_service_names_from_api_gateway_event( ctx.aws_request_id = "123" span1 = create_inferred_span(original_event, ctx) - self.assertEqual(span1.get_tag("operation_name"), "aws.apigateway.rest") self.assertEqual(span1.service, "new-name") # Testing the second event event2 = copy.deepcopy(original_event) event2["requestContext"]["apiId"] = "different" span2 = create_inferred_span(event2, ctx) - self.assertEqual(span2.get_tag("operation_name"), "aws.apigateway.rest") self.assertEqual( span2.service, "70ixmpl4fl.execute-api.us-east-2.amazonaws.com" ) @@ -1456,14 +1452,12 @@ def test_remaps_specific_inferred_span_service_names_from_api_gateway_http_event ctx.aws_request_id = "123" span1 = create_inferred_span(original_event, ctx) - self.assertEqual(span1.get_tag("operation_name"), "aws.httpapi") self.assertEqual(span1.service, "new-name") # Testing the second event event2 = copy.deepcopy(original_event) event2["requestContext"]["apiId"] = "different" span2 = create_inferred_span(event2, ctx) - self.assertEqual(span2.get_tag("operation_name"), "aws.httpapi") self.assertEqual( span2.service, "x02yirxc7a.execute-api.eu-west-1.amazonaws.com" ) @@ -1804,7 +1798,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): _Span( service="70ixmpl4fl.execute-api.us-east-2.amazonaws.com", start=1428582896.0, - span_type="http", + span_type="web", tags={ "_dd.origin": "lambda", "_inferred_span.synchronicity": "sync", @@ -1814,7 +1808,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "endpoint": "/path/to/resource", "http.method": "POST", "http.url": "https://70ixmpl4fl.execute-api.us-east-2.amazonaws.com/path/to/resource", - "operation_name": "aws.apigateway.rest", + "http.useragent": "Custom User Agent String", "request_id": "123", "resource_names": "POST /{proxy+}", "stage": "prod", @@ -1826,7 +1820,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): _Span( service="lgxbo6a518.execute-api.eu-west-1.amazonaws.com", start=1631210915.2510002, - span_type="http", + span_type="web", tags={ "_dd.origin": "lambda", "_inferred_span.synchronicity": "async", @@ -1836,7 +1830,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "endpoint": "/http/get", "http.method": "GET", "http.url": "https://lgxbo6a518.execute-api.eu-west-1.amazonaws.com/http/get", - "operation_name": "aws.apigateway.rest", + "http.useragent": "curl/7.64.1", "request_id": "123", "resource_names": "GET /http/get", "stage": "dev", @@ -1848,7 +1842,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): _Span( service="lgxbo6a518.execute-api.eu-west-1.amazonaws.com", start=1631210915.2510002, - span_type="http", + span_type="web", tags={ "_dd.origin": "lambda", "_inferred_span.synchronicity": "sync", @@ -1858,7 +1852,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "endpoint": "/http/get", "http.method": "GET", "http.url": "https://lgxbo6a518.execute-api.eu-west-1.amazonaws.com/http/get", - "operation_name": "aws.apigateway.rest", + "http.useragent": "curl/7.64.1", "request_id": "123", "resource_names": "GET /http/get", "stage": "dev", @@ -1870,7 +1864,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): _Span( service="x02yirxc7a.execute-api.eu-west-1.amazonaws.com", start=1631212283.738, - span_type="http", + span_type="web", tags={ "_dd.origin": "lambda", "_inferred_span.synchronicity": "sync", @@ -1882,8 +1876,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "http.protocol": "HTTP/1.1", "http.source_ip": "38.122.226.210", "http.url": "https://x02yirxc7a.execute-api.eu-west-1.amazonaws.com/httpapi/get", - "http.user_agent": "curl/7.64.1", - "operation_name": "aws.httpapi", + "http.useragent": "curl/7.64.1", "request_id": "123", "resource_names": "GET /httpapi/get", "stage": "$default", @@ -1895,7 +1888,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): _Span( service="mcwkra0ya4.execute-api.sa-east-1.amazonaws.com", start=1710529824.52, - span_type="http", + span_type="web", tags={ "_dd.origin": "lambda", "_inferred_span.synchronicity": "sync", @@ -1905,7 +1898,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "endpoint": "/user/42", "http.method": "GET", "http.url": "https://mcwkra0ya4.execute-api.sa-east-1.amazonaws.com/user/42", - "operation_name": "aws.apigateway.rest", + "http.useragent": "curl/8.1.2", "request_id": "123", "resource_names": "GET /user/{id}", "stage": "dev", @@ -1917,7 +1910,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): _Span( service="9vj54we5ih.execute-api.sa-east-1.amazonaws.com", start=1710529905.066, - span_type="http", + span_type="web", tags={ "_dd.origin": "lambda", "_inferred_span.synchronicity": "sync", @@ -1927,7 +1920,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "endpoint": "/user/42", "http.method": "GET", "http.url": "https://9vj54we5ih.execute-api.sa-east-1.amazonaws.com/user/42", - "operation_name": "aws.httpapi", + "http.useragent": "curl/8.1.2", "request_id": "123", "resource_names": "GET /user/{id}", "stage": "$default", @@ -2186,7 +2179,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): _Span( service="70ixmpl4fl.execute-api.us-east-2.amazonaws.com", start=1428582896.0, - span_type="http", + span_type="web", tags={ "_dd.origin": "lambda", "_inferred_span.synchronicity": "sync", @@ -2196,7 +2189,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "endpoint": "/path/to/resource", "http.method": "POST", "http.url": "https://70ixmpl4fl.execute-api.us-east-2.amazonaws.com/path/to/resource", - "operation_name": "aws.apigateway.rest", + "http.useragent": "Custom User Agent String", "request_id": "123", "resource_names": "POST /{proxy+}", "stage": "prod", @@ -2208,7 +2201,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): _Span( service="amddr1rix9.execute-api.eu-west-1.amazonaws.com", start=1663295021.832, - span_type="http", + span_type="web", parent_name="aws.apigateway.authorizer", tags={ "_dd.origin": "lambda", @@ -2219,7 +2212,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "endpoint": "/hello", "http.method": "GET", "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", - "operation_name": "aws.apigateway.rest", + "http.useragent": "PostmanRuntime/7.29.2", "request_id": "123", "resource_names": "GET /hello", "stage": "dev", @@ -2231,7 +2224,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): _Span( service="amddr1rix9.execute-api.eu-west-1.amazonaws.com", start=1666714653.636, - span_type="http", + span_type="web", tags={ "_dd.origin": "lambda", "_inferred_span.synchronicity": "sync", @@ -2241,7 +2234,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "endpoint": "/hello", "http.method": "GET", "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", - "operation_name": "aws.apigateway.rest", + "http.useragent": "PostmanRuntime/7.29.2", "request_id": "123", "resource_names": "GET /hello", "stage": "dev", @@ -2253,7 +2246,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): _Span( service="amddr1rix9.execute-api.eu-west-1.amazonaws.com", start=1663295021.832, - span_type="http", + span_type="web", parent_name="aws.apigateway.authorizer", tags={ "_dd.origin": "lambda", @@ -2264,7 +2257,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "endpoint": "/hello", "http.method": "GET", "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", - "operation_name": "aws.apigateway.rest", + "http.useragent": "PostmanRuntime/7.29.2", "request_id": "123", "resource_names": "GET /hello", "stage": "dev", @@ -2276,7 +2269,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): _Span( service="amddr1rix9.execute-api.eu-west-1.amazonaws.com", start=1666803622.99, - span_type="http", + span_type="web", tags={ "_dd.origin": "lambda", "_inferred_span.synchronicity": "sync", @@ -2286,7 +2279,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "endpoint": "/hello", "http.method": "GET", "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", - "operation_name": "aws.apigateway.rest", + "http.useragent": "PostmanRuntime/7.29.2", "request_id": "123", "resource_names": "GET /hello", "stage": "dev", @@ -2298,7 +2291,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): _Span( service="amddr1rix9.execute-api.eu-west-1.amazonaws.com", start=1664228639.5337753, - span_type="http", + span_type="web", tags={ "_dd.origin": "lambda", "_inferred_span.synchronicity": "sync", @@ -2308,7 +2301,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "endpoint": "/hello", "http.method": "GET", "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", - "operation_name": "aws.httpapi", + "http.useragent": "curl/7.64.1", "request_id": "123", "resource_names": "GET /hello", "stage": "dev", @@ -2320,7 +2313,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): _Span( service="amddr1rix9.execute-api.eu-west-1.amazonaws.com", start=1666715429.349, - span_type="http", + span_type="web", tags={ "_dd.origin": "lambda", "_inferred_span.synchronicity": "sync", @@ -2330,7 +2323,7 @@ def __init__(self, service, start, span_type, parent_name=None, tags=None): "endpoint": "/hello", "http.method": "GET", "http.url": "https://amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello", - "operation_name": "aws.httpapi", + "http.useragent": "PostmanRuntime/7.29.2", "request_id": "123", "resource_names": "GET /hello", "stage": "dev", From f2a704c251cddbbbb644dc3f8bd6300763b6c97a Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Fri, 12 Dec 2025 11:39:38 -0500 Subject: [PATCH 104/164] Update Asm Blocked Response (#681) * use block config for block id * linting * Using existing block config * Update dd-trace-py version * update to ddtracepy v3.19.1 --- datadog_lambda/asm.py | 4 +++- pyproject.toml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/asm.py b/datadog_lambda/asm.py index 6c65a9465..29648021a 100644 --- a/datadog_lambda/asm.py +++ b/datadog_lambda/asm.py @@ -223,7 +223,9 @@ def get_asm_blocked_response( content = "" else: content_type = blocked.get("content-type", "application/json") - content = http_utils._get_blocked_template(content_type) + content = http_utils._get_blocked_template( + content_type, blocked.get("block_id", "default") + ) response = { "statusCode": blocked.get("status_code", 403), diff --git a/pyproject.toml b/pyproject.toml index 29e9c7f2a..6ca4f1476 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ classifiers = [ python = ">=3.8.0,<4" datadog = ">=0.51.0,<1.0.0" wrapt = "^1.11.2" -ddtrace = ">=3.16.2,<3.19.0" +ddtrace = ">=3.19.1,<4" ujson = ">=5.9.0" botocore = { version = "^1.34.0", optional = true } requests = { version ="^2.22.0", optional = true } From 73650f9a0a9ea667a060d7b63d2d41da039e8349 Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Tue, 16 Dec 2025 14:56:11 -0500 Subject: [PATCH 105/164] Running Gitlab jobs based on skip_e2e_tests variable (#700) * Running Gitlab jobs based on upstream pipeline existence * check value of env var * more prints * removing gate on e2e tests * another print * print * using upstream project name variable * colons * when on success * Replace commit branch with project name * force fail * remove force fail * Use skip e2e tests global variable * check skip_e2e_test=true explicitly * make variable a string --- .gitlab-ci.yml | 7 ++++++- ci/input_files/build.yaml.tpl | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0f36a781d..417398ec4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,3 +1,6 @@ +variables: + SKIP_E2E_TESTS: "false" + stages: - pre - build @@ -25,5 +28,7 @@ build-layers: - artifact: ci/build-pipeline.yaml job: generator strategy: depend + forward: + pipeline_variables: true rules: - - when: on_success + - when: on_success \ No newline at end of file diff --git a/ci/input_files/build.yaml.tpl b/ci/input_files/build.yaml.tpl index 599160fbf..10ff9984a 100644 --- a/ci/input_files/build.yaml.tpl +++ b/ci/input_files/build.yaml.tpl @@ -142,6 +142,8 @@ publish-layer-{{ $environment_name }} ({{ $runtime.name }}-{{ $runtime.arch }}): tags: ["arch:amd64"] image: registry.ddbuild.io/images/docker:20.10-py3 rules: + - if: '$SKIP_E2E_TESTS == "true"' + when: never - if: '"{{ $environment_name }}" == "sandbox" && $REGION == "{{ $e2e_region }}" && "{{ $runtime.arch }}" == "amd64"' when: on_success - if: '"{{ $environment_name }}" == "sandbox"' @@ -247,6 +249,10 @@ e2e-test: trigger: project: DataDog/serverless-e2e-tests strategy: depend + rules: + - if: '$SKIP_E2E_TESTS == "true"' + when: never + - when: on_success variables: LANGUAGES_SUBSET: python # These env vars are inherited from the dotenv reports of the publish-layer jobs @@ -267,6 +273,10 @@ e2e-test-status: image: registry.ddbuild.io/images/docker:20.10-py3 tags: ["arch:amd64"] timeout: 3h + rules: + - if: '$SKIP_E2E_TESTS == "true"' + when: never + - when: on_success script: | GITLAB_API_TOKEN=$(aws ssm get-parameter --region us-east-1 --name "ci.${CI_PROJECT_NAME}.serverless-e2e-gitlab-token" --with-decryption --query "Parameter.Value" --out text) URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/pipelines/${CI_PIPELINE_ID}/bridges" From 8395f838ec1ecc98a6f2109184f1ec1c2b196a64 Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Wed, 24 Dec 2025 12:38:34 -0500 Subject: [PATCH 106/164] Address flakiness of Gitlab jobs (#703) * Add retries to build, unit test, and integration test Gitlab jobs * Don't trigger integration tests from dd-trace-py * Add timeout to build jobs --- ci/input_files/build.yaml.tpl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ci/input_files/build.yaml.tpl b/ci/input_files/build.yaml.tpl index 10ff9984a..67f13706f 100644 --- a/ci/input_files/build.yaml.tpl +++ b/ci/input_files/build.yaml.tpl @@ -54,6 +54,8 @@ build-layer ({{ $runtime.name }}-{{ $runtime.arch }}): CI_ENABLE_CONTAINER_IMAGE_BUILDS: "true" script: - PYTHON_VERSION={{ $runtime.python_version }} ARCH={{ $runtime.arch }} ./scripts/build_layers.sh + timeout: 15m + retry: 2 check-layer-size ({{ $runtime.name }}-{{ $runtime.arch }}): stage: test @@ -85,11 +87,16 @@ unit-test ({{ $runtime.name }}-{{ $runtime.arch }}): script: - source venv/bin/activate - pytest -vv + retry: 2 integration-test ({{ $runtime.name }}-{{ $runtime.arch }}): stage: test tags: ["arch:amd64"] image: registry.ddbuild.io/images/docker:20.10-py3 + rules: + - if: '$SKIP_E2E_TESTS == "true"' + when: never + - when: on_success needs: - build-layer ({{ $runtime.name }}-{{ $runtime.arch }}) dependencies: @@ -105,6 +112,7 @@ integration-test ({{ $runtime.name }}-{{ $runtime.arch }}): - cd integration_tests && yarn install && cd .. script: - RUNTIME_PARAM={{ $runtime.python_version }} ARCH={{ $runtime.arch }} ./scripts/run_integration_tests.sh + retry: 2 sign-layer ({{ $runtime.name }}-{{ $runtime.arch }}): stage: sign From 23dfcd2f740f5efb69f6f51a23f2ef7e586ced6b Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Fri, 26 Dec 2025 15:04:23 -0500 Subject: [PATCH 107/164] Support ddtrace v4 (#701) * Runtime dependent pyproject.toml * brackets * remove additional quotation marks * overwrote ddtrace value * refactoring pyproject.toml dependencies * rename to project * update authors * move python requirement * have tool.poetry and project * duplicate * fix python requires * have both tool.poetry.dependencies and project.dependencies * re-add tool.poetry.extras * optional dependencies in poetry * conditional ddtrace version * reducing diff * re-add python dependency in poetry * downgrade for python 3.9 * Use dd-trace-py v4.1.1 or above for runtime >= 3.10 * Removing duplicated sections --- pyproject.toml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 6ca4f1476..a9eeca237 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,8 +3,12 @@ name = "datadog_lambda" version = "8.121.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] + +[project] +name = "datadog_lambda" license = "Apache-2.0" readme = "README.md" +requires-python = ">=3.8.0,<4" repository = "https://github.com/DataDog/datadog-lambda-python" keywords = [ "datadog", @@ -12,10 +16,18 @@ keywords = [ "lambda", "layer", ] +dependencies = [ + "datadog>=0.51.0,<1.0.0", + "wrapt>=1.11.2,<2", + "ddtrace>=3.19.1,<4; python_version>='3.9.0' and python_version < '3.10'", + "ddtrace>=4.1.1,<5; python_version>='3.10.0'", + "ujson>=5.9.0", +] packages = [ { include = "datadog_lambda" } ] classifiers = [ + "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", @@ -25,6 +37,8 @@ classifiers = [ "Programming Language :: Python :: 3.14", ] +# can remove tool.poetry.depencies and tool.poetry.extras +# after deprecation of Python 3.8 [tool.poetry.dependencies] python = ">=3.8.0,<4" datadog = ">=0.51.0,<1.0.0" @@ -46,6 +60,15 @@ dev = [ "requests", ] +[project.optional-dependencies] +dev = [ + "botocore>=1.34.0,<2", + "requests>=2.22.0,<3", + "pytest>=8.0.0,<9", + "pytest-benchmark>=4.0,<5", + "flake8>=5.0.4,<6", +] + [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" From 1f9a316263131ec8022e784855df34e6fba9a9e0 Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Tue, 30 Dec 2025 12:05:13 -0500 Subject: [PATCH 108/164] Trigger layer version update in documentation (#704) * Trigger version update in documentation * typo * Move input to variables * Needs pypi package * both pypi and layers * testing trigger * Remove testing --- ci/input_files/build.yaml.tpl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ci/input_files/build.yaml.tpl b/ci/input_files/build.yaml.tpl index 67f13706f..6820057dd 100644 --- a/ci/input_files/build.yaml.tpl +++ b/ci/input_files/build.yaml.tpl @@ -206,6 +206,22 @@ publish-pypi-package: script: - ./ci/publish_pypi.sh +update-layer-versions-docs: + stage: publish + trigger: + project: DataDog/serverless-ci + rules: + - if: '$CI_COMMIT_TAG =~ /^v.*/' + needs: {{ range $runtime := (ds "runtimes").runtimes }} + - publish-layer-prod ({{ $runtime.name }}-{{ $runtime.arch}}) + {{- end }} + - publish-pypi-package + variables: + RUN_LAMBDA_LAYER_DOCUMENTATION: "true" + RUN_LAMBDA_DATADOG_CI: "true" + RUN_LAMBDA_UI_LAYER_VERSIONS: "true" + RUN_LAMBDA_RUNTIMES: "true" + layer bundle: stage: build tags: ["arch:amd64"] From 8c6590128608bb616387d1965ecba59a4bb8daaf Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Tue, 6 Jan 2026 09:59:47 -0500 Subject: [PATCH 109/164] v121 (#705) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 9ce3b4e79..537f13a73 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.121.0.dev0" +__version__ = "8.121.0" diff --git a/pyproject.toml b/pyproject.toml index a9eeca237..3f152b9d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.121.0.dev0" +version = "8.121.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] From f83c1c314347f947af45ea0579c2ede34fa735fd Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Tue, 6 Jan 2026 10:46:54 -0500 Subject: [PATCH 110/164] Revert "v121 (#705)" (#706) This reverts commit 8c6590128608bb616387d1965ecba59a4bb8daaf. --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 537f13a73..9ce3b4e79 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.121.0" +__version__ = "8.121.0.dev0" diff --git a/pyproject.toml b/pyproject.toml index 3f152b9d8..a9eeca237 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.121.0" +version = "8.121.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] From cb34422f2c35435d46306adb2f26fb5c99f5ec97 Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Tue, 6 Jan 2026 16:22:25 -0500 Subject: [PATCH 111/164] Revert "Trigger layer version update in documentation (#704)" (#708) This reverts commit 1f9a316263131ec8022e784855df34e6fba9a9e0. --- ci/input_files/build.yaml.tpl | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/ci/input_files/build.yaml.tpl b/ci/input_files/build.yaml.tpl index 6820057dd..67f13706f 100644 --- a/ci/input_files/build.yaml.tpl +++ b/ci/input_files/build.yaml.tpl @@ -206,22 +206,6 @@ publish-pypi-package: script: - ./ci/publish_pypi.sh -update-layer-versions-docs: - stage: publish - trigger: - project: DataDog/serverless-ci - rules: - - if: '$CI_COMMIT_TAG =~ /^v.*/' - needs: {{ range $runtime := (ds "runtimes").runtimes }} - - publish-layer-prod ({{ $runtime.name }}-{{ $runtime.arch}}) - {{- end }} - - publish-pypi-package - variables: - RUN_LAMBDA_LAYER_DOCUMENTATION: "true" - RUN_LAMBDA_DATADOG_CI: "true" - RUN_LAMBDA_UI_LAYER_VERSIONS: "true" - RUN_LAMBDA_RUNTIMES: "true" - layer bundle: stage: build tags: ["arch:amd64"] From 9951c3d49e1e97b4228a4a05ab26cd83d47cb4c2 Mon Sep 17 00:00:00 2001 From: Brett Langdon Date: Wed, 7 Jan 2026 10:54:25 -0500 Subject: [PATCH 112/164] ci: fix broken dd-trace-py wheel downloading (#710) * ci: fix broken dd-trace-py wheel downloading * debug * fix platform tag * add necessary --no-index --- .github/workflows/build_layer.yml | 54 +++++-------------------------- 1 file changed, 8 insertions(+), 46 deletions(-) diff --git a/.github/workflows/build_layer.yml b/.github/workflows/build_layer.yml index fc22e9ce4..1725975f7 100644 --- a/.github/workflows/build_layer.yml +++ b/.github/workflows/build_layer.yml @@ -8,32 +8,9 @@ on: - "main" jobs: - get-ddtrace-run-id: - runs-on: ubuntu-latest - outputs: - run-id: ${{ steps.get-ddtrace-run-id.outputs.run_id }} - steps: - - name: Resolve Run ID of latest dd-trace-py build - id: get-ddtrace-run-id - env: - GH_TOKEN: ${{ github.token }} - run: | - RUN_ID=$(gh run list \ - --repo DataDog/dd-trace-py \ - --workflow build_deploy.yml \ - --branch main \ - --status success \ - --limit 1 \ - --json databaseId \ - --jq '.[0].databaseId') - - echo "run_id=$RUN_ID" >> $GITHUB_OUTPUT - build: runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest' }} - needs: get-ddtrace-run-id - strategy: fail-fast: false matrix: @@ -44,33 +21,18 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Build artifact name - id: build-artifact-name + - name: Download ddtrace Wheel + id: find-ddtrace-wheel run: | - if [ "${{ matrix.arch }}" == "amd64" ]; then - ARCH="x86_64" + # Convert matrix.arch into pip platform tag + if [ "${{ matrix.arch }}" = "amd64" ]; then + PLATFORM_TAG="manylinux_2_17_x86_64" else - ARCH="aarch64" + PLATFORM_TAG="manylinux_2_17_aarch64" fi - VER="${{ matrix.python_version }}" - PY_VERSION_NO_DOT="${VER//./}" - - echo "artifact_name=wheels-cp${PY_VERSION_NO_DOT}-manylinux_${ARCH}" >> $GITHUB_OUTPUT - - - name: Download ddtrace Wheel - uses: actions/download-artifact@v4 - with: - name: ${{ steps.build-artifact-name.outputs.artifact_name }} - repository: DataDog/dd-trace-py - run-id: ${{ needs.get-ddtrace-run-id.outputs.run-id }} - github-token: ${{ secrets.GITHUB_TOKEN }} - path: ./artifacts - - - name: Find ddtrace Wheel - id: find-ddtrace-wheel - run: | - echo "wheel_path=$(find ./artifacts -name "*.whl" | head -n 1)" >> $GITHUB_OUTPUT + pip download --no-index --no-deps --find-links https://dd-trace-py-builds.s3.amazonaws.com/main/index.html --pre --python-version "${{ matrix.python_version}}" --platform "${PLATFORM_TAG}" ddtrace + echo "wheel_path=$(find . -name "*.whl" | head -n 1)" >> $GITHUB_OUTPUT - name: Patch pyproject.toml run: | From b2a82fa8f0c5aefe6feb68c489b9e58282b93f6c Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Mon, 12 Jan 2026 10:32:59 -0500 Subject: [PATCH 113/164] Revert "Revert "v121 (#705)" (#706)" (#711) This reverts commit f83c1c314347f947af45ea0579c2ede34fa735fd. --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 9ce3b4e79..537f13a73 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.121.0.dev0" +__version__ = "8.121.0" diff --git a/pyproject.toml b/pyproject.toml index a9eeca237..3f152b9d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.121.0.dev0" +version = "8.121.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] From 3ece8ec868c9a6158d164bfb6cbce55d1b59c1a4 Mon Sep 17 00:00:00 2001 From: Rithika Narayan Date: Mon, 12 Jan 2026 12:44:49 -0500 Subject: [PATCH 114/164] v8.122.0.dev0 --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 537f13a73..2c988bd81 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.121.0" +__version__ = "8.122.0.dev0" diff --git a/pyproject.toml b/pyproject.toml index 3f152b9d8..cf1b2507e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.121.0" +version = "8.122.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] From aee684256a0d97449320ed6c4af83c76d166398e Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Mon, 2 Feb 2026 12:42:02 -0500 Subject: [PATCH 115/164] Clean up pyproject.toml (#714) * Remove project sections * fixing github actions --- .github/workflows/build_layer.yml | 2 +- pyproject.toml | 30 +++++------------------------- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/.github/workflows/build_layer.yml b/.github/workflows/build_layer.yml index 1725975f7..db8329b5e 100644 --- a/.github/workflows/build_layer.yml +++ b/.github/workflows/build_layer.yml @@ -37,7 +37,7 @@ jobs: - name: Patch pyproject.toml run: | echo "Patching pyproject.toml to use latest build of dd-trace-py" - sed -i 's|^ddtrace =.*$|ddtrace = { file = "${{ steps.find-ddtrace-wheel.outputs.wheel_path }}" }|' pyproject.toml + sed -zEi 's|^ddtrace =.*$|ddtrace = { file = "${{ steps.find-ddtrace-wheel.outputs.wheel_path }}" }|' pyproject.toml - name: Build layer for Python ${{ matrix.python_version }} on ${{ matrix.arch }} run: | diff --git a/pyproject.toml b/pyproject.toml index cf1b2507e..355dee300 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,12 +3,8 @@ name = "datadog_lambda" version = "8.122.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] - -[project] -name = "datadog_lambda" license = "Apache-2.0" readme = "README.md" -requires-python = ">=3.8.0,<4" repository = "https://github.com/DataDog/datadog-lambda-python" keywords = [ "datadog", @@ -16,18 +12,10 @@ keywords = [ "lambda", "layer", ] -dependencies = [ - "datadog>=0.51.0,<1.0.0", - "wrapt>=1.11.2,<2", - "ddtrace>=3.19.1,<4; python_version>='3.9.0' and python_version < '3.10'", - "ddtrace>=4.1.1,<5; python_version>='3.10.0'", - "ujson>=5.9.0", -] packages = [ { include = "datadog_lambda" } ] classifiers = [ - "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", @@ -37,13 +25,14 @@ classifiers = [ "Programming Language :: Python :: 3.14", ] -# can remove tool.poetry.depencies and tool.poetry.extras -# after deprecation of Python 3.8 [tool.poetry.dependencies] python = ">=3.8.0,<4" datadog = ">=0.51.0,<1.0.0" wrapt = "^1.11.2" -ddtrace = ">=3.19.1,<4" +ddtrace = [ + {version = ">=3.19.1,<4", python = ">=3.8,<3.10"}, + {version = ">=4.1.1,<5", python = ">=3.10"} +] ujson = ">=5.9.0" botocore = { version = "^1.34.0", optional = true } requests = { version ="^2.22.0", optional = true } @@ -60,18 +49,9 @@ dev = [ "requests", ] -[project.optional-dependencies] -dev = [ - "botocore>=1.34.0,<2", - "requests>=2.22.0,<3", - "pytest>=8.0.0,<9", - "pytest-benchmark>=4.0,<5", - "flake8>=5.0.4,<6", -] - [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.pytest.ini_options] -addopts = "--benchmark-disable --benchmark-autosave" +addopts = "--benchmark-disable --benchmark-autosave" \ No newline at end of file From 0287c5de1299f5c6511b0e7088d94b30e700dd5d Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Mon, 2 Feb 2026 12:56:48 -0500 Subject: [PATCH 116/164] v8.122.0 (#715) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 2c988bd81..09b00f329 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.122.0.dev0" +__version__ = "8.122.0" diff --git a/pyproject.toml b/pyproject.toml index 355dee300..ab95de194 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.122.0.dev0" +version = "8.122.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 7c36e9a97ed43eb919309d3853e027cd23eea1af Mon Sep 17 00:00:00 2001 From: Rithika Narayan Date: Mon, 2 Feb 2026 15:01:56 -0500 Subject: [PATCH 117/164] v8.123.0.dev0 --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 09b00f329..a329cafa0 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.122.0" +__version__ = "8.123.0.dev0" diff --git a/pyproject.toml b/pyproject.toml index ab95de194..f5a49eadc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.122.0" +version = "8.123.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From aa9cbba18b15a579a4e9f4964fa725ff8abb09ca Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Tue, 3 Feb 2026 09:36:24 -0500 Subject: [PATCH 118/164] Revert "Clean up pyproject.toml (#714)" (#719) This reverts commit aee684256a0d97449320ed6c4af83c76d166398e. --- .github/workflows/build_layer.yml | 2 +- pyproject.toml | 30 +++++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build_layer.yml b/.github/workflows/build_layer.yml index db8329b5e..1725975f7 100644 --- a/.github/workflows/build_layer.yml +++ b/.github/workflows/build_layer.yml @@ -37,7 +37,7 @@ jobs: - name: Patch pyproject.toml run: | echo "Patching pyproject.toml to use latest build of dd-trace-py" - sed -zEi 's|^ddtrace =.*$|ddtrace = { file = "${{ steps.find-ddtrace-wheel.outputs.wheel_path }}" }|' pyproject.toml + sed -i 's|^ddtrace =.*$|ddtrace = { file = "${{ steps.find-ddtrace-wheel.outputs.wheel_path }}" }|' pyproject.toml - name: Build layer for Python ${{ matrix.python_version }} on ${{ matrix.arch }} run: | diff --git a/pyproject.toml b/pyproject.toml index f5a49eadc..d8aa42018 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,8 +3,12 @@ name = "datadog_lambda" version = "8.123.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] + +[project] +name = "datadog_lambda" license = "Apache-2.0" readme = "README.md" +requires-python = ">=3.8.0,<4" repository = "https://github.com/DataDog/datadog-lambda-python" keywords = [ "datadog", @@ -12,10 +16,18 @@ keywords = [ "lambda", "layer", ] +dependencies = [ + "datadog>=0.51.0,<1.0.0", + "wrapt>=1.11.2,<2", + "ddtrace>=3.19.1,<4; python_version>='3.9.0' and python_version < '3.10'", + "ddtrace>=4.1.1,<5; python_version>='3.10.0'", + "ujson>=5.9.0", +] packages = [ { include = "datadog_lambda" } ] classifiers = [ + "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", @@ -25,14 +37,13 @@ classifiers = [ "Programming Language :: Python :: 3.14", ] +# can remove tool.poetry.depencies and tool.poetry.extras +# after deprecation of Python 3.8 [tool.poetry.dependencies] python = ">=3.8.0,<4" datadog = ">=0.51.0,<1.0.0" wrapt = "^1.11.2" -ddtrace = [ - {version = ">=3.19.1,<4", python = ">=3.8,<3.10"}, - {version = ">=4.1.1,<5", python = ">=3.10"} -] +ddtrace = ">=3.19.1,<4" ujson = ">=5.9.0" botocore = { version = "^1.34.0", optional = true } requests = { version ="^2.22.0", optional = true } @@ -49,9 +60,18 @@ dev = [ "requests", ] +[project.optional-dependencies] +dev = [ + "botocore>=1.34.0,<2", + "requests>=2.22.0,<3", + "pytest>=8.0.0,<9", + "pytest-benchmark>=4.0,<5", + "flake8>=5.0.4,<6", +] + [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.pytest.ini_options] -addopts = "--benchmark-disable --benchmark-autosave" \ No newline at end of file +addopts = "--benchmark-disable --benchmark-autosave" From 88bf2f2a5cae91396fff83a57ff2d950f7d2eade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jordan=20gonz=C3=A1lez?= <30836115+duncanista@users.noreply.github.com> Date: Thu, 5 Feb 2026 12:00:50 -0800 Subject: [PATCH 119/164] fix: omit creating cold start on LMI (#716) * omit creating cold start on LMI * set env in config instead of using os to do it --- datadog_lambda/cold_start.py | 17 +++++++++++++ datadog_lambda/config.py | 1 + datadog_lambda/wrapper.py | 9 ++++++- tests/test_cold_start.py | 46 ++++++++++++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/datadog_lambda/cold_start.py b/datadog_lambda/cold_start.py index a40e2fcb3..260d491b8 100644 --- a/datadog_lambda/cold_start.py +++ b/datadog_lambda/cold_start.py @@ -63,6 +63,19 @@ def get_proactive_init_tag(): ) +def is_managed_instances_mode(): + """ + Checks if the Lambda function is running in managed instances mode. + In managed instances mode, we should not create cold start tracing spans + as the gap between the sandbox initialization and the first + invocation might not be be a great experience. + + Returns: + bool: True if running in managed instances mode, False otherwise + """ + return config.aws_lambda_initialization_type == "lambda-managed-instances" + + class ImportNode(object): def __init__(self, module_name, full_file_path, start_time_ns, end_time_ns=None): self.module_name = module_name @@ -145,6 +158,10 @@ def wrapped_find_spec(*args, **kwargs): def initialize_cold_start_tracing(): + # Skip cold start tracing initialization in managed instances mode + if is_managed_instances_mode(): + return + if is_new_sandbox() and config.cold_start_tracing: from sys import meta_path diff --git a/datadog_lambda/config.py b/datadog_lambda/config.py index eda6b5828..9960953ec 100644 --- a/datadog_lambda/config.py +++ b/datadog_lambda/config.py @@ -98,6 +98,7 @@ def _resolve_env(self, key, default=None, cast=None, depends_on_tracing=False): integration_test = _get_env("DD_INTEGRATION_TEST", "false", as_bool) aws_lambda_function_name = _get_env("AWS_LAMBDA_FUNCTION_NAME") + aws_lambda_initialization_type = _get_env("AWS_LAMBDA_INITIALIZATION_TYPE") @property def function_name(self): diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 5a32e2ff9..b2f83f138 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -16,6 +16,7 @@ is_cold_start, is_proactive_init, is_new_sandbox, + is_managed_instances_mode, ColdStartTracer, ) from datadog_lambda.config import config @@ -338,7 +339,13 @@ def _after(self, event, context): create_dd_dummy_metadata_subsegment( self.trigger_tags, XraySubsegment.LAMBDA_FUNCTION_TAGS_KEY ) - should_trace_cold_start = config.cold_start_tracing and is_new_sandbox() + # Skip creating cold start spans in managed instances mode + # In managed instances, the tracer library handles cold start independently + should_trace_cold_start = ( + config.cold_start_tracing + and is_new_sandbox() + and not is_managed_instances_mode() + ) if should_trace_cold_start: trace_ctx = tracer.current_trace_context() diff --git a/tests/test_cold_start.py b/tests/test_cold_start.py index d75b5f43a..858db9a51 100644 --- a/tests/test_cold_start.py +++ b/tests/test_cold_start.py @@ -12,6 +12,52 @@ class TestColdStartTracingSetup(unittest.TestCase): + def test_is_managed_instances_mode_when_set(self): + os.environ["AWS_LAMBDA_INITIALIZATION_TYPE"] = "lambda-managed-instances" + self.assertTrue(cold_start.is_managed_instances_mode()) + # Clean up + if "AWS_LAMBDA_INITIALIZATION_TYPE" in os.environ: + del os.environ["AWS_LAMBDA_INITIALIZATION_TYPE"] + + def test_is_not_managed_instances_mode_when_not_set(self): + if "AWS_LAMBDA_INITIALIZATION_TYPE" in os.environ: + del os.environ["AWS_LAMBDA_INITIALIZATION_TYPE"] + self.assertFalse(cold_start.is_managed_instances_mode()) + + def test_is_not_managed_instances_mode_with_different_value(self): + os.environ["AWS_LAMBDA_INITIALIZATION_TYPE"] = "on-demand" + self.assertFalse(cold_start.is_managed_instances_mode()) + # Clean up + if "AWS_LAMBDA_INITIALIZATION_TYPE" in os.environ: + del os.environ["AWS_LAMBDA_INITIALIZATION_TYPE"] + + def test_initialize_cold_start_tracing_skips_in_managed_instances(self): + # Set managed instances mode + os.environ["AWS_LAMBDA_INITIALIZATION_TYPE"] = "lambda-managed-instances" + os.environ["DD_COLD_START_TRACING"] = "true" + cold_start._cold_start = True + cold_start._lambda_container_initialized = False + + # Reset node stacks and wrapped loaders to get clean state + cold_start.reset_node_stacks() + cold_start.already_wrapped_loaders.clear() + + # Count wrapped loaders before + wrapped_loaders_before = len(cold_start.already_wrapped_loaders) + + # Initialize cold start tracing - should skip in managed instances mode + cold_start.initialize_cold_start_tracing() + + # Verify no loaders were wrapped + wrapped_loaders_after = len(cold_start.already_wrapped_loaders) + self.assertEqual(wrapped_loaders_before, wrapped_loaders_after) + + # Clean up + if "AWS_LAMBDA_INITIALIZATION_TYPE" in os.environ: + del os.environ["AWS_LAMBDA_INITIALIZATION_TYPE"] + if "DD_COLD_START_TRACING" in os.environ: + del os.environ["DD_COLD_START_TRACING"] + def test_proactive_init(self): cold_start._cold_start = True cold_start._proactive_initialization = False From 8cfa94f84c88b0e000b39763e1ce99be4937fb06 Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Fri, 6 Feb 2026 10:08:46 -0500 Subject: [PATCH 120/164] Revert pyproject.toml changes, refactor sed command (#720) * Revert pyproject.toml changes and add environment variable for ddtrace wheel sed command * version typo * add commit branch variable * prints * fix environment variable checks * Remove debug prints * eof newline --- .github/workflows/build_layer.yml | 7 +------ pyproject.toml | 28 ++++------------------------ scripts/build_layers.sh | 8 ++++++++ 3 files changed, 13 insertions(+), 30 deletions(-) diff --git a/.github/workflows/build_layer.yml b/.github/workflows/build_layer.yml index 1725975f7..e21f16336 100644 --- a/.github/workflows/build_layer.yml +++ b/.github/workflows/build_layer.yml @@ -34,15 +34,10 @@ jobs: pip download --no-index --no-deps --find-links https://dd-trace-py-builds.s3.amazonaws.com/main/index.html --pre --python-version "${{ matrix.python_version}}" --platform "${PLATFORM_TAG}" ddtrace echo "wheel_path=$(find . -name "*.whl" | head -n 1)" >> $GITHUB_OUTPUT - - name: Patch pyproject.toml - run: | - echo "Patching pyproject.toml to use latest build of dd-trace-py" - sed -i 's|^ddtrace =.*$|ddtrace = { file = "${{ steps.find-ddtrace-wheel.outputs.wheel_path }}" }|' pyproject.toml - - name: Build layer for Python ${{ matrix.python_version }} on ${{ matrix.arch }} run: | echo "Building layer for Python ${{ matrix.python_version }} on ${{ matrix.arch }}" - ARCH=${{ matrix.arch }} PYTHON_VERSION=${{ matrix.python_version }} ./scripts/build_layers.sh + ARCH=${{ matrix.arch }} PYTHON_VERSION=${{ matrix.python_version }} DD_TRACE_WHEEL="${{ steps.find-ddtrace-wheel.outputs.wheel_path }}" ./scripts/build_layers.sh - name: Upload layer artifact uses: actions/upload-artifact@v4 diff --git a/pyproject.toml b/pyproject.toml index d8aa42018..ee15e3876 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,12 +3,8 @@ name = "datadog_lambda" version = "8.123.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] - -[project] -name = "datadog_lambda" license = "Apache-2.0" readme = "README.md" -requires-python = ">=3.8.0,<4" repository = "https://github.com/DataDog/datadog-lambda-python" keywords = [ "datadog", @@ -16,18 +12,10 @@ keywords = [ "lambda", "layer", ] -dependencies = [ - "datadog>=0.51.0,<1.0.0", - "wrapt>=1.11.2,<2", - "ddtrace>=3.19.1,<4; python_version>='3.9.0' and python_version < '3.10'", - "ddtrace>=4.1.1,<5; python_version>='3.10.0'", - "ujson>=5.9.0", -] packages = [ { include = "datadog_lambda" } ] classifiers = [ - "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", @@ -37,13 +25,14 @@ classifiers = [ "Programming Language :: Python :: 3.14", ] -# can remove tool.poetry.depencies and tool.poetry.extras -# after deprecation of Python 3.8 [tool.poetry.dependencies] python = ">=3.8.0,<4" datadog = ">=0.51.0,<1.0.0" wrapt = "^1.11.2" -ddtrace = ">=3.19.1,<4" +ddtrace = [ + {version = ">=3.19.1,<4", python = ">=3.8,<3.10"}, + {version = ">=4.1.1,<5", python = ">=3.10"} +] ujson = ">=5.9.0" botocore = { version = "^1.34.0", optional = true } requests = { version ="^2.22.0", optional = true } @@ -60,15 +49,6 @@ dev = [ "requests", ] -[project.optional-dependencies] -dev = [ - "botocore>=1.34.0,<2", - "requests>=2.22.0,<3", - "pytest>=8.0.0,<9", - "pytest-benchmark>=4.0,<5", - "flake8>=5.0.4,<6", -] - [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" diff --git a/scripts/build_layers.sh b/scripts/build_layers.sh index b78ca9abe..f10b9dbf9 100755 --- a/scripts/build_layers.sh +++ b/scripts/build_layers.sh @@ -46,6 +46,14 @@ else PYTHON_VERSIONS=$PYTHON_VERSION fi +# Replace ddtrace wheel used if necessary +if [ -n "$DD_TRACE_COMMIT_BRANCH" ]; then + sed -z -E -i 's|(ddtrace = )\[[^]]*]|\1{ git = "https://github.com/DataDog/dd-trace-py.git", branch = \"'"$DD_TRACE_COMMIT_BRANCH"'\" }|g' pyproject.toml +else + if [ -n "$DD_TRACE_WHEEL" ]; then + sed -z -E -i 's|(ddtrace = )\[[^]]*]|\1{ file = "'"$DD_TRACE_WHEEL"'" }|g' pyproject.toml + fi +fi function make_path_absolute { echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")" From 1031435740d8a86e1365dabfb4061f3f1563b28b Mon Sep 17 00:00:00 2001 From: Yiming Luo Date: Fri, 20 Feb 2026 17:09:37 -0500 Subject: [PATCH 121/164] fix: normalize runtime version format in integration test log comparison (#729) The Lambda runtime now emits versions like `python:3.10.mainlinev2.v3` instead of the old `python:3.10.v3` format, causing snapshot mismatches. Broaden the sed pattern to match any alphanumeric version suffix. Co-authored-by: Claude Sonnet 4.6 --- scripts/run_integration_tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/run_integration_tests.sh b/scripts/run_integration_tests.sh index 1dfa72b6b..1ec552897 100755 --- a/scripts/run_integration_tests.sh +++ b/scripts/run_integration_tests.sh @@ -199,7 +199,7 @@ for handler_name in "${LAMBDA_HANDLERS[@]}"; do sed '/^$/d' | # Normalize Lambda runtime REPORT logs sed -E 's/(RequestId|TraceId|SegmentId|Duration|init|Memory Used|"e"): [a-z0-9\.\-]+/\1: XXXX/g' | - sed -E 's/(python:3.[0-9]+\.v)[0-9]+/\1X/g' | + sed -E 's/(python:3\.[0-9]+\.)[a-zA-Z0-9\.]+/\1vX/g' | # Normalize HTTP headers sed -E "s/(x-datadog-parent-id:|x-datadog-trace-id:|Content-Length:)[0-9]+/\1XXXX/g" | # Remove Account ID From 1fafd5edd164bfdb5c949722bfd5ab09bed07241 Mon Sep 17 00:00:00 2001 From: Yiming Luo Date: Mon, 23 Feb 2026 10:13:08 -0500 Subject: [PATCH 122/164] feat: add durable function execution tags to Lambda spans (#728) * feat: add durable function execution tags to Lambda spans Extract DurableExecutionArn from the Lambda event payload and add durable_function_execution_name and durable_function_execution_id as span tags, matching the equivalent feature in datadog-lambda-js#730. Co-Authored-By: Claude Sonnet 4.6 * Change log level from debug to error * Format * fmt * Fix long line --------- Co-authored-by: Claude Sonnet 4.6 --- datadog_lambda/durable.py | 49 +++++++++++++++++++++ datadog_lambda/tracing.py | 3 ++ datadog_lambda/wrapper.py | 3 ++ tests/test_durable.py | 91 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 146 insertions(+) create mode 100644 datadog_lambda/durable.py create mode 100644 tests/test_durable.py diff --git a/datadog_lambda/durable.py b/datadog_lambda/durable.py new file mode 100644 index 000000000..e9443f92d --- /dev/null +++ b/datadog_lambda/durable.py @@ -0,0 +1,49 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019 Datadog, Inc. +import logging +import re + +logger = logging.getLogger(__name__) + + +def _parse_durable_execution_arn(arn): + """ + Parses a DurableExecutionArn to extract execution name and ID. + ARN format: + arn:aws:lambda:{region}:{account}:function:{func}:{version}/durable-execution/{name}/{id} + Returns (execution_name, execution_id) or None if parsing fails. + """ + match = re.search(r"/durable-execution/([^/]+)/([^/]+)$", arn) + if not match: + return None + execution_name, execution_id = match.group(1), match.group(2) + if not execution_name or not execution_id: + return None + return execution_name, execution_id + + +def extract_durable_function_tags(event): + """ + Extracts durable function tags from the Lambda event payload. + Returns a dict with durable function tags, or an empty dict if the event + is not a durable function invocation. + """ + if not isinstance(event, dict): + return {} + + durable_execution_arn = event.get("DurableExecutionArn") + if not isinstance(durable_execution_arn, str): + return {} + + parsed = _parse_durable_execution_arn(durable_execution_arn) + if not parsed: + logger.error("Failed to parse DurableExecutionArn: %s", durable_execution_arn) + return {} + + execution_name, execution_id = parsed + return { + "durable_function_execution_name": execution_name, + "durable_function_execution_id": execution_id, + } diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index e7dca1f32..bd1389768 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -1449,6 +1449,7 @@ def create_function_execution_span( trace_context_source, merge_xray_traces, trigger_tags, + durable_function_tags=None, parent_span=None, span_pointers=None, ): @@ -1477,6 +1478,8 @@ def create_function_execution_span( if trace_context_source == TraceContextSource.XRAY and merge_xray_traces: tags["_dd.parent_source"] = trace_context_source tags.update(trigger_tags) + if durable_function_tags: + tags.update(durable_function_tags) tracer.set_tags(_dd_origin) # Determine service name based on config and env var if config.service: diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index b2f83f138..aff4a44ec 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -42,6 +42,7 @@ tracer, propagator, ) +from datadog_lambda.durable import extract_durable_function_tags from datadog_lambda.trigger import ( extract_trigger_tags, extract_http_status_code_tag, @@ -243,6 +244,7 @@ def _before(self, event, context): submit_invocations_metric(context) self.trigger_tags = extract_trigger_tags(event, context) + self.durable_function_tags = extract_durable_function_tags(event) # Extract Datadog trace context and source from incoming requests dd_context, trace_context_source, event_source = extract_dd_trace_context( event, @@ -280,6 +282,7 @@ def _before(self, event, context): trace_context_source=trace_context_source, merge_xray_traces=config.merge_xray_traces, trigger_tags=self.trigger_tags, + durable_function_tags=self.durable_function_tags, parent_span=self.inferred_span, span_pointers=calculate_span_pointers(event_source, event), ) diff --git a/tests/test_durable.py b/tests/test_durable.py new file mode 100644 index 000000000..60914934c --- /dev/null +++ b/tests/test_durable.py @@ -0,0 +1,91 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019 Datadog, Inc. +import unittest + +from datadog_lambda.durable import ( + _parse_durable_execution_arn, + extract_durable_function_tags, +) + + +class TestParseDurableExecutionArn(unittest.TestCase): + def test_returns_name_and_id_for_valid_arn(self): + arn = "arn:aws:lambda:us-east-1:123456789012:function:my-func:$LATEST/durable-execution/order-123/550e8400-e29b-41d4-a716-446655440001" + result = _parse_durable_execution_arn(arn) + self.assertEqual(result, ("order-123", "550e8400-e29b-41d4-a716-446655440001")) + + def test_returns_none_for_arn_without_durable_execution_marker(self): + arn = "arn:aws:lambda:us-east-1:123456789012:function:my-func:$LATEST" + result = _parse_durable_execution_arn(arn) + self.assertIsNone(result) + + def test_returns_none_for_malformed_arn_with_only_execution_name(self): + arn = "arn:aws:lambda:us-east-1:123456789012:function:my-func:$LATEST/durable-execution/order-123" + result = _parse_durable_execution_arn(arn) + self.assertIsNone(result) + + def test_returns_none_for_malformed_arn_with_empty_execution_name(self): + arn = "arn:aws:lambda:us-east-1:123456789012:function:my-func:$LATEST/durable-execution//550e8400-e29b-41d4-a716-446655440002" + result = _parse_durable_execution_arn(arn) + self.assertIsNone(result) + + def test_returns_none_for_malformed_arn_with_empty_execution_id(self): + arn = "arn:aws:lambda:us-east-1:123456789012:function:my-func:$LATEST/durable-execution/order-123/" + result = _parse_durable_execution_arn(arn) + self.assertIsNone(result) + + def test_works_with_numeric_version_qualifier(self): + arn = "arn:aws:lambda:us-east-1:123456789012:function:my-func:1/durable-execution/my-execution/550e8400-e29b-41d4-a716-446655440004" + result = _parse_durable_execution_arn(arn) + self.assertEqual( + result, ("my-execution", "550e8400-e29b-41d4-a716-446655440004") + ) + + +class TestExtractDurableFunctionTags(unittest.TestCase): + def test_extracts_tags_from_event_with_durable_execution_arn(self): + event = { + "DurableExecutionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-func:1/durable-execution/my-execution/550e8400-e29b-41d4-a716-446655440004", + "CheckpointToken": "some-token", + "InitialExecutionState": {"Operations": []}, + } + result = extract_durable_function_tags(event) + self.assertEqual( + result, + { + "durable_function_execution_name": "my-execution", + "durable_function_execution_id": "550e8400-e29b-41d4-a716-446655440004", + }, + ) + + def test_returns_empty_dict_for_regular_lambda_event(self): + event = { + "body": '{"key": "value"}', + "headers": {"Content-Type": "application/json"}, + } + result = extract_durable_function_tags(event) + self.assertEqual(result, {}) + + def test_returns_empty_dict_when_event_is_none(self): + result = extract_durable_function_tags(None) + self.assertEqual(result, {}) + + def test_returns_empty_dict_when_event_is_not_a_dict(self): + result = extract_durable_function_tags("not-a-dict") + self.assertEqual(result, {}) + + def test_returns_empty_dict_when_durable_execution_arn_is_not_a_string(self): + event = {"DurableExecutionArn": 12345} + result = extract_durable_function_tags(event) + self.assertEqual(result, {}) + + def test_returns_empty_dict_when_durable_execution_arn_cannot_be_parsed(self): + event = {"DurableExecutionArn": "invalid-arn-without-durable-execution-marker"} + result = extract_durable_function_tags(event) + self.assertEqual(result, {}) + + def test_returns_empty_dict_when_event_is_empty(self): + result = extract_durable_function_tags({}) + self.assertEqual(result, {}) From d5e91cdb30adf9fc8a857b4c158ca45a73d0b963 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Wed, 25 Feb 2026 10:40:54 -0500 Subject: [PATCH 123/164] release v8.123.0 (#730) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index a329cafa0..4047ae838 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.123.0.dev0" +__version__ = "8.123.0" diff --git a/pyproject.toml b/pyproject.toml index ee15e3876..da3ecccf2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.123.0.dev0" +version = "8.123.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 6fd23fcb008f9ecb4fcf9f86005578a5eb1aca8a Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Thu, 26 Feb 2026 17:11:39 +0100 Subject: [PATCH 124/164] Add profiling enabled test in 3.14 (#731) --- tests/test_wrapper.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 95dfc3040..5b2afea8c 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -836,9 +836,6 @@ def lambda_handler(event, context): @patch("datadog_lambda.config.Config.profiling_enabled", True) -@pytest.mark.skipif( - sys.version_info >= (3, 14), reason="profiling not yet supported in python 3.14" -) def test_profiling_enabled(monkeypatch): importlib.reload(wrapper) From e5ab49a86d44829843c007ef6f1f55ce5917d460 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Mon, 2 Mar 2026 10:14:36 -0500 Subject: [PATCH 125/164] fix profiling (#733) --- datadog_lambda/wrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index aff4a44ec..c174a5016 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -292,7 +292,7 @@ def _before(self, event, context): else: set_correlation_ids() if config.profiling_enabled and profiler and is_new_sandbox(): - self.prof.start(stop_on_exit=False, profile_children=True) + self.prof.start() logger.debug("datadog_lambda_wrapper _before() done") except Exception as e: logger.error(format_err_with_traceback(e)) From 0a21fe4e800bdeebbc3230d068195f9612960f3f Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Mon, 2 Mar 2026 15:00:17 -0500 Subject: [PATCH 126/164] update to 8.124.0.dev0 --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 4047ae838..d11f7a1f6 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.123.0" +__version__ = "8.124.0.dev0" diff --git a/pyproject.toml b/pyproject.toml index da3ecccf2..ca2c739af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.123.0" +version = "8.124.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 544d8f7fd6cea759b4729455dbb2ec34a87c60cf Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Wed, 4 Mar 2026 17:02:09 -0500 Subject: [PATCH 127/164] chore: enable build_layers.sh to build from specific dd-trace-py commit (#734) * enable build_layers.sh to build from specific dd-trace-py commit * make PIN_SETUPTOOLS optional * remove the pin_setuptools option entirely --- Dockerfile | 1 + scripts/build_layers.sh | 70 +++++++++++++++++++++++++++++++++-------- 2 files changed, 58 insertions(+), 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index 974419ed8..b64cd4193 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,6 +25,7 @@ ENV PATH=/root/.cargo/bin:$PATH # Install datadog_lambda and dependencies from local COPY . . + RUN pip install --no-cache-dir . -t ./python/lib/$runtime/site-packages # Remove botocore (40MB) to reduce package size. aws-xray-sdk diff --git a/scripts/build_layers.sh b/scripts/build_layers.sh index f10b9dbf9..f15002757 100755 --- a/scripts/build_layers.sh +++ b/scripts/build_layers.sh @@ -6,9 +6,27 @@ # Copyright 2019 Datadog, Inc. # Builds datadog-lambda-python layers for Lambda functions - -# Usage: PYTHON_VERSION=3.11 ./build_layers.sh -# If PYTHON_VERSION is not specified, all versions will be built. +# +# Usage: +# PYTHON_VERSION=12 ARCH=arm ./scripts/build_layers.sh +# +# Environment variables: +# PYTHON_VERSION Python minor version. Accepts shorthand (e.g. 12) or full (e.g. 3.12). +# If not set, all supported versions are built. +# ARCH Target architecture. Accepts shorthand: arm, amd, x86, aarch64 +# or full: arm64, amd64. If not set, both are built. +# +# dd-trace-py overrides (mutually exclusive, highest priority first): +# DD_TRACE_COMMIT Specific dd-trace-py commit SHA to build from GitHub. +# DD_TRACE_COMMIT_BRANCH dd-trace-py branch name to build from GitHub. +# DD_TRACE_WHEEL Path to a pre-built ddtrace .whl file. +# +# Examples: +# # Build a single layer for Python 3.12 on arm64 +# PYTHON_VERSION=12 ARCH=arm ./scripts/build_layers.sh +# +# # Build with a specific dd-trace-py commit (for git bisect) +# DD_TRACE_COMMIT=abc123 PYTHON_VERSION=12 ARCH=arm ./scripts/build_layers.sh set -e @@ -17,6 +35,13 @@ LAYER_FILES_PREFIX="datadog_lambda_py" AVAILABLE_PYTHON_VERSIONS=("3.8" "3.9" "3.10" "3.11" "3.12" "3.13" "3.14") AVAILABLE_ARCHS=("arm64" "amd64") +if [ -n "$ARCH" ]; then + case "$ARCH" in + arm|arm64|aarch64) ARCH="arm64" ;; + amd|amd64|x86|x86_64) ARCH="amd64" ;; + esac +fi + if [ -z "$ARCH" ]; then echo "No architectures specified, building layers for all architectures." ARCHS=("${AVAILABLE_ARCHS[@]}") @@ -28,7 +53,14 @@ else echo "EXITING SCRIPT." exit 1 fi - ARCHS=$ARCH + ARCHS=("$ARCH") +fi + +# Normalize Python version shorthand (e.g. 12 -> 3.12, 3.12 -> 3.12) +if [ -n "$PYTHON_VERSION" ]; then + if [[ "$PYTHON_VERSION" =~ ^[0-9]+$ ]]; then + PYTHON_VERSION="3.${PYTHON_VERSION}" + fi fi # Determine which Python versions to build layers for @@ -43,18 +75,30 @@ else echo "EXITING SCRIPT." exit 1 fi - PYTHON_VERSIONS=$PYTHON_VERSION + PYTHON_VERSIONS=("$PYTHON_VERSION") fi -# Replace ddtrace wheel used if necessary -if [ -n "$DD_TRACE_COMMIT_BRANCH" ]; then - sed -z -E -i 's|(ddtrace = )\[[^]]*]|\1{ git = "https://github.com/DataDog/dd-trace-py.git", branch = \"'"$DD_TRACE_COMMIT_BRANCH"'\" }|g' pyproject.toml -else - if [ -n "$DD_TRACE_WHEEL" ]; then - sed -z -E -i 's|(ddtrace = )\[[^]]*]|\1{ file = "'"$DD_TRACE_WHEEL"'" }|g' pyproject.toml - fi -fi +# Backup pyproject.toml so modifications don't persist across runs +cp pyproject.toml pyproject.toml.bak +cleanup() { + mv pyproject.toml.bak pyproject.toml 2>/dev/null || true +} +trap cleanup EXIT +# Helper: replace the multi-line ddtrace dependency in pyproject.toml. +# Uses perl instead of sed -z for macOS/Linux portability. +replace_ddtrace_dep() { + perl -i -0777 -pe "s|ddtrace = \[[^\]]*\]|$1|gs" pyproject.toml +} + +# Replace ddtrace source if necessary +if [ -n "$DD_TRACE_COMMIT" ]; then + replace_ddtrace_dep "ddtrace = { git = \"https://github.com/DataDog/dd-trace-py.git\", rev = \"$DD_TRACE_COMMIT\" }" +elif [ -n "$DD_TRACE_COMMIT_BRANCH" ]; then + replace_ddtrace_dep "ddtrace = { git = \"https://github.com/DataDog/dd-trace-py.git\", branch = \"$DD_TRACE_COMMIT_BRANCH\" }" +elif [ -n "$DD_TRACE_WHEEL" ]; then + replace_ddtrace_dep "ddtrace = { file = \"$DD_TRACE_WHEEL\" }" +fi function make_path_absolute { echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")" } From f349c577d94c4fc346a87de0cdc5568786ce75b9 Mon Sep 17 00:00:00 2001 From: Nicolas Catoni Date: Tue, 10 Mar 2026 16:14:28 +0100 Subject: [PATCH 128/164] ci: add test optimization reporting for system-tests (#735) * Adding test optimization reporting for system-tests * Push to test optim * New API key for test optimization --- .github/workflows/system_tests.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/system_tests.yml b/.github/workflows/system_tests.yml index b61725b1a..49e7bf052 100644 --- a/.github/workflows/system_tests.yml +++ b/.github/workflows/system_tests.yml @@ -27,12 +27,15 @@ jobs: needs: - build uses: DataDog/system-tests/.github/workflows/system-tests.yml@main - secrets: inherit + secrets: + DD_API_KEY: ${{ secrets.DD_API_KEY }} + TEST_OPTIMIZATION_API_KEY: ${{ secrets.TEST_OPTIMIZATION_API_KEY }} permissions: contents: read packages: write with: library: python_lambda binaries_artifact: binaries - scenarios_groups: appsec + scenarios_groups: tracer_release skip_empty_scenarios: true + push_to_test_optimization: true From 8fe789e3f8dae35f2cb9ffa42427e68b1df65ed0 Mon Sep 17 00:00:00 2001 From: jchrostek-dd Date: Fri, 13 Mar 2026 10:05:19 -0400 Subject: [PATCH 129/164] Add span.kind=server to aws.lambda spans (#745) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add span.kind=server to aws.lambda span This aligns the tracer-created span with the extension's behavior, enabling server-based features in Datadog APM for Lambda functions. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * Update integration test snapshots with span.kind: server Add span.kind: server to all aws.lambda spans in integration test snapshot files to match the new behavior added in tracing.py. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --------- Co-authored-by: Claude Opus 4.5 --- datadog_lambda/tracing.py | 1 + .../integration/snapshots/logs/async-metrics_python310.log | 7 +++++++ .../integration/snapshots/logs/async-metrics_python311.log | 7 +++++++ .../integration/snapshots/logs/async-metrics_python312.log | 7 +++++++ .../integration/snapshots/logs/async-metrics_python313.log | 7 +++++++ .../integration/snapshots/logs/async-metrics_python314.log | 7 +++++++ .../integration/snapshots/logs/async-metrics_python38.log | 7 +++++++ .../integration/snapshots/logs/async-metrics_python39.log | 7 +++++++ .../integration/snapshots/logs/sync-metrics_python310.log | 7 +++++++ .../integration/snapshots/logs/sync-metrics_python311.log | 7 +++++++ .../integration/snapshots/logs/sync-metrics_python312.log | 7 +++++++ .../integration/snapshots/logs/sync-metrics_python313.log | 7 +++++++ .../integration/snapshots/logs/sync-metrics_python314.log | 7 +++++++ tests/integration/snapshots/logs/sync-metrics_python38.log | 7 +++++++ tests/integration/snapshots/logs/sync-metrics_python39.log | 7 +++++++ 15 files changed, 99 insertions(+) diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index bd1389768..da4c9dd33 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -1460,6 +1460,7 @@ def create_function_execution_span( function_arn = ":".join(tk[0:7]) if len(tk) > 7 else function_arn function_version = tk[7] if len(tk) > 7 else "$LATEST" tags = { + "span.kind": "server", "cold_start": str(is_cold_start).lower(), "function_arn": function_arn, "function_version": function_version, diff --git a/tests/integration/snapshots/logs/async-metrics_python310.log b/tests/integration/snapshots/logs/async-metrics_python310.log index 356d82439..8d47fa129 100644 --- a/tests/integration/snapshots/logs/async-metrics_python310.log +++ b/tests/integration/snapshots/logs/async-metrics_python310.log @@ -237,6 +237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -445,6 +446,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -605,6 +607,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -946,6 +949,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1122,6 +1126,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1287,6 +1292,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1451,6 +1457,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python311.log b/tests/integration/snapshots/logs/async-metrics_python311.log index fa140a85a..3a2dd243e 100644 --- a/tests/integration/snapshots/logs/async-metrics_python311.log +++ b/tests/integration/snapshots/logs/async-metrics_python311.log @@ -237,6 +237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -445,6 +446,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -605,6 +607,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -946,6 +949,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1122,6 +1126,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1287,6 +1292,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1451,6 +1457,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python312.log b/tests/integration/snapshots/logs/async-metrics_python312.log index c2ea06475..910218152 100644 --- a/tests/integration/snapshots/logs/async-metrics_python312.log +++ b/tests/integration/snapshots/logs/async-metrics_python312.log @@ -237,6 +237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -445,6 +446,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -605,6 +607,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -946,6 +949,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1122,6 +1126,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1287,6 +1292,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1451,6 +1457,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python313.log b/tests/integration/snapshots/logs/async-metrics_python313.log index b6a4f68e8..41008f65d 100644 --- a/tests/integration/snapshots/logs/async-metrics_python313.log +++ b/tests/integration/snapshots/logs/async-metrics_python313.log @@ -237,6 +237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -445,6 +446,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -605,6 +607,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -946,6 +949,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1122,6 +1126,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1287,6 +1292,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1451,6 +1457,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python314.log b/tests/integration/snapshots/logs/async-metrics_python314.log index a430b6449..c6979758d 100644 --- a/tests/integration/snapshots/logs/async-metrics_python314.log +++ b/tests/integration/snapshots/logs/async-metrics_python314.log @@ -237,6 +237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -445,6 +446,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -605,6 +607,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -946,6 +949,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1122,6 +1126,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1287,6 +1292,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1451,6 +1457,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python38.log b/tests/integration/snapshots/logs/async-metrics_python38.log index e37090ff9..d4c33fe59 100644 --- a/tests/integration/snapshots/logs/async-metrics_python38.log +++ b/tests/integration/snapshots/logs/async-metrics_python38.log @@ -237,6 +237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -445,6 +446,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -605,6 +607,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -946,6 +949,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1122,6 +1126,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1287,6 +1292,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1451,6 +1457,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python39.log b/tests/integration/snapshots/logs/async-metrics_python39.log index 46c361126..c12ed57fd 100644 --- a/tests/integration/snapshots/logs/async-metrics_python39.log +++ b/tests/integration/snapshots/logs/async-metrics_python39.log @@ -237,6 +237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -445,6 +446,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -605,6 +607,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -946,6 +949,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1122,6 +1126,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1287,6 +1292,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1451,6 +1457,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index a9170abd9..3747c3aec 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -236,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -463,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -642,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -1021,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1216,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1400,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1583,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index 490fcc635..b614b1222 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -236,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -463,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -642,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -1021,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1216,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1400,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1583,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index 509d1bfe4..593d9fbfd 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -236,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -463,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -642,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -1021,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1216,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1400,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1583,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index 03a8e8c26..c21fcaad0 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -236,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -463,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -642,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -1021,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1216,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1400,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1583,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python314.log b/tests/integration/snapshots/logs/sync-metrics_python314.log index 7261153e1..090c3cbae 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python314.log +++ b/tests/integration/snapshots/logs/sync-metrics_python314.log @@ -236,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -463,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -642,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -1021,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1216,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1400,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1583,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python38.log b/tests/integration/snapshots/logs/sync-metrics_python38.log index 37bbff6e9..322961263 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python38.log +++ b/tests/integration/snapshots/logs/sync-metrics_python38.log @@ -236,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -463,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -642,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -1021,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1216,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1400,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1583,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python39.log b/tests/integration/snapshots/logs/sync-metrics_python39.log index cd2a74e04..1c1496d32 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python39.log +++ b/tests/integration/snapshots/logs/sync-metrics_python39.log @@ -236,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -463,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -642,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -1021,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1216,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1400,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1583,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, From 64eba2f834685153f29d68de2da880af8d850f91 Mon Sep 17 00:00:00 2001 From: jchrostek-dd Date: Mon, 16 Mar 2026 11:12:52 -0400 Subject: [PATCH 130/164] fix(cold_start): capture trace context before finishing spans (#746) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move trace context capture BEFORE span.finish() so ColdStartTracer creates spans with the correct trace_id. Previously, tracer.current_trace_context() was called AFTER span.finish(), which returned a stale context, causing cold start spans (aws.lambda.load and import spans) to have a different trace_id than the main aws.lambda span. Added unit test assertions to verify trace_id consistency. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 --- datadog_lambda/wrapper.py | 19 ++++++++++--------- tests/test_cold_start.py | 7 ++++++- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index c174a5016..d022988bc 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -305,6 +305,16 @@ def _after(self, event, context): status_code = extract_http_status_code_tag(self.trigger_tags, self.response) + # Skip creating cold start spans in managed instances mode + # In managed instances, the tracer library handles cold start independently + should_trace_cold_start = ( + config.cold_start_tracing + and is_new_sandbox() + and not is_managed_instances_mode() + ) + if should_trace_cold_start: + trace_ctx = tracer.current_trace_context() + if self.span: if config.appsec_enabled and not self.blocking_response: asm_start_response( @@ -342,15 +352,6 @@ def _after(self, event, context): create_dd_dummy_metadata_subsegment( self.trigger_tags, XraySubsegment.LAMBDA_FUNCTION_TAGS_KEY ) - # Skip creating cold start spans in managed instances mode - # In managed instances, the tracer library handles cold start independently - should_trace_cold_start = ( - config.cold_start_tracing - and is_new_sandbox() - and not is_managed_instances_mode() - ) - if should_trace_cold_start: - trace_ctx = tracer.current_trace_context() if self.inferred_span: if status_code: diff --git a/tests/test_cold_start.py b/tests/test_cold_start.py index 858db9a51..5fc11e2cf 100644 --- a/tests/test_cold_start.py +++ b/tests/test_cold_start.py @@ -310,13 +310,18 @@ def handler(event, context): handler.cold_start_tracing = True handler({}, lambda_context) - function_span = import_span = None + function_span = import_span = load_span = None for span in spans: if span.resource == "tabnanny": import_span = span elif span.name == "aws.lambda": function_span = span + elif span.name == "aws.lambda.load": + load_span = span assert function_span is not None assert import_span is not None assert import_span.parent_id == function_span.span_id + assert import_span.trace_id == function_span.trace_id + assert load_span is not None + assert load_span.trace_id == function_span.trace_id From 0f4c059a8adfe57793de5435fd7a8c7cb1623750 Mon Sep 17 00:00:00 2001 From: Brett Langdon Date: Wed, 18 Mar 2026 15:46:37 -0400 Subject: [PATCH 131/164] ci: skip ddtrace 4.6.* version (#750) * ci: skip ddtrace 4.6.* version * Update pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ca2c739af..f289867cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ datadog = ">=0.51.0,<1.0.0" wrapt = "^1.11.2" ddtrace = [ {version = ">=3.19.1,<4", python = ">=3.8,<3.10"}, - {version = ">=4.1.1,<5", python = ">=3.10"} + {version = ">=4.1.1,<5,!=4.6.*", python = ">=3.10"} ] ujson = ">=5.9.0" botocore = { version = "^1.34.0", optional = true } From 1bcf24370f0b35bcfd24457edbc8568b78d6bd7e Mon Sep 17 00:00:00 2001 From: Nicolas Catoni Date: Thu, 19 Mar 2026 13:26:11 +0100 Subject: [PATCH 132/164] ci: adding schedule to system-tests workflow (#744) * Adding schedule to system-tests workflow * Update .github/workflows/system_tests.yml Co-authored-by: Charles de Beauchesne --------- Co-authored-by: Charles de Beauchesne --- .github/workflows/system_tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/system_tests.yml b/.github/workflows/system_tests.yml index 49e7bf052..f6e23a0f0 100644 --- a/.github/workflows/system_tests.yml +++ b/.github/workflows/system_tests.yml @@ -7,6 +7,8 @@ on: pull_request: branches: - "**" + schedule: + - cron: '00 03 * * *' jobs: build: From 91d24869566fae968b2a7ca21cfcf70a99804ede Mon Sep 17 00:00:00 2001 From: Brett Langdon Date: Thu, 19 Mar 2026 11:00:15 -0400 Subject: [PATCH 133/164] ci: install dd-trace-py pipeline wheels when run as child pipeline (#749) * ci: allow installing dd-trace-py pipeline artifacts * we don't have python/pip available * don't fail if wheels aren't available * don't delete local wheels --- scripts/build_layers.sh | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/scripts/build_layers.sh b/scripts/build_layers.sh index f15002757..7456a38bf 100755 --- a/scripts/build_layers.sh +++ b/scripts/build_layers.sh @@ -20,6 +20,9 @@ # DD_TRACE_COMMIT Specific dd-trace-py commit SHA to build from GitHub. # DD_TRACE_COMMIT_BRANCH dd-trace-py branch name to build from GitHub. # DD_TRACE_WHEEL Path to a pre-built ddtrace .whl file. +# UPSTREAM_PIPELINE_ID GitLab pipeline ID from dd-trace-py. Downloads the +# matching pre-built wheel from S3 (via +# index-manylinux2014.html) for each python/arch. # # Examples: # # Build a single layer for Python 3.12 on arm64 @@ -91,14 +94,6 @@ replace_ddtrace_dep() { perl -i -0777 -pe "s|ddtrace = \[[^\]]*\]|$1|gs" pyproject.toml } -# Replace ddtrace source if necessary -if [ -n "$DD_TRACE_COMMIT" ]; then - replace_ddtrace_dep "ddtrace = { git = \"https://github.com/DataDog/dd-trace-py.git\", rev = \"$DD_TRACE_COMMIT\" }" -elif [ -n "$DD_TRACE_COMMIT_BRANCH" ]; then - replace_ddtrace_dep "ddtrace = { git = \"https://github.com/DataDog/dd-trace-py.git\", branch = \"$DD_TRACE_COMMIT_BRANCH\" }" -elif [ -n "$DD_TRACE_WHEEL" ]; then - replace_ddtrace_dep "ddtrace = { file = \"$DD_TRACE_WHEEL\" }" -fi function make_path_absolute { echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")" } @@ -109,6 +104,36 @@ function docker_build_zip { destination=$(make_path_absolute $2) arch=$3 + # Restore pyproject.toml to a clean state for each build iteration + cp pyproject.toml.bak pyproject.toml + + # Replace ddtrace source if necessary + if [ -n "$DD_TRACE_COMMIT" ]; then + replace_ddtrace_dep "ddtrace = { git = \"https://github.com/DataDog/dd-trace-py.git\", rev = \"$DD_TRACE_COMMIT\" }" + elif [ -n "$DD_TRACE_COMMIT_BRANCH" ]; then + replace_ddtrace_dep "ddtrace = { git = \"https://github.com/DataDog/dd-trace-py.git\", branch = \"$DD_TRACE_COMMIT_BRANCH\" }" + elif [ -n "$DD_TRACE_WHEEL" ]; then + replace_ddtrace_dep "ddtrace = { file = \"$DD_TRACE_WHEEL\" }" + elif [ -n "$UPSTREAM_PIPELINE_ID" ]; then + S3_BASE="https://dd-trace-py-builds.s3.amazonaws.com/${UPSTREAM_PIPELINE_ID}" + if [ "${arch}" = "amd64" ]; then + PLATFORM="manylinux2014_x86_64" + else + PLATFORM="manylinux2014_aarch64" + fi + PY_TAG="cp$(echo "$1" | tr -d '.')" + WHEEL_FILE=$(curl -sSfL "${S3_BASE}/index-manylinux2014.html" \ + | grep -o "ddtrace-[^\"]*${PY_TAG}[^\"]*${PLATFORM}[^\"]*\.whl" \ + | head -n 1) + if [ -z "${WHEEL_FILE}" ]; then + echo "No S3 wheel found for ${PY_TAG} ${PLATFORM}, using default pyproject.toml version" + else + curl -sSfL "${S3_BASE}/${WHEEL_FILE}" -o "${WHEEL_FILE}" + echo "Using S3 wheel: ${WHEEL_FILE}" + replace_ddtrace_dep "ddtrace = { file = \"${WHEEL_FILE}\" }" + fi + fi + # Install datadogpy in a docker container to avoid the mess from switching # between different python runtimes. temp_dir=$(mktemp -d) From 8f20b9faceb487953e8e09c526ab73c7d8b9a3f1 Mon Sep 17 00:00:00 2001 From: Juanjo Alvarez Martinez Date: Mon, 23 Mar 2026 15:20:06 +0100 Subject: [PATCH 134/164] feat: slim down the zip ddtrace package (#753) Remove more things from the ddtrace package Signed-off-by: Juanjo Alvarez simplify appsec removal Signed-off-by: Juanjo Alvarez Merge branch 'main' into juanjux/remove-ddtrace-stuff simplify appsec removal Signed-off-by: Juanjo Alvarez Merge branch 'juanjux/remove-ddtrace-stuff' of https://github.com/juanjux/datadog-lambda-python into juanjux/remove-ddtrace-stuff Add more extensions to delete Signed-off-by: Juanjo Alvarez Merge branch 'main' into juanjux/remove-ddtrace-stuff simplify appsec removal Signed-off-by: Juanjo Alvarez Merge branch 'juanjux/remove-ddtrace-stuff' of https://github.com/juanjux/datadog-lambda-python into juanjux/remove-ddtrace-stuff Also delete .pyi Signed-off-by: Juanjo Alvarez Co-authored-by: juanjo.alvarezmartinez --- Dockerfile | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index b64cd4193..6d9eb756e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,10 +33,12 @@ RUN pip install --no-cache-dir . -t ./python/lib/$runtime/site-packages RUN rm -rf ./python/lib/$runtime/site-packages/botocore* RUN rm -rf ./python/lib/$runtime/site-packages/setuptools RUN rm -rf ./python/lib/$runtime/site-packages/jsonschema/tests -RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_ast/iastpatch*.so -RUN rm -rf ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_taint_tracking/_vendor -RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_taint_tracking/*.so -RUN rm -f ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast/_stacktrace*.so +RUN rm -rf ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast +RUN rm -rf ./python/lib/$runtime/site-packages/ddtrace/internal/test_visibility +# Dogshell +RUN rm -rf ./python/lib/$runtime/site-packages/datadog/dogshell +RUN rm -rf ./python/lib/$runtime/site-packages/bin/dog* + # remove *.dist-info directories except any entry_points.txt files and METADATA files required for Appsec Software Composition Analysis RUN find ./python/lib/$runtime/site-packages/*.dist-info \ -type f \ @@ -50,7 +52,8 @@ RUN rm -rf \ ./python/lib/$runtime/site-packages/urllib3* \ ./python/lib/$runtime/site-packages/certifi* \ ./python/lib/$runtime/site-packages/idna* \ - ./python/lib/$runtime/site-packages/charset_normalizer* + ./python/lib/$runtime/site-packages/charset_normalizer* \ + ./python/lib/$runtime/site-packages/*__mypyc*.so # from charset_normalizer # Precompile all .pyc files and remove .py files. This speeds up load time. # Compile with optimization level 2 (-OO) and PYTHONNODEBUGRANGES=1 to redtce @@ -73,6 +76,7 @@ RUN find ./python/lib/$runtime/site-packages/ddtrace -name \*.cc -delete RUN find ./python/lib/$runtime/site-packages/ddtrace -name \*.h -delete RUN find ./python/lib/$runtime/site-packages/ddtrace -name \*.hpp -delete RUN find ./python/lib/$runtime/site-packages/ddtrace -name \*.pyx -delete +RUN find ./python/lib/$runtime/site-packages/ddtrace -name \*.pyi -delete # Strip debug symbols and symbols that are not needed for relocation # processing using strip --strip-unneeded for all .so files. This is to From 52bcf2180771dad19cfed6ed55fe4037c038ac12 Mon Sep 17 00:00:00 2001 From: Olivier Nzia Date: Mon, 23 Mar 2026 16:28:54 -0400 Subject: [PATCH 135/164] fix: disable Client Side Stats by default (#756) * set DD_TRACE_COMPUTE_STATS to false by default * lint * add comment * add alias, and warning * lint * disable css invariably --- datadog_lambda/config.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/datadog_lambda/config.py b/datadog_lambda/config.py index 9960953ec..4458bd9aa 100644 --- a/datadog_lambda/config.py +++ b/datadog_lambda/config.py @@ -141,6 +141,12 @@ def _reset(self): "enabled" if config.fips_mode_enabled else "not enabled", ) +# disable css to prevent double counting in lambda +os.environ["DD_TRACE_STATS_COMPUTATION_ENABLED"] = "false" + +# unset css aliases to ensure it is disabled +if "DD_TRACE_COMPUTE_STATS" in os.environ: + del os.environ["DD_TRACE_COMPUTE_STATS"] if ( "DD_INSTRUMENTATION_TELEMETRY_ENABLED" not in os.environ From 12a2a5a785642b6fe230e0a545c96573f42d7da1 Mon Sep 17 00:00:00 2001 From: jchrostek-dd Date: Thu, 26 Mar 2026 11:28:11 -0400 Subject: [PATCH 136/164] feat: add durable_function_execution_status tag to aws.lambda span (#751) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add durable_function_execution_status tag to aws.lambda span When using AWS Lambda Durable Execution SDK, extract the execution status from the handler response and add it as a tag to the aws.lambda span. The tag captures the Status field from durable function responses: - SUCCEEDED: Execution completed successfully - FAILED: Execution failed - PENDING: Execution is still in progress The tag is only added when: 1. The event contains a DurableExecutionArn (indicates durable invocation) 2. The response is a dict with a valid Status field 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * refactor: simplify durable status extraction Return status string directly instead of wrapping in a dict. Remove redundant comments. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * remove redundant docstrings * restore docstring for existing function * fix: black formatting * fix: apply black formatting * fix: use correct durable execution status values (SUCCEEDED, FAILED, STOPPED, TIMED_OUT) * fix: rename tag to aws_lambda.durable_function.execution_status 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --------- Co-authored-by: Claude Opus 4.5 --- datadog_lambda/durable.py | 14 ++++++++ datadog_lambda/wrapper.py | 14 ++++++-- tests/test_durable.py | 70 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/durable.py b/datadog_lambda/durable.py index e9443f92d..3174cd6cf 100644 --- a/datadog_lambda/durable.py +++ b/datadog_lambda/durable.py @@ -47,3 +47,17 @@ def extract_durable_function_tags(event): "durable_function_execution_name": execution_name, "durable_function_execution_id": execution_id, } + + +VALID_DURABLE_STATUSES = {"SUCCEEDED", "FAILED", "STOPPED", "TIMED_OUT"} + + +def extract_durable_execution_status(response, event): + if not isinstance(event, dict) or "DurableExecutionArn" not in event: + return None + if not isinstance(response, dict): + return None + status = response.get("Status") + if status not in VALID_DURABLE_STATUSES: + return None + return status diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index d022988bc..36b00efd9 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -42,7 +42,10 @@ tracer, propagator, ) -from datadog_lambda.durable import extract_durable_function_tags +from datadog_lambda.durable import ( + extract_durable_function_tags, + extract_durable_execution_status, +) from datadog_lambda.trigger import ( extract_trigger_tags, extract_http_status_code_tag, @@ -153,7 +156,7 @@ def __init__(self, func): if config.trace_extractor: extractor_parts = config.trace_extractor.rsplit(".", 1) if len(extractor_parts) == 2: - (mod_name, extractor_name) = extractor_parts + mod_name, extractor_name = extractor_parts modified_extractor_name = modify_module_name(mod_name) extractor_module = import_module(modified_extractor_name) self.trace_extractor = getattr(extractor_module, extractor_name) @@ -340,6 +343,13 @@ def _after(self, event, context): if status_code: self.span.set_tag("http.status_code", status_code) + durable_status = extract_durable_execution_status(self.response, event) + if durable_status: + self.span.set_tag( + "aws_lambda.durable_function.execution_status", + durable_status, + ) + self.span.finish() if status_code: diff --git a/tests/test_durable.py b/tests/test_durable.py index 60914934c..e668b45f0 100644 --- a/tests/test_durable.py +++ b/tests/test_durable.py @@ -7,6 +7,7 @@ from datadog_lambda.durable import ( _parse_durable_execution_arn, extract_durable_function_tags, + extract_durable_execution_status, ) @@ -89,3 +90,72 @@ def test_returns_empty_dict_when_durable_execution_arn_cannot_be_parsed(self): def test_returns_empty_dict_when_event_is_empty(self): result = extract_durable_function_tags({}) self.assertEqual(result, {}) + + +class TestExtractDurableExecutionStatus(unittest.TestCase): + def test_returns_succeeded(self): + event = { + "DurableExecutionArn": "arn:aws:lambda:us-east-1:123:function:f:1/durable-execution/n/id" + } + response = {"Status": "SUCCEEDED", "Result": "some-result"} + self.assertEqual(extract_durable_execution_status(response, event), "SUCCEEDED") + + def test_returns_failed(self): + event = { + "DurableExecutionArn": "arn:aws:lambda:us-east-1:123:function:f:1/durable-execution/n/id" + } + response = {"Status": "FAILED", "Error": "some-error"} + self.assertEqual(extract_durable_execution_status(response, event), "FAILED") + + def test_returns_stopped(self): + event = { + "DurableExecutionArn": "arn:aws:lambda:us-east-1:123:function:f:1/durable-execution/n/id" + } + response = {"Status": "STOPPED"} + self.assertEqual(extract_durable_execution_status(response, event), "STOPPED") + + def test_returns_timed_out(self): + event = { + "DurableExecutionArn": "arn:aws:lambda:us-east-1:123:function:f:1/durable-execution/n/id" + } + response = {"Status": "TIMED_OUT"} + self.assertEqual(extract_durable_execution_status(response, event), "TIMED_OUT") + + def test_returns_none_for_non_durable_event(self): + event = {"key": "value"} + response = {"Status": "SUCCEEDED"} + self.assertIsNone(extract_durable_execution_status(response, event)) + + def test_returns_none_for_non_dict_response(self): + event = { + "DurableExecutionArn": "arn:aws:lambda:us-east-1:123:function:f:1/durable-execution/n/id" + } + self.assertIsNone(extract_durable_execution_status("string", event)) + + def test_returns_none_for_missing_status(self): + event = { + "DurableExecutionArn": "arn:aws:lambda:us-east-1:123:function:f:1/durable-execution/n/id" + } + response = {"Result": "some-result"} + self.assertIsNone(extract_durable_execution_status(response, event)) + + def test_returns_none_for_invalid_status(self): + event = { + "DurableExecutionArn": "arn:aws:lambda:us-east-1:123:function:f:1/durable-execution/n/id" + } + response = {"Status": "INVALID"} + self.assertIsNone(extract_durable_execution_status(response, event)) + + def test_returns_none_for_non_dict_event(self): + response = {"Status": "SUCCEEDED"} + self.assertIsNone(extract_durable_execution_status(response, "not-a-dict")) + + def test_returns_none_for_none_event(self): + response = {"Status": "SUCCEEDED"} + self.assertIsNone(extract_durable_execution_status(response, None)) + + def test_returns_none_for_none_response(self): + event = { + "DurableExecutionArn": "arn:aws:lambda:us-east-1:123:function:f:1/durable-execution/n/id" + } + self.assertIsNone(extract_durable_execution_status(None, event)) From 38cabf2f6fa25d99072b1571d1c329293305a21e Mon Sep 17 00:00:00 2001 From: Emmett Butler <723615+emmettbutler@users.noreply.github.com> Date: Fri, 27 Mar 2026 08:16:00 -0700 Subject: [PATCH 137/164] tiny increase of lambda layer size limit (#760) * tiny increase of lambda layer size limit * Update scripts/check_layer_size.sh Co-authored-by: Brett Langdon --------- Co-authored-by: Brett Langdon --- scripts/check_layer_size.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/check_layer_size.sh b/scripts/check_layer_size.sh index ce67d92d9..de9a8c4d4 100755 --- a/scripts/check_layer_size.sh +++ b/scripts/check_layer_size.sh @@ -8,7 +8,7 @@ # Compares layer size to threshold, and fails if below that threshold set -e -MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 9 \* 1024) # 9216 KB +MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 9 \* 1024 + 15) # 9231 KB MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 25 \* 1024) # 25600 KB From 63f81be017154ceaf594dd46a1de6a745c53c510 Mon Sep 17 00:00:00 2001 From: Brett Langdon Date: Mon, 30 Mar 2026 17:16:16 -0400 Subject: [PATCH 138/164] chore: remove ddtrace patch.py files from layer (#763) chore: remove ddtrace patch.py files from layer version gate the patch.py file removing Apply suggestion from @brettlangdon Co-authored-by: brett.langdon --- Dockerfile | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6d9eb756e..12e1f7cad 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,10 +62,16 @@ RUN rm -rf \ # https://docs.python.org/3.11/using/cmdline.html#cmdoption-O # https://docs.python.org/3/using/cmdline.html#envvar-PYTHONNODEBUGRANGES RUN PYTHONNODEBUGRANGES=1 python -OO -m compileall -b ./python/lib/$runtime/site-packages -# remove all .py files except ddtrace/contrib/*/patch.py which are necessary -# for ddtrace.patch to discover instrumationation packages. -RUN find ./python/lib/$runtime/site-packages -name \*.py | grep -v ddtrace/contrib | xargs rm -rf -RUN find ./python/lib/$runtime/site-packages/ddtrace/contrib -name \*.py | grep -v patch.py | xargs rm -rf +# remove all .py files +# DEV: ddtrace>=4.7.0rc4 checks for .pyc files in addition to .py files for instrumentation +# discovery (DataDog/dd-trace-py#17196), so we can safely remove all .py files. +# For older versions, we need to keep patch.py files for instrumentation discovery. +RUN if python -c "from packaging.version import Version; import ddtrace; exit(0 if Version(ddtrace.__version__) >= Version('4.7.0rc3') else 1)"; then \ + find ./python/lib/$runtime/site-packages -name \*.py | xargs rm -rf; \ + else \ + find ./python/lib/$runtime/site-packages -name \*.py | grep -v ddtrace/contrib | xargs rm -rf && \ + find ./python/lib/$runtime/site-packages/ddtrace/contrib -name \*.py | grep -v patch.py | xargs rm -rf; \ + fi RUN find ./python/lib/$runtime/site-packages -name __pycache__ -type d -exec rm -r {} \+ # When building ddtrace from branch, remove extra source files. These are From ea8d01594abb24207feaef59c9d0047917adac67 Mon Sep 17 00:00:00 2001 From: Yiming Luo Date: Mon, 30 Mar 2026 17:24:08 -0400 Subject: [PATCH 139/164] feat: [SVLS-8493] rename durable function tags to use aws_lambda prefix (#757) * feat: [SVLS-8493] rename durable function execution tags to use aws.lambda prefix Co-Authored-By: Claude Sonnet 4.6 * feat: [SVLS-8493] use aws_lambda prefix for durable function tags Co-Authored-By: Claude Sonnet 4.6 --------- Co-authored-by: Claude Sonnet 4.6 --- datadog_lambda/durable.py | 4 ++-- tests/test_durable.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/datadog_lambda/durable.py b/datadog_lambda/durable.py index 3174cd6cf..0064f9bc8 100644 --- a/datadog_lambda/durable.py +++ b/datadog_lambda/durable.py @@ -44,8 +44,8 @@ def extract_durable_function_tags(event): execution_name, execution_id = parsed return { - "durable_function_execution_name": execution_name, - "durable_function_execution_id": execution_id, + "aws_lambda.durable_function.execution_name": execution_name, + "aws_lambda.durable_function.execution_id": execution_id, } diff --git a/tests/test_durable.py b/tests/test_durable.py index e668b45f0..51a49a877 100644 --- a/tests/test_durable.py +++ b/tests/test_durable.py @@ -56,8 +56,8 @@ def test_extracts_tags_from_event_with_durable_execution_arn(self): self.assertEqual( result, { - "durable_function_execution_name": "my-execution", - "durable_function_execution_id": "550e8400-e29b-41d4-a716-446655440004", + "aws_lambda.durable_function.execution_name": "my-execution", + "aws_lambda.durable_function.execution_id": "550e8400-e29b-41d4-a716-446655440004", }, ) From f313c46ae1b7b0a33287771bbec5b08e9fccfdd2 Mon Sep 17 00:00:00 2001 From: Brett Langdon Date: Tue, 31 Mar 2026 09:22:36 -0400 Subject: [PATCH 140/164] ci: fix ddtrace version detection (#764) --- Dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 12e1f7cad..329556c5e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -63,10 +63,12 @@ RUN rm -rf \ # https://docs.python.org/3/using/cmdline.html#envvar-PYTHONNODEBUGRANGES RUN PYTHONNODEBUGRANGES=1 python -OO -m compileall -b ./python/lib/$runtime/site-packages # remove all .py files -# DEV: ddtrace>=4.7.0rc4 checks for .pyc files in addition to .py files for instrumentation +# DEV: ddtrace>=4.7.0rc3 checks for .pyc files in addition to .py files for instrumentation # discovery (DataDog/dd-trace-py#17196), so we can safely remove all .py files. # For older versions, we need to keep patch.py files for instrumentation discovery. -RUN if python -c "from packaging.version import Version; import ddtrace; exit(0 if Version(ddtrace.__version__) >= Version('4.7.0rc3') else 1)"; then \ +RUN pip install --quiet packaging && \ + DDTRACE_VERSION=$(grep "^Version:" ./python/lib/$runtime/site-packages/ddtrace-*.dist-info/METADATA | awk '{print $2}') && \ + if python -c "from packaging.version import Version; exit(0 if Version('$DDTRACE_VERSION') >= Version('4.7.0rc3') else 1)"; then \ find ./python/lib/$runtime/site-packages -name \*.py | xargs rm -rf; \ else \ find ./python/lib/$runtime/site-packages -name \*.py | grep -v ddtrace/contrib | xargs rm -rf && \ From 354a07453d7adbb5f304e4ca9996464c7094af50 Mon Sep 17 00:00:00 2001 From: Brett Langdon Date: Tue, 31 Mar 2026 11:42:17 -0400 Subject: [PATCH 141/164] chore: remove all ddtrace ci viz paths from layer (#765) --- Dockerfile | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 329556c5e..b5635dea1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,7 +34,21 @@ RUN rm -rf ./python/lib/$runtime/site-packages/botocore* RUN rm -rf ./python/lib/$runtime/site-packages/setuptools RUN rm -rf ./python/lib/$runtime/site-packages/jsonschema/tests RUN rm -rf ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast -RUN rm -rf ./python/lib/$runtime/site-packages/ddtrace/internal/test_visibility +# CI Visibility paths/integrations +RUN rm -rf \ + ./python/lib/$runtime/site-packages/ddtrace/contrib/coverage/ \ + ./python/lib/$runtime/site-packages/ddtrace/contrib/pytest/ \ + ./python/lib/$runtime/site-packages/ddtrace/contrib/pytest_bdd/ \ + ./python/lib/$runtime/site-packages/ddtrace/contrib/pytest_benchmark/ \ + ./python/lib/$runtime/site-packages/ddtrace/contrib/selenium/ \ + ./python/lib/$runtime/site-packages/ddtrace/contrib/unittest/ \ + ./python/lib/$runtime/site-packages/ddtrace/ext/ci_visibility \ + ./python/lib/$runtime/site-packages/ddtrace/ext/test_visibility \ + ./python/lib/$runtime/site-packages/ddtrace/internal/ci_visibility \ + ./python/lib/$runtime/site-packages/ddtrace/internal/coverage \ + ./python/lib/$runtime/site-packages/ddtrace/internal/test_visibility \ + ./python/lib/$runtime/site-packages/ddtrace/testing/ + # Dogshell RUN rm -rf ./python/lib/$runtime/site-packages/datadog/dogshell RUN rm -rf ./python/lib/$runtime/site-packages/bin/dog* From d8a256537af6ffaa9cb05e22c797138455326e57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jordan=20gonz=C3=A1lez?= <30836115+duncanista@users.noreply.github.com> Date: Wed, 1 Apr 2026 10:22:36 -0400 Subject: [PATCH 142/164] ci: migrate CI secrets from AWS SSM to Vault KV (#766) Move secret retrieval in get_secrets.sh from aws ssm get-parameter to vault kv get, aligning with the pattern used by datadog-lambda-js. --- ci/get_secrets.sh | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/ci/get_secrets.sh b/ci/get_secrets.sh index 9d9c957c0..d854a9a40 100755 --- a/ci/get_secrets.sh +++ b/ci/get_secrets.sh @@ -21,21 +21,11 @@ fi printf "Getting AWS External ID...\n" -EXTERNAL_ID=$(aws ssm get-parameter \ - --region us-east-1 \ - --name "ci.datadog-lambda-python.$EXTERNAL_ID_NAME" \ - --with-decryption \ - --query "Parameter.Value" \ - --out text) +EXTERNAL_ID=$(vault kv get -field="$EXTERNAL_ID_NAME" kv/k8s/gitlab-runner/datadog-lambda-python/secrets) printf "Getting DD API KEY...\n" -export DD_API_KEY=$(aws ssm get-parameter \ - --region us-east-1 \ - --name ci.datadog-lambda-python.dd-api-key \ - --with-decryption \ - --query "Parameter.Value" \ - --out text) +export DD_API_KEY=$(vault kv get -field=dd-api-key kv/k8s/gitlab-runner/datadog-lambda-python/secrets) printf "Assuming role...\n" From c6c307eef460510684f4ecb108ea04b4a4c7c201 Mon Sep 17 00:00:00 2001 From: Emmett Butler <723615+emmettbutler@users.noreply.github.com> Date: Wed, 1 Apr 2026 11:59:44 -0700 Subject: [PATCH 143/164] use serverless-specific wheel in layer (#762) * use serverless-specific wheel in layer * missing underscore * change index * use proper wheel name * print search pattern * backward compatibility * backward compatibility * wrong copypasta * silly typo * debug output --- scripts/build_layers.sh | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/scripts/build_layers.sh b/scripts/build_layers.sh index 7456a38bf..216ab617c 100755 --- a/scripts/build_layers.sh +++ b/scripts/build_layers.sh @@ -98,6 +98,23 @@ function make_path_absolute { echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")" } +function search_wheel { + # Args: [wheel base name] [index] + + WHEEL_BASENAME=$1 + INDEX=$2 + + SEARCH_PATTERN="${WHEEL_BASENAME}-[^\"]*${PY_TAG}[^\"]*${PLATFORM}[^\"]*\.whl" + INDEX_URL="${S3_BASE}/index-${INDEX}.html" + echo "Searching for wheel ${SEARCH_PATTERN}" + export WHEEL_FILE=$(curl -sSfL ${INDEX_URL} | grep -o "$SEARCH_PATTERN" | head -n 1) + if [ ! -z "${WHEEL_FILE}" ]; then + curl -sSfL "${S3_BASE}/${WHEEL_FILE}" -o "${WHEEL_FILE}" + echo "Using S3 wheel: ${WHEEL_FILE}" + replace_ddtrace_dep "${WHEEL_BASENAME} = { file = \"${WHEEL_FILE}\" }" + fi +} + function docker_build_zip { # Args: [python version] [zip destination] @@ -122,15 +139,12 @@ function docker_build_zip { PLATFORM="manylinux2014_aarch64" fi PY_TAG="cp$(echo "$1" | tr -d '.')" - WHEEL_FILE=$(curl -sSfL "${S3_BASE}/index-manylinux2014.html" \ - | grep -o "ddtrace-[^\"]*${PY_TAG}[^\"]*${PLATFORM}[^\"]*\.whl" \ - | head -n 1) + search_wheel "ddtrace_serverless" "serverless" + if [ -z "${WHEEL_FILE}" ]; then + search_wheel "ddtrace" "manylinux2014" + fi if [ -z "${WHEEL_FILE}" ]; then echo "No S3 wheel found for ${PY_TAG} ${PLATFORM}, using default pyproject.toml version" - else - curl -sSfL "${S3_BASE}/${WHEEL_FILE}" -o "${WHEEL_FILE}" - echo "Using S3 wheel: ${WHEEL_FILE}" - replace_ddtrace_dep "ddtrace = { file = \"${WHEEL_FILE}\" }" fi fi From 332e7315d663536f8efe9676ee99bacbbf723620 Mon Sep 17 00:00:00 2001 From: Emmett Butler <723615+emmettbutler@users.noreply.github.com> Date: Wed, 1 Apr 2026 13:21:58 -0700 Subject: [PATCH 144/164] more complete backward compatibility (#775) --- scripts/build_layers.sh | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/scripts/build_layers.sh b/scripts/build_layers.sh index 216ab617c..eabba1012 100755 --- a/scripts/build_layers.sh +++ b/scripts/build_layers.sh @@ -116,21 +116,23 @@ function search_wheel { } function docker_build_zip { - # Args: [python version] [zip destination] + # Args: [python version] [zip destination] [wheel base name] [index] destination=$(make_path_absolute $2) arch=$3 + wheel_basename=$4 + index=$5 # Restore pyproject.toml to a clean state for each build iteration cp pyproject.toml.bak pyproject.toml # Replace ddtrace source if necessary if [ -n "$DD_TRACE_COMMIT" ]; then - replace_ddtrace_dep "ddtrace = { git = \"https://github.com/DataDog/dd-trace-py.git\", rev = \"$DD_TRACE_COMMIT\" }" + replace_ddtrace_dep "${wheel_basename} = { git = \"https://github.com/DataDog/dd-trace-py.git\", rev = \"$DD_TRACE_COMMIT\" }" elif [ -n "$DD_TRACE_COMMIT_BRANCH" ]; then - replace_ddtrace_dep "ddtrace = { git = \"https://github.com/DataDog/dd-trace-py.git\", branch = \"$DD_TRACE_COMMIT_BRANCH\" }" + replace_ddtrace_dep "${wheel_basename} = { git = \"https://github.com/DataDog/dd-trace-py.git\", branch = \"$DD_TRACE_COMMIT_BRANCH\" }" elif [ -n "$DD_TRACE_WHEEL" ]; then - replace_ddtrace_dep "ddtrace = { file = \"$DD_TRACE_WHEEL\" }" + replace_ddtrace_dep "${wheel_basename} = { file = \"$DD_TRACE_WHEEL\" }" elif [ -n "$UPSTREAM_PIPELINE_ID" ]; then S3_BASE="https://dd-trace-py-builds.s3.amazonaws.com/${UPSTREAM_PIPELINE_ID}" if [ "${arch}" = "amd64" ]; then @@ -139,10 +141,7 @@ function docker_build_zip { PLATFORM="manylinux2014_aarch64" fi PY_TAG="cp$(echo "$1" | tr -d '.')" - search_wheel "ddtrace_serverless" "serverless" - if [ -z "${WHEEL_FILE}" ]; then - search_wheel "ddtrace" "manylinux2014" - fi + search_wheel ${wheel_basename} ${index} if [ -z "${WHEEL_FILE}" ]; then echo "No S3 wheel found for ${PY_TAG} ${PLATFORM}, using default pyproject.toml version" fi @@ -163,6 +162,7 @@ function docker_build_zip { rm -rf $temp_dir echo "Done creating archive $destination" + rm pyproject.toml.bak } rm -rf $LAYER_DIR @@ -173,7 +173,10 @@ do for architecture in "${ARCHS[@]}" do echo "Building layer for Python ${python_version} arch=${architecture}" - docker_build_zip ${python_version} $LAYER_DIR/${LAYER_FILES_PREFIX}-${architecture}-${python_version}.zip ${architecture} + docker_build_zip ${python_version} $LAYER_DIR/${LAYER_FILES_PREFIX}-${architecture}-${python_version}.zip ${architecture} "ddtrace_serverless" "serverless" || true + if [ -f pyproject.toml.bak ]; then # true means the previous attempt failed + docker_build_zip ${python_version} $LAYER_DIR/${LAYER_FILES_PREFIX}-${architecture}-${python_version}.zip ${architecture} "ddtrace" "manylinux2014" + fi done done From a3f0640029679ed0a28e51be0eaf1a7b0edd6fa1 Mon Sep 17 00:00:00 2001 From: Brett Langdon Date: Thu, 2 Apr 2026 09:39:05 -0400 Subject: [PATCH 145/164] ci: revert PRs #762 and #775 (#776) * Revert "more complete backward compatibility (#775)" This reverts commit 332e7315d663536f8efe9676ee99bacbbf723620. * Revert "use serverless-specific wheel in layer (#762)" This reverts commit c6c307eef460510684f4ecb108ea04b4a4c7c201. --- scripts/build_layers.sh | 41 ++++++++++++----------------------------- 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/scripts/build_layers.sh b/scripts/build_layers.sh index eabba1012..7456a38bf 100755 --- a/scripts/build_layers.sh +++ b/scripts/build_layers.sh @@ -98,41 +98,22 @@ function make_path_absolute { echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")" } -function search_wheel { - # Args: [wheel base name] [index] - - WHEEL_BASENAME=$1 - INDEX=$2 - - SEARCH_PATTERN="${WHEEL_BASENAME}-[^\"]*${PY_TAG}[^\"]*${PLATFORM}[^\"]*\.whl" - INDEX_URL="${S3_BASE}/index-${INDEX}.html" - echo "Searching for wheel ${SEARCH_PATTERN}" - export WHEEL_FILE=$(curl -sSfL ${INDEX_URL} | grep -o "$SEARCH_PATTERN" | head -n 1) - if [ ! -z "${WHEEL_FILE}" ]; then - curl -sSfL "${S3_BASE}/${WHEEL_FILE}" -o "${WHEEL_FILE}" - echo "Using S3 wheel: ${WHEEL_FILE}" - replace_ddtrace_dep "${WHEEL_BASENAME} = { file = \"${WHEEL_FILE}\" }" - fi -} - function docker_build_zip { - # Args: [python version] [zip destination] [wheel base name] [index] + # Args: [python version] [zip destination] destination=$(make_path_absolute $2) arch=$3 - wheel_basename=$4 - index=$5 # Restore pyproject.toml to a clean state for each build iteration cp pyproject.toml.bak pyproject.toml # Replace ddtrace source if necessary if [ -n "$DD_TRACE_COMMIT" ]; then - replace_ddtrace_dep "${wheel_basename} = { git = \"https://github.com/DataDog/dd-trace-py.git\", rev = \"$DD_TRACE_COMMIT\" }" + replace_ddtrace_dep "ddtrace = { git = \"https://github.com/DataDog/dd-trace-py.git\", rev = \"$DD_TRACE_COMMIT\" }" elif [ -n "$DD_TRACE_COMMIT_BRANCH" ]; then - replace_ddtrace_dep "${wheel_basename} = { git = \"https://github.com/DataDog/dd-trace-py.git\", branch = \"$DD_TRACE_COMMIT_BRANCH\" }" + replace_ddtrace_dep "ddtrace = { git = \"https://github.com/DataDog/dd-trace-py.git\", branch = \"$DD_TRACE_COMMIT_BRANCH\" }" elif [ -n "$DD_TRACE_WHEEL" ]; then - replace_ddtrace_dep "${wheel_basename} = { file = \"$DD_TRACE_WHEEL\" }" + replace_ddtrace_dep "ddtrace = { file = \"$DD_TRACE_WHEEL\" }" elif [ -n "$UPSTREAM_PIPELINE_ID" ]; then S3_BASE="https://dd-trace-py-builds.s3.amazonaws.com/${UPSTREAM_PIPELINE_ID}" if [ "${arch}" = "amd64" ]; then @@ -141,9 +122,15 @@ function docker_build_zip { PLATFORM="manylinux2014_aarch64" fi PY_TAG="cp$(echo "$1" | tr -d '.')" - search_wheel ${wheel_basename} ${index} + WHEEL_FILE=$(curl -sSfL "${S3_BASE}/index-manylinux2014.html" \ + | grep -o "ddtrace-[^\"]*${PY_TAG}[^\"]*${PLATFORM}[^\"]*\.whl" \ + | head -n 1) if [ -z "${WHEEL_FILE}" ]; then echo "No S3 wheel found for ${PY_TAG} ${PLATFORM}, using default pyproject.toml version" + else + curl -sSfL "${S3_BASE}/${WHEEL_FILE}" -o "${WHEEL_FILE}" + echo "Using S3 wheel: ${WHEEL_FILE}" + replace_ddtrace_dep "ddtrace = { file = \"${WHEEL_FILE}\" }" fi fi @@ -162,7 +149,6 @@ function docker_build_zip { rm -rf $temp_dir echo "Done creating archive $destination" - rm pyproject.toml.bak } rm -rf $LAYER_DIR @@ -173,10 +159,7 @@ do for architecture in "${ARCHS[@]}" do echo "Building layer for Python ${python_version} arch=${architecture}" - docker_build_zip ${python_version} $LAYER_DIR/${LAYER_FILES_PREFIX}-${architecture}-${python_version}.zip ${architecture} "ddtrace_serverless" "serverless" || true - if [ -f pyproject.toml.bak ]; then # true means the previous attempt failed - docker_build_zip ${python_version} $LAYER_DIR/${LAYER_FILES_PREFIX}-${architecture}-${python_version}.zip ${architecture} "ddtrace" "manylinux2014" - fi + docker_build_zip ${python_version} $LAYER_DIR/${LAYER_FILES_PREFIX}-${architecture}-${python_version}.zip ${architecture} done done From 55dc3f497930df620fd2e6bf739c36e35de7a69a Mon Sep 17 00:00:00 2001 From: Yiming Luo Date: Thu, 2 Apr 2026 14:20:37 -0400 Subject: [PATCH 146/164] feat: [SVLS-8720] Add span tag aws_lambda.durable_function.first_invocation (#747) * Add durable_function_first_invocation tag to aws.lambda spans Extends extract_durable_function_tags() to accept context.state and sets durable_function_first_invocation ("true"/"false") using not state.is_replaying(). wrapper._before() passes context.state to the function. Co-Authored-By: Claude Sonnet 4.6 * Add durable_function_first_invocation tag to aws.lambda spans Extends extract_durable_function_tags() to set durable_function_first_invocation ("true"/"false") by checking len(InitialExecutionState.Operations) <= 1, mirroring the SDK's own replay detection logic (ReplayStatus.REPLAY when len > 1). Co-Authored-By: Claude Sonnet 4.6 * Add comment * Change <= 1 to == 1 * Update comments * fmt * feat: [SVLS-8493] use aws_lambda prefix for durable function tags Co-Authored-By: Claude Sonnet 4.6 --------- Co-authored-by: Claude Sonnet 4.6 --- datadog_lambda/durable.py | 8 +++++++- tests/test_durable.py | 28 ++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/datadog_lambda/durable.py b/datadog_lambda/durable.py index 0064f9bc8..c77b43b04 100644 --- a/datadog_lambda/durable.py +++ b/datadog_lambda/durable.py @@ -41,11 +41,17 @@ def extract_durable_function_tags(event): if not parsed: logger.error("Failed to parse DurableExecutionArn: %s", durable_execution_arn) return {} - execution_name, execution_id = parsed + # Use the number of operations to determine if it's the first invocation. This is + # what the durable execution SDK does to determine the replay status. + operations = event.get("InitialExecutionState", {}).get("Operations", []) + is_first_invocation = len(operations) == 1 return { "aws_lambda.durable_function.execution_name": execution_name, "aws_lambda.durable_function.execution_id": execution_id, + "aws_lambda.durable_function.first_invocation": str( + is_first_invocation + ).lower(), } diff --git a/tests/test_durable.py b/tests/test_durable.py index 51a49a877..203548d12 100644 --- a/tests/test_durable.py +++ b/tests/test_durable.py @@ -46,11 +46,12 @@ def test_works_with_numeric_version_qualifier(self): class TestExtractDurableFunctionTags(unittest.TestCase): - def test_extracts_tags_from_event_with_durable_execution_arn(self): + def test_sets_first_invocation_true_when_only_execution_operation(self): + # One operation (the current EXECUTION operation itself) → not replaying → first invocation event = { "DurableExecutionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-func:1/durable-execution/my-execution/550e8400-e29b-41d4-a716-446655440004", "CheckpointToken": "some-token", - "InitialExecutionState": {"Operations": []}, + "InitialExecutionState": {"Operations": [{"OperationType": "EXECUTION"}]}, } result = extract_durable_function_tags(event) self.assertEqual( @@ -58,6 +59,29 @@ def test_extracts_tags_from_event_with_durable_execution_arn(self): { "aws_lambda.durable_function.execution_name": "my-execution", "aws_lambda.durable_function.execution_id": "550e8400-e29b-41d4-a716-446655440004", + "aws_lambda.durable_function.first_invocation": "true", + }, + ) + + def test_sets_first_invocation_false_when_multiple_operations(self): + # More than one operation → replaying → not first invocation + event = { + "DurableExecutionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-func:1/durable-execution/my-execution/550e8400-e29b-41d4-a716-446655440004", + "CheckpointToken": "some-token", + "InitialExecutionState": { + "Operations": [ + {"OperationType": "EXECUTION"}, + {"OperationType": "STEP"}, + ] + }, + } + result = extract_durable_function_tags(event) + self.assertEqual( + result, + { + "aws_lambda.durable_function.execution_name": "my-execution", + "aws_lambda.durable_function.execution_id": "550e8400-e29b-41d4-a716-446655440004", + "aws_lambda.durable_function.first_invocation": "false", }, ) From 88b4e1f8c4cf982e59b3eb89c79e98a34bd34e5b Mon Sep 17 00:00:00 2001 From: Jordan Storms Date: Thu, 2 Apr 2026 16:27:04 -0400 Subject: [PATCH 147/164] =?UTF-8?q?fix:=20remove=20return=20from=20finally?= =?UTF-8?q?=20block=20to=20resolve=20Python=203.14=20SyntaxWa=E2=80=A6=20(?= =?UTF-8?q?#767)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: remove return from finally block to resolve Python 3.14 SyntaxWarning Python 3.14 raises a SyntaxWarning for inside a block. Move the blocking_response return to after the try/except/finally in _LambdaDecorator.__call__, preserving all AppSec blocking execution paths. Add a regression test confirming handler exceptions still propagate when AppSec is enabled and no blocking response is active. Signed-off-by: Jordan * update snapshots Signed-off-by: Jordan * Co-authored-by: melissa.j.womack@gmail.com Signed-off-by: Jordan --------- Signed-off-by: Jordan Co-authored-by: Melissa Womack --- datadog_lambda/wrapper.py | 7 ++-- .../snapshots/logs/sync-metrics_python310.log | 40 +++++++++---------- .../snapshots/logs/sync-metrics_python311.log | 40 +++++++++---------- .../snapshots/logs/sync-metrics_python312.log | 40 +++++++++---------- .../snapshots/logs/sync-metrics_python313.log | 40 +++++++++---------- .../snapshots/logs/sync-metrics_python314.log | 40 +++++++++---------- .../snapshots/logs/sync-metrics_python38.log | 40 +++++++++---------- .../snapshots/logs/sync-metrics_python39.log | 40 +++++++++---------- tests/test_wrapper.py | 17 ++++++++ 9 files changed, 161 insertions(+), 143 deletions(-) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 36b00efd9..f8eed8aa1 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -191,7 +191,6 @@ def __call__(self, event, context, **kwargs): if self.blocking_response: return self.blocking_response self.response = self.func(event, context, **kwargs) - return self.response except BlockingException: self.blocking_response = get_asm_blocked_response(self.event_source) except Exception: @@ -204,8 +203,10 @@ def __call__(self, event, context, **kwargs): raise finally: self._after(event, context) - if self.blocking_response: - return self.blocking_response + + if self.blocking_response: + return self.blocking_response + return self.response def _inject_authorizer_span_headers(self, request_id): reference_span = self.inferred_span if self.inferred_span else self.span diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index 3747c3aec..757b6fc6c 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -75,6 +75,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -86,7 +87,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,6 +227,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -236,7 +237,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,6 +455,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -464,7 +465,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,6 +635,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -644,7 +645,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,6 +824,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -835,7 +836,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,6 +1015,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1024,7 +1025,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,6 +1211,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1220,7 +1221,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,6 +1396,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1405,7 +1406,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,6 +1580,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1589,7 +1590,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,6 +1770,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1781,7 +1782,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index b614b1222..a6a3931a9 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -75,6 +75,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -86,7 +87,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,6 +227,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -236,7 +237,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,6 +455,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -464,7 +465,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,6 +635,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -644,7 +645,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,6 +824,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -835,7 +836,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,6 +1015,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1024,7 +1025,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,6 +1211,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1220,7 +1221,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,6 +1396,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1405,7 +1406,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,6 +1580,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1589,7 +1590,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,6 +1770,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1781,7 +1782,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index 593d9fbfd..572fb9bd1 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -75,6 +75,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -86,7 +87,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,6 +227,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -236,7 +237,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,6 +455,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -464,7 +465,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,6 +635,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -644,7 +645,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,6 +824,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -835,7 +836,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,6 +1015,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1024,7 +1025,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,6 +1211,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1220,7 +1221,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,6 +1396,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1405,7 +1406,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,6 +1580,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1589,7 +1590,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,6 +1770,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1781,7 +1782,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index c21fcaad0..b79ab7fef 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -75,6 +75,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -86,7 +87,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,6 +227,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -236,7 +237,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,6 +455,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -464,7 +465,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,6 +635,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -644,7 +645,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,6 +824,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -835,7 +836,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,6 +1015,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1024,7 +1025,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,6 +1211,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1220,7 +1221,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,6 +1396,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1405,7 +1406,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,6 +1580,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1589,7 +1590,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,6 +1770,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1781,7 +1782,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python314.log b/tests/integration/snapshots/logs/sync-metrics_python314.log index 090c3cbae..3e523a0f2 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python314.log +++ b/tests/integration/snapshots/logs/sync-metrics_python314.log @@ -75,6 +75,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -86,7 +87,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,6 +227,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -236,7 +237,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,6 +455,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -464,7 +465,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,6 +635,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -644,7 +645,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,6 +824,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -835,7 +836,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,6 +1015,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1024,7 +1025,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,6 +1211,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1220,7 +1221,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,6 +1396,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1405,7 +1406,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,6 +1580,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1589,7 +1590,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,6 +1770,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1781,7 +1782,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python38.log b/tests/integration/snapshots/logs/sync-metrics_python38.log index 322961263..9dd3f2c1d 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python38.log +++ b/tests/integration/snapshots/logs/sync-metrics_python38.log @@ -75,6 +75,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -86,7 +87,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,6 +227,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -236,7 +237,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,6 +455,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -464,7 +465,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,6 +635,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -644,7 +645,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,6 +824,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -835,7 +836,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,6 +1015,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -1024,7 +1025,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,6 +1211,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -1220,7 +1221,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,6 +1396,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -1405,7 +1406,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,6 +1580,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -1589,7 +1590,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,6 +1770,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -1781,7 +1782,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python39.log b/tests/integration/snapshots/logs/sync-metrics_python39.log index 1c1496d32..5fd09c8e4 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python39.log +++ b/tests/integration/snapshots/logs/sync-metrics_python39.log @@ -75,6 +75,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -86,7 +87,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,6 +227,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -236,7 +237,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,6 +455,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -464,7 +465,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,6 +635,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -644,7 +645,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,6 +824,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -835,7 +836,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,6 +1015,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -1024,7 +1025,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,6 +1211,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -1220,7 +1221,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,6 +1396,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -1405,7 +1406,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,6 +1580,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -1589,7 +1590,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,6 +1770,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -1781,7 +1782,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "202", + "http.status_code": "403", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 5b2afea8c..b1aa1ae86 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -765,6 +765,23 @@ def lambda_handler(event, context): assert lambda_handler.span.get_tag("http.status_code") == "403" + def test_handler_exception_propagates_when_appsec_enabled(self): + # Regression guard: before the fix, `return` in the `finally` block + # would silently swallow handler exceptions when no blocking response + # was set, preventing them from reaching the caller. + self.mock_get_asm_blocking_response.return_value = None + + class HandlerError(Exception): + pass + + def lambda_handler(event, context): + raise HandlerError("handler error") + + lambda_handler = wrapper.datadog_lambda_wrapper(lambda_handler) + + with self.assertRaises(HandlerError): + lambda_handler(self.api_gateway_request, get_mock_context()) + def test_no_blocking_appsec_disabled(self): os.environ["DD_APPSEC_ENABLED"] = "false" From 8051f4496fb841f6c2c92788bfc9a66d25992a7e Mon Sep 17 00:00:00 2001 From: Emmett Butler <723615+emmettbutler@users.noreply.github.com> Date: Thu, 2 Apr 2026 14:03:37 -0700 Subject: [PATCH 148/164] Add ability to use ddtrace_serverless wheels in layer build (#777) * Revert "ci: revert PRs #762 and #775 (#776)" This reverts commit a3f0640029679ed0a28e51be0eaf1a7b0edd6fa1. * try a different way of checking success * refactor to only do docker build once * oh yeah * catch error code * bite the proverbial bullet * *shakes fist* ....bash!!! * more handling * debug output * construct basename when given a wheel directly * handle dotslash in basename --- scripts/build_layers.sh | 57 +++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/scripts/build_layers.sh b/scripts/build_layers.sh index 7456a38bf..b3f733857 100755 --- a/scripts/build_layers.sh +++ b/scripts/build_layers.sh @@ -91,6 +91,7 @@ trap cleanup EXIT # Helper: replace the multi-line ddtrace dependency in pyproject.toml. # Uses perl instead of sed -z for macOS/Linux portability. replace_ddtrace_dep() { + echo "Replacing dep with $1" perl -i -0777 -pe "s|ddtrace = \[[^\]]*\]|$1|gs" pyproject.toml } @@ -98,22 +99,41 @@ function make_path_absolute { echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")" } -function docker_build_zip { - # Args: [python version] [zip destination] +function search_wheel { + # Args: [wheel base name] [index] - destination=$(make_path_absolute $2) - arch=$3 + WHEEL_BASENAME=$1 + INDEX=$2 + + SEARCH_PATTERN="${WHEEL_BASENAME}-[^\"]*${PY_TAG}[^\"]*${PLATFORM}[^\"]*\.whl" + INDEX_URL="${S3_BASE}/index-${INDEX}.html" + echo "Searching for wheel ${SEARCH_PATTERN}" + export WHEEL_FILE=$(curl -sSfL ${INDEX_URL} | grep -o "$SEARCH_PATTERN" | head -n 1) + if [ ! -z "${WHEEL_FILE}" ]; then + curl -sSfL "${S3_BASE}/${WHEEL_FILE}" -o "${WHEEL_FILE}" + echo "Using S3 wheel: ${WHEEL_FILE}" + replace_ddtrace_dep "${WHEEL_BASENAME} = { file = \"${WHEEL_FILE}\" }" + fi +} + +function find_and_spec_wheel { + # Args: [python version] [wheel base name] [index] + + arch=$2 + wheel_basename=$3 + index=$4 # Restore pyproject.toml to a clean state for each build iteration cp pyproject.toml.bak pyproject.toml # Replace ddtrace source if necessary if [ -n "$DD_TRACE_COMMIT" ]; then - replace_ddtrace_dep "ddtrace = { git = \"https://github.com/DataDog/dd-trace-py.git\", rev = \"$DD_TRACE_COMMIT\" }" + replace_ddtrace_dep "${wheel_basename} = { git = \"https://github.com/DataDog/dd-trace-py.git\", rev = \"$DD_TRACE_COMMIT\" }" elif [ -n "$DD_TRACE_COMMIT_BRANCH" ]; then - replace_ddtrace_dep "ddtrace = { git = \"https://github.com/DataDog/dd-trace-py.git\", branch = \"$DD_TRACE_COMMIT_BRANCH\" }" + replace_ddtrace_dep "${wheel_basename} = { git = \"https://github.com/DataDog/dd-trace-py.git\", branch = \"$DD_TRACE_COMMIT_BRANCH\" }" elif [ -n "$DD_TRACE_WHEEL" ]; then - replace_ddtrace_dep "ddtrace = { file = \"$DD_TRACE_WHEEL\" }" + wheel_basename=$(sed 's/^\.\///' <<< ${DD_TRACE_WHEEL%%-*}) + replace_ddtrace_dep "${wheel_basename} = { file = \"$DD_TRACE_WHEEL\" }" elif [ -n "$UPSTREAM_PIPELINE_ID" ]; then S3_BASE="https://dd-trace-py-builds.s3.amazonaws.com/${UPSTREAM_PIPELINE_ID}" if [ "${arch}" = "amd64" ]; then @@ -122,18 +142,19 @@ function docker_build_zip { PLATFORM="manylinux2014_aarch64" fi PY_TAG="cp$(echo "$1" | tr -d '.')" - WHEEL_FILE=$(curl -sSfL "${S3_BASE}/index-manylinux2014.html" \ - | grep -o "ddtrace-[^\"]*${PY_TAG}[^\"]*${PLATFORM}[^\"]*\.whl" \ - | head -n 1) + search_wheel ${wheel_basename} ${index} if [ -z "${WHEEL_FILE}" ]; then echo "No S3 wheel found for ${PY_TAG} ${PLATFORM}, using default pyproject.toml version" - else - curl -sSfL "${S3_BASE}/${WHEEL_FILE}" -o "${WHEEL_FILE}" - echo "Using S3 wheel: ${WHEEL_FILE}" - replace_ddtrace_dep "ddtrace = { file = \"${WHEEL_FILE}\" }" + return 1 fi fi +} + +function docker_build_zip { + # Args: [python version] [zip destination] + destination=$(make_path_absolute $2) + arch=$3 # Install datadogpy in a docker container to avoid the mess from switching # between different python runtimes. temp_dir=$(mktemp -d) @@ -159,6 +180,14 @@ do for architecture in "${ARCHS[@]}" do echo "Building layer for Python ${python_version} arch=${architecture}" + set +e + find_and_spec_wheel ${python_version} ${architecture} "ddtrace_serverless" "serverless" + FAILURE=$? + if [ $FAILURE != 0 ]; then + echo "Attempting layer build again with package ddtrace" + find_and_spec_wheel ${python_version} ${architecture} "ddtrace" "manylinux2014" + fi + set -e docker_build_zip ${python_version} $LAYER_DIR/${LAYER_FILES_PREFIX}-${architecture}-${python_version}.zip ${architecture} done done From db826eb82fa7de85cc701880e1c58e9a98104a7a Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Fri, 3 Apr 2026 10:29:52 -0400 Subject: [PATCH 149/164] =?UTF-8?q?Revert=20"fix:=20remove=20return=20from?= =?UTF-8?q?=20finally=20block=20to=20resolve=20Python=203.14=20SyntaxWa?= =?UTF-8?q?=E2=80=A6"=20(#780)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 88b4e1f8c4cf982e59b3eb89c79e98a34bd34e5b. --- datadog_lambda/wrapper.py | 7 ++-- .../snapshots/logs/sync-metrics_python310.log | 40 +++++++++---------- .../snapshots/logs/sync-metrics_python311.log | 40 +++++++++---------- .../snapshots/logs/sync-metrics_python312.log | 40 +++++++++---------- .../snapshots/logs/sync-metrics_python313.log | 40 +++++++++---------- .../snapshots/logs/sync-metrics_python314.log | 40 +++++++++---------- .../snapshots/logs/sync-metrics_python38.log | 40 +++++++++---------- .../snapshots/logs/sync-metrics_python39.log | 40 +++++++++---------- tests/test_wrapper.py | 17 -------- 9 files changed, 143 insertions(+), 161 deletions(-) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index f8eed8aa1..36b00efd9 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -191,6 +191,7 @@ def __call__(self, event, context, **kwargs): if self.blocking_response: return self.blocking_response self.response = self.func(event, context, **kwargs) + return self.response except BlockingException: self.blocking_response = get_asm_blocked_response(self.event_source) except Exception: @@ -203,10 +204,8 @@ def __call__(self, event, context, **kwargs): raise finally: self._after(event, context) - - if self.blocking_response: - return self.blocking_response - return self.response + if self.blocking_response: + return self.blocking_response def _inject_authorizer_span_headers(self, request_id): reference_span = self.inferred_span if self.inferred_span else self.span diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index 757b6fc6c..3747c3aec 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -75,7 +75,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -87,6 +86,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,7 +227,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -237,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,7 +455,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -465,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,7 +635,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -645,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,7 +824,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -836,6 +835,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,7 +1015,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1025,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,7 +1211,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1221,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,7 +1396,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1406,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,7 +1580,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1590,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,7 +1770,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1782,6 +1781,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index a6a3931a9..b614b1222 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -75,7 +75,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -87,6 +86,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,7 +227,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -237,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,7 +455,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -465,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,7 +635,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -645,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,7 +824,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -836,6 +835,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,7 +1015,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1025,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,7 +1211,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1221,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,7 +1396,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1406,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,7 +1580,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1590,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,7 +1770,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1782,6 +1781,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index 572fb9bd1..593d9fbfd 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -75,7 +75,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -87,6 +86,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,7 +227,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -237,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,7 +455,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -465,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,7 +635,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -645,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,7 +824,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -836,6 +835,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,7 +1015,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1025,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,7 +1211,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1221,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,7 +1396,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1406,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,7 +1580,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1590,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,7 +1770,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1782,6 +1781,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index b79ab7fef..c21fcaad0 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -75,7 +75,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -87,6 +86,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,7 +227,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -237,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,7 +455,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -465,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,7 +635,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -645,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,7 +824,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -836,6 +835,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,7 +1015,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1025,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,7 +1211,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1221,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,7 +1396,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1406,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,7 +1580,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1590,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,7 +1770,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1782,6 +1781,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python314.log b/tests/integration/snapshots/logs/sync-metrics_python314.log index 3e523a0f2..090c3cbae 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python314.log +++ b/tests/integration/snapshots/logs/sync-metrics_python314.log @@ -75,7 +75,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -87,6 +86,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,7 +227,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -237,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,7 +455,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -465,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,7 +635,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -645,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,7 +824,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -836,6 +835,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,7 +1015,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1025,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,7 +1211,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1221,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,7 +1396,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1406,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,7 +1580,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1590,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,7 +1770,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1782,6 +1781,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python38.log b/tests/integration/snapshots/logs/sync-metrics_python38.log index 9dd3f2c1d..322961263 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python38.log +++ b/tests/integration/snapshots/logs/sync-metrics_python38.log @@ -75,7 +75,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -87,6 +86,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,7 +227,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -237,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,7 +455,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -465,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,7 +635,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -645,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,7 +824,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -836,6 +835,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,7 +1015,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -1025,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,7 +1211,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -1221,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,7 +1396,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -1406,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,7 +1580,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -1590,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,7 +1770,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", "function_version": "$LATEST", @@ -1782,6 +1781,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python39.log b/tests/integration/snapshots/logs/sync-metrics_python39.log index 5fd09c8e4..1c1496d32 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python39.log +++ b/tests/integration/snapshots/logs/sync-metrics_python39.log @@ -75,7 +75,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -87,6 +86,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -174,7 +174,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -227,7 +227,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -237,6 +236,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "language": "python" }, "metrics": { @@ -322,7 +322,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -455,7 +455,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -465,6 +464,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -550,7 +550,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -635,7 +635,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -645,6 +644,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -729,7 +729,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -824,7 +824,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -836,6 +835,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -923,7 +923,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1015,7 +1015,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -1025,6 +1024,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1110,7 +1110,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1211,7 +1211,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -1221,6 +1220,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1306,7 +1306,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1396,7 +1396,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -1406,6 +1405,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1491,7 +1491,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1580,7 +1580,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -1590,6 +1589,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", + "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1675,7 +1675,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", @@ -1770,7 +1770,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", - "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", "function_version": "$LATEST", @@ -1782,6 +1781,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", + "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1867,7 +1867,7 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.method": "POST", "http.url": "https://api.datadoghq.com/api/v1/distribution_points", "out.host": "api.datadoghq.com", - "http.status_code": "403", + "http.status_code": "202", "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index b1aa1ae86..5b2afea8c 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -765,23 +765,6 @@ def lambda_handler(event, context): assert lambda_handler.span.get_tag("http.status_code") == "403" - def test_handler_exception_propagates_when_appsec_enabled(self): - # Regression guard: before the fix, `return` in the `finally` block - # would silently swallow handler exceptions when no blocking response - # was set, preventing them from reaching the caller. - self.mock_get_asm_blocking_response.return_value = None - - class HandlerError(Exception): - pass - - def lambda_handler(event, context): - raise HandlerError("handler error") - - lambda_handler = wrapper.datadog_lambda_wrapper(lambda_handler) - - with self.assertRaises(HandlerError): - lambda_handler(self.api_gateway_request, get_mock_context()) - def test_no_blocking_appsec_disabled(self): os.environ["DD_APPSEC_ENABLED"] = "false" From c43d2b23cb2c0dab1f428a2727f4612d5e55ce4e Mon Sep 17 00:00:00 2001 From: Emmett Butler <723615+emmettbutler@users.noreply.github.com> Date: Fri, 3 Apr 2026 07:42:31 -0700 Subject: [PATCH 150/164] handle any preceding directory name (#778) --- scripts/build_layers.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_layers.sh b/scripts/build_layers.sh index b3f733857..8cdfc1534 100755 --- a/scripts/build_layers.sh +++ b/scripts/build_layers.sh @@ -132,7 +132,7 @@ function find_and_spec_wheel { elif [ -n "$DD_TRACE_COMMIT_BRANCH" ]; then replace_ddtrace_dep "${wheel_basename} = { git = \"https://github.com/DataDog/dd-trace-py.git\", branch = \"$DD_TRACE_COMMIT_BRANCH\" }" elif [ -n "$DD_TRACE_WHEEL" ]; then - wheel_basename=$(sed 's/^\.\///' <<< ${DD_TRACE_WHEEL%%-*}) + wheel_basename=$(sed 's/^.*\///' <<< ${DD_TRACE_WHEEL%%-*}) replace_ddtrace_dep "${wheel_basename} = { file = \"$DD_TRACE_WHEEL\" }" elif [ -n "$UPSTREAM_PIPELINE_ID" ]; then S3_BASE="https://dd-trace-py-builds.s3.amazonaws.com/${UPSTREAM_PIPELINE_ID}" From 3883ffd51ba5f6c7a007b88258cd942516bebdfe Mon Sep 17 00:00:00 2001 From: pablomartinezbernardo <134320516+pablomartinezbernardo@users.noreply.github.com> Date: Mon, 6 Apr 2026 16:24:30 +0200 Subject: [PATCH 151/164] fix: negative duration on aws.apigateway.authorizer span (#782) --- datadog_lambda/tracing.py | 16 ++++------ .../authorizer-request-api-gateway-v1.json | 2 +- tests/test_tracing.py | 32 +++++++++++++++++++ 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index da4c9dd33..3c7d9f115 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -977,16 +977,12 @@ def process_injected_data(event, request_time_epoch_ms, args, tags): start_time_ns = int( injected_authorizer_data.get(Headers.Parent_Span_Finish_Time) ) - finish_time_ns = ( - request_time_epoch_ms - + ( - int( - event["requestContext"]["authorizer"].get( - "integrationLatency", 0 - ) - ) - ) - ) * 1e6 + integration_latency = int( + event["requestContext"]["authorizer"].get("integrationLatency", 0) + ) + finish_time_ns = max( + start_time_ns, (request_time_epoch_ms + integration_latency) * 1e6 + ) upstream_authorizer_span = insert_upstream_authorizer_span( args, tags, start_time_ns, finish_time_ns ) diff --git a/tests/event_samples/authorizer-request-api-gateway-v1.json b/tests/event_samples/authorizer-request-api-gateway-v1.json index d14b7aa01..7496c5ed2 100644 --- a/tests/event_samples/authorizer-request-api-gateway-v1.json +++ b/tests/event_samples/authorizer-request-api-gateway-v1.json @@ -55,7 +55,7 @@ "requestContext": { "resourceId": "0et54l", "authorizer": { - "_datadog": "eyJ4LWRhdGFkb2ctdHJhY2UtaWQiOiAiMTM0Nzg3MDU5OTU3OTcyMjEyMDkiLCAieC1kYXRhZG9nLXBhcmVudC1pZCI6ICI4NDcxMjg4MjYzMzg0MjE2ODk2IiwgIngtZGF0YWRvZy1zYW1wbGluZy1wcmlvcml0eSI6ICIxIiwgIngtZGF0YWRvZy1wYXJlbnQtc3Bhbi1maW5pc2gtdGltZSI6IDE2NjMyOTUwMjE4MjcuNTIxLCAieC1kYXRhZG9nLWF1dGhvcml6aW5nLXJlcXVlc3RpZCI6ICJhYmMxMjMifQ==", + "_datadog": "eyJ4LWRhdGFkb2ctdHJhY2UtaWQiOiAiMTM0Nzg3MDU5OTU3OTcyMjEyMDkiLCAieC1kYXRhZG9nLXBhcmVudC1pZCI6ICI4NDcxMjg4MjYzMzg0MjE2ODk2IiwgIngtZGF0YWRvZy1zYW1wbGluZy1wcmlvcml0eSI6ICIxIiwgIngtZGF0YWRvZy1wYXJlbnQtc3Bhbi1maW5pc2gtdGltZSI6IDE2NjMyOTUwMjE4Mjc1MjEwMDAsICJ4LWRhdGFkb2ctYXV0aG9yaXppbmctcmVxdWVzdGlkIjogImFiYzEyMyJ9", "scope": "this is just a string", "principalId": "foo", "integrationLatency": 1897 diff --git a/tests/test_tracing.py b/tests/test_tracing.py index ec78265a6..3a3d9e895 100644 --- a/tests/test_tracing.py +++ b/tests/test_tracing.py @@ -2408,6 +2408,38 @@ def test_create_inferred_span(mock_span_finish, source, expect): assert mock_span_finish.call_count == 0 +@patch("ddtrace.trace.Span.finish", autospec=True) +def test_authorizer_span_no_negative_duration_when_clock_skew(mock_span_finish): + """ + Simulate the case where requestTimeEpoch + integrationLatency < parentSpanFinishTime + (i.e., API Gateway's reported end is before the authorizer lambda's self-reported finish). + This 1ms discrepancy would produce a negative duration. + """ + with open(f"{event_samples}authorizer-request-api-gateway-v1.json") as f: + event = json.load(f) + + authorizer_ctx = json.loads( + base64.b64decode(event["requestContext"]["authorizer"]["_datadog"]) + ) + parent_finish_time_ns = authorizer_ctx["x-datadog-parent-span-finish-time"] + request_time_epoch_ms = event["requestContext"]["requestTimeEpoch"] + # Set integrationLatency 1ms below the parent span's finish time to simulate clock skew. + event["requestContext"]["authorizer"]["integrationLatency"] = ( + parent_finish_time_ns // 1_000_000 - request_time_epoch_ms - 1 + ) + + ctx = get_mock_context(aws_request_id="123") + create_inferred_span(event, ctx) + + args = mock_span_finish.call_args_list[0].args + authorizer_span, finish_time = args[0], args[1] + + assert finish_time >= authorizer_span.start, ( + f"Authorizer span has negative duration: " + f"finish_time={finish_time} < start={authorizer_span.start}" + ) + + class TestInferredSpans(unittest.TestCase): @patch("datadog_lambda.tracing.submit_errors_metric") def test_mark_trace_as_error_for_5xx_responses_getting_400_response_code( From 8badbdb9b9bd4c197e81351ab678395c834187a2 Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Mon, 6 Apr 2026 13:47:27 -0400 Subject: [PATCH 152/164] fix: remove return from finally block to resolve Python 3.14 SyntaxWarning (#783) * test * linting * Adding coauthor Co-authored-by: Melissa Womack --------- Co-authored-by: Melissa Womack --- datadog_lambda/wrapper.py | 6 +++--- tests/test_wrapper.py | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 36b00efd9..767816a50 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -191,7 +191,6 @@ def __call__(self, event, context, **kwargs): if self.blocking_response: return self.blocking_response self.response = self.func(event, context, **kwargs) - return self.response except BlockingException: self.blocking_response = get_asm_blocked_response(self.event_source) except Exception: @@ -204,8 +203,9 @@ def __call__(self, event, context, **kwargs): raise finally: self._after(event, context) - if self.blocking_response: - return self.blocking_response + if self.blocking_response: + return self.blocking_response + return self.response def _inject_authorizer_span_headers(self, request_id): reference_span = self.inferred_span if self.inferred_span else self.span diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 5b2afea8c..b1aa1ae86 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -765,6 +765,23 @@ def lambda_handler(event, context): assert lambda_handler.span.get_tag("http.status_code") == "403" + def test_handler_exception_propagates_when_appsec_enabled(self): + # Regression guard: before the fix, `return` in the `finally` block + # would silently swallow handler exceptions when no blocking response + # was set, preventing them from reaching the caller. + self.mock_get_asm_blocking_response.return_value = None + + class HandlerError(Exception): + pass + + def lambda_handler(event, context): + raise HandlerError("handler error") + + lambda_handler = wrapper.datadog_lambda_wrapper(lambda_handler) + + with self.assertRaises(HandlerError): + lambda_handler(self.api_gateway_request, get_mock_context()) + def test_no_blocking_appsec_disabled(self): os.environ["DD_APPSEC_ENABLED"] = "false" From 2c57e69cfdbf881b19ab14e11ea0ae564327327e Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Mon, 6 Apr 2026 16:14:24 -0400 Subject: [PATCH 153/164] Migrate e2e status to short-lived token (#784) * Migrate e2e status to short-lived token * Executable mode --- ci/input_files/build.yaml.tpl | 29 ++------------------------ ci/poll_e2e.sh | 38 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 27 deletions(-) create mode 100755 ci/poll_e2e.sh diff --git a/ci/input_files/build.yaml.tpl b/ci/input_files/build.yaml.tpl index 67f13706f..420eea649 100644 --- a/ci/input_files/build.yaml.tpl +++ b/ci/input_files/build.yaml.tpl @@ -285,30 +285,5 @@ e2e-test-status: - if: '$SKIP_E2E_TESTS == "true"' when: never - when: on_success - script: | - GITLAB_API_TOKEN=$(aws ssm get-parameter --region us-east-1 --name "ci.${CI_PROJECT_NAME}.serverless-e2e-gitlab-token" --with-decryption --query "Parameter.Value" --out text) - URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/pipelines/${CI_PIPELINE_ID}/bridges" - echo "Fetching E2E job status from: $URL" - while true; do - RESPONSE=$(curl -s --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" "$URL") - E2E_JOB_STATUS=$(echo "$RESPONSE" | jq -r '.[] | select(.name=="e2e-test") | .downstream_pipeline.status') - echo -n "E2E job status: $E2E_JOB_STATUS, " - if [ "$E2E_JOB_STATUS" == "success" ]; then - echo "✅ E2E tests completed successfully" - exit 0 - elif [ "$E2E_JOB_STATUS" == "failed" ]; then - echo "❌ E2E tests failed" - exit 1 - elif [ "$E2E_JOB_STATUS" == "running" ]; then - echo "⏳ E2E tests are still running, retrying in 1 minute..." - elif [ "$E2E_JOB_STATUS" == "canceled" ]; then - echo "🚫 E2E tests were canceled" - exit 1 - elif [ "$E2E_JOB_STATUS" == "skipped" ]; then - echo "⏭️ E2E tests were skipped" - exit 0 - else - echo "❓ Unknown E2E test status: $E2E_JOB_STATUS, retrying in 1 minute..." - fi - sleep 60 - done + script: + - ci/poll_e2e.sh diff --git a/ci/poll_e2e.sh b/ci/poll_e2e.sh new file mode 100755 index 000000000..3d56926a6 --- /dev/null +++ b/ci/poll_e2e.sh @@ -0,0 +1,38 @@ +curl -OL "binaries.ddbuild.io/dd-source/authanywhere/LATEST/authanywhere-linux-amd64" && mv "authanywhere-linux-amd64" /bin/authanywhere && chmod +x /bin/authanywhere + +BTI_CI_API_TOKEN=$(authanywhere --audience rapid-devex-ci) + +BTI_RESPONSE=$(curl --silent --request GET \ + --header "$BTI_CI_API_TOKEN" \ + --header "Content-Type: application/vnd.api+json" \ + "https://bti-ci-api.us1.ddbuild.io/internal/ci/gitlab/token?owner=DataDog&repository=datadog-lambda-python") + +GITLAB_TOKEN=$(echo "$BTI_RESPONSE" | jq -r '.token // empty') + +URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/pipelines/${CI_PIPELINE_ID}/bridges" + +echo "Fetching E2E job status from: $URL" + +while true; do + RESPONSE=$(curl -s --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" "$URL") + E2E_JOB_STATUS=$(echo "$RESPONSE" | jq -r '.[] | select(.name=="e2e-test") | .downstream_pipeline.status') + echo -n "E2E job status: $E2E_JOB_STATUS, " + if [ "$E2E_JOB_STATUS" == "success" ]; then + echo "✅ E2E tests completed successfully" + exit 0 + elif [ "$E2E_JOB_STATUS" == "failed" ]; then + echo "❌ E2E tests failed" + exit 1 + elif [ "$E2E_JOB_STATUS" == "running" ]; then + echo "⏳ E2E tests are still running, retrying in 2 minutes..." + elif [ "$E2E_JOB_STATUS" == "canceled" ]; then + echo "🚫 E2E tests were canceled" + exit 1 + elif [ "$E2E_JOB_STATUS" == "skipped" ]; then + echo "⏭️ E2E tests were skipped" + exit 0 + else + echo "❓ Unknown E2E test status: $E2E_JOB_STATUS, retrying in 2 minutes..." + fi + sleep 120 +done \ No newline at end of file From affe9c78f77625c96409dda5a9c28aa47b1c9891 Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Tue, 7 Apr 2026 09:36:21 +0200 Subject: [PATCH 154/164] Remove unused ddtrace appsec packages (#761) * Remove unused ddtrace appsec packages Remove additional ddtrace appsec packages from site-packages. * Update Dockerfile Co-authored-by: Brett Langdon --------- Co-authored-by: Brett Langdon --- Dockerfile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index b5635dea1..1e112f81d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,7 +33,13 @@ RUN pip install --no-cache-dir . -t ./python/lib/$runtime/site-packages RUN rm -rf ./python/lib/$runtime/site-packages/botocore* RUN rm -rf ./python/lib/$runtime/site-packages/setuptools RUN rm -rf ./python/lib/$runtime/site-packages/jsonschema/tests -RUN rm -rf ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast + +# Remove unsupported appsec modules +RUN rm -rf \ + ./python/lib/$runtime/site-packages/ddtrace/appsec/_iast \ + ./python/lib/$runtime/site-packages/ddtrace/appsec/sca \ + ./python/lib/$runtime/site-packages/ddtrace/appsec/_shared + # CI Visibility paths/integrations RUN rm -rf \ ./python/lib/$runtime/site-packages/ddtrace/contrib/coverage/ \ From 81d57acb951c1f37241b67b549963da4b1611949 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Thu, 9 Apr 2026 11:19:19 -0400 Subject: [PATCH 155/164] fix: Bump ujson minimum version to 5.10.0 (#787) * fix CVE-2026-32874 and CVE-2026-32875 * split the ujson constraint by Python version --- pyproject.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f289867cd..ec95a7385 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,10 @@ ddtrace = [ {version = ">=3.19.1,<4", python = ">=3.8,<3.10"}, {version = ">=4.1.1,<5,!=4.6.*", python = ">=3.10"} ] -ujson = ">=5.9.0" +ujson = [ + {version = ">=5.10.0,<5.12.0", python = ">=3.8,<3.10"}, + {version = ">=5.12.0", python = ">=3.10"} +] botocore = { version = "^1.34.0", optional = true } requests = { version ="^2.22.0", optional = true } pytest = { version= "^8.0.0", optional = true } From 5e8feaa4ad7bd9a12c8d5891847fcfed9f868fa1 Mon Sep 17 00:00:00 2001 From: Rithika Narayan <93233069+rithikanarayan@users.noreply.github.com> Date: Mon, 13 Apr 2026 12:39:23 -0400 Subject: [PATCH 156/164] Update integration test snapshots (#792) * Updated integration test snapshots * remove extra file --- .../logs/async-metrics_python310.log | 50 +++++++----- .../logs/async-metrics_python311.log | 50 +++++++----- .../logs/async-metrics_python312.log | 50 +++++++----- .../logs/async-metrics_python313.log | 50 +++++++----- .../logs/async-metrics_python314.log | 50 +++++++----- .../snapshots/logs/sync-metrics_python310.log | 80 ++++++++++++------- .../snapshots/logs/sync-metrics_python311.log | 80 ++++++++++++------- .../snapshots/logs/sync-metrics_python312.log | 80 ++++++++++++------- .../snapshots/logs/sync-metrics_python313.log | 80 ++++++++++++------- .../snapshots/logs/sync-metrics_python314.log | 80 ++++++++++++------- 10 files changed, 400 insertions(+), 250 deletions(-) diff --git a/tests/integration/snapshots/logs/async-metrics_python310.log b/tests/integration/snapshots/logs/async-metrics_python310.log index 8d47fa129..5aef301ef 100644 --- a/tests/integration/snapshots/logs/async-metrics_python310.log +++ b/tests/integration/snapshots/logs/async-metrics_python310.log @@ -73,7 +73,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -95,6 +96,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python310", "function_version": "$LATEST", @@ -106,7 +108,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -228,6 +229,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python310", "function_version": "$LATEST", @@ -237,8 +239,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -383,7 +385,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -437,6 +440,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python310", "function_version": "$LATEST", @@ -446,7 +450,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -576,7 +579,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -598,6 +602,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python310", "function_version": "$LATEST", @@ -607,7 +612,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -746,7 +750,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -768,6 +773,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python310", "function_version": "$LATEST", @@ -779,7 +785,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -918,7 +923,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -940,6 +946,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python310", "function_version": "$LATEST", @@ -949,7 +956,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1083,7 +1089,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1117,6 +1124,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python310", "function_version": "$LATEST", @@ -1126,7 +1134,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1261,7 +1268,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1283,6 +1291,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python310", "function_version": "$LATEST", @@ -1292,7 +1301,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1426,7 +1434,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1448,6 +1457,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python310", "function_version": "$LATEST", @@ -1457,7 +1467,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1597,7 +1606,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1619,6 +1629,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python310", "function_version": "$LATEST", @@ -1630,7 +1641,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python311.log b/tests/integration/snapshots/logs/async-metrics_python311.log index 3a2dd243e..d662cb7af 100644 --- a/tests/integration/snapshots/logs/async-metrics_python311.log +++ b/tests/integration/snapshots/logs/async-metrics_python311.log @@ -73,7 +73,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -95,6 +96,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python311", "function_version": "$LATEST", @@ -106,7 +108,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -228,6 +229,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python311", "function_version": "$LATEST", @@ -237,8 +239,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -383,7 +385,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -437,6 +440,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python311", "function_version": "$LATEST", @@ -446,7 +450,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -576,7 +579,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -598,6 +602,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python311", "function_version": "$LATEST", @@ -607,7 +612,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -746,7 +750,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -768,6 +773,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python311", "function_version": "$LATEST", @@ -779,7 +785,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -918,7 +923,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -940,6 +946,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python311", "function_version": "$LATEST", @@ -949,7 +956,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1083,7 +1089,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1117,6 +1124,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python311", "function_version": "$LATEST", @@ -1126,7 +1134,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1261,7 +1268,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1283,6 +1291,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python311", "function_version": "$LATEST", @@ -1292,7 +1301,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1426,7 +1434,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1448,6 +1457,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python311", "function_version": "$LATEST", @@ -1457,7 +1467,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1597,7 +1606,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1619,6 +1629,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python311", "function_version": "$LATEST", @@ -1630,7 +1641,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python312.log b/tests/integration/snapshots/logs/async-metrics_python312.log index 910218152..0e492dac2 100644 --- a/tests/integration/snapshots/logs/async-metrics_python312.log +++ b/tests/integration/snapshots/logs/async-metrics_python312.log @@ -73,7 +73,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -95,6 +96,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python312", "function_version": "$LATEST", @@ -106,7 +108,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -228,6 +229,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python312", "function_version": "$LATEST", @@ -237,8 +239,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -383,7 +385,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -437,6 +440,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python312", "function_version": "$LATEST", @@ -446,7 +450,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -576,7 +579,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -598,6 +602,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python312", "function_version": "$LATEST", @@ -607,7 +612,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -746,7 +750,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -768,6 +773,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python312", "function_version": "$LATEST", @@ -779,7 +785,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -918,7 +923,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -940,6 +946,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python312", "function_version": "$LATEST", @@ -949,7 +956,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1083,7 +1089,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1117,6 +1124,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python312", "function_version": "$LATEST", @@ -1126,7 +1134,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1261,7 +1268,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1283,6 +1291,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python312", "function_version": "$LATEST", @@ -1292,7 +1301,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1426,7 +1434,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1448,6 +1457,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python312", "function_version": "$LATEST", @@ -1457,7 +1467,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1597,7 +1606,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1619,6 +1629,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python312", "function_version": "$LATEST", @@ -1630,7 +1641,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python313.log b/tests/integration/snapshots/logs/async-metrics_python313.log index 41008f65d..6466246c2 100644 --- a/tests/integration/snapshots/logs/async-metrics_python313.log +++ b/tests/integration/snapshots/logs/async-metrics_python313.log @@ -73,7 +73,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -95,6 +96,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python313", "function_version": "$LATEST", @@ -106,7 +108,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -228,6 +229,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python313", "function_version": "$LATEST", @@ -237,8 +239,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -383,7 +385,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -437,6 +440,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python313", "function_version": "$LATEST", @@ -446,7 +450,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -576,7 +579,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -598,6 +602,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python313", "function_version": "$LATEST", @@ -607,7 +612,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -746,7 +750,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -768,6 +773,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python313", "function_version": "$LATEST", @@ -779,7 +785,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -918,7 +923,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -940,6 +946,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python313", "function_version": "$LATEST", @@ -949,7 +956,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1083,7 +1089,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1117,6 +1124,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python313", "function_version": "$LATEST", @@ -1126,7 +1134,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1261,7 +1268,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1283,6 +1291,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python313", "function_version": "$LATEST", @@ -1292,7 +1301,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1426,7 +1434,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1448,6 +1457,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python313", "function_version": "$LATEST", @@ -1457,7 +1467,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1597,7 +1606,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1619,6 +1629,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python313", "function_version": "$LATEST", @@ -1630,7 +1641,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/async-metrics_python314.log b/tests/integration/snapshots/logs/async-metrics_python314.log index c6979758d..2ff4a6c16 100644 --- a/tests/integration/snapshots/logs/async-metrics_python314.log +++ b/tests/integration/snapshots/logs/async-metrics_python314.log @@ -73,7 +73,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -95,6 +96,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", "function_version": "$LATEST", @@ -106,7 +108,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -228,6 +229,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", "function_version": "$LATEST", @@ -237,8 +239,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -383,7 +385,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -437,6 +440,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", "function_version": "$LATEST", @@ -446,7 +450,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -576,7 +579,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -598,6 +602,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", "function_version": "$LATEST", @@ -607,7 +612,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -746,7 +750,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -768,6 +773,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", "function_version": "$LATEST", @@ -779,7 +785,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -918,7 +923,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -940,6 +946,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", "function_version": "$LATEST", @@ -949,7 +956,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1083,7 +1089,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1117,6 +1124,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", "function_version": "$LATEST", @@ -1126,7 +1134,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1261,7 +1268,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1283,6 +1291,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", "function_version": "$LATEST", @@ -1292,7 +1301,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1426,7 +1434,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1448,6 +1457,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", "function_version": "$LATEST", @@ -1457,7 +1467,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1597,7 +1606,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1619,6 +1629,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python314", "function_version": "$LATEST", @@ -1630,7 +1641,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index 3747c3aec..997cc0e36 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -53,7 +53,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -75,6 +76,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -86,7 +88,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -178,7 +179,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -227,6 +229,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -236,8 +239,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -326,7 +329,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -401,7 +405,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -455,6 +460,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -464,7 +470,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -554,7 +559,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -613,7 +619,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -635,6 +642,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -644,7 +652,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -733,7 +740,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -802,7 +810,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -824,6 +833,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -835,7 +845,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -927,7 +936,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -993,7 +1003,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1015,6 +1026,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1024,7 +1036,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1114,7 +1125,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1177,7 +1189,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1211,6 +1224,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1220,7 +1234,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1310,7 +1323,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1374,7 +1388,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1396,6 +1411,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1405,7 +1421,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1495,7 +1510,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1558,7 +1574,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1580,6 +1597,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1589,7 +1607,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1679,7 +1696,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1748,7 +1766,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1770,6 +1789,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", "function_version": "$LATEST", @@ -1781,7 +1801,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1871,7 +1890,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index b614b1222..4880a9049 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -53,7 +53,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -75,6 +76,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -86,7 +88,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -178,7 +179,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -227,6 +229,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -236,8 +239,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -326,7 +329,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -401,7 +405,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -455,6 +460,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -464,7 +470,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -554,7 +559,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -613,7 +619,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -635,6 +642,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -644,7 +652,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -733,7 +740,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -802,7 +810,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -824,6 +833,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -835,7 +845,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -927,7 +936,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -993,7 +1003,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1015,6 +1026,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1024,7 +1036,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1114,7 +1125,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1177,7 +1189,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1211,6 +1224,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1220,7 +1234,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1310,7 +1323,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1374,7 +1388,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1396,6 +1411,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1405,7 +1421,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1495,7 +1510,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1558,7 +1574,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1580,6 +1597,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1589,7 +1607,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1679,7 +1696,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1748,7 +1766,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1770,6 +1789,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", "function_version": "$LATEST", @@ -1781,7 +1801,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1871,7 +1890,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index 593d9fbfd..0ed8cb0f4 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -53,7 +53,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -75,6 +76,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -86,7 +88,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -178,7 +179,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -227,6 +229,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -236,8 +239,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -326,7 +329,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -401,7 +405,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -455,6 +460,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -464,7 +470,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -554,7 +559,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -613,7 +619,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -635,6 +642,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -644,7 +652,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -733,7 +740,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -802,7 +810,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -824,6 +833,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -835,7 +845,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -927,7 +936,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -993,7 +1003,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1015,6 +1026,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1024,7 +1036,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1114,7 +1125,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1177,7 +1189,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1211,6 +1224,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1220,7 +1234,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1310,7 +1323,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1374,7 +1388,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1396,6 +1411,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1405,7 +1421,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1495,7 +1510,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1558,7 +1574,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1580,6 +1597,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1589,7 +1607,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1679,7 +1696,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1748,7 +1766,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1770,6 +1789,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", "function_version": "$LATEST", @@ -1781,7 +1801,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1871,7 +1890,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index c21fcaad0..fca4631cd 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -53,7 +53,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -75,6 +76,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -86,7 +88,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -178,7 +179,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -227,6 +229,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -236,8 +239,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -326,7 +329,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -401,7 +405,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -455,6 +460,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -464,7 +470,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -554,7 +559,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -613,7 +619,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -635,6 +642,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -644,7 +652,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -733,7 +740,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -802,7 +810,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -824,6 +833,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -835,7 +845,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -927,7 +936,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -993,7 +1003,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1015,6 +1026,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1024,7 +1036,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1114,7 +1125,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1177,7 +1189,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1211,6 +1224,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1220,7 +1234,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1310,7 +1323,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1374,7 +1388,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1396,6 +1411,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1405,7 +1421,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1495,7 +1510,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1558,7 +1574,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1580,6 +1597,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1589,7 +1607,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1679,7 +1696,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1748,7 +1766,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1770,6 +1789,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", "function_version": "$LATEST", @@ -1781,7 +1801,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1871,7 +1890,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, diff --git a/tests/integration/snapshots/logs/sync-metrics_python314.log b/tests/integration/snapshots/logs/sync-metrics_python314.log index 090c3cbae..8b6eb8f06 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python314.log +++ b/tests/integration/snapshots/logs/sync-metrics_python314.log @@ -53,7 +53,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -75,6 +76,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "true", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -86,7 +88,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/Prod/", "http.method": "GET", "http.route": "/", @@ -178,7 +179,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -227,6 +229,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "meta": { "runtime-id": "XXXX", "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -236,8 +239,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -326,7 +329,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -401,7 +405,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -455,6 +460,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -464,7 +470,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "dynamodb", "function_trigger.event_source_arn": "XXXX" }, @@ -554,7 +559,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -613,7 +619,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -635,6 +642,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -644,7 +652,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "eventbridge" }, "metrics": { @@ -733,7 +740,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -802,7 +810,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -824,6 +833,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -835,7 +845,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX$default", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get", "http.method": "GET", "http.route": "/httpapi/get", @@ -927,7 +936,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -993,7 +1003,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1015,6 +1026,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1024,7 +1036,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "kinesis", "function_trigger.event_source_arn": "XXXX" }, @@ -1114,7 +1125,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1177,7 +1189,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1211,6 +1224,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1220,7 +1234,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "s3", "function_trigger.event_source_arn": "XXXX" }, @@ -1310,7 +1323,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1374,7 +1388,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1396,6 +1411,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1405,7 +1421,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sns", "function_trigger.event_source_arn": "XXXX" }, @@ -1495,7 +1510,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1558,7 +1574,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1580,6 +1597,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1589,7 +1607,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "datadog_lambda": "X.X.X", "dd_trace": "X.X.X", "span.name": "aws.lambda", - "span.kind": "server", "function_trigger.event_source": "sqs", "function_trigger.event_source_arn": "XXXX" }, @@ -1679,7 +1696,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1748,7 +1766,8 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "_dd.peer.service.source": "peer.service", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, @@ -1770,6 +1789,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "duration": "XXXX", "meta": { "_dd.origin": "lambda", + "span.kind": "server", "cold_start": "false", "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python314", "function_version": "$LATEST", @@ -1781,7 +1801,6 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate, zs "span.name": "aws.lambda", "function_trigger.event_source": "api-gateway", "function_trigger.event_source_arn": "XXXX", - "span.kind": "server", "http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com", "http.status_code": "200" }, @@ -1871,7 +1890,8 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept "http.useragent": "datadogpy/XX (python XX; os linux; arch XXXX)", "_dd.p.dm": "-0", "_dd.p.tid": "XXXX", - "language": "python" + "language": "python", + "_dd.tags.process": "entrypoint.basedir:runtime,entrypoint.name:bootstrap,entrypoint.type:script,entrypoint.workdir:task,svc.user:true" }, "metrics": { "process_id": XXXX, From 39f48d556c22e3816eec6ccf9268ff51ad6d9bd4 Mon Sep 17 00:00:00 2001 From: Zarir Hamza Date: Wed, 15 Apr 2026 13:42:44 -0400 Subject: [PATCH 157/164] fix: disable remote configuration by default in Lambda (#797) --- datadog_lambda/config.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/datadog_lambda/config.py b/datadog_lambda/config.py index 4458bd9aa..ce4924af8 100644 --- a/datadog_lambda/config.py +++ b/datadog_lambda/config.py @@ -141,6 +141,11 @@ def _reset(self): "enabled" if config.fips_mode_enabled else "not enabled", ) +# Remote configuration relies on /dev/shm which is unavailable in Lambda. +# Disable it before ddtrace loads to avoid the shared-memory warning. +if "DD_REMOTE_CONFIGURATION_ENABLED" not in os.environ: + os.environ["DD_REMOTE_CONFIGURATION_ENABLED"] = "false" + # disable css to prevent double counting in lambda os.environ["DD_TRACE_STATS_COMPUTATION_ENABLED"] = "false" From 5b292db0a2295bfa4cfa7d183c492d0956803f94 Mon Sep 17 00:00:00 2001 From: Yiming Luo <10097700+lym953@users.noreply.github.com> Date: Wed, 15 Apr 2026 14:18:09 -0400 Subject: [PATCH 158/164] fix: correct durable execution statuses to match Python SDK InvocationStatus enum (#793) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SUCCEEDED, FAILED, STOPPED, TIMED_OUT → SUCCEEDED, FAILED, PENDING. STOPPED and TIMED_OUT are OperationStatus values; InvocationStatus only defines SUCCEEDED, FAILED, and PENDING. Co-authored-by: Claude Sonnet 4.6 --- datadog_lambda/durable.py | 2 +- tests/test_durable.py | 13 +++---------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/datadog_lambda/durable.py b/datadog_lambda/durable.py index c77b43b04..9a28b36bd 100644 --- a/datadog_lambda/durable.py +++ b/datadog_lambda/durable.py @@ -55,7 +55,7 @@ def extract_durable_function_tags(event): } -VALID_DURABLE_STATUSES = {"SUCCEEDED", "FAILED", "STOPPED", "TIMED_OUT"} +VALID_DURABLE_STATUSES = {"SUCCEEDED", "FAILED", "PENDING"} def extract_durable_execution_status(response, event): diff --git a/tests/test_durable.py b/tests/test_durable.py index 203548d12..36a3e8c5f 100644 --- a/tests/test_durable.py +++ b/tests/test_durable.py @@ -131,19 +131,12 @@ def test_returns_failed(self): response = {"Status": "FAILED", "Error": "some-error"} self.assertEqual(extract_durable_execution_status(response, event), "FAILED") - def test_returns_stopped(self): + def test_returns_pending(self): event = { "DurableExecutionArn": "arn:aws:lambda:us-east-1:123:function:f:1/durable-execution/n/id" } - response = {"Status": "STOPPED"} - self.assertEqual(extract_durable_execution_status(response, event), "STOPPED") - - def test_returns_timed_out(self): - event = { - "DurableExecutionArn": "arn:aws:lambda:us-east-1:123:function:f:1/durable-execution/n/id" - } - response = {"Status": "TIMED_OUT"} - self.assertEqual(extract_durable_execution_status(response, event), "TIMED_OUT") + response = {"Status": "PENDING"} + self.assertEqual(extract_durable_execution_status(response, event), "PENDING") def test_returns_none_for_non_durable_event(self): event = {"key": "value"} From 5d8417db23f14e2555dfdd734e2bd148bbe123be Mon Sep 17 00:00:00 2001 From: Olivier Nzia Date: Wed, 15 Apr 2026 15:36:52 -0400 Subject: [PATCH 159/164] bump vulnerable dependencies (#796) * bump pytest * use compatible depedency versions and prevent major version upgrades * upgrade minimatch * upgrade urllib3 for transitive dependencies * remove upper python version limit from urllib3 * upgrade requests to ^2.33.0 * undo requests upgrade in requirements.txt * add python version markers for requests in requirements.txt --- poetry.lock | 483 ++++++++++++++++++++-------- pyproject.toml | 18 +- tests/integration/package-lock.json | 123 +++++-- tests/integration/package.json | 6 + tests/integration/requirements.txt | 3 +- tests/integration/yarn.lock | 287 ++++++++++------- 6 files changed, 627 insertions(+), 293 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4c37bf871..bf6c6fec4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "botocore" @@ -31,6 +31,7 @@ description = "Python module to generate and modify bytecode" optional = false python-versions = ">=3.8" groups = ["main"] +markers = "python_version < \"3.10\"" files = [ {file = "bytecode-0.16.1-py3-none-any.whl", hash = "sha256:1d4b61ed6bade4bff44127c8283bef8131a664ce4dbe09d64a88caf329939f35"}, {file = "bytecode-0.16.1.tar.gz", hash = "sha256:8fbbb637c880f339e564858bc6c7984ede67ae97bc71343379a535a9a4baf398"}, @@ -39,6 +40,19 @@ files = [ [package.dependencies] typing_extensions = {version = "*", markers = "python_version < \"3.10\""} +[[package]] +name = "bytecode" +version = "0.17.0" +description = "Python module to generate and modify bytecode" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "bytecode-0.17.0-py3-none-any.whl", hash = "sha256:64fb10cde1db7ef5cc39bd414ecebd54ba3b40e1c4cf8121ca5e72f170916ff8"}, + {file = "bytecode-0.17.0.tar.gz", hash = "sha256:0c37efa5bd158b1b873f530cceea2c645611d55bd2dc2a4758b09f185749b6fd"}, +] + [[package]] name = "certifi" version = "2024.12.14" @@ -183,100 +197,179 @@ requests = ">=2.6.0" [[package]] name = "ddtrace" -version = "2.20.0" +version = "3.19.7" description = "Datadog APM client library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["main"] +markers = "python_version < \"3.10\"" files = [ - {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e1dee099099b95acf7d0e552179925cfec58a52315cc914d153506367b195bc4"}, - {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:9d209bef14caafcd53be8c14e04741d86c08f76496c1bf755e2eaa38605ce3e0"}, - {file = "ddtrace-2.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f37966012078151713d61382de2a7ed710a8f375820e0db41930436b813b651"}, - {file = "ddtrace-2.20.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:879b963baf0b97d5ddd26185ab496b79efd25bbfdc2c25dbb1113ec19dc5abf9"}, - {file = "ddtrace-2.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e9b9a87c9df8a029fd3583ac660538dfa9d53207fee82b7f04749148bf8a3b"}, - {file = "ddtrace-2.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:eb76547a4bbf285d03ffc6e065bbad61761954741da2df0e4683d68d46ef2159"}, - {file = "ddtrace-2.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:194973afa1e357c68b6a6eceaabbddcef01130d167775126c2a15b3c1827f683"}, - {file = "ddtrace-2.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a71d2fc753b8fa2c3435b6f4d5f820d8deb51f49df59a4886b4da68b67f923d3"}, - {file = "ddtrace-2.20.0-cp310-cp310-win32.whl", hash = "sha256:567054d0c01dc552a8a24c4c9eeb98d778be720d2c4c9536acf1b86d6969a5e4"}, - {file = "ddtrace-2.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:d39f96e2fdfdf7ab43ee89a20d914f5ab12f8f361c390663eacb0e5da6e6e7fb"}, - {file = "ddtrace-2.20.0-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:0a1d7eaf6c9a5e0eabb8396f7d19faffc8f76a1ae37f34814c3432a9ca6f31da"}, - {file = "ddtrace-2.20.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:301a7787a34113b56cc9067a593c4717f6e158f2393883c30b59d0a37ebc06fa"}, - {file = "ddtrace-2.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d76ce49eb42588766db6756240d746441a66f03932547bfca9c62a8aecdbb38"}, - {file = "ddtrace-2.20.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a84d2e2411496c1b4ca3ce0cfb407d186cb3d13f1769c321fec30e677d815cd8"}, - {file = "ddtrace-2.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da47746a24242d805a800bca0a10b1354353e18b0bc4b6caf9c9c1724ba286b0"}, - {file = "ddtrace-2.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6f89e6003a738800beeb9948c847366976c73de2e24cc469b644a125f418c0a8"}, - {file = "ddtrace-2.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4fca20220bf668ebcac7051d28648b62aa95d2afeb5036ecad167cb454c7dcf1"}, - {file = "ddtrace-2.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1197e89fcaaca4ce419e3c812d04c73b8d16973202472cf3f674b4698b967697"}, - {file = "ddtrace-2.20.0-cp311-cp311-win32.whl", hash = "sha256:44bcd604a1d9095f4eb6813db6a677a208bd47884aff9ddc5aa46f596765f38e"}, - {file = "ddtrace-2.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:0a5f092df1ee4d0afe96502866ff0fb446a07c6a23d445ed616f1302c883e1d3"}, - {file = "ddtrace-2.20.0-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:f77103d36e6ab52cb45781766620d3874d0a728565afa7fd57f8ce2d5087e8e7"}, - {file = "ddtrace-2.20.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:d1cec952ce2ca9efbb34c8a9ee522e1cc588fe454b9115120b30fd5d0f821512"}, - {file = "ddtrace-2.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4a1da150e92b6d43047f2a91a7d3b7133207f94b82613625abf82662359b30e"}, - {file = "ddtrace-2.20.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91ab68c1facc6cf04085fdeea53210ed9928e95116809fd9bfe2dea54e83375d"}, - {file = "ddtrace-2.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fd7ec6410225e64ca875d1bc9bd6bd8489f52dd8558462fbb52447fb8f66ad3"}, - {file = "ddtrace-2.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57864590ddb84da4eb99332fe4b521e6fd747992178e3eabcf4f87406e908bb1"}, - {file = "ddtrace-2.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:37693555704a0cbd4a925e4ffe9c6df696146c85557c5f66ce3a7a88406772d9"}, - {file = "ddtrace-2.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ae5e802aaefc0cd3b63e3fd46e051a39e9f960a02e89f44a5bb820f445b736f9"}, - {file = "ddtrace-2.20.0-cp312-cp312-win32.whl", hash = "sha256:14fe4f583bec105c40e233c74fcbaea185658651c626ce1609750d83d93a00ae"}, - {file = "ddtrace-2.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:cfbc926ddfeece0312e82f9e00a68001647666d11ceb050a5bbe66ca8931e3d2"}, - {file = "ddtrace-2.20.0-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:eeca6b6bd48794d48de438981dccbc96a06366edde798c12b2b3348ca5e03717"}, - {file = "ddtrace-2.20.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:3f526e75d1b61019db2cd715e8c7298325e21c3584f8677a7decf37aa81e7284"}, - {file = "ddtrace-2.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96441189ccc772ef4871e23a35cec58a748c16ebfb2293eccaaa719dcbc368fd"}, - {file = "ddtrace-2.20.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d31d769f222c9a5bde1d4a594da1341014bf02db1a7194f5a41ed7e5c4c9fa8"}, - {file = "ddtrace-2.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54068dbf034e1f607ef5d58a9fa1b26bd78b4f3db0618ce0a3e9c4b04fff7209"}, - {file = "ddtrace-2.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62e86d9b00277fe2b9bdfbc51ca1bc34aa5c1200aa6bc5084c7eaaab28b022de"}, - {file = "ddtrace-2.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c83c2458de1cf1bbac48689c6541a85d54ad94ae6608961e1089cc2959a8c77a"}, - {file = "ddtrace-2.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:569d7a92a88ba9b2a203addea688b0585901534c92c2d148ef9f971b6d7b3805"}, - {file = "ddtrace-2.20.0-cp37-cp37m-macosx_12_0_x86_64.whl", hash = "sha256:df413d646fc14b4be51a15ed8e484bcdf3b21e370e2644a586283bcc7e0b2355"}, - {file = "ddtrace-2.20.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33e4406a436278722df193c93d49e662a8891e8a440fddb273dca9a56fa27947"}, - {file = "ddtrace-2.20.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d358bc7b4b1daa2d6e6bc697244b39db653ddd5ae139045941d3db28950bfe"}, - {file = "ddtrace-2.20.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a523924382d2f8f87731e4ad86bbf4721fba9eb807ed3b0c862db6d768e1e81c"}, - {file = "ddtrace-2.20.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:0af78a424e9d87250a8648a35b7de5653f27b3f6f6803c1b33780816a07e6d26"}, - {file = "ddtrace-2.20.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:2723378e670d27927f7d1ab878c8668fc392a5656a66453b9808e7c4025431fd"}, - {file = "ddtrace-2.20.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01f76fc9bf1413a188ddd59851eb3b668d3de936afed73a5914a817f36e11005"}, - {file = "ddtrace-2.20.0-cp37-cp37m-win32.whl", hash = "sha256:3a615ae95ef8f889304b2958655ac8cda23cf2f2c8faf5d8ff88bd14bdcf3fb4"}, - {file = "ddtrace-2.20.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b90333661ffd3460bae6dbbd7a5f35d8467cff36bd7a689a47b014edb19c0fe6"}, - {file = "ddtrace-2.20.0-cp38-cp38-macosx_12_0_universal2.whl", hash = "sha256:ab27596e82bdfe9c0c5580f6886ec943ae2fe615a446c22470f6a1f9742dec62"}, - {file = "ddtrace-2.20.0-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:e2de7371291283cba1afdd7e919a577637099da0d6872d33b4008e1cad6e1b8b"}, - {file = "ddtrace-2.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa4f90f472768aef8ce023a924505c9d1d09428fc9d6ab81bc0e3ab183e3ff48"}, - {file = "ddtrace-2.20.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05b68ba6fe4da5317396100669edf91b3d54b95ae979a2a22ca880cfcc6c249d"}, - {file = "ddtrace-2.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1512d07e6c7cde13ae251906d57d31613fe5ee99fab2894e90679053b4256953"}, - {file = "ddtrace-2.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dcadc60aa60e11f2db56065a834aaa5e52a9be02e8edc8d14aa7015fb54092ce"}, - {file = "ddtrace-2.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:698207d88941ea3e4e5f3add6071e6651caa12fcffe079359507391382251759"}, - {file = "ddtrace-2.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9f95a251f84725df055202d933b4a8fb39cefd51341e10cad17d2a8b4d64700e"}, - {file = "ddtrace-2.20.0-cp38-cp38-win32.whl", hash = "sha256:0b121285459693ae9f3c9ce54cc4be981a2e73d4c52b8a5eb038cf41df9974dd"}, - {file = "ddtrace-2.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:4c840dc91c622138a4a6abdbcbee56897d4c55d9e7bf16b1902ee676f20b22f2"}, - {file = "ddtrace-2.20.0-cp39-cp39-macosx_12_0_universal2.whl", hash = "sha256:c74d69e6a4cbd91f6fe411519d753f34893d6d40a68829b43485690df8a7f30f"}, - {file = "ddtrace-2.20.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:4902b64ba89a8e4008228e7a5007e20b2bb8071c6c7689abd47dddc159e2baf1"}, - {file = "ddtrace-2.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758ba828eddd144a4804af692869e7278376efa740932a7453e8fdc0ed6ef6a7"}, - {file = "ddtrace-2.20.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:37995326df811236c9d92d1b5713378a7f11270bf1e21c64914653a3e12d7d01"}, - {file = "ddtrace-2.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab7f1babd7a8e73edf70c957a5b3bbeb4c615b232a078a0fe4da566e1663d1aa"}, - {file = "ddtrace-2.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1cd1b240f465c98e226ab896b1b1c3696752d5eb1051a0aafb8a3db701d2ddc1"}, - {file = "ddtrace-2.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3a300515c3327af4fd5c6c83e6ca63cd0a20e4243381d4b712e3f406d9ddf201"}, - {file = "ddtrace-2.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f1ce886b112e0e8aa66ba8cf3593f00f7f6ae6b48dd09bd8ce90c59adad59d66"}, - {file = "ddtrace-2.20.0-cp39-cp39-win32.whl", hash = "sha256:bb77464849b092f93839d5c257df9eaeb018521ddea2deef97dfc6e3501a2516"}, - {file = "ddtrace-2.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:b95f14f0634fe3f02dcebb7b8a124207b3d44168fd0dfc6bfff1e4db93978089"}, - {file = "ddtrace-2.20.0.tar.gz", hash = "sha256:f185c6dd88cd04884f0ad27b37f14d837274e8fc4dc43407781334d92d41c3bc"}, + {file = "ddtrace-3.19.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:640847ed52bef189da0d2403c21be80c0dd425da19e65fb1b099b69db4506111"}, + {file = "ddtrace-3.19.7-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:428ef5a4bf0abaead6b24e422feb9121a29303246b70d4ea78cd892bfa0c9a58"}, + {file = "ddtrace-3.19.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:04169fddab36fcbb82248d6e02b3231e8fe732772d8f7b58b2342e414fdfe5fe"}, + {file = "ddtrace-3.19.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9d48387bb79f3ed3d0e812ce17545c065d8fa03336069cac1bae32b87e8e0b2f"}, + {file = "ddtrace-3.19.7-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:35a41266f309911797da7be1f8b3dd2cef440814be59edf48b11c5496f6fa585"}, + {file = "ddtrace-3.19.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7c7f885aacac5959b210ec86cf861d54c1bf778bedde72cf22a0e11b4e3342da"}, + {file = "ddtrace-3.19.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:bb0c758cd60783e4ac29d98afb2ccdc00f918304f0191381b3bd9df7ba15bb64"}, + {file = "ddtrace-3.19.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1fa535aa2795bf776270e3373227cf14ef5164ce3b6e0953b7b66da3a3cf9d0f"}, + {file = "ddtrace-3.19.7-cp310-cp310-win32.whl", hash = "sha256:31993a4eb521e28eb52921ed2112ad813b779a2cabf5fafc620224bb6e661a53"}, + {file = "ddtrace-3.19.7-cp310-cp310-win_amd64.whl", hash = "sha256:306a5c803aa38c6808449c543ef4a00430da7fa959b801438a144a8d964055cb"}, + {file = "ddtrace-3.19.7-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:2c8bbfa3ab83e6a66ed69a2897479158040cc126b561eb33fec002323afc1507"}, + {file = "ddtrace-3.19.7-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:c708d863ce44762bf219554b47ae7f9fd28348d8502b498f7910a24d4bcb3526"}, + {file = "ddtrace-3.19.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:52d30d1fe4b4751de0909d11966c9fb3db509cb795a98ea40633a78ff39daa18"}, + {file = "ddtrace-3.19.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c9fe721ede05f197893664361873177df8551a820b7e5ac6d84da39e82bf175c"}, + {file = "ddtrace-3.19.7-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:74b25220346fdac217d1b334c1d88bbae2c3ae5e101e53460f8193ed226d2759"}, + {file = "ddtrace-3.19.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:259261612982b1222731560d166edf4125f53d2a4a5468778a91b9b3d8577452"}, + {file = "ddtrace-3.19.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3b1a59d4347d0176ffe9841f2a01ca9b42bfd65760baf90337fd3b0718cceba5"}, + {file = "ddtrace-3.19.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119b60f006944af39ec6eaa2ed3a9b96defbb537ad51592a60a8285643217094"}, + {file = "ddtrace-3.19.7-cp311-cp311-win32.whl", hash = "sha256:74e31b295267f6b5d02192566e382a33dd3c2254f545f43f2d241f1266de06d4"}, + {file = "ddtrace-3.19.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e00eaca60b53c206370b69641534d251b68f114406a7cdd96aa505be1e8a4e3"}, + {file = "ddtrace-3.19.7-cp311-cp311-win_arm64.whl", hash = "sha256:54fa6ccf40f9ad09787b4ccc2cfb6524ce87997a3424e3f92efe3f4bfed2008d"}, + {file = "ddtrace-3.19.7-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2a1b4ccf33d82cc03334f6f54b8e37711f0e46fddaade56769ac42e6c6683d98"}, + {file = "ddtrace-3.19.7-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b6037dba7f0b7fa59b8e1ab44a2750fccc3e619917d451a94cc1bc108b16d3cb"}, + {file = "ddtrace-3.19.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:38b515c8b5100e6b3c513e58160eb268bddbd9783fa2cb6f7f65ee7c387936ee"}, + {file = "ddtrace-3.19.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:300807941a2f005aacf4ef3d81e94dd4034d9acf1bf3786e73c382659bd8b617"}, + {file = "ddtrace-3.19.7-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:c74524559e7d21beb29b8e13c5090644525b5df03a6a7450e9286997e31ac9c9"}, + {file = "ddtrace-3.19.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:817abdd18b24ec0f881843af4c6bae55c4ecd997dc0c3688c4a45b0a18a1368c"}, + {file = "ddtrace-3.19.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c59faed5fa5330ffd5fe60284b1ec1a0525d7fc063787de227a418810851c2f3"}, + {file = "ddtrace-3.19.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:af3f1200c3e4c850a9c408047a6f83f5b87cbb0c641022a4107e566e5064c434"}, + {file = "ddtrace-3.19.7-cp312-cp312-win32.whl", hash = "sha256:6fd3409777c2549b5bf743abc3c1ab17ba7a1a399c3a580e2a4bac383a576e35"}, + {file = "ddtrace-3.19.7-cp312-cp312-win_amd64.whl", hash = "sha256:69448c80f440aee4d1a3e19295e66c44a84ae014da6c05a52d846b4b7ac821c9"}, + {file = "ddtrace-3.19.7-cp312-cp312-win_arm64.whl", hash = "sha256:30827b6bbbbb75f883717c59339e43feef31a7a31da623f2f291ac6e9a044c6f"}, + {file = "ddtrace-3.19.7-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:425bacf644a772aa3faca075234f3bc5d37972fa1f32932343b00653190cdab5"}, + {file = "ddtrace-3.19.7-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dec566649d660bfe179d2d97d8217304a466c0294ac6cec84ab9ee5bd2c20056"}, + {file = "ddtrace-3.19.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:91e62d9d206150ddc360af2628615572f3bcc314ae420ab59041e6e493477993"}, + {file = "ddtrace-3.19.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:251607dec183356cfe1ec8f102f01ac556a38136216f74e31b5748b6fa994d97"}, + {file = "ddtrace-3.19.7-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:6952e2e78f126dce55d4d988490bc76c24e439d52d2686ff618f8d7640534e61"}, + {file = "ddtrace-3.19.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82b7fbfedac7986274d2c947d247affdb9d918edcb6d65587ab9c1d8d81af9bf"}, + {file = "ddtrace-3.19.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b96f689ab0225d2d8934c4aa42a7ce1001b91fbf1ff8e8158a6428e0f0faece6"}, + {file = "ddtrace-3.19.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0995ac17c3e43fae6f6c2ac0d9a90d035ea13d629342f84ba7596ac002ce87"}, + {file = "ddtrace-3.19.7-cp313-cp313-win32.whl", hash = "sha256:846b695964580cb4d91c4600907119f38b57b792d7ff1f21793d2140157b820b"}, + {file = "ddtrace-3.19.7-cp313-cp313-win_amd64.whl", hash = "sha256:de1aabc50c663f27c1ae341d16b31bdc3b8fb1c28c4b8a683e9000cbfd11fa44"}, + {file = "ddtrace-3.19.7-cp313-cp313-win_arm64.whl", hash = "sha256:2d41fd500ec915be8b3b95cd7a5535f87323acbdc7e9b2c02797d83b6985b451"}, + {file = "ddtrace-3.19.7-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:528fb2565048e669cfe5ad0e24f4f39f73747977982c78339f9ece7e39430180"}, + {file = "ddtrace-3.19.7-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:29202bdd4496098b27907dfdfd85000549901461ebea6f0f90d19eb4ebac2b76"}, + {file = "ddtrace-3.19.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abb3b5b8cac3247b01d381fe71aeb56b20f8759275619701418e53f0306eb6a0"}, + {file = "ddtrace-3.19.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7d27d310e272aa7772fdf7087bd5056966448d8051586de75577076ad8c8e323"}, + {file = "ddtrace-3.19.7-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:aec1ec1fbcdafa76362c7f468aab240224d14060c4cda73e9a0676293be471c5"}, + {file = "ddtrace-3.19.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:26c300dbb6d8c29b6fcd4847da29010a988150a28426c4cc46e7e1f3816ea195"}, + {file = "ddtrace-3.19.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:8c3a74eda7907e5d4a5a36c62e02ee41fca10de83ae2f592e0a63530d8eda7aa"}, + {file = "ddtrace-3.19.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:79cdb4246da2a6e32b768a0c7f952890ddeb9c8bea9228adf2d82bcf66849177"}, + {file = "ddtrace-3.19.7-cp314-cp314-win32.whl", hash = "sha256:759d49298575079e31da354780ca37220775c80a007bbe2ae7fb756a11210740"}, + {file = "ddtrace-3.19.7-cp314-cp314-win_amd64.whl", hash = "sha256:054ebbdd1e02e90874cda803b31721f4e4ab6d0d3833bc8e82de8b78f1fc9d57"}, + {file = "ddtrace-3.19.7-cp314-cp314-win_arm64.whl", hash = "sha256:ff953b2d7dc8a7d8e8d452aa0f9ac1e094e9deba371f3715bc73613bc1fa0069"}, + {file = "ddtrace-3.19.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:c0139817f0acce19aa0bd07e09bd9be0844c5561e1d8d3d6c0a46f13256587c4"}, + {file = "ddtrace-3.19.7-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:f67b6129039b91447e8f412b5fca83c264c8b471d688d1c3a1fd7c2dc05b3b03"}, + {file = "ddtrace-3.19.7-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c35e49e472e3639e8827c9b78d99a64caba74bf96a920c74c62c6ed36df5dbf2"}, + {file = "ddtrace-3.19.7-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9411e4ad0fbf9ebf7afd2420f171408bb0468b8c714657124ae1f1f2391193cf"}, + {file = "ddtrace-3.19.7-cp38-cp38-manylinux_2_28_i686.whl", hash = "sha256:482a43cb3f33a8373a207965579eded1a2699fb0e624f80746455c8a9c839b63"}, + {file = "ddtrace-3.19.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:79e6e53a290901b7df39bd2c176865ca906f66d7a0ed6ca6e862abbdd4b85b6b"}, + {file = "ddtrace-3.19.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5fa9aa40d7fedc5682a7ca82ec9e68d96fd5714e89c17342e76f8ef37300238d"}, + {file = "ddtrace-3.19.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6feaf4786d6b419a5fb225e91d97010273dfc1b7d046ed1d0996b6bd9b03aec0"}, + {file = "ddtrace-3.19.7-cp38-cp38-win32.whl", hash = "sha256:52a465d4509f1bd8154bfd7e0198e4f8d209cb3e7d30202299189b174fdab034"}, + {file = "ddtrace-3.19.7-cp38-cp38-win_amd64.whl", hash = "sha256:dfa876c29b4694db345eadacbd03d94dfc19569990da0488680039b985d84f62"}, + {file = "ddtrace-3.19.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a7e978e52a718b01e71cce740ed77fca96a65ca2ff9c17c8e7be2757532057ee"}, + {file = "ddtrace-3.19.7-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:8e0dd6fa57f71f9adfc088aa9cf86e27ba86e94406329060742e362131ad49e5"}, + {file = "ddtrace-3.19.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22b712f9bab0471599ed8462b1640a81ea07aee7532c666fef6e6334d0b9c09e"}, + {file = "ddtrace-3.19.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51043397868ce03c5c629d1d03d15c29b9379f574b03ffa3bc2149892445c465"}, + {file = "ddtrace-3.19.7-cp39-cp39-manylinux_2_28_i686.whl", hash = "sha256:80f967464f04c2a4455ff2994af6cd12971f09e33f8c33c475dc9150cd1b5aad"}, + {file = "ddtrace-3.19.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f6712f94b8a08fe6746e7e48b76582c7c261c9a83474c4a8cc8ec1349e3810ad"}, + {file = "ddtrace-3.19.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a31cbe6c75fe6c07befd744993fb61159f02dc70689230b69161547cfbf5892b"}, + {file = "ddtrace-3.19.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3b7173b6395e3b9c8a20ca94433033b8647971b61648add055a24819fa3ce72f"}, + {file = "ddtrace-3.19.7-cp39-cp39-win32.whl", hash = "sha256:8d3066532620ea1e74639db041fb4aabbead9057a48adcd00c9aae65ca096bc9"}, + {file = "ddtrace-3.19.7-cp39-cp39-win_amd64.whl", hash = "sha256:4d7abb09a7a672efecc560c110c2668bfdfce8f6c28e45903af96441476872d2"}, + {file = "ddtrace-3.19.7.tar.gz", hash = "sha256:e531a7c6370458d0e61b498714969471514033f6851a4603ac62f2cac1adc925"}, +] + +[package.dependencies] +bytecode = {version = ">=0.13.0,<1", markers = "python_version < \"3.11\""} +envier = ">=0.6.1,<0.7.0" +opentelemetry-api = ">=1,<2" +wrapt = ">=1,<3" + +[package.extras] +opentelemetry = ["opentelemetry-exporter-otlp (>=1,<2)"] +opentracing = ["opentracing (>=2,<3)"] + +[[package]] +name = "ddtrace" +version = "4.7.1" +description = "Datadog APM client library" +optional = false +python-versions = "<3.15,>=3.9" +groups = ["main"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "ddtrace-4.7.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:74ba511e6669bd88dba1f9fe5d03170bc741305a97f6b8331f3d35ca754d8c82"}, + {file = "ddtrace-4.7.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:8149302841f058c68c57f1c89e4ee273d9f7de30fdeb2ae047d90a32dc1b6096"}, + {file = "ddtrace-4.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44c15ab0f7bb7cc932e3ca7481eb0d9f3fa917247cc03375887bf50b9c6ece54"}, + {file = "ddtrace-4.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7d3fe0451fddfacbed5ee62a91c632f01cacd57ec7152a6be67b916f4716f2e3"}, + {file = "ddtrace-4.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:be57f6a30560d92a01c780ead970df73fcf458a20c6aa4d936af8d1b0892a786"}, + {file = "ddtrace-4.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:67726c736a02131f062bd63e18a0badfc0f000e2462a0a69c4e8680f54e37d66"}, + {file = "ddtrace-4.7.1-cp310-cp310-win32.whl", hash = "sha256:279397251be2d8b3fc848b231c04fc1be5d299b91c51b831d34795f9ec387e95"}, + {file = "ddtrace-4.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:ae1872e10c138827fb7cb759cdde26d1fe2f66449b95e19f5cc22609fe1ca02b"}, + {file = "ddtrace-4.7.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:df5b3716e47421bb9e925a1ae8592cf2169eadf9a3e62be56baa16d0656be876"}, + {file = "ddtrace-4.7.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:78da43378062c4905f09d1ff58d4b49bd61f9440977f2b7be5dc0dc427ddbbe3"}, + {file = "ddtrace-4.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cb6ae35e377e987c59a42971c550937404079fea4666a158849a47587b39cf7"}, + {file = "ddtrace-4.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b07a9c689f115e70a8946d3002275808c01b31a350d8159e3e6562ddee379ad0"}, + {file = "ddtrace-4.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e717ee7b8484ea85882fb5d0c349fcead2b023ff8ab6e965072d5c4064d607ba"}, + {file = "ddtrace-4.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:613a74ce4ea692e2a8435266ad361d44bfd018d1d694ab38709ebf7df692af14"}, + {file = "ddtrace-4.7.1-cp311-cp311-win32.whl", hash = "sha256:b5f5cdc530a8baf28647dae8ea85d446534770d70ea8a30a8d3dde00af412a5b"}, + {file = "ddtrace-4.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:27c8812da8a73e239eb0bece274ef8cc95eb3093910f049b2ca0542756e2fcb8"}, + {file = "ddtrace-4.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:bad60c97ca058580c62e0ea4340d9dd86971c825fd65491a8e67d0998b2e6da3"}, + {file = "ddtrace-4.7.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:0331d57f4c21cabebc9819092a0527dc4677f7f509c877229d216255236d8b65"}, + {file = "ddtrace-4.7.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:be562ef7187e61a4c835e37fbd8a6d81f445d6811660929c94a9e6a9462c6fb4"}, + {file = "ddtrace-4.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5dd9d7fbd678bfa8d8e71278ea05cc257b0230221749554e87e4f1e9704c4efe"}, + {file = "ddtrace-4.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:57cff66524ed7e441cb14d98f402eb52a22455964375f8f5a696afddc1684eb9"}, + {file = "ddtrace-4.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9c5b4a96d19e905b4845a86aa7d94698414f1f427ffc0f092b80228f6b2b71a3"}, + {file = "ddtrace-4.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d353a200d9443e7db6e0528a9f148f98f9359dab7abec41571bf46f155de6bd9"}, + {file = "ddtrace-4.7.1-cp312-cp312-win32.whl", hash = "sha256:e998ef9d9a29648a06581a6ca8f53e8d1e67700b61105587909a69297e98660d"}, + {file = "ddtrace-4.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:51d671f2e2d8a4f0abe82511186849be3246b7d4dfb3a207465c7e1c772c42c2"}, + {file = "ddtrace-4.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:a95c13794f61f8016d117d28a9e301a2eba04121bf1fc90e20264ef8c7fab0a6"}, + {file = "ddtrace-4.7.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d8c4c19d21331611a3f98e10489125eee426205043577013d1095b1c4b55f220"}, + {file = "ddtrace-4.7.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:f679951bb2cf749cf53214a7b4d76ac6912dc4f05a3371b094d4d679615d3446"}, + {file = "ddtrace-4.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2f64a6e9e7df59873e4ab60cd6ca707c7943379d572c4836acbebfc357b3e050"}, + {file = "ddtrace-4.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b7323dcd5d78a8c7d65955e4dcd3db560d00c9e7f2f2138705a6fde67603adb5"}, + {file = "ddtrace-4.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6103fb99c84c0d1bedb121ad085f89b69dd4712ad49f3a1745bbaf5573e93901"}, + {file = "ddtrace-4.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57aa50af618880335fa813315034428811aecb6c78715436eeeaf7ff0b11ba49"}, + {file = "ddtrace-4.7.1-cp313-cp313-win32.whl", hash = "sha256:803b4b94f333e563a4521e545bc6d07ed2d2f4bad4843a9df29bf279c5d43cde"}, + {file = "ddtrace-4.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:c270b7d956c3186a17de358fb8c0600cb79c9028b769a0e1a975deab42a539d7"}, + {file = "ddtrace-4.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:de62971f25321416ac59f65afb2165482bc5b0ffbd450afa4ad586f3e0aa1c46"}, + {file = "ddtrace-4.7.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:022b058263acd3b8e8534d5cd2446330b9be296cab48d24d33f489d4da0f999e"}, + {file = "ddtrace-4.7.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:fc0c89c7ba67582a2fd4d6e2d803b94fd800dd4489cd777398a80c87fc0b216f"}, + {file = "ddtrace-4.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89776d556ff27f95bcac17fcac4aeaf2173058e167c1923047007e7861079bdb"}, + {file = "ddtrace-4.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:26ad10decfd1072ec803aaf94ec5bf499cdbafe9d85fbf1608b6217d495b3edb"}, + {file = "ddtrace-4.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0424306e0668f0adaa57d6b327948f5775c568afa91c5603559cc6a82d934515"}, + {file = "ddtrace-4.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f5ffd1dfdee50236bf3b1a4dc699884387d04518a0bca5db7559e9fde932d744"}, + {file = "ddtrace-4.7.1-cp314-cp314-win32.whl", hash = "sha256:b7f6196521f00cf220ed4575de8832f9c77f110c5e05038a226f4bd39e89c688"}, + {file = "ddtrace-4.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:4906a58c510f00851aacd6033c0687a7d6db82a7c5d6ed9399dac247f49335ba"}, + {file = "ddtrace-4.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:ae9c3429e304cf0b1b6852213f29af20eee9997cda575b3dc8a267bb66f04b1f"}, + {file = "ddtrace-4.7.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:1e3244d00daaa0560b806fd71383b39e1cdf268292fd08b9823beacaa4131cc9"}, + {file = "ddtrace-4.7.1-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:4183df7ba4efe3e1d3a0e204dbd51badb2de826dc9c3da57477d0a17f2640752"}, + {file = "ddtrace-4.7.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f0159bcf3b07916dfb5b6cc6cc7f80b08740b9c55f114657ab15563b17eb269e"}, + {file = "ddtrace-4.7.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8d35c1e41c5c65fb705eb0eadb51686eca4432af36c48555570558b6f57eae1c"}, + {file = "ddtrace-4.7.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:55555cb48a23892b5e3a89d84555de369df1fbd967b0397698b4178e6aff66ec"}, + {file = "ddtrace-4.7.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:622f8ae6ddf9167557d40b59134df94a72ee0b7318cb6aa03466883c9d972289"}, + {file = "ddtrace-4.7.1-cp39-cp39-win32.whl", hash = "sha256:4a601fe4e5c6bd31e0470420771eaf82576e30311b401bdb79c8dec68ef30d3d"}, + {file = "ddtrace-4.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:c4f778ae3fbe708a8360d68af8f36bd60be9d64af7d4cf670832f4a737ed252e"}, + {file = "ddtrace-4.7.1.tar.gz", hash = "sha256:51695b8b34881432ea9d46c42aa41343d5531d9fdddc1c65b721aa4b051ed848"}, ] [package.dependencies] bytecode = [ - {version = ">=0.13.0", markers = "python_version < \"3.11\""}, - {version = ">=0.16.0", markers = "python_version >= \"3.13.0\""}, - {version = ">=0.15.0", markers = "python_version ~= \"3.12.0\""}, - {version = ">=0.14.0", markers = "python_version ~= \"3.11.0\""}, -] -envier = ">=0.5,<1.0" -legacy-cgi = {version = ">=2.0.0", markers = "python_version >= \"3.13.0\""} -opentelemetry-api = ">=1" -protobuf = ">=3" -typing_extensions = "*" -wrapt = ">=1" -xmltodict = ">=0.12" + {version = ">=0.17.0,<1", markers = "python_version >= \"3.14.0\""}, + {version = ">=0.16.0,<1", markers = "python_version >= \"3.13.0\" and python_version < \"3.14.0\""}, + {version = ">=0.15.1,<1", markers = "python_version ~= \"3.12.0\""}, + {version = ">=0.14.0,<1", markers = "python_version ~= \"3.11.0\""}, + {version = ">=0.13.0,<1", markers = "python_version < \"3.11.0\""}, +] +envier = ">=0.6.1,<0.7.0" +opentelemetry-api = ">=1,<2" +wrapt = ">=1,<3" [package.extras] -openai = ["tiktoken"] -opentracing = ["opentracing (>=2.0.0)"] +opentelemetry = ["opentelemetry-exporter-otlp (>=1,<2)"] +opentracing = ["opentracing (>=2,<3)"] [[package]] name = "deprecated" @@ -410,19 +503,6 @@ files = [ {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] -[[package]] -name = "legacy-cgi" -version = "2.6.2" -description = "Fork of the standard library cgi and cgitb modules, being deprecated in PEP-594" -optional = false -python-versions = ">=3.10" -groups = ["main"] -markers = "python_version >= \"3.13.0\"" -files = [ - {file = "legacy_cgi-2.6.2-py3-none-any.whl", hash = "sha256:a7b83afb1baf6ebeb56522537c5943ef9813cf933f6715e88a803f7edbce0bff"}, - {file = "legacy_cgi-2.6.2.tar.gz", hash = "sha256:9952471ceb304043b104c22d00b4f333cac27a6abe446d8a528fc437cf13c85f"}, -] - [[package]] name = "mccabe" version = "0.7.0" @@ -482,27 +562,6 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "protobuf" -version = "5.29.5" -description = "" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "protobuf-5.29.5-cp310-abi3-win32.whl", hash = "sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079"}, - {file = "protobuf-5.29.5-cp310-abi3-win_amd64.whl", hash = "sha256:3f76e3a3675b4a4d867b52e4a5f5b78a2ef9565549d4037e06cf7b0942b1d3fc"}, - {file = "protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671"}, - {file = "protobuf-5.29.5-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:fa18533a299d7ab6c55a238bf8629311439995f2e7eca5caaff08663606e9015"}, - {file = "protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61"}, - {file = "protobuf-5.29.5-cp38-cp38-win32.whl", hash = "sha256:ef91363ad4faba7b25d844ef1ada59ff1604184c0bcd8b39b8a6bef15e1af238"}, - {file = "protobuf-5.29.5-cp38-cp38-win_amd64.whl", hash = "sha256:7318608d56b6402d2ea7704ff1e1e4597bee46d760e7e4dd42a3d45e24b87f2e"}, - {file = "protobuf-5.29.5-cp39-cp39-win32.whl", hash = "sha256:6f642dc9a61782fa72b90878af134c5afe1917c89a568cd3476d758d3c3a0736"}, - {file = "protobuf-5.29.5-cp39-cp39-win_amd64.whl", hash = "sha256:470f3af547ef17847a28e1f47200a1cbf0ba3ff57b7de50d22776607cd2ea353"}, - {file = "protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5"}, - {file = "protobuf-5.29.5.tar.gz", hash = "sha256:bc1463bafd4b0929216c35f437a8e28731a2b7fe3d98bb77a600efced5a15c84"}, -] - [[package]] name = "py-cpuinfo" version = "9.0.0" @@ -542,6 +601,22 @@ files = [ {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, ] +[[package]] +name = "pygments" +version = "2.20.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.10\" and extra == \"dev\"" +files = [ + {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, + {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + [[package]] name = "pytest" version = "8.3.4" @@ -549,7 +624,7 @@ description = "pytest: simple powerful testing with Python" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "extra == \"dev\"" +markers = "python_version < \"3.10\" and extra == \"dev\"" files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -566,6 +641,31 @@ tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "pytest" +version = "9.0.3" +description = "pytest: simple powerful testing with Python" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\" and extra == \"dev\"" +files = [ + {file = "pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9"}, + {file = "pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c"}, +] + +[package.dependencies] +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} +iniconfig = ">=1.0.1" +packaging = ">=22" +pluggy = ">=1.5,<2" +pygments = ">=2.7.2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] + [[package]] name = "pytest-benchmark" version = "4.0.0" @@ -611,6 +711,7 @@ description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" groups = ["main"] +markers = "python_version < \"3.10\"" files = [ {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, @@ -626,6 +727,29 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "requests" +version = "2.33.1" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a"}, + {file = "requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517"}, +] + +[package.dependencies] +certifi = ">=2023.5.7" +charset_normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.26,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<8)"] + [[package]] name = "six" version = "1.17.0" @@ -689,6 +813,7 @@ description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" groups = ["main"] +markers = "python_version < \"3.10\"" files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -701,6 +826,7 @@ description = "Ultra fast JSON encoder and decoder for Python" optional = false python-versions = ">=3.8" groups = ["main"] +markers = "python_version < \"3.10\"" files = [ {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, @@ -782,6 +908,95 @@ files = [ {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, ] +[[package]] +name = "ujson" +version = "5.12.0" +description = "Ultra fast JSON encoder and decoder for Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "ujson-5.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:38051f36423f084b909aaadb3b41c9c6a2958e86956ba21a8489636911e87504"}, + {file = "ujson-5.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:457fabc2700a8e6ddb85bc5a1d30d3345fe0d3ec3ee8161a4e032ec585801dfa"}, + {file = "ujson-5.12.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57930ac9519099b852e190d2c04b1fb5d97ea128db33bce77ed874eccb4c7f09"}, + {file = "ujson-5.12.0-cp310-cp310-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:9b3b86ec3e818f3dd3e13a9de628e88a9990f4af68ecb0b12dd3de81227f0a26"}, + {file = "ujson-5.12.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:460e76a4daff214ae33ab959494962c93918cb44714ea3e3f748b14aa37f8a87"}, + {file = "ujson-5.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e584d0cdd37cac355aca52ed788d1a2d939d6837e2870d3b70e585db24025a50"}, + {file = "ujson-5.12.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0fe9128e75c6aa6e9ae06c1408d6edd9179a2fef0fe6d9cda3166b887eba521d"}, + {file = "ujson-5.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3ed5cb149892141b1e77ef312924a327f2cc718b34247dae346ed66329e1b8be"}, + {file = "ujson-5.12.0-cp310-cp310-win32.whl", hash = "sha256:973b7d7145b1ac553a7466a64afa8b31ec2693d7c7fff6a755059e0a2885dfd2"}, + {file = "ujson-5.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:1d072a403d82aef8090c6d4f728e3a727dfdba1ad3b7fa3a052c3ecbd37e73cb"}, + {file = "ujson-5.12.0-cp310-cp310-win_arm64.whl", hash = "sha256:55ede2a7a051b3b7e71a394978a098d71b3783e6b904702ff45483fad434ae2d"}, + {file = "ujson-5.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58a11cb49482f1a095a2bd9a1d81dd7c8fb5d2357f959ece85db4e46a825fd00"}, + {file = "ujson-5.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9b3cf13facf6f77c283af0e1713e5e8c47a0fe295af81326cb3cb4380212e797"}, + {file = "ujson-5.12.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb94245a715b4d6e24689de12772b85329a1f9946cbf6187923a64ecdea39e65"}, + {file = "ujson-5.12.0-cp311-cp311-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:0fe6b8b8968e11dd9b2348bd508f0f57cf49ab3512064b36bc4117328218718e"}, + {file = "ujson-5.12.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89e302abd3749f6d6699691747969a5d85f7c73081d5ed7e2624c7bd9721a2ab"}, + {file = "ujson-5.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0727363b05ab05ee737a28f6200dc4078bce6b0508e10bd8aab507995a15df61"}, + {file = "ujson-5.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b62cb9a7501e1f5c9ffe190485501349c33e8862dde4377df774e40b8166871f"}, + {file = "ujson-5.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a6ec5bf6bc361f2f0f9644907a36ce527715b488988a8df534120e5c34eeda94"}, + {file = "ujson-5.12.0-cp311-cp311-win32.whl", hash = "sha256:006428d3813b87477d72d306c40c09f898a41b968e57b15a7d88454ecc42a3fb"}, + {file = "ujson-5.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:40aa43a7a3a8d2f05e79900858053d697a88a605e3887be178b43acbcd781161"}, + {file = "ujson-5.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:561f89cc82deeae82e37d4a4764184926fb432f740a9691563a391b13f7339a4"}, + {file = "ujson-5.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:09b4beff9cc91d445d5818632907b85fb06943b61cb346919ce202668bf6794a"}, + {file = "ujson-5.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca0c7ce828bb76ab78b3991904b477c2fd0f711d7815c252d1ef28ff9450b052"}, + {file = "ujson-5.12.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2d79c6635ccffcbfc1d5c045874ba36b594589be81d50d43472570bb8de9c57"}, + {file = "ujson-5.12.0-cp312-cp312-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:7e07f6f644d2c44d53b7a320a084eef98063651912c1b9449b5f45fcbdc6ccd2"}, + {file = "ujson-5.12.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:085b6ce182cdd6657481c7c4003a417e0655c4f6e58b76f26ee18f0ae21db827"}, + {file = "ujson-5.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:16b4fe9c97dc605f5e1887a9e1224287291e35c56cbc379f8aa44b6b7bcfe2bb"}, + {file = "ujson-5.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0d2e8db5ade3736a163906154ca686203acc7d1d30736cbf577c730d13653d84"}, + {file = "ujson-5.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93bc91fdadcf046da37a214eaa714574e7e9b1913568e93bb09527b2ceb7f759"}, + {file = "ujson-5.12.0-cp312-cp312-win32.whl", hash = "sha256:2a248750abce1c76fbd11b2e1d88b95401e72819295c3b851ec73399d6849b3d"}, + {file = "ujson-5.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:1b5c6ceb65fecd28a1d20d1eba9dbfa992612b86594e4b6d47bb580d2dd6bcb3"}, + {file = "ujson-5.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:9a5fcbe7b949f2e95c47ea8a80b410fcdf2da61c98553b45a4ee875580418b68"}, + {file = "ujson-5.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:15d416440148f3e56b9b244fdaf8a09fcf5a72e4944b8e119f5bf60417a2bfc8"}, + {file = "ujson-5.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e0dd3676ea0837cd70ea1879765e9e9f6be063be0436de9b3ea4b775caf83654"}, + {file = "ujson-5.12.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7bbf05c38debc90d1a195b11340cc85cb43ab3e753dc47558a3a84a38cbc72da"}, + {file = "ujson-5.12.0-cp313-cp313-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:3c2f947e55d3c7cfe124dd4521ee481516f3007d13c6ad4bf6aeb722e190eb1b"}, + {file = "ujson-5.12.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ea6206043385343aff0b7da65cf73677f6f5e50de8f1c879e557f4298cac36a"}, + {file = "ujson-5.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb349dbba57c76eec25e5917e07f35aabaf0a33b9e67fc13d188002500106487"}, + {file = "ujson-5.12.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:937794042342006f707837f38d721426b11b0774d327a2a45c0bd389eb750a87"}, + {file = "ujson-5.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6ad57654570464eb1b040b5c353dee442608e06cff9102b8fcb105565a44c9ed"}, + {file = "ujson-5.12.0-cp313-cp313-win32.whl", hash = "sha256:76bf3e7406cf23a3e1ca6a23fb1fb9ea82f4f6bd226fe226e09146b0194f85dc"}, + {file = "ujson-5.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:15e555c4caca42411270b2ed2b2ebc7b3a42bb04138cef6c956e1f1d49709fe2"}, + {file = "ujson-5.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:bd03472c36fa3a386a6deb887113b9e3fa40efba8203eb4fe786d3c0ccc724f6"}, + {file = "ujson-5.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85833bca01aa5cae326ac759276dc175c5fa3f7b3733b7d543cf27f2df12d1ef"}, + {file = "ujson-5.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d22cad98c2a10bbf6aa083a8980db6ed90d4285a841c4de892890c2b28286ef9"}, + {file = "ujson-5.12.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99cc80facad240b0c2fb5a633044420878aac87a8e7c348b9486450cba93f27c"}, + {file = "ujson-5.12.0-cp314-cp314-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:d1831c07bd4dce53c4b666fa846c7eba4b7c414f2e641a4585b7f50b72f502dc"}, + {file = "ujson-5.12.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e00cec383eab2406c9e006bd4edb55d284e94bb943fda558326048178d26961"}, + {file = "ujson-5.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f19b3af31d02a2e79c5f9a6deaab0fb3c116456aeb9277d11720ad433de6dfc6"}, + {file = "ujson-5.12.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:bacbd3c69862478cbe1c7ed4325caedec580d8acf31b8ee1b9a1e02a56295cad"}, + {file = "ujson-5.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94c5f1621cbcab83c03be46441f090b68b9f307b6c7ec44d4e3f6d5997383df4"}, + {file = "ujson-5.12.0-cp314-cp314-win32.whl", hash = "sha256:e6369ac293d2cc40d52577e4fa3d75a70c1aae2d01fa3580a34a4e6eff9286b9"}, + {file = "ujson-5.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:31348a0ffbfc815ce78daac569d893349d85a0b57e1cd2cdbba50b7f333784da"}, + {file = "ujson-5.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:6879aed770557f0961b252648d36f6fdaab41079d37a2296b5649fd1b35608e0"}, + {file = "ujson-5.12.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7ddb08b3c2f9213df1f2e3eb2fbea4963d80ec0f8de21f0b59898e34f3b3d96d"}, + {file = "ujson-5.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0a3ae28f0b209be5af50b54ca3e2123a3de3a57d87b75f1e5aa3d7961e041983"}, + {file = "ujson-5.12.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30ad4359413c8821cc7b3707f7ca38aa8bc852ba3b9c5a759ee2d7740157315"}, + {file = "ujson-5.12.0-cp314-cp314t-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:02f93da7a4115e24f886b04fd56df1ee8741c2ce4ea491b7ab3152f744ad8f8e"}, + {file = "ujson-5.12.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3ff4ede90ed771140caa7e1890de17431763a483c54b3c1f88bd30f0cc1affc0"}, + {file = "ujson-5.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bf9cc97f05048ac8f3e02cd58f0fe62b901453c24345bfde287f4305dcc31c"}, + {file = "ujson-5.12.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:2324d9a0502317ffc35d38e153c1b2fa9610ae03775c9d0f8d0cca7b8572b04e"}, + {file = "ujson-5.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:50524f4f6a1c839714dbaff5386a1afb245d2d5ec8213a01fbc99cea7307811e"}, + {file = "ujson-5.12.0-cp314-cp314t-win32.whl", hash = "sha256:f7a0430d765f9bda043e6aefaba5944d5f21ec43ff4774417d7e296f61917382"}, + {file = "ujson-5.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:ccbfd94e59aad4a2566c71912b55f0547ac1680bfac25eb138e6703eb3dd434e"}, + {file = "ujson-5.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:42d875388fbd091c7ea01edfff260f839ba303038ffb23475ef392012e4d63dd"}, + {file = "ujson-5.12.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:bf85a00ac3b56a1e7a19c5be7b02b5180a0895ac4d3c234d717a55e86960691c"}, + {file = "ujson-5.12.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:64df53eef4ac857eb5816a56e2885ccf0d7dff6333c94065c93b39c51063e01d"}, + {file = "ujson-5.12.0-graalpy312-graalpy250_312_native-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c0aed6a4439994c9666fb8a5b6c4eac94d4ef6ddc95f9b806a599ef83547e3b"}, + {file = "ujson-5.12.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efae5df7a8cc8bdb1037b0f786b044ce281081441df5418c3a0f0e1f86fe7bb3"}, + {file = "ujson-5.12.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:8712b61eb1b74a4478cfd1c54f576056199e9f093659334aeb5c4a6b385338e5"}, + {file = "ujson-5.12.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:871c0e5102e47995b0e37e8df7819a894a6c3da0d097545cd1f9f1f7d7079927"}, + {file = "ujson-5.12.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:56ba3f7abbd6b0bb282a544dc38406d1a188d8bb9164f49fdb9c2fee62cb29da"}, + {file = "ujson-5.12.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c5a52987a990eb1bae55f9000994f1afdb0326c154fb089992f839ab3c30688"}, + {file = "ujson-5.12.0-pp311-pypy311_pp73-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:adf28d13a33f9d750fe7a78fb481cac298fa257d8863d8727b2ea4455ea41235"}, + {file = "ujson-5.12.0-pp311-pypy311_pp73-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51acc750ec7a2df786cdc868fb16fa04abd6269a01d58cf59bafc57978773d8e"}, + {file = "ujson-5.12.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:ab9056d94e5db513d9313b34394f3a3b83e6301a581c28ad67773434f3faccab"}, + {file = "ujson-5.12.0.tar.gz", hash = "sha256:14b2e1eb528d77bc0f4c5bd1a7ebc05e02b5b41beefb7e8567c9675b8b13bcf4"}, +] + [[package]] name = "urllib3" version = "1.26.20" @@ -802,22 +1017,22 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "urllib3" -version = "2.3.0" +version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" groups = ["main"] markers = "python_version >= \"3.10\"" files = [ - {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, - {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [package.extras] -brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "wrapt" @@ -908,18 +1123,6 @@ files = [ {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, ] -[[package]] -name = "xmltodict" -version = "0.14.2" -description = "Makes working with XML feel like you are working with JSON" -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, - {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, -] - [[package]] name = "zipp" version = "3.20.2" @@ -941,9 +1144,9 @@ test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.funct type = ["pytest-mypy"] [extras] -dev = ["botocore", "flake8", "pytest", "pytest-benchmark", "requests"] +dev = ["botocore", "flake8", "pytest", "pytest", "pytest-benchmark", "requests", "requests"] [metadata] lock-version = "2.1" -python-versions = ">=3.8.0,<4" -content-hash = "f6a2f7355200da107aa5b027d6fe4fb6bdb5a898ce8298a56e6ac39fe8d8e34d" +python-versions = ">=3.8.0,<3.15" +content-hash = "3da1bc2540691200481913d90171aa3a6a3700cb32059b9462dfd64f9f51d092" diff --git a/pyproject.toml b/pyproject.toml index ec95a7385..5fe65ae7d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ classifiers = [ ] [tool.poetry.dependencies] -python = ">=3.8.0,<4" +python = ">=3.8.0,<3.15" datadog = ">=0.51.0,<1.0.0" wrapt = "^1.11.2" ddtrace = [ @@ -35,11 +35,21 @@ ddtrace = [ ] ujson = [ {version = ">=5.10.0,<5.12.0", python = ">=3.8,<3.10"}, - {version = ">=5.12.0", python = ">=3.10"} + {version = "^5.12.0", python = ">=3.10"}, +] +urllib3 = [ + {version = ">=1.25.4,<1.27", python = ">=3.8,<3.10"}, + {version = "^2.6.3", python = ">=3.10"}, ] botocore = { version = "^1.34.0", optional = true } -requests = { version ="^2.22.0", optional = true } -pytest = { version= "^8.0.0", optional = true } +requests = [ + { version = "^2.22.0", optional = true, python = ">=3.8,<3.10" }, + { version = "^2.33.0", optional = true, python = ">=3.10" }, +] +pytest = [ + { version = "^8.3.4", optional = true, python = ">=3.8,<3.10" }, + { version = "^9.0.3", optional = true, python = ">=3.10" }, +] pytest-benchmark = { version = "^4.0", optional = true } flake8 = { version = "^5.0.4", optional = true } diff --git a/tests/integration/package-lock.json b/tests/integration/package-lock.json index 5990cc8db..c761c5503 100644 --- a/tests/integration/package-lock.json +++ b/tests/integration/package-lock.json @@ -57,7 +57,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/appdirectory/-/appdirectory-0.1.0.tgz", "integrity": "sha512-DJ5DV8vZXBbusyiyPlH28xppwS8eAMRuuyMo88xeEcf4bV64lbLtbxRxqixZuJBXsZzLtXFmA13GwVjJc7vdQw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "license": "MIT" }, @@ -76,9 +75,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -355,7 +354,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -405,7 +403,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -517,9 +514,9 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -569,7 +566,6 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", "dev": true, "license": "MIT" }, @@ -607,9 +603,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -633,6 +629,27 @@ "dev": true, "license": "MIT" }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -763,7 +780,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -784,9 +800,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -797,11 +813,14 @@ } }, "node_modules/serverless-plugin-datadog": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/serverless-plugin-datadog/-/serverless-plugin-datadog-2.18.0.tgz", - "integrity": "sha512-RUdCNjUk+uUKQYgQBjK0WNeYJ7lM2/RScqg/LjVSfv5EACeJ3iIUPz1c4bS2jtiH05al8qXudNb6QDkv9zxG7w==", + "version": "2.34.1", + "resolved": "https://registry.npmjs.org/serverless-plugin-datadog/-/serverless-plugin-datadog-2.34.1.tgz", + "integrity": "sha512-oDLh+73a7UPgagvWbMGkbTXK2n7+zGeN8aGDhxza5P0jJFpdwICFArkC72CTLOVcY4JYpgB7VAvbbVS9HAamOA==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "dependencies": { + "node-fetch": "^2.6.1" + } }, "node_modules/serverless-python-requirements": { "version": "6.1.2", @@ -895,9 +914,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", "engines": { @@ -932,6 +951,37 @@ "node": ">= 6" } }, + "node_modules/split2/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/split2/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/sprintf-kit": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.2.tgz", @@ -995,6 +1045,13 @@ "node": ">=8" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, "node_modules/type": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", @@ -1029,6 +1086,24 @@ "dev": true, "license": "MIT" }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/tests/integration/package.json b/tests/integration/package.json index 8dae6acaa..a3ac9ef51 100644 --- a/tests/integration/package.json +++ b/tests/integration/package.json @@ -2,5 +2,11 @@ "devDependencies": { "serverless-plugin-datadog": "^2.18.0", "serverless-python-requirements": "^6.1.2" + }, + "resolutions": { + "minimatch": "^3.1.3" + }, + "overrides": { + "minimatch": "^3.1.3" } } diff --git a/tests/integration/requirements.txt b/tests/integration/requirements.txt index 343ea0257..0275d888c 100644 --- a/tests/integration/requirements.txt +++ b/tests/integration/requirements.txt @@ -1,4 +1,5 @@ certifi==2024.12.14 charset-normalizer==3.4.1 idna==3.10 -requests==2.32.4 +requests==2.32.4; python_version < "3.10" +requests==2.33.1; python_version >= "3.10" diff --git a/tests/integration/yarn.lock b/tests/integration/yarn.lock index 7477e8dae..fc8b4d916 100644 --- a/tests/integration/yarn.lock +++ b/tests/integration/yarn.lock @@ -2,62 +2,62 @@ # yarn lockfile v1 -"@iarna/toml@^2.2.5": - version "2.2.5" - resolved "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz" - integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== - "2-thenable@^1.0.0": version "1.0.0" - resolved "https://registry.npmjs.org/2-thenable/-/2-thenable-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/2-thenable/-/2-thenable-1.0.0.tgz#56e9a2e363293b1e507f501aac1aa9927670b2fc" integrity sha512-HqiDzaLDFCXkcCO/SwoyhRwqYtINFHF7t9BDRq4x90TOKNAJpiqUt9X5lQ08bwxYzc067HUywDjGySpebHcUpw== dependencies: d "1" es5-ext "^0.10.47" +"@iarna/toml@^2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" + integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== + ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^4.0.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" appdirectory@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/appdirectory/-/appdirectory-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/appdirectory/-/appdirectory-0.1.0.tgz#eb6c816320e7b2ab16f5ed997f28d8205df56375" integrity sha512-DJ5DV8vZXBbusyiyPlH28xppwS8eAMRuuyMo88xeEcf4bV64lbLtbxRxqixZuJBXsZzLtXFmA13GwVjJc7vdQw== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bluebird@^3.7.2: version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + version "1.1.14" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.14.tgz#d9de602370d91347cd9ddad1224d4fd701eb348b" + integrity sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" camelcase@^5.0.0: version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== child-process-ext@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/child-process-ext/-/child-process-ext-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/child-process-ext/-/child-process-ext-2.1.1.tgz#f7cf4e68fef60c4c8ee911e1b402413191467dc3" integrity sha512-0UQ55f51JBkOFa+fvR76ywRzxiPwQS3Xe8oe5bZRphpv+dIMeerW5Zn5e4cUy4COJwVtJyU0R79RMnw+aCqmGA== dependencies: cross-spawn "^6.0.5" @@ -68,7 +68,7 @@ child-process-ext@^2.1.1: cliui@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: string-width "^4.2.0" @@ -77,29 +77,29 @@ cliui@^6.0.0: color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cross-spawn@^6.0.5: version "6.0.6" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== dependencies: nice-try "^1.0.4" @@ -108,9 +108,9 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -d@^1.0.1, d@^1.0.2, d@1: +d@1, d@^1.0.1, d@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/d/-/d-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de" integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== dependencies: es5-ext "^0.10.64" @@ -118,12 +118,12 @@ d@^1.0.1, d@^1.0.2, d@1: decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== duration@^0.2.2: version "0.2.2" - resolved "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz" + resolved "https://registry.yarnpkg.com/duration/-/duration-0.2.2.tgz#ddf149bc3bc6901150fe9017111d016b3357f529" integrity sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg== dependencies: d "1" @@ -131,12 +131,12 @@ duration@^0.2.2: emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== es5-ext@^0.10.35, es5-ext@^0.10.47, es5-ext@^0.10.49, es5-ext@^0.10.53, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14, es5-ext@~0.10.46: version "0.10.64" - resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714" integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== dependencies: es6-iterator "^2.0.3" @@ -146,7 +146,7 @@ es5-ext@^0.10.35, es5-ext@^0.10.47, es5-ext@^0.10.49, es5-ext@^0.10.53, es5-ext@ es6-iterator@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== dependencies: d "1" @@ -155,7 +155,7 @@ es6-iterator@^2.0.3: es6-symbol@^3.1.1, es6-symbol@^3.1.3: version "3.1.4" - resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c" integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== dependencies: d "^1.0.2" @@ -163,7 +163,7 @@ es6-symbol@^3.1.1, es6-symbol@^3.1.3: esniff@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== dependencies: d "^1.0.1" @@ -173,7 +173,7 @@ esniff@^2.0.1: event-emitter@^0.3.5: version "0.3.5" - resolved "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== dependencies: d "1" @@ -181,14 +181,14 @@ event-emitter@^0.3.5: ext@^1.7.0: version "1.7.0" - resolved "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== dependencies: type "^2.7.2" find-up@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -196,7 +196,7 @@ find-up@^4.1.0: fs-extra@^10.1.0: version "10.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" @@ -205,17 +205,17 @@ fs-extra@^10.1.0: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== get-caller-file@^2.0.1: version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== glob-all@^3.3.1: version "3.3.1" - resolved "https://registry.npmjs.org/glob-all/-/glob-all-3.3.1.tgz" + resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.3.1.tgz#6be2d5d8276902319f640fbf839fbe15b35e7667" integrity sha512-Y+ESjdI7ZgMwfzanHZYQ87C59jOO0i+Hd+QYtVt9PhLi6d8wlOpzQnfBxWUlaTuAoR3TkybLqqbIoWveU4Ji7Q== dependencies: glob "^7.2.3" @@ -223,7 +223,7 @@ glob-all@^3.3.1: glob@^7.1.3, glob@^7.2.3: version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -235,80 +235,80 @@ glob@^7.1.3, glob@^7.2.3: graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== immediate@~3.0.5: version "3.0.6" - resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@^2.0.3, inherits@~2.0.3, inherits@2: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== is-docker@^2.0.0: version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-primitive@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-3.0.1.tgz#98c4db1abff185485a657fc2905052b940524d05" integrity sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w== is-stream@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-wsl@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" isarray@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + version "6.2.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" + integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== dependencies: universalify "^2.0.0" optionalDependencies: @@ -316,7 +316,7 @@ jsonfile@^6.0.1: jszip@^3.10.1: version "3.10.1" - resolved "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== dependencies: lie "~3.3.0" @@ -326,36 +326,36 @@ jszip@^3.10.1: lie@~3.3.0: version "3.3.0" - resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== dependencies: immediate "~3.0.5" locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" lodash.get@^4.4.2: version "4.4.2" - resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== lodash.uniqby@^4.7.0: version "4.7.0" - resolved "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== lodash.values@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha512-r0RwvdCv8id9TUblb/O7rYPwVy6lerCbcawrfdo9iC/1t1wsNMJknO79WNBgwkH0hIeJ08jmvvESbFpNb4jH0Q== log@^6.0.0: version "6.3.2" - resolved "https://registry.npmjs.org/log/-/log-6.3.2.tgz" + resolved "https://registry.yarnpkg.com/log/-/log-6.3.2.tgz#8e37a672b06161acc994e2b679726c7f3c011016" integrity sha512-ek8NRg/OPvS9ISOJNWNAz5vZcpYacWNFDWNJjj5OXsc6YuKacfey6wF04cXz/tOJIVrZ2nGSkHpAY5qKtF6ISg== dependencies: d "^1.0.2" @@ -366,77 +366,84 @@ log@^6.0.0: type "^2.7.3" uni-global "^1.0.0" -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== +minimatch@^3.1.1, minimatch@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== dependencies: brace-expansion "^1.1.7" next-tick@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== nice-try@^1.0.4: version "1.0.5" - resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-fetch@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + once@^1.3.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@~1.0.2: version "1.0.11" - resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== readable-stream@^3.0.0: version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -445,7 +452,7 @@ readable-stream@^3.0.0: readable-stream@~2.3.6: version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -458,44 +465,51 @@ readable-stream@~2.3.6: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + semver@^5.5.0: version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^7.6.0: - version "7.6.3" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + version "7.7.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== serverless-plugin-datadog@^2.18.0: - version "2.18.0" - resolved "https://registry.npmjs.org/serverless-plugin-datadog/-/serverless-plugin-datadog-2.18.0.tgz" - integrity sha512-RUdCNjUk+uUKQYgQBjK0WNeYJ7lM2/RScqg/LjVSfv5EACeJ3iIUPz1c4bS2jtiH05al8qXudNb6QDkv9zxG7w== + version "2.34.1" + resolved "https://registry.yarnpkg.com/serverless-plugin-datadog/-/serverless-plugin-datadog-2.34.1.tgz#be9de0f9515be1211fdb578db650b716340b9470" + integrity sha512-oDLh+73a7UPgagvWbMGkbTXK2n7+zGeN8aGDhxza5P0jJFpdwICFArkC72CTLOVcY4JYpgB7VAvbbVS9HAamOA== + dependencies: + node-fetch "^2.6.1" serverless-python-requirements@^6.1.2: version "6.1.2" - resolved "https://registry.npmjs.org/serverless-python-requirements/-/serverless-python-requirements-6.1.2.tgz" + resolved "https://registry.yarnpkg.com/serverless-python-requirements/-/serverless-python-requirements-6.1.2.tgz#21a222c06ac52736c969b60e251a7e2f606a6a33" integrity sha512-pas27CBxxaLTU5XMYnCVPJc+LVdm65Ys5olNvRWRqfUaZwTfD/7KSSt2XPSRme8BeJubroslaiOtWPP+IrxTVA== dependencies: "@iarna/toml" "^2.2.5" @@ -517,12 +531,12 @@ serverless-python-requirements@^6.1.2: set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-value@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/set-value/-/set-value-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-4.1.0.tgz#aa433662d87081b75ad88a4743bd450f044e7d09" integrity sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw== dependencies: is-plain-object "^2.0.4" @@ -530,114 +544,139 @@ set-value@^4.1.0: setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== sha256-file@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/sha256-file/-/sha256-file-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/sha256-file/-/sha256-file-1.0.0.tgz#02cade5e658da3fbc167c3270bdcdfd5409f1b65" integrity sha512-nqf+g0veqgQAkDx0U2y2Tn2KWyADuuludZTw9A7J3D+61rKlIIl9V5TS4mfnwKuXZOH9B7fQyjYJ9pKRHIsAyg== shebang-command@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shell-quote@^1.8.1: - version "1.8.2" - resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz" - integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + version "1.8.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" + integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== split2@^3.1.1: version "3.2.2" - resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: readable-stream "^3.0.0" sprintf-kit@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/sprintf-kit/-/sprintf-kit-2.0.2.tgz#e79f0c6076d2bc656b5fb55fa43b737ca98d3ecf" integrity sha512-lnapdj6W4LflHZGKvl9eVkz5YF0xaTrqpRWVA4cNVOTedwqifIP8ooGImldzT/4IAN5KXFQAyXTdLidYVQdyag== dependencies: es5-ext "^0.10.64" stream-promise@^3.2.0: version "3.2.0" - resolved "https://registry.npmjs.org/stream-promise/-/stream-promise-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/stream-promise/-/stream-promise-3.2.0.tgz#bad976f2d0e1f11d56cc95cc11907cfd869a27ff" integrity sha512-P+7muTGs2C8yRcgJw/PPt61q7O517tDHiwYEzMWo1GSBCcZedUMT/clz7vUNsSxFphIlJ6QUL4GexQKlfJoVtA== dependencies: "2-thenable" "^1.0.0" es5-ext "^0.10.49" is-stream "^1.1.0" -string_decoder@^1.1.1, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + type@^2.5.0, type@^2.7.2, type@^2.7.3: version "2.7.3" - resolved "https://registry.npmjs.org/type/-/type-2.7.3.tgz" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.3.tgz#436981652129285cc3ba94f392886c2637ea0486" integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ== uni-global@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/uni-global/-/uni-global-1.0.0.tgz#3583c449e87a2d9dc270ea221410a649bcdad040" integrity sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw== dependencies: type "^2.5.0" universalify@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-module@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which@^1.2.9: version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -646,17 +685,17 @@ wrap-ansi@^6.2.0: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== y18n@^4.0.0: version "4.0.3" - resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== yargs-parser@^18.1.2: version "18.1.3" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" @@ -664,7 +703,7 @@ yargs-parser@^18.1.2: yargs@^15.3.1: version "15.4.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" From 3137af05ee59b01689cce2700cbb6e4ce13a89ea Mon Sep 17 00:00:00 2001 From: Olivier Nzia Date: Thu, 16 Apr 2026 10:39:26 -0400 Subject: [PATCH 160/164] v8.124.0 (#798) --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index d11f7a1f6..a1dc127d2 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.124.0.dev0" +__version__ = "8.124.0" diff --git a/pyproject.toml b/pyproject.toml index 5fe65ae7d..349942457 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.124.0.dev0" +version = "8.124.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 714156f80a9c0b258a582e63c0f2989e7dd92a89 Mon Sep 17 00:00:00 2001 From: Nicolas Catoni Date: Thu, 16 Apr 2026 18:36:41 +0200 Subject: [PATCH 161/164] chore(ci): use dd-sts for system-tests test optimization (#788) * chore(ci): use dd-sts for system-tests test optimization * chore(ci): remove dd_sts_policy from system-tests subworkflow * chore(ci): remove unneeded permissions from system-tests subworkflow * chore(ci): pin system-tests workflow to 1e5d6b709 * Remove API key * fix: add contents:read permission to system-tests workflow call * chore(ci): pass ref to system-tests reusable workflow --- .github/workflows/system_tests.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/system_tests.yml b/.github/workflows/system_tests.yml index f6e23a0f0..04e082460 100644 --- a/.github/workflows/system_tests.yml +++ b/.github/workflows/system_tests.yml @@ -28,15 +28,13 @@ jobs: system-tests: needs: - build - uses: DataDog/system-tests/.github/workflows/system-tests.yml@main - secrets: - DD_API_KEY: ${{ secrets.DD_API_KEY }} - TEST_OPTIMIZATION_API_KEY: ${{ secrets.TEST_OPTIMIZATION_API_KEY }} + uses: DataDog/system-tests/.github/workflows/system-tests.yml@1e5d6b7096279ca43ce4826fda3cc805635b63c1 permissions: contents: read - packages: write + id-token: write with: library: python_lambda + ref: 1e5d6b7096279ca43ce4826fda3cc805635b63c1 binaries_artifact: binaries scenarios_groups: tracer_release skip_empty_scenarios: true From c44193198f8e2305b48e01979b37ce18e0fe8ccb Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Fri, 17 Apr 2026 10:27:11 -0400 Subject: [PATCH 162/164] v8.125.0.dev0 --- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index a1dc127d2..0c1404f80 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "8.124.0" +__version__ = "8.125.0.dev0" diff --git a/pyproject.toml b/pyproject.toml index 349942457..105fa4d51 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "8.124.0" +version = "8.125.0.dev0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0" From 3e094174172e641e0ddc7581af9c5924334915e5 Mon Sep 17 00:00:00 2001 From: Nicolas Catoni Date: Mon, 20 Apr 2026 18:00:18 +0200 Subject: [PATCH 163/164] Remove system-tests pin (#801) --- .github/workflows/system_tests.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/system_tests.yml b/.github/workflows/system_tests.yml index 04e082460..bc6b05e93 100644 --- a/.github/workflows/system_tests.yml +++ b/.github/workflows/system_tests.yml @@ -28,13 +28,12 @@ jobs: system-tests: needs: - build - uses: DataDog/system-tests/.github/workflows/system-tests.yml@1e5d6b7096279ca43ce4826fda3cc805635b63c1 + uses: DataDog/system-tests/.github/workflows/system-tests.yml@main permissions: contents: read id-token: write with: library: python_lambda - ref: 1e5d6b7096279ca43ce4826fda3cc805635b63c1 binaries_artifact: binaries scenarios_groups: tracer_release skip_empty_scenarios: true From d99780273021614bc0d0b079a12cbc78cd936ec4 Mon Sep 17 00:00:00 2001 From: Olivier Nzia Date: Fri, 24 Apr 2026 12:09:19 -0400 Subject: [PATCH 164/164] Onzia/add us2 (#802) * add us-2 * typo * update aws role * update usage comment --- scripts/publish_govcloud.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/scripts/publish_govcloud.sh b/scripts/publish_govcloud.sh index 5edd3b08e..19c8c17ca 100755 --- a/scripts/publish_govcloud.sh +++ b/scripts/publish_govcloud.sh @@ -9,7 +9,7 @@ # Download button on the `layer bundle` job. This will be a zip file containing # all of the required layers. Run this script as follows: # -# ENVIRONMENT=[us1-staging-fed or us1-fed] [LAYER_NAME_SUFFIX=optional-layer-suffix] [REGIONS=us-gov-west-1] ./scripts/publish_govcloud.sh +# CI_COMMIT_TAG= ENVIRONMENT=[us1-staging-fed|us1-fed|us2-fed] [LAYER_NAME_SUFFIX=optional-layer-suffix] [REGIONS=us-gov-west-1] ./scripts/publish_govcloud.sh # # protip: you can drag the zip file from finder into your terminal to insert # its path. @@ -49,9 +49,17 @@ elif [ $ENVIRONMENT = "us1-fed" ]; then echo "[ERROR]: Unexpected package name: $PACKAGE_NAME" exit 1 fi +elif [ $ENVIRONMENT = "us2-fed" ]; then + AWS_VAULT_ROLE=sso-govcloud-fed-us2-lambda-layer-operator + export STAGE=gov-prod + + if [[ ! "$PACKAGE_NAME" =~ ^datadog_lambda_py-signed-bundle-[0-9]+$ ]]; then + echo "[ERROR]: Unexpected package name: $PACKAGE_NAME" + exit 1 + fi else - printf "[ERROR]: ENVIRONMENT not supported, must be us1-staging-fed or us1-fed.\n" + printf "[ERROR]: ENVIRONMENT not supported, must be us1-staging-fed, us1-fed, or us2-fed.\n" exit 1 fi