Skip to content

Commit 0827a61

Browse files
author
restrry
committed
store traceId manually during hapi lifecycle
1 parent 532610b commit 0827a61

File tree

6 files changed

+38
-12
lines changed

6 files changed

+38
-12
lines changed

src/core/server/http/http_server.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
getServerOptions,
1717
getRequestId,
1818
} from '@kbn/server-http-tools';
19+
import agent from 'elastic-apm-node';
1920

2021
import type { Duration } from 'moment';
2122
import { Observable } from 'rxjs';
@@ -345,6 +346,7 @@ export class HttpServer {
345346
...(request.app ?? {}),
346347
requestId,
347348
requestUuid: uuid.v4(),
349+
traceId: agent.currentTraceIds['trace.id'],
348350
} as KibanaRequestState;
349351
return responseToolkit.continue;
350352
});

src/core/server/http/logging/get_response_log.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ interface RequestFixtureOptions {
2727
path?: string;
2828
query?: Record<string, any>;
2929
response?: Record<string, any> | Boom.Boom;
30+
app?: Record<string, any>;
3031
}
3132

3233
function createMockHapiRequest({
@@ -39,6 +40,7 @@ function createMockHapiRequest({
3940
path = '/path',
4041
query = {},
4142
response = { headers: {}, statusCode: 200 },
43+
app = {},
4244
}: RequestFixtureOptions = {}): Request {
4345
return {
4446
auth,
@@ -50,6 +52,7 @@ function createMockHapiRequest({
5052
path,
5153
query,
5254
response,
55+
app,
5356
} as unknown as Request;
5457
}
5558

@@ -143,6 +146,17 @@ describe('getEcsResponseLog', () => {
143146
expect(result.message).toMatchInlineSnapshot(`"GET /path 200"`);
144147
});
145148

149+
test('set traceId stored in the request app storage', () => {
150+
const req = createMockHapiRequest({
151+
app: {
152+
foo: 'bar',
153+
traceId: 'trace_id',
154+
},
155+
});
156+
const result = getEcsResponseLog(req, logger);
157+
expect(result.meta?.trace?.id).toBe('trace_id');
158+
});
159+
146160
test('handles Boom errors in the response', () => {
147161
const req = createMockHapiRequest({
148162
response: Boom.badRequest(),
@@ -280,6 +294,7 @@ describe('getEcsResponseLog', () => {
280294
"status_code": 200,
281295
},
282296
},
297+
"trace": undefined,
283298
"url": Object {
284299
"path": "/path",
285300
"query": "",

src/core/server/http/logging/get_response_log.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import numeral from '@elastic/numeral';
1313
import { LogMeta } from '@kbn/logging';
1414
import { Logger } from '../../logging';
1515
import { getResponsePayloadBytes } from './get_payload_size';
16+
import type { KibanaRequestState } from '../router';
1617

1718
const FORBIDDEN_HEADERS = ['authorization', 'cookie', 'set-cookie'];
1819
const REDACTED_HEADER_TEXT = '[REDACTED]';
@@ -65,6 +66,8 @@ export function getEcsResponseLog(request: Request, log: Logger) {
6566
const bytes = getResponsePayloadBytes(response, log);
6667
const bytesMsg = bytes ? ` - ${numeral(bytes).format('0.0b')}` : '';
6768

69+
const traceId = (request.app as KibanaRequestState).traceId;
70+
6871
const meta: LogMeta = {
6972
client: {
7073
ip: request.info.remoteAddress,
@@ -95,6 +98,7 @@ export function getEcsResponseLog(request: Request, log: Logger) {
9598
user_agent: {
9699
original: request.headers['user-agent'],
97100
},
101+
trace: traceId ? { id: traceId } : undefined,
98102
};
99103

100104
return {

src/core/server/http/router/request.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export interface KibanaRequestState extends RequestApplicationState {
3535
requestId: string;
3636
requestUuid: string;
3737
rewrittenUrl?: URL;
38+
traceId?: string;
3839
}
3940

4041
/**

src/core/server/logging/layouts/json_layout.test.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -332,13 +332,13 @@ test('format() meta can not override tracing properties', () => {
332332
context: 'bar',
333333
pid: 3,
334334
meta: {
335-
span: 'span_override',
336-
trace: 'trace_override',
337-
transaction: 'transaction_override',
335+
span: { id: 'span_override' },
336+
trace: { id: 'trace_override' },
337+
transaction: { id: 'transaction_override' },
338338
},
339-
spanId: 'spanId-1',
340-
traceId: 'traceId-1',
341-
transactionId: 'transactionId-1',
339+
spanId: 'spanId',
340+
traceId: 'traceId',
341+
transactionId: 'transactionId',
342342
})
343343
)
344344
).toStrictEqual({
@@ -352,8 +352,8 @@ test('format() meta can not override tracing properties', () => {
352352
process: {
353353
pid: 3,
354354
},
355-
span: { id: 'spanId-1' },
356-
trace: { id: 'traceId-1' },
357-
transaction: { id: 'transactionId-1' },
355+
span: { id: 'span_override' },
356+
trace: { id: 'trace_override' },
357+
transaction: { id: 'transaction_override' },
358358
});
359359
});

src/core/server/logging/layouts/json_layout.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ export class JsonLayout implements Layout {
4242
}
4343

4444
public format(record: LogRecord): string {
45+
const spanId = record.meta?.span?.id ?? record.spanId;
46+
const traceId = record.meta?.trace?.id ?? record.traceId;
47+
const transactionId = record.meta?.transaction?.id ?? record.transactionId;
48+
4549
const log: Ecs = {
4650
ecs: { version: '8.0.0' },
4751
'@timestamp': moment(record.timestamp).format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
@@ -54,9 +58,9 @@ export class JsonLayout implements Layout {
5458
process: {
5559
pid: record.pid,
5660
},
57-
span: record.spanId ? { id: record.spanId } : undefined,
58-
trace: record.traceId ? { id: record.traceId } : undefined,
59-
transaction: record.transactionId ? { id: record.transactionId } : undefined,
61+
span: spanId ? { id: spanId } : undefined,
62+
trace: traceId ? { id: traceId } : undefined,
63+
transaction: transactionId ? { id: transactionId } : undefined,
6064
};
6165
const output = record.meta ? merge({ ...record.meta }, log) : log;
6266

0 commit comments

Comments
 (0)