Skip to content

Commit f5c74a5

Browse files
committed
test: simple test case for stringifySpans
1 parent 2db68e4 commit f5c74a5

File tree

2 files changed

+136
-3
lines changed

2 files changed

+136
-3
lines changed
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
import { serializeSpans } from './netlify.ts'
2+
import { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api'
3+
import { TraceState } from '@opentelemetry/core'
4+
import { Resource } from '@opentelemetry/resources'
5+
import { ReadableSpan } from '@opentelemetry/sdk-trace-node'
6+
import { describe, test, expect } from 'vitest'
7+
8+
function createSpan(): ReadableSpan {
9+
return {
10+
name: 'span-name',
11+
kind: SpanKind.INTERNAL,
12+
spanContext: () => ({
13+
spanId: '0000000000000002',
14+
traceFlags: TraceFlags.SAMPLED,
15+
traceId: '00000000000000000000000000000001',
16+
isRemote: false,
17+
traceState: new TraceState('span=bar'),
18+
}),
19+
startTime: [1640715557, 342725388],
20+
endTime: [1640715558, 642725388],
21+
status: {
22+
code: SpanStatusCode.OK,
23+
},
24+
attributes: { 'string-attribute': 'some attribute value' },
25+
links: [
26+
{
27+
context: {
28+
spanId: '0000000000000003',
29+
traceId: '00000000000000000000000000000002',
30+
traceFlags: TraceFlags.SAMPLED,
31+
isRemote: false,
32+
traceState: new TraceState('link=foo'),
33+
},
34+
attributes: {
35+
'link-attribute': 'string value',
36+
},
37+
},
38+
],
39+
events: [
40+
{
41+
name: 'event',
42+
time: [1640715558, 542725388],
43+
attributes: {
44+
'event-attribute': 'string value',
45+
},
46+
},
47+
],
48+
duration: [1, 300000000],
49+
ended: true,
50+
resource: new Resource({
51+
'service.name': 'serviceName',
52+
'service.version': 'serviceVersion',
53+
'process.runtime.name': 'nodejs',
54+
'process.runtime.version': 'runtimeVersion',
55+
'deployment.environment': 'deploymentEnvironment',
56+
'http.url': 'siteUrl',
57+
'netlify.site.id': 'siteId',
58+
'netlify.site.name': 'siteName',
59+
}),
60+
instrumentationLibrary: {
61+
name: '@netlify/otel',
62+
version: '1.0.0',
63+
},
64+
droppedAttributesCount: 0,
65+
droppedEventsCount: 0,
66+
droppedLinksCount: 0,
67+
}
68+
}
69+
70+
describe('`serializeSpans`', () => {
71+
test('Returns expected results', () => {
72+
const sampleSpan = createSpan()
73+
const serializedSpan = serializeSpans([sampleSpan])
74+
const result = JSON.stringify(serializedSpan)
75+
76+
const expectedResult = {
77+
resourceSpans: [
78+
{
79+
resource: {
80+
attributes: [
81+
{ key: 'service.name', value: { stringValue: 'serviceName' } },
82+
{ key: 'service.version', value: { stringValue: 'serviceVersion' } },
83+
{ key: 'process.runtime.name', value: { stringValue: 'nodejs' } },
84+
{ key: 'process.runtime.version', value: { stringValue: 'runtimeVersion' } },
85+
{ key: 'deployment.environment', value: { stringValue: 'deploymentEnvironment' } },
86+
{ key: 'http.url', value: { stringValue: 'siteUrl' } },
87+
{ key: 'netlify.site.id', value: { stringValue: 'siteId' } },
88+
{ key: 'netlify.site.name', value: { stringValue: 'siteName' } },
89+
],
90+
droppedAttributesCount: 0,
91+
},
92+
scopeSpans: [
93+
{
94+
scope: { name: '@netlify/otel', version: '1.0.0' },
95+
spans: [
96+
{
97+
traceId: '00000000000000000000000000000001',
98+
spanId: '0000000000000002',
99+
name: 'span-name',
100+
kind: 1,
101+
startTimeUnixNano: '1640715557342725388',
102+
endTimeUnixNano: '1640715558642725388',
103+
attributes: [{ key: 'string-attribute', value: { stringValue: 'some attribute value' } }],
104+
droppedAttributesCount: 0,
105+
events: [
106+
{
107+
name: 'event',
108+
timeUnixNano: '1640715558542725388',
109+
attributes: [{ key: 'event-attribute', value: { stringValue: 'string value' } }],
110+
droppedAttributesCount: 0,
111+
},
112+
],
113+
droppedEventsCount: 0,
114+
status: { code: 1 },
115+
links: [
116+
{
117+
spanId: '0000000000000003',
118+
traceId: '00000000000000000000000000000002',
119+
attributes: [{ key: 'link-attribute', value: { stringValue: 'string value' } }],
120+
droppedAttributesCount: 0,
121+
},
122+
],
123+
droppedLinksCount: 0,
124+
},
125+
],
126+
},
127+
],
128+
},
129+
],
130+
}
131+
132+
expect(result).toEqual(expectedResult)
133+
})
134+
})

packages/otel/src/exporters/netlify.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export class NetlifySpanExporter implements SpanExporter {
2525
return
2626
}
2727

28-
console.log(TRACE_PREFIX, JSON.stringify(serialize(spans)))
28+
console.log(TRACE_PREFIX, JSON.stringify(serializeSpans(spans)))
2929
resultCallback({ code: ExportResultCode.SUCCESS })
3030
}
3131

@@ -46,11 +46,10 @@ export class NetlifySpanExporter implements SpanExporter {
4646
}
4747

4848
// Replaces JsonTraceSerializer.serializeRequest(spans)
49-
const serialize = (spans: ReadableSpan[]): Record<string, unknown> => {
49+
export const serializeSpans = (spans: ReadableSpan[]): Record<string, unknown> => {
5050
return {
5151
resourceSpans: spans.map((span) => {
5252
const spanContext = span.spanContext()
53-
5453
return {
5554
resource: {
5655
attributes: toAttributes(span.resource.attributes),

0 commit comments

Comments
 (0)