From 5de94d389a14892c0a83a7319c4520035374aa70 Mon Sep 17 00:00:00 2001 From: Justin Rowles Date: Thu, 27 Aug 2026 16:31:35 +0100 Subject: [PATCH 1/2] Handle sigterm better in instrumentation --- .../src/server/instrumentation.ts | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/dotcom-rendering/src/server/instrumentation.ts b/dotcom-rendering/src/server/instrumentation.ts index 2d4d5e2820a..2e27a4a3113 100644 --- a/dotcom-rendering/src/server/instrumentation.ts +++ b/dotcom-rendering/src/server/instrumentation.ts @@ -44,11 +44,31 @@ const sdk = new NodeSDK({ sdk.start(); +// Instrumentation is preloaded into the same process as the app server. +// It should react to process SIGTERM, but not own process/server lifecycle. +let shutdownPromise: Promise | null = null; + +const shutdownInstrumentation = (): Promise => { + if (shutdownPromise !== null) { + logger.error( + 'SIGTERM received; Instrumentation SDK is already shutting down', + ); + return shutdownPromise; + } + + logger.info('SIGTERM received; Instrumentation SDK shutting down'); + shutdownPromise = sdk.shutdown().then( + () => { + logger.info('Instrumentation SDK shut down successfully'); + }, + (err) => { + logger.error('Error shutting down Instrumentation SDK', err); + }, + ); + + return shutdownPromise; +}; + process.on('SIGTERM', () => { - sdk.shutdown() - .then( - () => logger.info('SDK shut down successfully'), - (err) => logger.error('Error shutting down SDK', err), - ) - .finally(() => process.exit(0)); + void shutdownInstrumentation(); }); From d21039bc552d4cb2451978125e3de1390c48e535 Mon Sep 17 00:00:00 2001 From: Justin Rowles Date: Fri, 28 Aug 2026 12:52:44 +0100 Subject: [PATCH 2/2] Add basic documentation --- dotcom-rendering/docs/img.png | Bin 0 -> 13426 bytes dotcom-rendering/docs/traces.md | 167 ++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 dotcom-rendering/docs/img.png create mode 100644 dotcom-rendering/docs/traces.md diff --git a/dotcom-rendering/docs/img.png b/dotcom-rendering/docs/img.png new file mode 100644 index 0000000000000000000000000000000000000000..ef74f1e89a2fbacccdec8e79b1c084d7f73fc490 GIT binary patch literal 13426 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 literal 0 HcmV?d00001 diff --git a/dotcom-rendering/docs/traces.md b/dotcom-rendering/docs/traces.md new file mode 100644 index 00000000000..dc823f0771a --- /dev/null +++ b/dotcom-rendering/docs/traces.md @@ -0,0 +1,167 @@ +# Traces + +AWS Cloudwatch Traces are added by `createRequestTracingMiddleware`. They can be viewed in the aws Cloudwatch console + +If fetched using `aws xray batch-get-traces`, the trace document will contain a `Segment` field, which contains a +`Document` field. The `Document` field is a JSON string containing the trace data we want. + +An example CLI request to view a single trace document as json is: + +# Set date range + +``` +start="$(date -u -d '5 hours ago' +%s)" +end="$(date -u +%s)" +``` + +# List all services (currently only "tag-page-rendering") + +``` +aws xray get-service-graph \ + --start-time "$start" \ + --end-time "$end" \ + --query 'Services[].Name' +``` + +# List all traces for a specific service, time range, and path + +``` +aws xray get-trace-summaries \ + --start-time "$start" \ + --end-time "$end" \ + --filter-expression 'service("tag-page-rendering") AND http.url CONTAINS "/Article"' \ + --query 'TraceSummaries[].Id' +``` + +# Get full info from a single trace + +``` +aws xray batch-get-traces \ + --trace-ids 1-e805ee5f-1df00290c3be6a6cee361060 \ + | jq -r '.Traces[0].Segments[0].Document' \ + | jq '.' +``` + +It can be useful to add `metadata` to the trace document for use in the AWS UI. + +For example, we add `subsegments[0].metadata.http.route` to the trace document so it is visible onscreen: + +![img.png](img.png) + +An example of a complete segment document is below. We are likely to be interested in the following sections: + +- start_time (convert on a mac with `date -r `) +- end_time +- metadata.default.http.request_content_length_uncompressed +- http.request.url and http.request.method + +``` +{ + "id": "7a193b1ebdceda4b", + "name": "tag-page-rendering", + "start_time": 1787914805.575, + "trace_id": "1-e805ee5f-1df00290c3be6a6cee361060", + "end_time": 1787914805.5822752, + "fault": false, + "error": false, + "throttle": false, + "http": { + "request": { + "url": "http://tag-page-rendering-jr.local.dev-gutools.co.uk/Article", + "method": "POST", + "user_agent": "curl/8.7.1", + "client_ip": "10.0.20.50" + }, + "response": { + "status": 200, + "content_length": 0 + } + }, + "aws": { + "xray": { + "auto_instrumentation": false, + "sdk_version": "2.8.0", + "sdk": "opentelemetry for nodejs" + } + }, + "metadata": { + "default": { + "otel.resource.process.command": "/app/server.js", + "otel.resource.telemetry.sdk.name": "opentelemetry", + "http.request_content_length_uncompressed": 3466, + "net.transport": "ip_tcp", + "http.flavor": "1.1", + "otel.resource.process.command_args": [ + "/usr/bin/node", + "--require", + "/app/instrumentation.js", + "/app/server.js" + ], + "otel.resource.process.runtime.description": "Node.js", + "otel.resource.host.arch": "arm64", + "otel.resource.host.name": "ip-10-0-14-80.eu-west-1.compute.internal", + "otel.resource.process.runtime.version": "24.20.0", + "otel.resource.service.name": "tag-page-rendering", + "net.host.ip": "::ffff:10.0.14.80", + "otel.resource.process.executable.path": "/usr/bin/node", + "otel.resource.telemetry.sdk.version": "2.8.0", + "otel.resource.process.executable.name": "node", + "otel.resource.process.owner": "node", + "otel.resource.process.pid": 1, + "http.status_text": "OK", + "otel.resource.process.runtime.name": "nodejs", + "otel.resource.telemetry.sdk.language": "nodejs" + } + }, + "subsegments": [ + { + "id": "f6779849ceecde52", + "name": "request handler", + "start_time": 1787914805.576, + "end_time": 1787914805.582691, + "fault": false, + "error": false, + "throttle": false, + "http": { + "request": { + "method": "POST" + }, + "response": { + "status": 200, + "content_length": 0 + } + }, + "aws": { + "xray": { + "auto_instrumentation": false, + "sdk_version": "2.8.0", + "sdk": "opentelemetry for nodejs" + } + }, + "metadata": { + "default": { + "http.lifecycle.event": "finish", + "http.route": "/Article", + "http.aborted": false + } + } + }, + { + "id": "c36bf9dd11b68a79", + "name": "express.json", + "start_time": 1787914805.575, + "end_time": 1787914805.57525, + "fault": false, + "error": false, + "throttle": false, + "aws": { + "xray": { + "auto_instrumentation": false, + "sdk_version": "2.8.0", + "sdk": "opentelemetry for nodejs" + } + } + } + ] +} +```