Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[w3c] Support W3C trace context propagation #429

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
935fd50
refactor `trace-context-service.ts`
duncanista Nov 7, 2023
2f1aa21
add `span-context-wrapper.ts`
duncanista Nov 7, 2023
2016804
update `tracer-wrapper.ts`
duncanista Nov 7, 2023
a7cebf3
add `step-function-service.ts`
duncanista Nov 7, 2023
cf8192d
add `xray-service.ts`
duncanista Nov 7, 2023
5168403
add `extractor.ts`
duncanista Nov 7, 2023
5b29f18
add `http.ts` extractor
duncanista Nov 7, 2023
0edec58
add `custom.ts` extractor
duncanista Nov 7, 2023
a9bc581
add `app-sync.ts` extractor
duncanista Nov 7, 2023
7ffa01e
add `sns.ts` extractor
duncanista Nov 7, 2023
aafdaae
add `sqs.ts` extractor
duncanista Nov 7, 2023
48840a3
add `kinesis.ts` extractor
duncanista Nov 7, 2023
608b6c7
add `sns-sqs.ts` extractor
duncanista Nov 7, 2023
4bbcbed
add `event-bridge.ts` extractor
duncanista Nov 7, 2023
046289a
add `event-bridge-sqs.ts` extractor
duncanista Nov 7, 2023
5a81761
add `lambda-context.ts` extractor
duncanista Nov 7, 2023
3473052
add `step-function.ts` extractor
duncanista Nov 7, 2023
306d1e9
add `index.ts` for extractors
duncanista Nov 7, 2023
b2ffe25
refactor main `index.ts`
duncanista Nov 7, 2023
cae110c
refactor `patch-http.ts`
duncanista Nov 7, 2023
17eacbc
refactor `patch-console.ts`
duncanista Nov 7, 2023
5adeace
refactor `listener.ts`
duncanista Nov 7, 2023
f7a4a94
add `reset` method to `step-function-service.ts`
duncanista Nov 7, 2023
8933905
update `index.ts` in trace
duncanista Nov 7, 2023
77ffab3
add `event-validator.ts`
duncanista Nov 7, 2023
2e0ccbc
remove `context.ts`
duncanista Nov 7, 2023
21ec41f
lint
duncanista Nov 7, 2023
604fd92
format
duncanista Nov 7, 2023
ed48aaa
when tracer is not present, mock an object which allows us to keep us…
duncanista Nov 7, 2023
4940541
remove state for `XrayService`, sadly, for some reason we have to gen…
duncanista Nov 7, 2023
e95556f
get `spanContext` for parenting only when tracer is available
duncanista Nov 7, 2023
72161f9
minor changes to unit test so they can pass
duncanista Nov 8, 2023
65fa9fa
update function signature for `toString` in `SpanContextWrapper`
duncanista Nov 8, 2023
ff842c5
lint
duncanista Nov 8, 2023
10796eb
solve merge conflicts
duncanista Nov 8, 2023
26ccf9a
fix unit tests imports
duncanista Nov 8, 2023
d1ab955
rename `TraceHeaders` to `DatadogTraceHeaders`
duncanista Nov 9, 2023
8cc8ceb
feat: Fix export of TraceHeaders, add note about deprecation. Fix rel…
astuyve Nov 14, 2023
ad05203
fix: s/breaking/major/
astuyve Nov 14, 2023
8d67083
feat: lint
astuyve Nov 14, 2023
9563fea
Merge branch 'main' into jordan.gonzalez/SVLS-3939/support-w3c-trace-…
astuyve Nov 20, 2023
1871ba7
Merge branch 'main' into jordan.gonzalez/SVLS-3939/support-w3c-trace-…
astuyve Nov 20, 2023
e74de4e
Merge branch 'main' into jordan.gonzalez/SVLS-3939/support-w3c-trace-…
astuyve Nov 20, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 74 additions & 9 deletions src/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,14 @@ import http from "http";
import nock from "nock";

import { Context, Handler } from "aws-lambda";
import {
datadog,
getTraceHeaders,
sendDistributionMetric,
TraceHeaders,
sendDistributionMetricWithDate,
} from "./index";
import { datadog, getTraceHeaders, sendDistributionMetric, sendDistributionMetricWithDate } 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";
import { DatadogTraceHeaders } from "./trace/context/extractor";
import { SpanContextWrapper } from "./trace/span-context-wrapper";
import { TraceSource } from "./trace/trace-context-service";

jest.mock("./metrics/enhanced-metrics");

Expand All @@ -28,6 +25,34 @@ const mockContext = {
// typeof OriginalListenerModule.MetricsListener
// >;

let mockSpanContextWrapper: any;
let mockSpanContext: any;
let mockTraceHeaders: Record<string, string> | undefined = undefined;
let mockTraceSource: TraceSource | undefined = undefined;

jest.mock("./trace/trace-context-service", () => {
class MockTraceContextService {
extract(event: any, context: Context): SpanContextWrapper {
return mockSpanContextWrapper;
}

get traceSource() {
return mockTraceSource;
}
get currentTraceContext() {
return mockSpanContextWrapper;
}

get currentTraceHeaders() {
return mockTraceHeaders;
}
}
return {
...jest.requireActual("./trace/trace-context-service"),
TraceContextService: MockTraceContextService,
};
});

describe("datadog", () => {
let traceId: string | undefined;
let parentId: string | undefined;
Expand All @@ -43,6 +68,9 @@ describe("datadog", () => {
callback(null, "Result");
};
beforeEach(() => {
mockTraceHeaders = undefined;
mockSpanContext = undefined;
mockSpanContextWrapper = undefined;
traceId = undefined;
parentId = undefined;
sampled = undefined;
Expand All @@ -60,6 +88,12 @@ describe("datadog", () => {

it("patches http request when autoPatch enabled", async () => {
nock("http://www.example.com").get("/").reply(200, {});
mockTraceHeaders = {
"x-datadog-parent-id": "9101112",
"x-datadog-sampling-priority": "2",
"x-datadog-trace-id": "123456",
};

const wrapped = datadog(handler, { forceWrap: true });
await wrapped(
{
Expand Down Expand Up @@ -189,7 +223,12 @@ describe("datadog", () => {
});

it("makes the current trace headers available", async () => {
let traceHeaders: Partial<TraceHeaders> = {};
mockTraceHeaders = {
"x-datadog-parent-id": "9101112",
"x-datadog-sampling-priority": "2",
"x-datadog-trace-id": "123456",
};
let traceHeaders: Partial<DatadogTraceHeaders> = {};
const event = {
headers: {
"x-datadog-parent-id": "9101112",
Expand All @@ -214,6 +253,19 @@ describe("datadog", () => {
});

it("injects context into console.log messages", async () => {
mockSpanContext = {
toTraceId: () => "123456",
toSpanId: () => "9101112",
_sampling: {
priority: "2",
},
};
mockSpanContextWrapper = {
spanContext: mockSpanContext,
toTraceId: () => mockSpanContext.toTraceId(),
toSpanId: () => mockSpanContext.toSpanId(),
};

const event = {
headers: {
"x-datadog-parent-id": "9101112",
Expand All @@ -238,6 +290,19 @@ describe("datadog", () => {
it("injects context into console.log messages with env var", async () => {
process.env.DD_LOGS_INJECTION = "true";

mockSpanContext = {
toTraceId: () => "123456",
toSpanId: () => "9101112",
_sampling: {
priority: "2",
},
};
mockSpanContextWrapper = {
spanContext: mockSpanContext,
toTraceId: () => mockSpanContext.toTraceId(),
toSpanId: () => mockSpanContext.toSpanId(),
};

const event = {
headers: {
"x-datadog-parent-id": "9101112",
Expand Down Expand Up @@ -333,7 +398,7 @@ describe("datadog", () => {

expect(mockedIncrementInvocations).toBeCalledTimes(1);
expect(mockedIncrementInvocations).toBeCalledWith(expect.anything(), mockContext);
expect(logger.debug).toHaveBeenCalledTimes(11);
expect(logger.debug).toHaveBeenCalledTimes(8);
expect(logger.debug).toHaveBeenLastCalledWith('{"status":"debug","message":"datadog:Unpatching HTTP libraries"}');
});

Expand Down
9 changes: 5 additions & 4 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
MetricsConfig,
MetricsListener,
} from "./metrics";
import { TraceConfig, TraceHeaders, TraceListener } from "./trace";
import { TraceConfig, TraceListener } from "./trace";
import { subscribeToDC } from "./runtime";
import {
logDebug,
Expand All @@ -20,9 +20,10 @@ import {
setLogLevel,
} from "./utils";
import { getEnhancedMetricTags } from "./metrics/enhanced-metrics";
import { DatadogTraceHeaders } from "./trace/context/extractor";

export { TraceHeaders } from "./trace";

// Backwards-compatible export, TODO deprecate in next major
export { DatadogTraceHeaders as TraceHeaders } from "./trace/context/extractor";
export const apiKeyEnvVar = "DD_API_KEY";
export const apiKeyKMSEnvVar = "DD_KMS_API_KEY";
export const captureLambdaPayloadEnvVar = "DD_CAPTURE_LAMBDA_PAYLOAD";
Expand Down Expand Up @@ -278,7 +279,7 @@ export function sendDistributionMetric(name: string, value: number, ...tags: str
/**
* Retrieves the Datadog headers for the current trace.
*/
export function getTraceHeaders(): Partial<TraceHeaders> {
export function getTraceHeaders(): Partial<DatadogTraceHeaders> {
if (currentTraceListener === undefined) {
return {};
}
Expand Down
Loading