Skip to content

Commit 485e5f7

Browse files
committed
improve tagging
1 parent 985be88 commit 485e5f7

File tree

5 files changed

+36
-71
lines changed

5 files changed

+36
-71
lines changed

src/ExpressBridge.ts

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -41,24 +41,8 @@ export class ExpressBridge {
4141
console.log('Telemetry enabled: ', !!process.env.EB_TELEMETRY);
4242
if (process.env.EB_TELEMETRY && this.options.telemetry) {
4343
console.log('Telemetry enabled, setting trace tag on event.');
44-
if ('body' in incomingEvent) {
45-
incomingEvent.body =
46-
typeof incomingEvent.body === 'string'
47-
? JSON.parse(incomingEvent.body)
48-
: incomingEvent.body;
49-
incomingEvent.body.eb_event_id =
50-
incomingEvent.body?.eb_event_id || v4();
51-
} else if (incomingEvent.Records) {
52-
for (const record of incomingEvent.Records) {
53-
record.eb_event_id = record.eb_event_id || v4();
54-
}
55-
} else {
56-
incomingEvent.eb_event_id = incomingEvent.eb_event_id || v4();
57-
}
58-
this.telemetry = new Telemetry(
59-
incomingEvent.body.eb_event_id,
60-
this.options.telemetry
61-
);
44+
this.telemetry = new Telemetry(this.options.telemetry);
45+
const tag = this.telemetry.tagEvent(incomingEvent);
6246
}
6347

6448
await this.telemetry?.beacon('EB-PROCESS', {
@@ -133,11 +117,7 @@ export class ExpressBridge {
133117
public post(...handlers: handlerType[]): void {
134118
this.postHandlers.push(...handlers);
135119
}
136-
137-
public getTelemetryId() {
138-
return this.telemetry.eb_event_id;
139-
}
140-
120+
/* */
141121
private match(
142122
incomingEvent: Record<string, any>
143123
): EventPattern<typeof incomingEvent>[] {

src/Telemetry.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@ export type TelemetryConfig = Partial<AxiosRequestConfig> & {
77
};
88

99
export class Telemetry {
10-
constructor(
11-
public eb_event_id: string,
12-
private requestConfig: TelemetryConfig
13-
) {}
10+
private eb_event_id: string;
11+
12+
constructor(private requestConfig: TelemetryConfig) {}
1413

1514
public async beacon(
1615
tag: string,
@@ -32,19 +31,25 @@ export class Telemetry {
3231
}
3332
}
3433

35-
public tagEvent(event: Record<string, any>): Record<string, any> {
34+
public tagEvent(event: Record<string, any>): string {
3635
const { body, detail, Records } = event;
3736
let payload = body ?? detail ?? Records;
3837

38+
console.log('Tagging payload: ', payload);
39+
3940
const tag = v4();
4041
if (Array.isArray(payload)) {
4142
for (const record of payload) {
4243
record.eb_event_id = record.eb_event_id || tag;
4344
}
45+
} else if (!payload) {
46+
event.eb_event_id = event.eb_event_id || tag;
4447
} else {
4548
payload = typeof payload === 'string' ? JSON.parse(payload) : payload;
4649
payload.eb_event_id = payload.eb_event_id || tag;
4750
}
48-
return event;
51+
52+
this.eb_event_id = tag;
53+
return tag;
4954
}
5055
}

src/tests/expressBridge.data.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,23 @@ export default {
7373
},
7474
stageVariables: {},
7575
},
76+
eventBridgeMessage: {
77+
version: '0',
78+
id: '301a585b-1fc4-00bb-f5b2-a4f887684942',
79+
'detail-type': 'message',
80+
source: 'acme.payments',
81+
account: '018345072091',
82+
time: '2022-01-29T05:57:47Z',
83+
region: 'us-east-1',
84+
resources: [],
85+
detail: {
86+
id: 1234,
87+
userId: 'user@example.com',
88+
price: 10,
89+
serviceTier: 'premium',
90+
address: '2965 S Sierra Heights, Mesa, AZ 85212',
91+
createdAt: 1000001231234,
92+
eb_event_id: '20e1b1ba-05da-40b9-aa98-6d81eca40041',
93+
},
94+
},
7695
};

src/tests/expressBridge.test.ts

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -66,39 +66,3 @@ describe('Test ExpressBridge', () => {
6666
//expect(true).toBe(true);
6767
});
6868
});
69-
70-
describe('test event id persistence between services', () => {
71-
beforeEach(() => {
72-
jest.clearAllMocks();
73-
});
74-
75-
test('should persist eb_event_id between services', async () => {
76-
// expressBridge modifies the event by 'tagging' it with an
77-
// id used for telemetry
78-
// this is where a REAL wrapper object would be useful later --
79-
// to track related event messages
80-
process.env.EB_TELEMETRY = 'true';
81-
const message = { ...messages.httpMessage };
82-
83-
const ordersBridge = new ExpressBridge({
84-
alwaysRunHooks: true,
85-
telemetry: {
86-
serviceName: 'orders',
87-
},
88-
});
89-
ordersBridge.process(message);
90-
const ordersEventId = message.body.eb_event_id;
91-
expect(ordersEventId).toBeTruthy();
92-
93-
const paymentsBridge = new ExpressBridge({
94-
alwaysRunHooks: true,
95-
telemetry: {
96-
serviceName: 'payments',
97-
},
98-
});
99-
paymentsBridge.process(message);
100-
const paymentsEventId = message.body.eb_event_id;
101-
102-
expect(ordersEventId).toEqual(paymentsEventId);
103-
});
104-
});

src/tests/telemetry.test.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import axios from 'axios';
2-
import { v4 } from 'uuid';
32
import { Telemetry } from '../Telemetry';
43

54
jest.mock('axios', () => ({
@@ -17,8 +16,7 @@ describe('test telemetry functionality', () => {
1716
test('should exercise telemetry functionality under correct conditions', async () => {
1817
expect(process.env.EB_TELEMETRY).toBe('true');
1918

20-
const eventId = v4();
21-
const telemetry = new Telemetry(eventId, {
19+
const telemetry = new Telemetry({
2220
url: 'foo.com/telemetry',
2321
method: 'post',
2422
headers: {
@@ -27,8 +25,6 @@ describe('test telemetry functionality', () => {
2725
serviceName: 'orders',
2826
});
2927

30-
expect(telemetry.eb_event_id).toBeDefined();
31-
3228
const message = {
3329
name: 'Johnny Appleseed',
3430
item: 'Moleskine Notebooks',
@@ -42,14 +38,15 @@ describe('test telemetry functionality', () => {
4238
},
4339
};
4440

41+
const tag = telemetry.tagEvent(message);
4542
telemetry.beacon('EB-TEST', message);
4643

4744
expect(axios).toHaveBeenCalledWith(
4845
expect.objectContaining({
4946
data: {
5047
tag: 'EB-TEST',
5148
message,
52-
eb_event_id: eventId,
49+
eb_event_id: tag,
5350
serviceName: 'orders',
5451
},
5552
})

0 commit comments

Comments
 (0)