Skip to content

Commit c3300d1

Browse files
authored
Combine integration tests for metrics and tracing (#123)
1 parent 1b9ce8e commit c3300d1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+114
-438
lines changed

scripts/build_layers.sh

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

8-
# Builds Datadogpy layers for lambda functions, using Docker
8+
# Builds datadog-lambda-python layers for Lambda functions
9+
10+
# Usage: PYTHON_VERSION=3.7 ./build_layers.sh
11+
# If PYTHON_VERSION is not specified, all versions will be built.
12+
913
set -e
1014

1115
LAYER_DIR=".layers"
1216
LAYER_FILES_PREFIX="datadog_lambda_py"
13-
PYTHON_VERSIONS=("2.7" "3.6" "3.7" "3.8")
17+
AVAILABLE_PYTHON_VERSIONS=("2.7" "3.6" "3.7" "3.8")
18+
19+
# Determine which Python versions to build layers for
20+
if [ -z "$PYTHON_VERSION" ]; then
21+
echo "Python version not specified, building layers for all versions."
22+
PYTHON_VERSIONS=("${AVAILABLE_PYTHON_VERSIONS[@]}")
23+
else
24+
echo "Python version specified: $PYTHON_VERSION"
25+
if [[ ! " ${AVAILABLE_PYTHON_VERSIONS[@]} " =~ " ${PYTHON_VERSION} " ]]; then
26+
echo "Python version $PYTHON_VERSION is not a valid option. Choose from: ${AVAILABLE_PYTHON_VERSIONS[@]}"
27+
echo ""
28+
echo "EXITING SCRIPT."
29+
exit 1
30+
fi
31+
PYTHON_VERSIONS=$PYTHON_VERSION
32+
fi
33+
1434

1535
function make_path_absolute {
1636
echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"
@@ -44,10 +64,9 @@ mkdir $LAYER_DIR
4464

4565
for python_version in "${PYTHON_VERSIONS[@]}"
4666
do
47-
echo "Building layer for python${python_version}"
67+
echo "Building layer for Python ${python_version}"
4868
docker_build_zip ${python_version} $LAYER_DIR/${LAYER_FILES_PREFIX}${python_version}.zip
4969
done
5070

51-
5271
echo "Done creating layers:"
5372
ls $LAYER_DIR | xargs -I _ echo "$LAYER_DIR/_"

scripts/run_integration_tests.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ set -e
1010

1111
# These values need to be in sync with serverless.yml, where there needs to be a function
1212
# defined for every handler_runtime combination
13-
LAMBDA_HANDLERS=("async-metrics" "sync-metrics" "http-requests" "http-error")
13+
LAMBDA_HANDLERS=("async-metrics" "sync-metrics")
1414
RUNTIMES=("python27" "python36" "python37" "python38")
1515

1616
LOGS_WAIT_SECONDS=20
@@ -144,7 +144,7 @@ for handler_name in "${LAMBDA_HANDLERS[@]}"; do
144144
sed -E 's/"points": \[\[[0-9\.]+,/"points": \[\[XXXX,/g' |
145145
# Strip API key from logged requests
146146
sed -E "s/(api_key=|'api_key': ')[a-z0-9\.\-]+/\1XXXX/g" |
147-
# Normalize minor package version so that these snapshots aren't broken on version bumps
147+
# Normalize package version so that these snapshots aren't broken on version bumps
148148
sed -E "s/(dd_lambda_layer:datadog-python[0-9]+_)[0-9]+\.[0-9]+\.[0-9]+/\1X\.X\.X/g" |
149149
sed -E "s/(datadog_lambda:v)([0-9]+\.[0-9]+\.[0-9])/\1XX/g" |
150150
# Strip out run ID (from function name, resource, etc.)

tests/integration/handle.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import requests
2+
13
from datadog_lambda.metric import lambda_metric
24
from datadog_lambda.wrapper import datadog_lambda_wrapper
35

46

57
@datadog_lambda_wrapper
68
def handle(event, context):
7-
# Parse request ID and record ids out of the event to include in the response
9+
# Parse request ID and record IDs out of the event to include in the response
810
request_id = event.get("requestContext", {}).get("requestId")
911
event_records = event.get("Records", [])
1012

@@ -17,11 +19,16 @@ def handle(event, context):
1719
if record.get("Sns", {}).get("MessageId"):
1820
record_ids.append(record["Sns"]["MessageId"])
1921

22+
# Generate custom metrics
2023
lambda_metric("hello.dog", 1, tags=["team:serverless", "role:hello"])
2124
lambda_metric(
2225
"tests.integration.count", 21, tags=["test:integration", "role:hello"]
2326
)
2427

28+
# Make HTTP calls to test ddtrace instrumentation
29+
requests.get("https://httpstat.us/200/")
30+
requests.get("https://httpstat.us/400/")
31+
2532
return {
2633
"statusCode": 200,
2734
"body": {

tests/integration/http_error.py

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

tests/integration/http_requests.py

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

tests/integration/serverless.yml

Lines changed: 1 addition & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ provider:
77
lambda: "PassThrough"
88
environment:
99
DD_INTEGRATION_TEST: true
10+
DD_TRACE_ENABLED: true
1011
DD_API_KEY: ${env:DD_API_KEY}
1112
lambdaHashingVersion: 20201221
1213
timeout: 15
@@ -83,69 +84,3 @@ functions:
8384
runtime: python3.8
8485
layers:
8586
- { Ref: Python38LambdaLayer }
86-
87-
# http-requests
88-
http-requests_python27:
89-
handler: http_requests.handle
90-
runtime: python2.7
91-
environment:
92-
DD_TRACE_ENABLED: true
93-
layers:
94-
- { Ref: Python27LambdaLayer }
95-
96-
http-requests_python36:
97-
handler: http_requests.handle
98-
runtime: python3.6
99-
environment:
100-
DD_TRACE_ENABLED: true
101-
layers:
102-
- { Ref: Python36LambdaLayer }
103-
104-
http-requests_python37:
105-
handler: http_requests.handle
106-
runtime: python3.7
107-
environment:
108-
DD_TRACE_ENABLED: true
109-
layers:
110-
- { Ref: Python37LambdaLayer }
111-
112-
http-requests_python38:
113-
handler: http_requests.handle
114-
runtime: python3.8
115-
environment:
116-
DD_TRACE_ENABLED: true
117-
layers:
118-
- { Ref: Python38LambdaLayer }
119-
120-
# http-error
121-
http-error_python27:
122-
handler: http_error.handle
123-
runtime: python2.7
124-
environment:
125-
DD_TRACE_ENABLED: true
126-
layers:
127-
- { Ref: Python27LambdaLayer }
128-
129-
http-error_python36:
130-
handler: http_error.handle
131-
runtime: python3.6
132-
environment:
133-
DD_TRACE_ENABLED: true
134-
layers:
135-
- { Ref: Python36LambdaLayer }
136-
137-
http-error_python37:
138-
handler: http_error.handle
139-
runtime: python3.7
140-
environment:
141-
DD_TRACE_ENABLED: true
142-
layers:
143-
- { Ref: Python37LambdaLayer }
144-
145-
http-error_python38:
146-
handler: http_error.handle
147-
runtime: python3.8
148-
environment:
149-
DD_TRACE_ENABLED: true
150-
layers:
151-
- { Ref: Python38LambdaLayer }

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,26 @@ START RequestId: XXXX Version: $LATEST
22
{"e": XXXX, "m": "aws.lambda.enhanced.invocations", "t": ["region:sa-east-1", "account_id:XXXX", "functionname:python-integration-tests-XXXX-async-metrics_python27", "resource:python-integration-tests-XXXX-async-metrics_python27", "cold_start:true", "memorysize:1024", "runtime:python2.7", "datadog_lambda:vXX", "dd_lambda_layer:datadog-python27_X.X.X"], "v": 1}
33
{"e": XXXX, "m": "hello.dog", "t": ["team:serverless", "role:hello", "dd_lambda_layer:datadog-python27_X.X.X"], "v": 1}
44
{"e": XXXX, "m": "tests.integration.count", "t": ["test:integration", "role:hello", "dd_lambda_layer:datadog-python27_X.X.X"], "v": 21}
5+
HTTP GET https://httpstat.us/200/ Headers: ["Accept-Encoding:gzip, deflate", "Accept:*/*", "Connection:keep-alive", "User-Agent:python-requests/2.25.1", "x-datadog-parent-id:XXXX", "x-datadog-sampling-priority:1", "x-datadog-trace-id:XXXX"] Data: {}
6+
HTTP GET https://httpstat.us/400/ Headers: ["Accept-Encoding:gzip, deflate", "Accept:*/*", "Connection:keep-alive", "User-Agent:python-requests/2.25.1", "x-datadog-parent-id:XXXX", "x-datadog-sampling-priority:1", "x-datadog-trace-id:XXXX"] Data: {}
7+
{"traces": [[{"resource": "python-integration-tests-XXXX-async-metrics_python27", "name": "aws.lambda", "service": "aws.lambda", "start": XXXX, "trace_id": "XXXX", "metrics": {"_sampling_priority_v1": 1, "system.pid": XXXX, "_dd.agent_psr": 1.0}, "parent_id": "XXXX", "meta": {"http.method": "GET", "runtime-id": "XXXX", "request_id": "XXXX", "function_trigger.event_source": "api-gateway", "cold_start": "true", "datadog_lambda": "X.X.X", "function_arn": "arn:aws:lambda:sa-east-1:601427279990:function:python-integration-tests-XXXX-async-metrics_python27", "dd_trace": "X.X.X", "_dd.origin": "lambda", "http.status_code": "200", "resource_names": "python-integration-tests-XXXX-async-metrics_python27", "function_trigger.event_source_arn": "arn:aws:apigateway:sa-east-1::/restapis/wt6mne2s9k/stages/test", "function_version": "$LATEST"}, "error": 0, "duration": XXXX, "type": "serverless", "span_id": "XXXX"}, {"resource": "requests.request", "name": "requests.request", "service": "aws.lambda", "start": XXXX, "trace_id": "XXXX", "metrics": {"_dd.measured": 1}, "parent_id": "XXXX", "meta": {"http.status_code": "200", "http.url": "https://httpstat.us/200/", "_dd.origin": "lambda", "http.method": "GET"}, "error": 0, "duration": XXXX, "type": "http", "span_id": "XXXX"}, {"resource": "requests.request", "name": "requests.request", "service": "aws.lambda", "start": XXXX, "trace_id": "XXXX", "metrics": {"_dd.measured": 1}, "parent_id": "XXXX", "meta": {"http.status_code": "400", "http.url": "https://httpstat.us/400/", "_dd.origin": "lambda", "http.method": "GET"}, "error": 0, "duration": XXXX, "type": "http", "span_id": "XXXX"}]]}
58
END RequestId: XXXX
69
REPORT RequestId: XXXX Duration: XXXX ms Billed Duration: XXXX ms Memory Size: 1024 MB Max Memory Used: XXXX MB Init Duration: XXXX ms
710
START RequestId: XXXX Version: $LATEST
811
{"e": XXXX, "m": "aws.lambda.enhanced.invocations", "t": ["region:sa-east-1", "account_id:XXXX", "functionname:python-integration-tests-XXXX-async-metrics_python27", "resource:python-integration-tests-XXXX-async-metrics_python27", "cold_start:false", "memorysize:1024", "runtime:python2.7", "datadog_lambda:vXX", "dd_lambda_layer:datadog-python27_X.X.X"], "v": 1}
912
{"e": XXXX, "m": "hello.dog", "t": ["team:serverless", "role:hello", "dd_lambda_layer:datadog-python27_X.X.X"], "v": 1}
1013
{"e": XXXX, "m": "tests.integration.count", "t": ["test:integration", "role:hello", "dd_lambda_layer:datadog-python27_X.X.X"], "v": 21}
14+
HTTP GET https://httpstat.us/200/ Headers: ["Accept-Encoding:gzip, deflate", "Accept:*/*", "Connection:keep-alive", "User-Agent:python-requests/2.25.1", "x-datadog-parent-id:XXXX", "x-datadog-sampling-priority:1", "x-datadog-trace-id:XXXX"] Data: {}
15+
HTTP GET https://httpstat.us/400/ Headers: ["Accept-Encoding:gzip, deflate", "Accept:*/*", "Connection:keep-alive", "User-Agent:python-requests/2.25.1", "x-datadog-parent-id:XXXX", "x-datadog-sampling-priority:1", "x-datadog-trace-id:XXXX"] Data: {}
16+
{"traces": [[{"resource": "python-integration-tests-XXXX-async-metrics_python27", "name": "aws.lambda", "service": "aws.lambda", "start": XXXX, "trace_id": "XXXX", "metrics": {"_sampling_priority_v1": 1, "system.pid": XXXX, "_dd.agent_psr": 1.0}, "parent_id": "XXXX", "meta": {"runtime-id": "XXXX", "request_id": "XXXX", "function_trigger.event_source": "sns", "cold_start": "false", "datadog_lambda": "X.X.X", "function_arn": "arn:aws:lambda:sa-east-1:601427279990:function:python-integration-tests-XXXX-async-metrics_python27", "dd_trace": "X.X.X", "_dd.origin": "lambda", "resource_names": "python-integration-tests-XXXX-async-metrics_python27", "function_trigger.event_source_arn": "arn:aws:sns:us-east-2:123456789012:sns-lambda", "function_version": "$LATEST"}, "error": 0, "duration": XXXX, "type": "serverless", "span_id": "XXXX"}, {"resource": "requests.request", "name": "requests.request", "service": "aws.lambda", "start": XXXX, "trace_id": "XXXX", "metrics": {"_dd.measured": 1}, "parent_id": "XXXX", "meta": {"http.status_code": "200", "http.url": "https://httpstat.us/200/", "_dd.origin": "lambda", "http.method": "GET"}, "error": 0, "duration": XXXX, "type": "http", "span_id": "XXXX"}, {"resource": "requests.request", "name": "requests.request", "service": "aws.lambda", "start": XXXX, "trace_id": "XXXX", "metrics": {"_dd.measured": 1}, "parent_id": "XXXX", "meta": {"http.status_code": "400", "http.url": "https://httpstat.us/400/", "_dd.origin": "lambda", "http.method": "GET"}, "error": 0, "duration": XXXX, "type": "http", "span_id": "XXXX"}]]}
1117
END RequestId: XXXX
1218
REPORT RequestId: XXXX Duration: XXXX ms Billed Duration: XXXX ms Memory Size: 1024 MB Max Memory Used: XXXX MB
1319
START RequestId: XXXX Version: $LATEST
1420
{"e": XXXX, "m": "aws.lambda.enhanced.invocations", "t": ["region:sa-east-1", "account_id:XXXX", "functionname:python-integration-tests-XXXX-async-metrics_python27", "resource:python-integration-tests-XXXX-async-metrics_python27", "cold_start:false", "memorysize:1024", "runtime:python2.7", "datadog_lambda:vXX", "dd_lambda_layer:datadog-python27_X.X.X"], "v": 1}
1521
{"e": XXXX, "m": "hello.dog", "t": ["team:serverless", "role:hello", "dd_lambda_layer:datadog-python27_X.X.X"], "v": 1}
1622
{"e": XXXX, "m": "tests.integration.count", "t": ["test:integration", "role:hello", "dd_lambda_layer:datadog-python27_X.X.X"], "v": 21}
23+
HTTP GET https://httpstat.us/200/ Headers: ["Accept-Encoding:gzip, deflate", "Accept:*/*", "Connection:keep-alive", "User-Agent:python-requests/2.25.1", "x-datadog-parent-id:XXXX", "x-datadog-sampling-priority:1", "x-datadog-trace-id:XXXX"] Data: {}
24+
HTTP GET https://httpstat.us/400/ Headers: ["Accept-Encoding:gzip, deflate", "Accept:*/*", "Connection:keep-alive", "User-Agent:python-requests/2.25.1", "x-datadog-parent-id:XXXX", "x-datadog-sampling-priority:1", "x-datadog-trace-id:XXXX"] Data: {}
25+
{"traces": [[{"resource": "python-integration-tests-XXXX-async-metrics_python27", "name": "aws.lambda", "service": "aws.lambda", "start": XXXX, "trace_id": "XXXX", "metrics": {"_sampling_priority_v1": 1, "system.pid": XXXX}, "parent_id": "XXXX", "meta": {"runtime-id": "XXXX", "request_id": "XXXX", "function_trigger.event_source": "sqs", "cold_start": "false", "datadog_lambda": "X.X.X", "function_arn": "arn:aws:lambda:sa-east-1:601427279990:function:python-integration-tests-XXXX-async-metrics_python27", "dd_trace": "X.X.X", "_dd.origin": "lambda", "resource_names": "python-integration-tests-XXXX-async-metrics_python27", "function_trigger.event_source_arn": "arn:aws:sqs:us-east-2:123456789012:my-queue", "function_version": "$LATEST"}, "error": 0, "duration": XXXX, "type": "serverless", "span_id": "XXXX"}, {"resource": "requests.request", "name": "requests.request", "service": "aws.lambda", "start": XXXX, "trace_id": "XXXX", "metrics": {"_dd.measured": 1}, "parent_id": "XXXX", "meta": {"http.status_code": "200", "http.url": "https://httpstat.us/200/", "_dd.origin": "lambda", "http.method": "GET"}, "error": 0, "duration": XXXX, "type": "http", "span_id": "XXXX"}, {"resource": "requests.request", "name": "requests.request", "service": "aws.lambda", "start": XXXX, "trace_id": "XXXX", "metrics": {"_dd.measured": 1}, "parent_id": "XXXX", "meta": {"http.status_code": "400", "http.url": "https://httpstat.us/400/", "_dd.origin": "lambda", "http.method": "GET"}, "error": 0, "duration": XXXX, "type": "http", "span_id": "XXXX"}]]}
1726
END RequestId: XXXX
1827
REPORT RequestId: XXXX Duration: XXXX ms Billed Duration: XXXX ms Memory Size: 1024 MB Max Memory Used: XXXX MB

0 commit comments

Comments
 (0)