Skip to content
This repository was archived by the owner on Oct 3, 2023. It is now read-only.

Commit a692467

Browse files
authored
Enforce message event and annotation limits. (#335)
1 parent e95a418 commit a692467

File tree

6 files changed

+100
-13
lines changed

6 files changed

+100
-13
lines changed

packages/opencensus-core/src/trace/model/span-base.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,12 @@ export abstract class SpanBase implements types.Span {
6464

6565
/** The number of dropped attributes. */
6666
droppedAttributesCount = 0;
67-
6867
/** The number of dropped links. */
6968
droppedLinksCount = 0;
69+
/** The number of dropped annotations. */
70+
droppedAnnotationsCount = 0;
71+
/** The number of dropped message events. */
72+
droppedMessageEventsCount = 0;
7073

7174
/** Constructs a new SpanBaseModel instance. */
7275
constructor() {
@@ -166,6 +169,11 @@ export abstract class SpanBase implements types.Span {
166169
*/
167170
addAnnotation(
168171
description: string, attributes?: types.Attributes, timestamp = 0) {
172+
if (this.annotations.length >=
173+
this.activeTraceParams.numberOfAnnontationEventsPerSpan) {
174+
this.annotations.shift();
175+
this.droppedAnnotationsCount++;
176+
}
169177
this.annotations.push({
170178
'description': description,
171179
'attributes': attributes,
@@ -203,6 +211,11 @@ export abstract class SpanBase implements types.Span {
203211
* @param timestamp A time in milliseconds. Defaults to Date.now()
204212
*/
205213
addMessageEvent(type: string, id: string, timestamp = 0) {
214+
if (this.messageEvents.length >=
215+
this.activeTraceParams.numberOfMessageEventsPerSpan) {
216+
this.messageEvents.shift();
217+
this.droppedMessageEventsCount++;
218+
}
206219
this.messageEvents.push({
207220
'type': type,
208221
'id': id,

packages/opencensus-core/src/trace/model/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,12 @@ export interface Span {
329329
/** The number of dropped links. */
330330
droppedLinksCount: number;
331331

332+
/** The number of dropped annotations. */
333+
droppedAnnotationsCount: number;
334+
335+
/** The number of dropped message events. */
336+
droppedMessageEventsCount: number;
337+
332338
/**
333339
* Adds an atribute to the span.
334340
* @param key Describes the value added.

packages/opencensus-core/test/test-root-span.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ describe('RootSpan', () => {
206206
rootSpan.addAnnotation('description test', {} as Attributes, Date.now());
207207

208208
assert.ok(rootSpan.annotations.length > 0);
209+
assert.equal(rootSpan.droppedAnnotationsCount, 0);
209210
assert.ok(instanceOfAnnotation(rootSpan.annotations[0]));
210211
});
211212
});
@@ -251,6 +252,7 @@ describe('RootSpan', () => {
251252
rootSpan.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id');
252253

253254
assert.ok(rootSpan.messageEvents.length > 0);
255+
assert.equal(rootSpan.droppedMessageEventsCount, 0);
254256
assert.ok(instanceOfLink(rootSpan.messageEvents[0]));
255257
});
256258
});

packages/opencensus-core/test/test-span.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ import {Annotation, Attributes, Link} from '../src/trace/model/types';
2828
const tracer = new CoreTracer();
2929
tracer.activeTraceParams = {
3030
numberOfAttributesPerSpan: 32,
31-
numberOfLinksPerSpan: 32
31+
numberOfLinksPerSpan: 32,
32+
numberOfAnnontationEventsPerSpan: 32,
33+
numberOfMessageEventsPerSpan: 32
3234
};
3335

3436
describe('Span', () => {
@@ -226,8 +228,23 @@ describe('Span', () => {
226228
span.addAnnotation('description test', {} as Attributes, Date.now());
227229

228230
assert.ok(span.annotations.length > 0);
231+
assert.equal(span.droppedAnnotationsCount, 0);
229232
assert.ok(instanceOfAnnotation(span.annotations[0]));
230233
});
234+
235+
it('should drop extra annotations', () => {
236+
const rootSpan = new RootSpan(tracer);
237+
rootSpan.start();
238+
239+
const span = new Span(rootSpan);
240+
span.start();
241+
for (let i = 0; i < 40; i++) {
242+
span.addAnnotation('description test', {} as Attributes, Date.now());
243+
}
244+
245+
assert.equal(span.annotations.length, 32);
246+
assert.equal(span.droppedAnnotationsCount, 8);
247+
});
231248
});
232249

233250
/**
@@ -289,8 +306,23 @@ describe('Span', () => {
289306
span.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id');
290307

291308
assert.ok(span.messageEvents.length > 0);
309+
assert.equal(span.droppedMessageEventsCount, 0);
292310
assert.ok(instanceOfLink(span.messageEvents[0]));
293311
});
312+
313+
it('should drop extra Message Event', () => {
314+
const rootSpan = new RootSpan(tracer);
315+
rootSpan.start();
316+
317+
const span = new Span(rootSpan);
318+
span.start();
319+
for (let i = 0; i < 35; i++) {
320+
span.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id');
321+
}
322+
323+
assert.equal(span.messageEvents.length, 32);
324+
assert.equal(span.droppedMessageEventsCount, 3);
325+
});
294326
});
295327

296328
describe('setStatus()', () => {

packages/opencensus-exporter-ocagent/src/adapters.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,8 @@ const adaptMessageEventType = (value: string): opencensus.proto.trace.v1.Span
157157
* @returns opencensus.proto.trace.v1.Span.TimeEvents
158158
*/
159159
const adaptTimeEvents =
160-
(annotations: Annotation[], messageEvents: MessageEvent[]):
160+
(annotations: Annotation[], messageEvents: MessageEvent[],
161+
droppedAnnotationsCount: number, droppedMessageEventsCount: number):
161162
opencensus.proto.trace.v1.Span.TimeEvents => {
162163
const timeEvents: opencensus.proto.trace.v1.Span.TimeEvent[] = [];
163164

@@ -188,8 +189,8 @@ const adaptTimeEvents =
188189

189190
return {
190191
timeEvent: timeEvents,
191-
droppedAnnotationsCount: null,
192-
droppedMessageEventsCount: null
192+
droppedAnnotationsCount,
193+
droppedMessageEventsCount
193194
};
194195
};
195196

@@ -274,7 +275,9 @@ export const adaptSpan = (span: Span): opencensus.proto.trace.v1.Span => {
274275
endTime: millisToTimestamp(span.endTime),
275276
attributes: adaptAttributes(span.attributes, span.droppedAttributesCount),
276277
stackTrace: null, // Unsupported by nodejs
277-
timeEvents: adaptTimeEvents(span.annotations, span.messageEvents),
278+
timeEvents: adaptTimeEvents(
279+
span.annotations, span.messageEvents, span.droppedAnnotationsCount,
280+
span.droppedMessageEventsCount),
278281
links: adaptLinks(span.links, span.droppedLinksCount),
279282
status: span.status,
280283
sameProcessAsParentSpan: adaptBoolean(!span.remoteParent),

packages/opencensus-exporter-ocagent/test/test-ocagent.ts

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,12 @@ describe('OpenCensus Agent Exporter', () => {
175175
tracing = nodeTracing.start({
176176
exporter: ocAgentExporter,
177177
samplingRate: INITIAL_SAMPLER_PROBABILITY,
178-
traceParams: {numberOfAttributesPerSpan: 4, numberOfLinksPerSpan: 3}
178+
traceParams: {
179+
numberOfAttributesPerSpan: 4,
180+
numberOfLinksPerSpan: 3,
181+
numberOfAnnontationEventsPerSpan: 2,
182+
numberOfMessageEventsPerSpan: 3
183+
}
179184
});
180185
});
181186

@@ -344,9 +349,16 @@ describe('OpenCensus Agent Exporter', () => {
344349
// Annotation
345350
rootSpan.addAnnotation(
346351
'my_annotation', {myString: 'bar', myNumber: 123, myBoolean: true});
352+
rootSpan.addAnnotation(
353+
'my_annotation1', {myString: 'bar1', myNumber: 456, myBoolean: true});
354+
rootSpan.addAnnotation(
355+
'my_annotation2', {myString: 'bar2', myNumber: 789, myBoolean: true});
356+
rootSpan.addAnnotation(
357+
'my_annotation3', {myString: 'bar3', myNumber: 789, myBoolean: true});
347358

348359
// Message Event
349360
const timeStamp = 123456789;
361+
rootSpan.addMessageEvent('MessageEventTypeSent', 'aaaa', timeStamp);
350362
rootSpan.addMessageEvent('MessageEventTypeSent', 'ffff', timeStamp);
351363
rootSpan.addMessageEvent('MessageEventTypeRecv', 'ffff', timeStamp);
352364
// Use of `null` is to force a `TYPE_UNSPECIFIED` value
@@ -420,27 +432,46 @@ describe('OpenCensus Agent Exporter', () => {
420432

421433
// Time Events
422434
assert.deepEqual(span.timeEvents, {
423-
droppedAnnotationsCount: 0,
424-
droppedMessageEventsCount: 0,
435+
droppedAnnotationsCount: 2,
436+
droppedMessageEventsCount: 1,
425437
timeEvent: [
426438
{
427439
value: 'annotation',
428440
time: null,
429441
annotation: {
430442
description:
431-
{value: 'my_annotation', truncatedByteCount: 0},
443+
{value: 'my_annotation2', truncatedByteCount: 0},
432444
attributes: {
433445
attributeMap: {
434446
myString: {
435447
value: 'stringValue',
436-
stringValue: {value: 'bar', truncatedByteCount: 0}
448+
stringValue: {value: 'bar2', truncatedByteCount: 0}
437449
},
438-
myNumber: {value: 'intValue', intValue: '123'},
450+
myNumber: {value: 'intValue', intValue: '789'},
439451
myBoolean: {value: 'boolValue', boolValue: true}
440452
},
441453
droppedAttributesCount: 0
442454
}
443-
}
455+
},
456+
},
457+
{
458+
value: 'annotation',
459+
time: null,
460+
annotation: {
461+
description:
462+
{value: 'my_annotation3', truncatedByteCount: 0},
463+
attributes: {
464+
attributeMap: {
465+
myString: {
466+
value: 'stringValue',
467+
stringValue: {value: 'bar3', truncatedByteCount: 0}
468+
},
469+
myNumber: {value: 'intValue', intValue: '789'},
470+
myBoolean: {value: 'boolValue', boolValue: true}
471+
},
472+
droppedAttributesCount: 0
473+
}
474+
},
444475
},
445476
{
446477
messageEvent: {

0 commit comments

Comments
 (0)