Skip to content

Commit a937771

Browse files
authored
fix: reset tracecontext to avoid unintentional caching (#676)
* reset tracecontext to avoid unintentional caching * fix unittest mock * yarn format * fix mock in index.spec.ts * yarn format
1 parent 09f1d7c commit a937771

File tree

5 files changed

+63
-1
lines changed

5 files changed

+63
-1
lines changed

src/index.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ jest.mock("./trace/trace-context-service", () => {
6363
get currentTraceHeaders() {
6464
return mockTraceHeaders;
6565
}
66+
67+
reset() {
68+
// mocking
69+
}
6670
}
6771
return {
6872
...jest.requireActual("./trace/trace-context-service"),

src/trace/listener.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ jest.mock("./trace-context-service", () => {
6868
get currentTraceContext() {
6969
return mockSpanContextWrapper;
7070
}
71+
reset() {
72+
// mocking
73+
}
7174
}
7275
return {
7376
...jest.requireActual("./trace-context-service"),

src/trace/listener.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,9 +279,10 @@ export class TraceListener {
279279
this.injectAuthorizerSpan(result, event?.requestContext?.requestId, finishTime || Date.now());
280280
}
281281

282-
// Reset singleton
282+
// Reset singletons and trace context
283283
this.stepFunctionContext = undefined;
284284
StepFunctionContextService.reset();
285+
this.contextService.reset();
285286
}
286287

287288
public onWrap<T = (...args: any[]) => any>(func: T): T {

src/trace/trace-context-service.spec.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,51 @@ describe("TraceContextService", () => {
7979
expect(currentTraceContext?.sampleMode()).toBe(1);
8080
expect(currentTraceContext?.source).toBe("xray");
8181
});
82+
83+
it("resets rootTraceContext to prevent caching between invocations", () => {
84+
// Initial trace context
85+
traceContextService["rootTraceContext"] = {
86+
toTraceId: () => "123456",
87+
toSpanId: () => "abcdef",
88+
sampleMode: () => 1,
89+
source: TraceSource.Event,
90+
spanContext: spanContext,
91+
};
92+
93+
expect(traceContextService.currentTraceContext).not.toBeNull();
94+
expect(traceContextService.traceSource).toBe("event");
95+
96+
traceContextService.reset();
97+
98+
expect(traceContextService.currentTraceContext).toBeNull();
99+
expect(traceContextService.traceSource).toBeNull();
100+
});
101+
102+
it("automatically resets trace context at the beginning of extract", async () => {
103+
// Mock the extractor to return a specific context
104+
const mockExtract = jest.fn().mockResolvedValue({
105+
toTraceId: () => "newTraceId",
106+
toSpanId: () => "newSpanId",
107+
sampleMode: () => 1,
108+
source: TraceSource.Event,
109+
spanContext: {},
110+
});
111+
traceContextService["traceExtractor"] = { extract: mockExtract } as any;
112+
113+
// Set up old trace context (simulating previous invocation)
114+
traceContextService["rootTraceContext"] = {
115+
toTraceId: () => "oldTraceId",
116+
toSpanId: () => "oldSpanId",
117+
sampleMode: () => 0,
118+
source: TraceSource.Xray,
119+
spanContext: {},
120+
};
121+
122+
// Extract should reset and set new context
123+
const result = await traceContextService.extract({}, {} as any);
124+
125+
// Verify old context was cleared and new context was set
126+
expect(result?.toTraceId()).toBe("newTraceId");
127+
expect(traceContextService.traceSource).toBe("event");
128+
});
82129
});

src/trace/trace-context-service.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ export class TraceContextService {
5050
}
5151

5252
async extract(event: any, context: Context): Promise<SpanContextWrapper | null> {
53+
// Reset trace context from previous invocation to prevent caching
54+
this.rootTraceContext = null;
55+
5356
this.rootTraceContext = await this.traceExtractor?.extract(event, context);
5457

5558
return this.currentTraceContext;
@@ -82,4 +85,8 @@ export class TraceContextService {
8285
get traceSource() {
8386
return this.rootTraceContext !== null ? this.rootTraceContext?.source : null;
8487
}
88+
89+
reset() {
90+
this.rootTraceContext = null;
91+
}
8592
}

0 commit comments

Comments
 (0)