Skip to content

Commit 1ecee97

Browse files
authored
Merge branch 'main' into joey/durable-tracecontext-extraction
2 parents 8c6a2e7 + 67ce9b6 commit 1ecee97

17 files changed

Lines changed: 344 additions & 66 deletions

.github/workflows/update_deps.yml

Lines changed: 0 additions & 43 deletions
This file was deleted.

ci/get_secrets.sh

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,72 @@
55
# This product includes software developed at Datadog (https://www.datadoghq.com/).
66
# Copyright 2023 Datadog, Inc.
77

8+
# Loads secrets for CI jobs from Vault (gitlab-runner path below).
9+
#
10+
# Full mode (default): requires EXTERNAL_ID_NAME, ROLE_TO_ASSUME, and AWS_ACCOUNT.
11+
# Fetches the external ID and DD API key, then assumes the AWS deployer role.
12+
#
13+
# API-key-only mode: set GET_SECRETS_API_KEY_ONLY=1 when sourcing.
14+
# Loads DD_API_KEY only (e.g. unit-test Test Optimization). Uses DD_API_KEY from
15+
# the environment when set; otherwise reads from Vault. Installs the vault CLI
16+
# on slim images that do not include it.
17+
818
set -e
919

20+
VAULT_SECRETS_PATH="kv/k8s/gitlab-runner/datadog-lambda-python/secrets"
21+
VAULT_CLI_VERSION="${VAULT_CLI_VERSION:-1.18.5}"
22+
23+
_ensure_vault_cli() {
24+
command -v vault >/dev/null 2>&1 && return
25+
26+
local arch install_dir
27+
case "$(uname -m)" in
28+
x86_64 | amd64) arch=amd64 ;;
29+
aarch64 | arm64) arch=arm64 ;;
30+
*) printf "[Error] Unsupported architecture: %s\n" "$(uname -m)" >&2; exit 1 ;;
31+
esac
32+
33+
install_dir="${TMPDIR:-/tmp}/vault-cli-${VAULT_CLI_VERSION}-${arch}"
34+
if [ -x "${install_dir}/vault" ]; then
35+
export PATH="${install_dir}:${PATH}"
36+
return
37+
fi
38+
39+
apt-get update -qq && apt-get install -y -qq curl unzip
40+
printf "Installing vault CLI %s (%s)...\n" "$VAULT_CLI_VERSION" "$arch"
41+
mkdir -p "$install_dir"
42+
curl -fsSL \
43+
"https://releases.hashicorp.com/vault/${VAULT_CLI_VERSION}/vault_${VAULT_CLI_VERSION}_linux_${arch}.zip" \
44+
-o "${install_dir}/vault.zip"
45+
unzip -qo "${install_dir}/vault.zip" -d "$install_dir"
46+
rm -f "${install_dir}/vault.zip"
47+
export PATH="${install_dir}:${PATH}"
48+
}
49+
50+
_get_dd_api_key() {
51+
if [ -n "${DD_API_KEY:-}" ]; then
52+
printf "Using DD_API_KEY from environment.\n"
53+
else
54+
printf "Getting DD API KEY...\n"
55+
_ensure_vault_cli
56+
DD_API_KEY=$(vault kv get -field=dd-api-key "$VAULT_SECRETS_PATH")
57+
if [ -z "$DD_API_KEY" ]; then
58+
printf "[Error] DD_API_KEY is empty after Vault lookup.\n" >&2
59+
return 1 2>/dev/null || exit 1
60+
fi
61+
export DD_API_KEY
62+
fi
63+
64+
if [ -n "${GITLAB_ENV:-}" ]; then
65+
echo "DD_API_KEY=${DD_API_KEY}" >>"$GITLAB_ENV"
66+
fi
67+
}
68+
69+
if [ -n "${GET_SECRETS_API_KEY_ONLY:-}" ]; then
70+
_get_dd_api_key
71+
return 0 2>/dev/null || exit 0
72+
fi
73+
1074
if [ -z "$EXTERNAL_ID_NAME" ]; then
1175
printf "[Error] No EXTERNAL_ID_NAME found.\n"
1276
printf "Exiting script...\n"
@@ -19,13 +83,13 @@ if [ -z "$ROLE_TO_ASSUME" ]; then
1983
exit 1
2084
fi
2185

22-
printf "Getting AWS External ID...\n"
86+
_ensure_vault_cli
2387

24-
EXTERNAL_ID=$(vault kv get -field="$EXTERNAL_ID_NAME" kv/k8s/gitlab-runner/datadog-lambda-python/secrets)
88+
printf "Getting AWS External ID...\n"
2589

26-
printf "Getting DD API KEY...\n"
90+
EXTERNAL_ID=$(vault kv get -field="$EXTERNAL_ID_NAME" "$VAULT_SECRETS_PATH")
2791

28-
export DD_API_KEY=$(vault kv get -field=dd-api-key kv/k8s/gitlab-runner/datadog-lambda-python/secrets)
92+
_get_dd_api_key
2993

3094
printf "Assuming role...\n"
3195

ci/input_files/build.yaml.tpl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,18 @@ unit-test ({{ $runtime.name }}-{{ $runtime.arch }}):
8282
{{ end }}
8383
image: registry.ddbuild.io/images/mirror/python:{{ $runtime.image }}
8484
cache: &{{ $runtime.name }}-{{ $runtime.arch }}-cache
85+
variables:
86+
DD_CIVISIBILITY_AGENTLESS_ENABLED: "true"
87+
DD_SERVICE: "datadog-lambda-python"
88+
DD_ENV: "ci"
89+
DD_TAGS: "python_version:{{ $runtime.python_version }},arch:{{ $runtime.arch }}"
8590
before_script:
91+
- GET_SECRETS_API_KEY_ONLY=1 source ./ci/get_secrets.sh
8692
- PYTHON_VERSION={{ $runtime.python_version }} ARCH={{ $runtime.arch }} ./scripts/setup_python_env.sh
8793
script:
94+
- set -e
8895
- source venv/bin/activate
89-
- pytest -vv
96+
- pytest -vv --ddtrace
9097
retry: 2
9198

9299
integration-test ({{ $runtime.name }}-{{ $runtime.arch }}):

datadog_lambda/durable.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,9 @@ def extract_durable_function_tags(event):
5050
operations = event.get("InitialExecutionState", {}).get("Operations", [])
5151
is_first_invocation = len(operations) == 1
5252
return {
53-
"aws_lambda.durable_function.execution_name": execution_name,
54-
"aws_lambda.durable_function.execution_id": execution_id,
55-
"aws_lambda.durable_function.first_invocation": str(
56-
is_first_invocation
57-
).lower(),
53+
"aws.durable.execution_name": execution_name,
54+
"aws.durable.execution_id": execution_id,
55+
"aws.durable.first_invocation": str(is_first_invocation).lower(),
5856
}
5957

6058

datadog_lambda/wrapper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ def _after(self, event, context):
346346
durable_status = extract_durable_execution_status(self.response, event)
347347
if durable_status:
348348
self.span.set_tag(
349-
"aws_lambda.durable_function.execution_status",
349+
"aws.durable.execution_status",
350350
durable_status,
351351
)
352352

tests/integration/snapshots/logs/async-metrics_python310.log

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
131131
"component": "requests",
132132
"http.method": "GET",
133133
"http.status_code": "200",
134+
"http.status_msg": "OK",
134135
"http.url": "https://datadoghq.com/",
135136
"http.useragent": "python-requests/X.X.X",
136137
"out.host": "datadoghq.com",
@@ -160,6 +161,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
160161
"component": "requests",
161162
"http.method": "GET",
162163
"http.status_code": "200",
164+
"http.status_msg": "OK",
163165
"http.url": "https://www.datadoghq.com/",
164166
"http.useragent": "python-requests/X.X.X",
165167
"out.host": "www.datadoghq.com",
@@ -267,6 +269,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
267269
"component": "requests",
268270
"http.method": "GET",
269271
"http.status_code": "200",
272+
"http.status_msg": "OK",
270273
"http.url": "https://datadoghq.com/",
271274
"http.useragent": "python-requests/X.X.X",
272275
"out.host": "datadoghq.com",
@@ -295,6 +298,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
295298
"component": "requests",
296299
"http.method": "GET",
297300
"http.status_code": "200",
301+
"http.status_msg": "OK",
298302
"http.url": "https://www.datadoghq.com/",
299303
"http.useragent": "python-requests/X.X.X",
300304
"out.host": "www.datadoghq.com",
@@ -483,6 +487,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
483487
"component": "requests",
484488
"http.method": "GET",
485489
"http.status_code": "200",
490+
"http.status_msg": "OK",
486491
"http.url": "https://datadoghq.com/",
487492
"http.useragent": "python-requests/X.X.X",
488493
"out.host": "datadoghq.com",
@@ -512,6 +517,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
512517
"component": "requests",
513518
"http.method": "GET",
514519
"http.status_code": "200",
520+
"http.status_msg": "OK",
515521
"http.url": "https://www.datadoghq.com/",
516522
"http.useragent": "python-requests/X.X.X",
517523
"out.host": "www.datadoghq.com",
@@ -651,6 +657,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
651657
"component": "requests",
652658
"http.method": "GET",
653659
"http.status_code": "200",
660+
"http.status_msg": "OK",
654661
"http.url": "https://datadoghq.com/",
655662
"http.useragent": "python-requests/X.X.X",
656663
"out.host": "datadoghq.com",
@@ -680,6 +687,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
680687
"component": "requests",
681688
"http.method": "GET",
682689
"http.status_code": "200",
690+
"http.status_msg": "OK",
683691
"http.url": "https://www.datadoghq.com/",
684692
"http.useragent": "python-requests/X.X.X",
685693
"out.host": "www.datadoghq.com",
@@ -834,6 +842,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
834842
"component": "requests",
835843
"http.method": "GET",
836844
"http.status_code": "200",
845+
"http.status_msg": "OK",
837846
"http.url": "https://datadoghq.com/",
838847
"http.useragent": "python-requests/X.X.X",
839848
"out.host": "datadoghq.com",
@@ -863,6 +872,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
863872
"component": "requests",
864873
"http.method": "GET",
865874
"http.status_code": "200",
875+
"http.status_msg": "OK",
866876
"http.url": "https://www.datadoghq.com/",
867877
"http.useragent": "python-requests/X.X.X",
868878
"out.host": "www.datadoghq.com",
@@ -1010,6 +1020,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
10101020
"component": "requests",
10111021
"http.method": "GET",
10121022
"http.status_code": "200",
1023+
"http.status_msg": "OK",
10131024
"http.url": "https://datadoghq.com/",
10141025
"http.useragent": "python-requests/X.X.X",
10151026
"out.host": "datadoghq.com",
@@ -1039,6 +1050,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
10391050
"component": "requests",
10401051
"http.method": "GET",
10411052
"http.status_code": "200",
1053+
"http.status_msg": "OK",
10421054
"http.url": "https://www.datadoghq.com/",
10431055
"http.useragent": "python-requests/X.X.X",
10441056
"out.host": "www.datadoghq.com",
@@ -1195,6 +1207,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
11951207
"component": "requests",
11961208
"http.method": "GET",
11971209
"http.status_code": "200",
1210+
"http.status_msg": "OK",
11981211
"http.url": "https://datadoghq.com/",
11991212
"http.useragent": "python-requests/X.X.X",
12001213
"out.host": "datadoghq.com",
@@ -1224,6 +1237,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
12241237
"component": "requests",
12251238
"http.method": "GET",
12261239
"http.status_code": "200",
1240+
"http.status_msg": "OK",
12271241
"http.url": "https://www.datadoghq.com/",
12281242
"http.useragent": "python-requests/X.X.X",
12291243
"out.host": "www.datadoghq.com",
@@ -1369,6 +1383,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
13691383
"component": "requests",
13701384
"http.method": "GET",
13711385
"http.status_code": "200",
1386+
"http.status_msg": "OK",
13721387
"http.url": "https://datadoghq.com/",
13731388
"http.useragent": "python-requests/X.X.X",
13741389
"out.host": "datadoghq.com",
@@ -1398,6 +1413,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
13981413
"component": "requests",
13991414
"http.method": "GET",
14001415
"http.status_code": "200",
1416+
"http.status_msg": "OK",
14011417
"http.url": "https://www.datadoghq.com/",
14021418
"http.useragent": "python-requests/X.X.X",
14031419
"out.host": "www.datadoghq.com",
@@ -1542,6 +1558,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
15421558
"component": "requests",
15431559
"http.method": "GET",
15441560
"http.status_code": "200",
1561+
"http.status_msg": "OK",
15451562
"http.url": "https://datadoghq.com/",
15461563
"http.useragent": "python-requests/X.X.X",
15471564
"out.host": "datadoghq.com",
@@ -1571,6 +1588,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
15711588
"component": "requests",
15721589
"http.method": "GET",
15731590
"http.status_code": "200",
1591+
"http.status_msg": "OK",
15741592
"http.url": "https://www.datadoghq.com/",
15751593
"http.useragent": "python-requests/X.X.X",
15761594
"out.host": "www.datadoghq.com",
@@ -1723,6 +1741,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
17231741
"component": "requests",
17241742
"http.method": "GET",
17251743
"http.status_code": "200",
1744+
"http.status_msg": "OK",
17261745
"http.url": "https://datadoghq.com/",
17271746
"http.useragent": "python-requests/X.X.X",
17281747
"out.host": "datadoghq.com",
@@ -1752,6 +1771,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
17521771
"component": "requests",
17531772
"http.method": "GET",
17541773
"http.status_code": "200",
1774+
"http.status_msg": "OK",
17551775
"http.url": "https://www.datadoghq.com/",
17561776
"http.useragent": "python-requests/X.X.X",
17571777
"out.host": "www.datadoghq.com",

0 commit comments

Comments
 (0)