diff --git a/integration_tests/snapshots/logs/process-input-traced_node14.log b/integration_tests/snapshots/logs/process-input-traced_node14.log index 50d3fbed..7ac5af9f 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node14.log +++ b/integration_tests/snapshots/logs/process-input-traced_node14.log @@ -85,8 +85,7 @@ START "metrics": { "cold_start": 1, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -107,8 +106,7 @@ START }, "metrics": { "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -130,8 +128,7 @@ START }, "metrics": { "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -152,8 +149,7 @@ START "language": "javascript" }, "metrics": { - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -250,8 +246,7 @@ START "metrics": { "cold_start": 0, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -274,8 +269,7 @@ START }, "metrics": { "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -371,8 +365,7 @@ START "metrics": { "cold_start": 0, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -395,8 +388,7 @@ START }, "metrics": { "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, diff --git a/integration_tests/snapshots/logs/process-input-traced_node16.log b/integration_tests/snapshots/logs/process-input-traced_node16.log index 48ff92aa..40e59651 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node16.log +++ b/integration_tests/snapshots/logs/process-input-traced_node16.log @@ -87,8 +87,7 @@ START "metrics": { "cold_start": 1, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -110,8 +109,7 @@ START }, "metrics": { "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -134,8 +132,7 @@ START }, "metrics": { "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -157,8 +154,7 @@ START "language": "javascript" }, "metrics": { - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -257,8 +253,7 @@ START "metrics": { "cold_start": 0, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -282,8 +277,7 @@ START }, "metrics": { "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -381,8 +375,7 @@ START "metrics": { "cold_start": 0, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -406,8 +399,7 @@ START }, "metrics": { "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, diff --git a/integration_tests/snapshots/logs/process-input-traced_node18.log b/integration_tests/snapshots/logs/process-input-traced_node18.log index b3c80d66..58a91b9b 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node18.log +++ b/integration_tests/snapshots/logs/process-input-traced_node18.log @@ -87,8 +87,7 @@ START "metrics": { "cold_start": 1, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -110,8 +109,7 @@ START }, "metrics": { "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -134,8 +132,7 @@ START }, "metrics": { "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -157,8 +154,7 @@ START "language": "javascript" }, "metrics": { - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -257,8 +253,7 @@ START "metrics": { "cold_start": 0, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -282,8 +277,7 @@ START }, "metrics": { "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -381,8 +375,7 @@ START "metrics": { "cold_start": 0, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -406,8 +399,7 @@ START }, "metrics": { "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, diff --git a/integration_tests/snapshots/logs/status-code-500s_node14.log b/integration_tests/snapshots/logs/status-code-500s_node14.log index 55fbaf8b..a962e2aa 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node14.log +++ b/integration_tests/snapshots/logs/status-code-500s_node14.log @@ -89,8 +89,7 @@ START "metrics": { "cold_start": 1, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -112,8 +111,7 @@ START "language": "javascript" }, "metrics": { - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -200,8 +198,7 @@ START "metrics": { "cold_start": 0, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -213,7 +210,6 @@ START } END Duration: XXXX ms Memory Used: XXXX MB START -END Duration: XXXX ms Memory Used: XXXX MB { "e": XXXX, "m": "aws.lambda.enhanced.invocations", @@ -289,8 +285,7 @@ END Duration: XXXX ms Memory Used: XXXX MB "metrics": { "cold_start": 0, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -300,3 +295,4 @@ END Duration: XXXX ms Memory Used: XXXX MB ] ] } +END Duration: XXXX ms Memory Used: XXXX MB diff --git a/integration_tests/snapshots/logs/status-code-500s_node16.log b/integration_tests/snapshots/logs/status-code-500s_node16.log index b1738ac3..c1026154 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node16.log +++ b/integration_tests/snapshots/logs/status-code-500s_node16.log @@ -91,8 +91,7 @@ START "metrics": { "cold_start": 1, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -115,8 +114,7 @@ START "language": "javascript" }, "metrics": { - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -205,8 +203,7 @@ START "metrics": { "cold_start": 0, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -295,8 +292,7 @@ START "metrics": { "cold_start": 0, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, diff --git a/integration_tests/snapshots/logs/status-code-500s_node18.log b/integration_tests/snapshots/logs/status-code-500s_node18.log index 0ee5b706..3b97cc16 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node18.log +++ b/integration_tests/snapshots/logs/status-code-500s_node18.log @@ -91,8 +91,7 @@ START "metrics": { "cold_start": 1, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -115,8 +114,7 @@ START "language": "javascript" }, "metrics": { - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -205,8 +203,7 @@ START "metrics": { "cold_start": 0, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, @@ -295,8 +292,7 @@ START "metrics": { "cold_start": 0, "_dd.measured": 1, - "process_id":XXXX, - "_sampling_priority_v1": 1 + "process_id":XXXX }, "start":XXXX, "duration":XXXX, diff --git a/integration_tests/snapshots/logs/throw-error-traced_node14.log b/integration_tests/snapshots/logs/throw-error-traced_node14.log index 1c6ac5f5..676be1dd 100644 --- a/integration_tests/snapshots/logs/throw-error-traced_node14.log +++ b/integration_tests/snapshots/logs/throw-error-traced_node14.log @@ -30,7 +30,7 @@ START ], "v": 1 } -XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} +XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at traceListenerOnWrap (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} END Duration: XXXX ms (init: XXXX ms) Memory Used: XXXX MB START { @@ -63,7 +63,7 @@ START ], "v": 1 } -XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} +XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at traceListenerOnWrap (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} END Duration: XXXX ms Memory Used: XXXX MB START { @@ -96,5 +96,5 @@ START ], "v": 1 } -XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} +XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at traceListenerOnWrap (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} END Duration: XXXX ms Memory Used: XXXX MB diff --git a/integration_tests/snapshots/logs/throw-error-traced_node16.log b/integration_tests/snapshots/logs/throw-error-traced_node16.log index b8ca3885..8aedb66a 100644 --- a/integration_tests/snapshots/logs/throw-error-traced_node16.log +++ b/integration_tests/snapshots/logs/throw-error-traced_node16.log @@ -30,7 +30,7 @@ START ], "v": 1 } -XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} +XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at traceListenerOnWrap (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} END Duration: XXXX ms (init: XXXX ms) Memory Used: XXXX MB START { @@ -63,7 +63,7 @@ START ], "v": 1 } -XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} +XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at traceListenerOnWrap (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} END Duration: XXXX ms Memory Used: XXXX MB START { @@ -96,5 +96,5 @@ START ], "v": 1 } -XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} +XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at traceListenerOnWrap (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} END Duration: XXXX ms Memory Used: XXXX MB diff --git a/integration_tests/snapshots/logs/throw-error-traced_node18.log b/integration_tests/snapshots/logs/throw-error-traced_node18.log index da6de016..f7ad94da 100644 --- a/integration_tests/snapshots/logs/throw-error-traced_node18.log +++ b/integration_tests/snapshots/logs/throw-error-traced_node18.log @@ -15,7 +15,6 @@ START ], "v": 1 } -XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} { "e": XXXX, "m": "aws.lambda.enhanced.errors", @@ -31,6 +30,7 @@ XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error { ], "v": 1 } +XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at traceListenerOnWrap (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} END Duration: XXXX ms (init: XXXX ms) Memory Used: XXXX MB START { @@ -63,7 +63,7 @@ START ], "v": 1 } -XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} +XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at traceListenerOnWrap (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} END Duration: XXXX ms Memory Used: XXXX MB START { @@ -81,7 +81,6 @@ START ], "v": 1 } -XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} { "e": XXXX, "m": "aws.lambda.enhanced.errors", @@ -97,4 +96,5 @@ XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error { ], "v": 1 } +XXXX-XX-XX XX:XX:XX.XXX ERROR [dd.trace_id=XXXX dd.span_id=XXXX] Invoke Error {"errorType":"Error","errorMessage":"Hello","stack":["Error: Hello"," at handle (/var/task/throw-error-traced.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/utils/handler.js:XXX:XXX"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at Object.next (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"," at new Promise ()"," at __awaiter (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at traceListenerOnWrap (/opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX)"," at /opt/nodejs/node_modules/datadog-lambda-js/index.js:XXX:XXX"]} END Duration: XXXX ms Memory Used: XXXX MB diff --git a/package.json b/package.json index a154311e..a953e842 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@types/node": "^15.6.1", "@types/promise-retry": "^1.1.3", "@types/shimmer": "^1.0.1", - "dd-trace": "^2.27.0", + "dd-trace": "^2.30.1", "jest": "^27.0.1", "mock-fs": "4.14.0", "nock": "13.0.11", diff --git a/scripts/check_layer_size.sh b/scripts/check_layer_size.sh index ed4577ac..699e0bee 100755 --- a/scripts/check_layer_size.sh +++ b/scripts/check_layer_size.sh @@ -9,7 +9,7 @@ # 6 mb size limit MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 6 \* 1024) -MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 17 \* 1024) +MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 18 \* 1024) LAYER_FILES_PREFIX="datadog_lambda_node" diff --git a/src/constants.ts b/src/constants.ts index f061d7c5..674ac3ea 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1 +1,5 @@ export const datadogLambdaVersion = "X.X.X"; + +// Response streaming functions +export const HANDLER_STREAMING = Symbol.for("aws.lambda.runtime.handler.streaming"); +export const STREAM_RESPONSE = "response"; diff --git a/src/index.spec.ts b/src/index.spec.ts index 84f9c7ae..6aa21ff5 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -11,6 +11,8 @@ import { } from "./index"; import { incrementErrorsMetric, incrementInvocationsMetric } from "./metrics/enhanced-metrics"; import { LogLevel, setLogLevel } from "./utils"; +import { HANDLER_STREAMING, STREAM_RESPONSE } from "./constants"; +import { PassThrough } from "stream"; jest.mock("./metrics/enhanced-metrics"); @@ -334,4 +336,25 @@ describe("datadog", () => { expect(logger.debug).toHaveBeenCalledTimes(11); expect(logger.debug).toHaveBeenLastCalledWith('{"status":"debug","message":"datadog:Unpatching HTTP libraries"}'); }); + + it("adds stream symbol to function when handler is stream response type", async () => { + const handler: any = async (event: any, responseStream: any, context: Context) => {}; + + handler[HANDLER_STREAMING] = STREAM_RESPONSE; + + const wrapped = datadog(handler); + const mockReadable = new PassThrough(); + await wrapped({}, mockReadable, mockContext); + + expect(wrapped[HANDLER_STREAMING]).toBe(STREAM_RESPONSE); + }); + + it("doesnt add stream symbol to function when handler is buffered type", async () => { + const handler: any = async (event: any, context: Context) => {}; + + const wrapped = datadog(handler); + await wrapped({}, mockContext); + + expect(wrapped[HANDLER_STREAMING]).toBe(undefined); + }); }); diff --git a/src/index.ts b/src/index.ts index 568d4252..3555e1d6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ import { Context, Handler } from "aws-lambda"; +import { HANDLER_STREAMING, STREAM_RESPONSE } from "./constants"; import { incrementErrorsMetric, incrementInvocationsMetric, @@ -18,6 +19,7 @@ import { setLogger, setLogLevel, } from "./utils"; +import { getEnhancedMetricTags } from "./metrics/enhanced-metrics"; export { TraceHeaders } from "./trace"; @@ -97,15 +99,15 @@ if (getEnvValue(coldStartTracingEnvVar, "true").toLowerCase() === "true") { * @returns A wrapped handler function. * * ```javascript - * import { datadog } from 'datadog-lambda-layer'; + * import { datadog } from 'datadog-lambda-js'; * function yourHandler(event) {} * exports.yourHandler = datadog(yourHandler); * ``` */ export function datadog( - handler: Handler, + handler: Handler | any, config?: Partial, -): Handler { +): Handler | any { const finalConfig = getConfig(config); const metricsListener = new MetricsListener(new KMSService(), finalConfig); @@ -122,9 +124,15 @@ export function datadog( setLogger(finalConfig.logger); } - const promHandler = promisifiedHandler(handler); - const wrappedFunc = async (event: TEvent, context: Context) => { + const isResponseStreamFunction = + handler[HANDLER_STREAMING] !== undefined && handler[HANDLER_STREAMING] === STREAM_RESPONSE; + const promHandler: any = promisifiedHandler(handler); + + let wrappedFunc: any; + wrappedFunc = async (...args: any[]) => { + const { event, context, responseStream } = extractArgs(isResponseStreamFunction, ...args); setColdStart(); + const startTime = new Date(); currentMetricsListener = metricsListener; currentTraceListener = traceListener; @@ -146,21 +154,46 @@ export function datadog( let error: any; let didThrow = false; try { - result = await traceListener.onWrap(async (localEvent: TEvent, localContext: Context) => { + const traceListenerOnWrap = async (...localArgs: any[]) => { + const { + event: localEvent, + context: localContext, + responseStream: localResponseStream, + } = extractArgs(isResponseStreamFunction, ...localArgs); + + if (isResponseStreamFunction) { + responseStream.once("drain", () => { + const firstDrainTime = new Date(); + const timeToFirstByte = firstDrainTime.getTime() - startTime.getTime(); + metricsListener.sendDistributionMetric( + "aws.lambda.enhanced.time_to_first_byte", + timeToFirstByte, + true, + ...getEnhancedMetricTags(context), + ); + }); + } + try { - localResult = await promHandler(localEvent, localContext); + localResult = isResponseStreamFunction + ? await promHandler(localEvent, localResponseStream, localContext) + : await promHandler(localEvent, localContext); } finally { const responseIs5xxError = traceListener.onEndingInvocation( localEvent, localResult, - finalConfig.captureLambdaPayload, + isResponseStreamFunction, ); if (responseIs5xxError) { incrementErrorsMetric(metricsListener, context); } } return localResult; - })(event, context); + }; + + result = isResponseStreamFunction + ? await traceListener.onWrap(traceListenerOnWrap)(event, responseStream, context) + : await traceListener.onWrap(traceListenerOnWrap)(event, context); } catch (err) { didThrow = true; error = err; @@ -186,9 +219,27 @@ export function datadog( }; (wrappedFunc as any)[_ddWrappedKey] = true; + + if (isResponseStreamFunction) { + (wrappedFunc as any)[HANDLER_STREAMING] = STREAM_RESPONSE; + } + return wrappedFunc; } +/** + * + * @param isResponseStreamFunction A boolean determining if a Lambda Function is Response Stream. + * @param args Spread arguments of a Lambda Function. + * @returns An object containing the context and the event of a Lambda Function. + */ +export function extractArgs(isResponseStreamFunction: boolean, ...args: any[]) { + const context: Context = isResponseStreamFunction ? args[2] : args.length > 0 ? (args[1] as Context) : {}; + const event: TEvent = args[0]; + const responseStream: any = isResponseStreamFunction ? args[1] : undefined; + return { context, event, responseStream }; +} + /** * Sends a Distribution metric asynchronously to the Datadog API. * @param name The name of the metric to send. diff --git a/src/trace/listener.ts b/src/trace/listener.ts index 5551b308..a5086f0a 100644 --- a/src/trace/listener.ts +++ b/src/trace/listener.ts @@ -147,12 +147,12 @@ export class TraceListener { * @param result * @param shouldTagPayload */ - public onEndingInvocation(event: any, result: any, shouldTagPayload = false): boolean { + public onEndingInvocation(event: any, result: any, isResponseStreamFunction: boolean): boolean { // Guard clause if something has gone horribly wrong // so we won't crash user code. if (!this.tracerWrapper.currentSpan) return false; this.wrappedCurrentSpan = new SpanWrapper(this.tracerWrapper.currentSpan, {}); - if (shouldTagPayload) { + if (this.config.captureLambdaPayload) { tagObject(this.tracerWrapper.currentSpan, "function.request", event); tagObject(this.tracerWrapper.currentSpan, "function.response", result); } @@ -170,7 +170,7 @@ export class TraceListener { coldStartTracer.trace(coldStartNodes); } if (this.triggerTags) { - const statusCode = extractHTTPStatusCodeTag(this.triggerTags, result); + const statusCode = extractHTTPStatusCodeTag(this.triggerTags, result, isResponseStreamFunction); // Store the status tag in the listener to send to Xray on invocation completion this.triggerTags["http.status_code"] = statusCode!; diff --git a/src/trace/trigger.spec.ts b/src/trace/trigger.spec.ts index 2b85ecc1..471e363f 100644 --- a/src/trace/trigger.spec.ts +++ b/src/trace/trigger.spec.ts @@ -109,7 +109,7 @@ describe("parseEventSource", () => { }, ]; - const responses = [ + const bufferedResponses = [ { responseBody: { statusCode: 200, @@ -130,6 +130,27 @@ describe("parseEventSource", () => { }, ]; + const streamingResponses = [ + { + responseBody: { + statusCode: 200, + body: '"Hello from Lambda!"', + }, + expectedStatusCode: "200", + }, + { + responseBody: { + statusCode: 404, + body: '"NOT FOUND"', + }, + expectedStatusCode: "404", + }, + { + responseBody: undefined, + expectedStatusCode: "200", + }, + ]; + it("returns the correct event source and ARN", () => { for (let event of events) { const eventData = JSON.parse(readFileSync(`./event_samples/${event.file}`, "utf8")); @@ -148,13 +169,38 @@ describe("parseEventSource", () => { } }); - it("extracts the status code if API Gateway or ALB, otherwise do nothing", () => { + it("extracts the status code if API Gateway, ALB, or Function URL, otherwise do nothing, for buffered functions", () => { + for (const event of events) { + const eventData = JSON.parse(readFileSync(`./event_samples/${event.file}`, "utf8")); + const triggerTags = extractTriggerTags(eventData, mockContext); + const isResponseStreamingFunction = false; + for (const response of bufferedResponses) { + const statusCode = extractHTTPStatusCodeTag(triggerTags, response.responseBody, isResponseStreamingFunction); + // We should always return a status code for API Gateway, ALB, and Lambda Function URL + if ( + [ + "api-gateway-v1.json", + "api-gateway-v2.json", + "application-load-balancer.json", + "lambda-function-urls.json", + ].includes(event.file) + ) { + expect(statusCode).toEqual(response.expectedStatusCode); + } else { + expect(statusCode).toBeUndefined(); + } + } + } + }); + + it("extracts the status code if API Gateway, ALB, or Function URL, otherwise do nothing, for streaming functions", () => { for (let event of events) { const eventData = JSON.parse(readFileSync(`./event_samples/${event.file}`, "utf8")); const triggerTags = extractTriggerTags(eventData, mockContext); - for (let response of responses) { - const statusCode = extractHTTPStatusCodeTag(triggerTags, response.responseBody); - // We should always return a status code for API Gateway and ALB + const isResponseStreamingFunction = true; + for (const response of streamingResponses) { + const statusCode = extractHTTPStatusCodeTag(triggerTags, response.responseBody, isResponseStreamingFunction); + // We should always return a status code for API Gateway, ALB, and Lambda Function URL if ( [ "api-gateway-v1.json", diff --git a/src/trace/trigger.ts b/src/trace/trigger.ts index 66e60828..ab670059 100644 --- a/src/trace/trigger.ts +++ b/src/trace/trigger.ts @@ -344,11 +344,12 @@ export function extractTriggerTags(event: any, context: Context) { /** * extractHTTPStatusCode extracts a status code from the response if the Lambda was triggered - * by API Gateway or ALB + * by API Gateway, ALB, or Lambda Function URL */ export function extractHTTPStatusCodeTag( triggerTags: { [key: string]: string } | undefined, result: any, + isResponseStreamFunction: boolean, ): string | undefined { let eventSource: string | undefined; triggerTags ? (eventSource = triggerTags["function_trigger.event_source"]) : (eventSource = undefined); @@ -357,8 +358,10 @@ export function extractHTTPStatusCodeTag( } const resultStatusCode = result?.statusCode; - // Return a 502 status if no response is found - if (result === undefined) { + // Return a 502 status if no response is found in + // any buffered function. Streaming functions returning + // undefined results will be marked as 200. + if (result === undefined && !isResponseStreamFunction) { return "502"; } else if (resultStatusCode) { // Type check the statusCode if available diff --git a/src/utils/handler.ts b/src/utils/handler.ts index ec6832ec..4874bbf8 100644 --- a/src/utils/handler.ts +++ b/src/utils/handler.ts @@ -1,5 +1,6 @@ import { Callback, Context, Handler } from "aws-lambda"; import { logError } from "./log"; +import { HANDLER_STREAMING, STREAM_RESPONSE } from "../constants"; export type OnWrapFunc any> = (fn: T) => T; @@ -26,7 +27,7 @@ export function wrap( let result: TResult | undefined; let handlerError: Error | undefined; - let wrappedHandler = promHandler; + let wrappedHandler = promHandler as any; // Try to apply onWrap to the handler, and if it fails, fall back to the original // handler. try { @@ -63,7 +64,17 @@ export function wrap( }; } -export function promisifiedHandler(handler: Handler) { +export function promisifiedHandler(handler: Handler | any) { + // Response Stream Lambda function. + if (handler[HANDLER_STREAMING] !== undefined && handler[HANDLER_STREAMING] === STREAM_RESPONSE) { + return (event: any, responseStream: any, context: Context) => { + // This handler will always be a promise. + const promise = handler(event, responseStream, context) as Promise; + return promise; + }; + } + + // Buffered Lambda function. return (event: TEvent, context: Context) => { // Lambda functions in node complete in one of two possible ways. // 1. By calling the "callback" function with a result.