diff --git a/src/cloudevents.ts b/src/cloudevents.ts index 8eaeffb9..d02a994f 100644 --- a/src/cloudevents.ts +++ b/src/cloudevents.ts @@ -68,5 +68,10 @@ export function getBinaryCloudEventContext( context[attributeName] = req.header(name); } } + + // Populate the traceparent header. + if (req.header('traceparent')) { + context.traceparent = req.header('traceparent'); + } return context; } diff --git a/src/functions.ts b/src/functions.ts index 467f1a77..dbc11966 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -126,6 +126,11 @@ export interface CloudEventsContext { | boolean | null | unknown; + /** + * The traceparent string, containing a trace version, trace ID, span ID, and trace options. + * @see https://github.com/cloudevents/spec/blob/master/extensions/distributed-tracing.md + */ + traceparent?: string; } export type Context = CloudFunctionsContext | CloudEventsContext; diff --git a/test/integration/cloudevent.ts b/test/integration/cloudevent.ts index 5ebb7157..273318ae 100644 --- a/test/integration/cloudevent.ts +++ b/test/integration/cloudevent.ts @@ -25,6 +25,7 @@ const TEST_CLOUD_EVENT = { subject: 'test-subject', id: 'test-1234-1234', time: '2020-05-13T01:23:45Z', + traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', datacontenttype: 'application/json', data: { some: 'payload', @@ -52,6 +53,17 @@ describe('CloudEvent Function', () => { body: TEST_CLOUD_EVENT, expectedCloudEvent: TEST_CLOUD_EVENT, }, + { + name: 'CloudEvents v1.0 structured content request', + headers: { + traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', + }, + body: TEST_CLOUD_EVENT, + expectedCloudEvent: { + ...TEST_CLOUD_EVENT, + traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', + }, + }, { name: 'CloudEvents v1.0 binary content request', headers: { @@ -63,6 +75,7 @@ describe('CloudEvent Function', () => { 'ce-id': TEST_CLOUD_EVENT.id, 'ce-time': TEST_CLOUD_EVENT.time, 'ce-datacontenttype': TEST_CLOUD_EVENT.datacontenttype, + traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', }, body: TEST_CLOUD_EVENT.data, expectedCloudEvent: TEST_CLOUD_EVENT, diff --git a/test/integration/legacy_event.ts b/test/integration/legacy_event.ts index 410fd322..e93393a3 100644 --- a/test/integration/legacy_event.ts +++ b/test/integration/legacy_event.ts @@ -24,6 +24,7 @@ const TEST_CLOUD_EVENT = { subject: 'test-subject', id: 'test-1234-1234', time: '2020-05-13T01:23:45Z', + traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', datacontenttype: 'application/json', data: { some: 'payload', @@ -111,6 +112,7 @@ describe('Event Function', () => { specversion: '1.0', subject: 'test-subject', time: '2020-05-13T01:23:45Z', + traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', type: 'com.google.cloud.storage', }, }, @@ -125,6 +127,7 @@ describe('Event Function', () => { 'ce-id': TEST_CLOUD_EVENT.id, 'ce-time': TEST_CLOUD_EVENT.time, 'ce-datacontenttype': TEST_CLOUD_EVENT.datacontenttype, + traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', }, body: TEST_CLOUD_EVENT.data, expectedData: TEST_CLOUD_EVENT.data, @@ -136,6 +139,7 @@ describe('Event Function', () => { specversion: '1.0', subject: 'test-subject', time: '2020-05-13T01:23:45Z', + traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', type: 'com.google.cloud.storage', }, }, diff --git a/test/middleware/background_event_to_cloudevent.ts b/test/middleware/background_event_to_cloudevent.ts index 6e1ee0e0..ffd6df8c 100644 --- a/test/middleware/background_event_to_cloudevent.ts +++ b/test/middleware/background_event_to_cloudevent.ts @@ -148,6 +148,7 @@ describe('backgroundEventToCloudEventMiddleware', () => { subject: 'test-subject', id: 'test-1234-1234', time: '2020-05-13T01:23:45Z', + traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', datacontenttype: 'application/json', data: { some: 'payload', @@ -161,6 +162,7 @@ describe('backgroundEventToCloudEventMiddleware', () => { subject: 'test-subject', id: 'test-1234-1234', time: '2020-05-13T01:23:45Z', + traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', datacontenttype: 'application/json', data: { some: 'payload',