Skip to content

Commit 35af07d

Browse files
BAU: Add DT trace id to logs
1 parent 5a3fb75 commit 35af07d

4 files changed

Lines changed: 36 additions & 34 deletions

File tree

package-lock.json

Lines changed: 11 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
"dependencies": {
8080
"@aws-sdk/client-dynamodb": "3.799.0",
8181
"@aws-sdk/client-ssm": "3.799.0",
82+
"@dynatrace/oneagent-sdk": "1.5.0",
8283
"@govuk-one-login/data-vocab": "1.9.2",
8384
"@govuk-one-login/frontend-analytics": "3.3.0",
8485
"@govuk-one-login/frontend-device-intelligence": "1.1.0",

src/app.ts

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import vcReceiptStatusRouter from "./app/vc-receipt-status/router";
1818
import oauthRouter from "./app/oauth2/router";
1919
import config from "./config/config";
2020
import { setLocals } from "./lib/locals";
21-
import { loggerMiddleware, logger } from "./lib/logger";
21+
import { loggerMiddleware, logger, getLogRequestContext } from "./lib/logger";
2222
import { i18nextConfigurationOptions } from "./config/i18next";
2323
import serverErrorHandler from "./handlers/internal-server-error-handler";
2424
import journeyEventErrorHandler from "./handlers/journey-event-error-handler";
@@ -175,14 +175,6 @@ app.use((req, res, next) => {
175175

176176
app.use(notificationBannerHandler);
177177

178-
app.use((req, res, next) => {
179-
req.log = logger.child({
180-
requestId: req.id,
181-
ipvSessionId: req.session?.ipvSessionId,
182-
sessionId: req.session?.id,
183-
});
184-
next();
185-
});
186178
app.use(loggerMiddleware);
187179

188180
// Must be added to the app after the session and logging, and before the routers.
@@ -200,15 +192,6 @@ app.set("etag", false);
200192

201193
const router = express.Router();
202194

203-
router.use((req, res, next) => {
204-
req.log = logger.child({
205-
requestId: req.id,
206-
ipvSessionId: req.session?.ipvSessionId,
207-
sessionId: req.session?.id,
208-
});
209-
next();
210-
});
211-
212195
router.use("/oauth2", oauthRouter);
213196
router.use("/credential-issuer", criRouter);
214197
router.use("/app", mobileAppRouter);

src/lib/logger.ts

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { createInstance } from "@dynatrace/oneagent-sdk"
12
import { Request, RequestHandler, Response } from "express";
23
import pino, { Logger } from "pino";
34
import pinoHttp, { ReqId } from "pino-http";
@@ -69,17 +70,26 @@ export const generateRequestId = (req: Request, res: Response): ReqId => {
6970
return newId;
7071
};
7172

72-
const addRequestContext = (
73-
req: Request,
74-
res: Response,
75-
val: object,
76-
): object => ({
77-
...val,
78-
requestId: req.id,
79-
ipvSessionId: req.session?.ipvSessionId,
80-
sessionId: req.session?.id,
81-
context: req.session?.context ?? undefined,
82-
});
73+
const getDynatraceContext = (): object | undefined => {
74+
const dynatraceApi = createInstance();
75+
const contextInfo = dynatraceApi.getTraceContextInfo();
76+
if (contextInfo?.isValid) {
77+
return {
78+
"dt.trace_id": contextInfo.traceid,
79+
"dt.span_id": contextInfo.spanid,
80+
};
81+
}
82+
};
83+
84+
export const getLogRequestContext = (req: Request): object => {
85+
return {
86+
requestId: req.id,
87+
ipvSessionId: req.session?.ipvSessionId,
88+
sessionId: req.session?.id,
89+
context: req.session?.context ?? undefined,
90+
...getDynatraceContext(),
91+
};
92+
};
8393

8494
export const loggerMiddleware: RequestHandler = pinoHttp({
8595
// Reuse an existing logger instance
@@ -90,20 +100,18 @@ export const loggerMiddleware: RequestHandler = pinoHttp({
90100
wrapSerializers: false,
91101
// Define a custom receive message
92102
customReceivedMessage: (req) => `REQUEST RECEIVED: ${req.method}`,
93-
customReceivedObject: addRequestContext,
94103
customErrorMessage: (req, res) =>
95104
`REQUEST FAILED WITH STATUS CODE: ${res.statusCode}`,
96105
customErrorObject: (req, res, error, val) => {
97106
// Ignore errors that have already been handled by the error handler
98107
if (val.err === HANDLED_ERROR) {
99108
delete val.err;
100109
}
101-
102-
return addRequestContext(req, res, val);
110+
return val;
103111
},
112+
customProps: getLogRequestContext,
104113
customSuccessMessage: (req, res) =>
105114
`REQUEST ${res.statusCode >= 400 ? "FAILED" : "COMPLETED"} WITH STATUS CODE OF: ${res.statusCode}`,
106-
customSuccessObject: addRequestContext,
107115
customAttributeKeys: {
108116
responseTime: "timeTaken",
109117
},

0 commit comments

Comments
 (0)