@@ -31,6 +31,7 @@ import {
31
31
} from '@opentelemetry/core' ;
32
32
import { ExceptionAttribute } from '@opentelemetry/semantic-conventions' ;
33
33
import * as assert from 'assert' ;
34
+ import sinon = require( 'sinon' ) ;
34
35
import { BasicTracerProvider , Span , SpanProcessor } from '../src' ;
35
36
36
37
const performanceTimeOrigin = hrTime ( ) ;
@@ -255,6 +256,86 @@ describe('Span', () => {
255
256
assert . strictEqual ( span . attributes [ 'foo149' ] , 'bar149' ) ;
256
257
} ) ;
257
258
259
+ it ( 'should truncate attribute values exceeding length limit' , ( ) => {
260
+ const tracerWithLimit = new BasicTracerProvider ( {
261
+ logger : new NoopLogger ( ) ,
262
+ traceParams : {
263
+ spanAttributeValueSizeLimit : 100 ,
264
+ } ,
265
+ } ) . getTracer ( 'default' ) ;
266
+
267
+ const spanWithLimit = new Span (
268
+ tracerWithLimit ,
269
+ name ,
270
+ spanContext ,
271
+ SpanKind . CLIENT
272
+ ) ;
273
+ const spanWithoutLimit = new Span (
274
+ tracer ,
275
+ name ,
276
+ spanContext ,
277
+ SpanKind . CLIENT
278
+ ) ;
279
+
280
+ spanWithLimit . setAttribute ( 'attr under limit' , 'a' . repeat ( 100 ) ) ;
281
+ assert . strictEqual (
282
+ spanWithLimit . attributes [ 'attr under limit' ] ,
283
+ 'a' . repeat ( 100 )
284
+ ) ;
285
+ spanWithoutLimit . setAttribute ( 'attr under limit' , 'a' . repeat ( 100 ) ) ;
286
+ assert . strictEqual (
287
+ spanWithoutLimit . attributes [ 'attr under limit' ] ,
288
+ 'a' . repeat ( 100 )
289
+ ) ;
290
+
291
+ spanWithLimit . setAttribute ( 'attr over limit' , 'b' . repeat ( 101 ) ) ;
292
+ assert . strictEqual (
293
+ spanWithLimit . attributes [ 'attr over limit' ] ,
294
+ 'b' . repeat ( 100 )
295
+ ) ;
296
+ spanWithoutLimit . setAttribute ( 'attr over limit' , 'b' . repeat ( 101 ) ) ;
297
+ assert . strictEqual (
298
+ spanWithoutLimit . attributes [ 'attr over limit' ] ,
299
+ 'b' . repeat ( 101 )
300
+ ) ;
301
+ } ) ;
302
+
303
+ it ( 'should warn once when truncating attribute values exceeding length limit' , ( ) => {
304
+ const logger = new NoopLogger ( ) ;
305
+ const loggerWarnSpy = sinon . spy ( logger , 'warn' ) ;
306
+
307
+ const tracerWithLimit = new BasicTracerProvider ( {
308
+ logger,
309
+ traceParams : {
310
+ spanAttributeValueSizeLimit : 100 ,
311
+ } ,
312
+ } ) . getTracer ( 'default' ) ;
313
+
314
+ const spanWithLimit = new Span (
315
+ tracerWithLimit ,
316
+ name ,
317
+ spanContext ,
318
+ SpanKind . CLIENT
319
+ ) ;
320
+
321
+ spanWithLimit . setAttribute ( 'longAttr' , 'b' . repeat ( 100 ) ) ;
322
+ assert ( ! loggerWarnSpy . called ) ;
323
+
324
+ spanWithLimit . setAttribute ( 'longAttr' , 'b' . repeat ( 101 ) ) ;
325
+ assert (
326
+ loggerWarnSpy . withArgs ( 'Span attribute value truncated at key: longAttr.' )
327
+ . calledOnce
328
+ ) ;
329
+
330
+ spanWithLimit . setAttribute ( 'longAttr' , 'c' . repeat ( 102 ) ) ;
331
+ assert (
332
+ loggerWarnSpy . withArgs ( 'Span attribute value truncated at key: longAttr.' )
333
+ . calledOnce
334
+ ) ;
335
+
336
+ assert . strictEqual ( spanWithLimit . attributes . longAttr , 'c' . repeat ( 100 ) ) ;
337
+ } ) ;
338
+
258
339
it ( 'should set an error status' , ( ) => {
259
340
const span = new Span ( tracer , name , spanContext , SpanKind . CLIENT ) ;
260
341
span . setStatus ( {
0 commit comments