@@ -7,9 +7,10 @@ import { FileHandle, open, readFile, unlink } from 'node:fs/promises';
7
7
import { join } from 'node:path' ;
8
8
import semver from 'semver' ;
9
9
10
+ import { SeverityNumber } from '../collector/types/opentelemetry/proto/logs/v1/logs' ;
10
11
import delay from '../util/delay' ;
11
-
12
- import { expectResourceAttribute , expectSpanAttribute } from '../util/expectAttribute ' ;
12
+ import { expectLogRecordAttribute , expectResourceAttribute , expectSpanAttribute } from '../util/expectAttribute' ;
13
+ import { expectMatchingLogRecord } from '../util/expectMatchingLogRecord ' ;
13
14
import { expectMatchingSpan , expectMatchingSpanInFileDump } from '../util/expectMatchingSpan' ;
14
15
import runCommand from '../util/runCommand' ;
15
16
import waitUntil from '../util/waitUntil' ;
@@ -38,7 +39,7 @@ describe('attach', () => {
38
39
collector ( ) . clear ( ) ;
39
40
} ) ;
40
41
41
- describe ( 'basic tracing ' , ( ) => {
42
+ describe ( 'basic signals ' , ( ) => {
42
43
let appUnderTest : ChildProcessWrapper ;
43
44
44
45
before ( async ( ) => {
@@ -53,9 +54,9 @@ describe('attach', () => {
53
54
54
55
it ( 'should attach via --require and capture spans' , async ( ) => {
55
56
await waitUntil ( async ( ) => {
56
- const telemetry = await sendRequestAndWaitForTraceData ( ) ;
57
+ const traces = await sendRequestAndWaitForTraceData ( ) ;
57
58
expectMatchingSpan (
58
- telemetry . traces ,
59
+ traces ,
59
60
[
60
61
resource => expectResourceAttribute ( resource , 'telemetry.sdk.name' , 'opentelemetry' ) ,
61
62
resource => expectResourceAttribute ( resource , 'telemetry.sdk.language' , 'nodejs' ) ,
@@ -69,6 +70,31 @@ describe('attach', () => {
69
70
) ;
70
71
} ) ;
71
72
} ) ;
73
+
74
+ it ( 'should attach via --require and capture logs' , async ( ) => {
75
+ await waitUntil ( async ( ) => {
76
+ const logs = await sendRequestAndWaitForLogRecords ( ) ;
77
+ expectMatchingLogRecord (
78
+ logs ,
79
+ [
80
+ resource => expectResourceAttribute ( resource , 'telemetry.sdk.name' , 'opentelemetry' ) ,
81
+ resource => expectResourceAttribute ( resource , 'telemetry.sdk.language' , 'nodejs' ) ,
82
+ resource => expectResourceAttribute ( resource , 'telemetry.distro.name' , 'dash0-nodejs' ) ,
83
+ resource => expectResourceAttribute ( resource , 'telemetry.distro.version' , expectedDistroVersion ) ,
84
+ ] ,
85
+ [
86
+ logRecord => expect ( logRecord . body ) . to . deep . equal ( { string_value : 'log body' } ) ,
87
+ logRecord =>
88
+ expect ( logRecord . severity_number ) . to . equal (
89
+ SeverityNumber . SEVERITY_NUMBER_INFO ,
90
+ 'severity number should be info' ,
91
+ ) ,
92
+ logRecord => expect ( logRecord . severity_text ) . to . equal ( 'INFO' ) ,
93
+ logRecord => expectLogRecordAttribute ( logRecord , 'log.type' , 'LogRecord' ) ,
94
+ ] ,
95
+ ) ;
96
+ } ) ;
97
+ } ) ;
72
98
} ) ;
73
99
74
100
describe ( 'pod uid detection' , ( ) => {
@@ -87,9 +113,9 @@ describe('attach', () => {
87
113
88
114
it ( 'should attach via --require and detect the pod uid' , async ( ) => {
89
115
await waitUntil ( async ( ) => {
90
- const telemetry = await sendRequestAndWaitForTraceData ( ) ;
116
+ const traces = await sendRequestAndWaitForTraceData ( ) ;
91
117
expectMatchingSpan (
92
- telemetry . traces ,
118
+ traces ,
93
119
[ resource => expectResourceAttribute ( resource , 'k8s.pod.uid' , 'f57400dc-94ce-4806-a52e-d2726f448f15' ) ] ,
94
120
[
95
121
span => expect ( span . kind ) . to . equal ( SpanKind . SERVER , 'span kind should be server' ) ,
@@ -115,9 +141,9 @@ describe('attach', () => {
115
141
116
142
it ( 'should attach via --require and derive a service name from the package.json file' , async ( ) => {
117
143
await waitUntil ( async ( ) => {
118
- const telemetry = await sendRequestAndWaitForTraceData ( ) ;
144
+ const traces = await sendRequestAndWaitForTraceData ( ) ;
119
145
expectMatchingSpan (
120
- telemetry . traces ,
146
+ traces ,
121
147
[
122
148
resource =>
123
149
expectResourceAttribute ( resource , 'service.name' , '[email protected] ' ) ,
@@ -150,9 +176,9 @@ describe('attach', () => {
150
176
// (because the top level beforeHook is executed after this suite's before hook).
151
177
await appUnderTest . start ( ) ;
152
178
await waitUntil ( async ( ) => {
153
- const telemetry = await waitForTraceData ( ) ;
179
+ const traces = await waitForTraceData ( ) ;
154
180
expectMatchingSpan (
155
- telemetry . traces ,
181
+ traces ,
156
182
[
157
183
resource => expectResourceAttribute ( resource , 'telemetry.sdk.name' , 'opentelemetry' ) ,
158
184
resource => expectResourceAttribute ( resource , 'telemetry.sdk.language' , 'nodejs' ) ,
@@ -187,9 +213,9 @@ describe('attach', () => {
187
213
await appUnderTest . start ( ) ;
188
214
await appUnderTest . stop ( ) ;
189
215
await waitUntil ( async ( ) => {
190
- const telemetry = await waitForTraceData ( ) ;
216
+ const traces = await waitForTraceData ( ) ;
191
217
expectMatchingSpan (
192
- telemetry . traces ,
218
+ traces ,
193
219
[
194
220
resource => expectResourceAttribute ( resource , 'telemetry.sdk.name' , 'opentelemetry' ) ,
195
221
resource => expectResourceAttribute ( resource , 'telemetry.sdk.language' , 'nodejs' ) ,
@@ -205,9 +231,9 @@ describe('attach', () => {
205
231
await appUnderTest . start ( ) ;
206
232
await appUnderTest . stop ( 'SIGINT' ) ;
207
233
await waitUntil ( async ( ) => {
208
- const telemetry = await waitForTraceData ( ) ;
234
+ const traces = await waitForTraceData ( ) ;
209
235
expectMatchingSpan (
210
- telemetry . traces ,
236
+ traces ,
211
237
[
212
238
resource => expectResourceAttribute ( resource , 'telemetry.sdk.name' , 'opentelemetry' ) ,
213
239
resource => expectResourceAttribute ( resource , 'telemetry.sdk.language' , 'nodejs' ) ,
@@ -241,9 +267,9 @@ describe('attach', () => {
241
267
it ( 'should flush telemetry before process exit due to empty event loop' , async ( ) => {
242
268
await appUnderTest . start ( ) ;
243
269
await waitUntil ( async ( ) => {
244
- const telemetry = await waitForTraceData ( ) ;
270
+ const traces = await waitForTraceData ( ) ;
245
271
expectMatchingSpan (
246
- telemetry . traces ,
272
+ traces ,
247
273
[
248
274
resource => expectResourceAttribute ( resource , 'telemetry.sdk.name' , 'opentelemetry' ) ,
249
275
resource => expectResourceAttribute ( resource , 'telemetry.sdk.language' , 'nodejs' ) ,
@@ -351,6 +377,11 @@ describe('attach', () => {
351
377
return waitForTraceData ( ) ;
352
378
}
353
379
380
+ async function sendRequestAndWaitForLogRecords ( ) {
381
+ await sendRequestAndVerifyResponse ( ) ;
382
+ return waitForLogRecords ( ) ;
383
+ }
384
+
354
385
async function sendRequestAndVerifyResponse ( ) {
355
386
const response = await fetch ( `http://localhost:${ appPort } /ohai` ) ;
356
387
expect ( response . status ) . to . equal ( 200 ) ;
@@ -362,7 +393,14 @@ describe('attach', () => {
362
393
if ( ! ( await collector ( ) . hasTraces ( ) ) ) {
363
394
throw new Error ( 'The collector never received any spans.' ) ;
364
395
}
365
- return await collector ( ) . fetchTelemetry ( ) ;
396
+ return ( await collector ( ) . fetchTelemetry ( ) ) . traces ;
397
+ }
398
+
399
+ async function waitForLogRecords ( ) {
400
+ if ( ! ( await collector ( ) . hasLogs ( ) ) ) {
401
+ throw new Error ( 'The collector never received any log records.' ) ;
402
+ }
403
+ return ( await collector ( ) . fetchTelemetry ( ) ) . logs ;
366
404
}
367
405
368
406
async function verifyFileHasBeenCreated ( filename : string ) : Promise < FileHandle > {
0 commit comments