@@ -59,6 +59,7 @@ import {
59
59
processDetector ,
60
60
hostDetector ,
61
61
Resource ,
62
+ serviceInstanceIdDetectorSync ,
62
63
} from '@opentelemetry/resources' ;
63
64
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http' ;
64
65
import { logs } from '@opentelemetry/api-logs' ;
@@ -70,6 +71,7 @@ import {
70
71
import {
71
72
SEMRESATTRS_HOST_NAME ,
72
73
SEMRESATTRS_PROCESS_PID ,
74
+ SEMRESATTRS_SERVICE_INSTANCE_ID ,
73
75
} from '@opentelemetry/semantic-conventions' ;
74
76
75
77
const DefaultContextManager = semver . gte ( process . version , '14.8.0' )
@@ -126,6 +128,7 @@ describe('Node SDK', () => {
126
128
assert . ok ( ! ( metrics . getMeterProvider ( ) instanceof MeterProvider ) ) ;
127
129
assert . ok ( ! ( logs . getLoggerProvider ( ) instanceof LoggerProvider ) ) ;
128
130
delete env . OTEL_TRACES_EXPORTER ;
131
+ await sdk . shutdown ( ) ;
129
132
} ) ;
130
133
131
134
it ( 'should register a diag logger with OTEL_LOG_LEVEL' , ( ) => {
@@ -145,6 +148,7 @@ describe('Node SDK', () => {
145
148
} ) ;
146
149
147
150
delete env . OTEL_LOG_LEVEL ;
151
+ sdk . shutdown ( ) ;
148
152
} ) ;
149
153
150
154
it ( 'should not register a diag logger with OTEL_LOG_LEVEL unset' , ( ) => {
@@ -158,6 +162,7 @@ describe('Node SDK', () => {
158
162
sdk . start ( ) ;
159
163
160
164
assert . strictEqual ( spy . callCount , 0 ) ;
165
+ sdk . shutdown ( ) ;
161
166
} ) ;
162
167
163
168
it ( 'should register a tracer provider if an exporter is provided' , async ( ) => {
@@ -180,6 +185,7 @@ describe('Node SDK', () => {
180
185
const apiTracerProvider =
181
186
trace . getTracerProvider ( ) as ProxyTracerProvider ;
182
187
assert . ok ( apiTracerProvider . getDelegate ( ) instanceof NodeTracerProvider ) ;
188
+ await sdk . shutdown ( ) ;
183
189
} ) ;
184
190
185
191
it ( 'should register a tracer provider if an exporter is provided via env' , async ( ) => {
@@ -203,6 +209,7 @@ describe('Node SDK', () => {
203
209
trace . getTracerProvider ( ) as ProxyTracerProvider ;
204
210
assert . ok ( apiTracerProvider . getDelegate ( ) instanceof NodeTracerProvider ) ;
205
211
delete env . OTEL_TRACES_EXPORTER ;
212
+ await sdk . shutdown ( ) ;
206
213
} ) ;
207
214
208
215
it ( 'should register a tracer provider if span processors are provided' , async ( ) => {
@@ -240,6 +247,7 @@ describe('Node SDK', () => {
240
247
assert ( listOfProcessors [ 0 ] instanceof NoopSpanProcessor ) ;
241
248
assert ( listOfProcessors [ 1 ] instanceof SimpleSpanProcessor ) ;
242
249
assert ( listOfProcessors [ 2 ] instanceof BatchSpanProcessor ) ;
250
+ await sdk . shutdown ( ) ;
243
251
} ) ;
244
252
245
253
it ( 'should register a meter provider if a reader is provided' , async ( ) => {
@@ -446,6 +454,7 @@ describe('Node SDK', () => {
446
454
namespace : 'default' ,
447
455
version : '0.0.1' ,
448
456
} ) ;
457
+ await sdk . shutdown ( ) ;
449
458
} ) ;
450
459
} ) ;
451
460
@@ -497,6 +506,7 @@ describe('Node SDK', () => {
497
506
namespace : 'default' ,
498
507
version : '0.0.1' ,
499
508
} ) ;
509
+ await sdk . shutdown ( ) ;
500
510
} ) ;
501
511
} ) ;
502
512
@@ -551,6 +561,7 @@ describe('Node SDK', () => {
551
561
/ { \s + " s e r v i c e \. i n s t a n c e \. i d " : \s + " 6 2 7 c c 4 9 3 " , \s + " s e r v i c e \. n a m e " : \s + " m y - s e r v i c e " , \s + " s e r v i c e \. n a m e s p a c e " : \s + " d e f a u l t " , \s + " s e r v i c e \. v e r s i o n " : \s + " 0 .0 .1 " \s + } \s * / gm
552
562
)
553
563
) ;
564
+ await sdk . shutdown ( ) ;
554
565
} ) ;
555
566
556
567
describe ( 'with a faulty environment variable' , ( ) => {
@@ -578,6 +589,7 @@ describe('Node SDK', () => {
578
589
'EnvDetector failed: Attribute value should be a ASCII string with a length not exceed 255 characters.'
579
590
)
580
591
) ;
592
+ await sdk . shutdown ( ) ;
581
593
} ) ;
582
594
} ) ;
583
595
} ) ;
@@ -595,6 +607,7 @@ describe('Node SDK', () => {
595
607
assertServiceResource ( resource , {
596
608
name : 'config-set-name' ,
597
609
} ) ;
610
+ await sdk . shutdown ( ) ;
598
611
} ) ;
599
612
600
613
it ( 'should configure service name via OTEL_SERVICE_NAME env var' , async ( ) => {
@@ -609,6 +622,7 @@ describe('Node SDK', () => {
609
622
name : 'env-set-name' ,
610
623
} ) ;
611
624
delete process . env . OTEL_SERVICE_NAME ;
625
+ await sdk . shutdown ( ) ;
612
626
} ) ;
613
627
614
628
it ( 'should favor config set service name over OTEL_SERVICE_NAME env set service name' , async ( ) => {
@@ -625,11 +639,12 @@ describe('Node SDK', () => {
625
639
name : 'config-set-name' ,
626
640
} ) ;
627
641
delete process . env . OTEL_SERVICE_NAME ;
642
+ await sdk . shutdown ( ) ;
628
643
} ) ;
629
644
630
645
it ( 'should configure service name via OTEL_RESOURCE_ATTRIBUTES env var' , async ( ) => {
631
646
process . env . OTEL_RESOURCE_ATTRIBUTES =
632
- 'service.name=resource-env-set-name' ;
647
+ 'service.name=resource-env-set-name,service.instance.id=my-instance-id ' ;
633
648
const sdk = new NodeSDK ( ) ;
634
649
635
650
sdk . start ( ) ;
@@ -638,13 +653,15 @@ describe('Node SDK', () => {
638
653
639
654
assertServiceResource ( resource , {
640
655
name : 'resource-env-set-name' ,
656
+ instanceId : 'my-instance-id' ,
641
657
} ) ;
642
658
delete process . env . OTEL_RESOURCE_ATTRIBUTES ;
659
+ await sdk . shutdown ( ) ;
643
660
} ) ;
644
661
645
662
it ( 'should favor config set service name over OTEL_RESOURCE_ATTRIBUTES env set service name' , async ( ) => {
646
663
process . env . OTEL_RESOURCE_ATTRIBUTES =
647
- 'service.name=resource-env-set-name' ;
664
+ 'service.name=resource-env-set-name,service.instance.id=my-instance-id ' ;
648
665
const sdk = new NodeSDK ( {
649
666
serviceName : 'config-set-name' ,
650
667
} ) ;
@@ -655,8 +672,55 @@ describe('Node SDK', () => {
655
672
656
673
assertServiceResource ( resource , {
657
674
name : 'config-set-name' ,
675
+ instanceId : 'my-instance-id' ,
658
676
} ) ;
659
677
delete process . env . OTEL_RESOURCE_ATTRIBUTES ;
678
+ await sdk . shutdown ( ) ;
679
+ } ) ;
680
+ } ) ;
681
+
682
+ describe ( 'configureServiceInstanceId' , async ( ) => {
683
+ it ( 'should configure service instance id via OTEL_RESOURCE_ATTRIBUTES env var' , async ( ) => {
684
+ process . env . OTEL_RESOURCE_ATTRIBUTES =
685
+ 'service.instance.id=627cc493,service.name=my-service' ;
686
+ const sdk = new NodeSDK ( ) ;
687
+
688
+ sdk . start ( ) ;
689
+ const resource = sdk [ '_resource' ] ;
690
+ await resource . waitForAsyncAttributes ?.( ) ;
691
+
692
+ assertServiceResource ( resource , {
693
+ name : 'my-service' ,
694
+ instanceId : '627cc493' ,
695
+ } ) ;
696
+ delete process . env . OTEL_RESOURCE_ATTRIBUTES ;
697
+ sdk . shutdown ( ) ;
698
+ } ) ;
699
+
700
+ it ( 'should configure service instance id with random UUID' , async ( ) => {
701
+ const sdk = new NodeSDK ( {
702
+ autoDetectResources : true ,
703
+ resourceDetectors : [
704
+ processDetector ,
705
+ envDetector ,
706
+ hostDetector ,
707
+ serviceInstanceIdDetectorSync ,
708
+ ] ,
709
+ } ) ;
710
+
711
+ sdk . start ( ) ;
712
+ const resource = sdk [ '_resource' ] ;
713
+ await resource . waitForAsyncAttributes ?.( ) ;
714
+
715
+ const UUID_REGEX =
716
+ / ^ [ 0 - 9 a - f ] { 8 } - [ 0 - 9 a - f ] { 4 } - [ 1 - 5 ] [ 0 - 9 a - f ] { 3 } - [ 8 9 a b ] [ 0 - 9 a - f ] { 3 } - [ 0 - 9 a - f ] { 12 } $ / i;
717
+ assert . equal (
718
+ UUID_REGEX . test (
719
+ resource . attributes [ SEMRESATTRS_SERVICE_INSTANCE_ID ] ?. toString ( ) || ''
720
+ ) ,
721
+ true
722
+ ) ;
723
+ await sdk . shutdown ( ) ;
660
724
} ) ;
661
725
} ) ;
662
726
@@ -671,7 +735,7 @@ describe('Node SDK', () => {
671
735
672
736
it ( 'should not register a trace provider' , async ( ) => {
673
737
const sdk = new NodeSDK ( { } ) ;
674
- await sdk . start ( ) ;
738
+ sdk . start ( ) ;
675
739
676
740
assert . strictEqual (
677
741
( trace . getTracerProvider ( ) as ProxyTracerProvider ) . getDelegate ( ) ,
@@ -694,7 +758,7 @@ describe('Node SDK', () => {
694
758
metricReader : metricReader ,
695
759
autoDetectResources : false ,
696
760
} ) ;
697
- await sdk . start ( ) ;
761
+ sdk . start ( ) ;
698
762
699
763
assert . ok ( ! ( metrics . getMeterProvider ( ) instanceof MeterProvider ) ) ;
700
764
@@ -730,6 +794,7 @@ describe('Node SDK', () => {
730
794
await resource . waitForAsyncAttributes ?.( ) ;
731
795
732
796
assert . deepStrictEqual ( resource , Resource . empty ( ) ) ;
797
+ await sdk . shutdown ( ) ;
733
798
} ) ;
734
799
} ) ;
735
800
} ) ;
@@ -758,6 +823,7 @@ describe('Node SDK', () => {
758
823
759
824
assert . strictEqual ( span . spanContext ( ) . spanId , 'constant-test-span-id' ) ;
760
825
assert . strictEqual ( span . spanContext ( ) . traceId , 'constant-test-trace-id' ) ;
826
+ await sdk . shutdown ( ) ;
761
827
} ) ;
762
828
} ) ;
763
829
} ) ;
@@ -786,6 +852,7 @@ describe('setup exporter from env', () => {
786
852
assert ( sdk [ '_tracerProvider' ] instanceof TracerProviderWithEnvExporters ) ;
787
853
assert ( listOfProcessors . length === 1 ) ;
788
854
assert ( listOfProcessors [ 0 ] instanceof BatchSpanProcessor ) ;
855
+ await sdk . shutdown ( ) ;
789
856
} ) ;
790
857
it ( 'ignore env exporter when user provides exporter to sdk config' , async ( ) => {
791
858
const traceExporter = new ConsoleSpanExporter ( ) ;
@@ -802,6 +869,7 @@ describe('setup exporter from env', () => {
802
869
assert ( listOfProcessors . length === 1 ) ;
803
870
assert ( listOfProcessors [ 0 ] instanceof SimpleSpanProcessor === false ) ;
804
871
assert ( listOfProcessors [ 0 ] instanceof BatchSpanProcessor ) ;
872
+ await sdk . shutdown ( ) ;
805
873
} ) ;
806
874
it ( 'ignores default env exporter when user provides span processor to sdk config' , async ( ) => {
807
875
const traceExporter = new ConsoleSpanExporter ( ) ;
@@ -819,6 +887,7 @@ describe('setup exporter from env', () => {
819
887
assert ( listOfProcessors . length === 1 ) ;
820
888
assert ( listOfProcessors [ 0 ] instanceof SimpleSpanProcessor ) ;
821
889
assert ( listOfProcessors [ 0 ] instanceof BatchSpanProcessor === false ) ;
890
+ await sdk . shutdown ( ) ;
822
891
} ) ;
823
892
it ( 'ignores env exporter when user provides tracer exporter to sdk config and sets exporter via env' , async ( ) => {
824
893
env . OTEL_TRACES_EXPORTER = 'console' ;
@@ -837,6 +906,7 @@ describe('setup exporter from env', () => {
837
906
assert ( listOfProcessors [ 0 ] instanceof SimpleSpanProcessor === false ) ;
838
907
assert ( listOfProcessors [ 0 ] instanceof BatchSpanProcessor ) ;
839
908
delete env . OTEL_TRACES_EXPORTER ;
909
+ await sdk . shutdown ( ) ;
840
910
} ) ;
841
911
it ( 'should only create one span processor when configured using env vars and config' , async ( ) => {
842
912
env . OTEL_TRACES_EXPORTER = 'console' ;
@@ -852,6 +922,7 @@ describe('setup exporter from env', () => {
852
922
) ;
853
923
assert . strictEqual ( listOfProcessors . length , 1 ) ;
854
924
delete env . OTEL_TRACES_EXPORTER ;
925
+ await sdk . shutdown ( ) ;
855
926
} ) ;
856
927
it ( 'use otlp exporter and defined exporter protocol env value' , async ( ) => {
857
928
env . OTEL_TRACES_EXPORTER = 'otlp' ;
@@ -866,6 +937,7 @@ describe('setup exporter from env', () => {
866
937
assert ( listOfProcessors [ 0 ] instanceof BatchSpanProcessor ) ;
867
938
delete env . OTEL_TRACES_EXPORTER ;
868
939
delete env . OTEL_EXPORTER_OTLP_TRACES_PROTOCOL ;
940
+ await sdk . shutdown ( ) ;
869
941
} ) ;
870
942
it ( 'use noop span processor when user sets env exporter to none' , async ( ) => {
871
943
env . OTEL_TRACES_EXPORTER = 'none' ;
@@ -879,6 +951,7 @@ describe('setup exporter from env', () => {
879
951
assert ( listOfProcessors . length === 0 ) ;
880
952
assert ( activeProcessor instanceof NoopSpanProcessor ) ;
881
953
delete env . OTEL_TRACES_EXPORTER ;
954
+ await sdk . shutdown ( ) ;
882
955
} ) ;
883
956
it ( 'log warning that sdk will not be initialized when exporter is set to none' , async ( ) => {
884
957
env . OTEL_TRACES_EXPORTER = 'none' ;
@@ -890,16 +963,18 @@ describe('setup exporter from env', () => {
890
963
'OTEL_TRACES_EXPORTER contains "none". SDK will not be initialized.'
891
964
) ;
892
965
delete env . OTEL_TRACES_EXPORTER ;
966
+ await sdk . shutdown ( ) ;
893
967
} ) ;
894
968
it ( 'use default otlp exporter when user does not set exporter via env or config' , async ( ) => {
895
969
const sdk = new NodeSDK ( ) ;
896
- await sdk . start ( ) ;
970
+ sdk . start ( ) ;
897
971
898
972
const listOfProcessors =
899
973
sdk [ '_tracerProvider' ] ! [ '_registeredSpanProcessors' ] ! ;
900
974
assert ( sdk [ '_tracerProvider' ] instanceof TracerProviderWithEnvExporters ) ;
901
975
assert ( listOfProcessors . length === 1 ) ;
902
976
assert ( listOfProcessors [ 0 ] instanceof BatchSpanProcessor ) ;
977
+ await sdk . shutdown ( ) ;
903
978
} ) ;
904
979
it ( 'use default otlp exporter when empty value is provided for exporter via env' , async ( ) => {
905
980
env . OTEL_TRACES_EXPORTER = '' ;
@@ -912,6 +987,7 @@ describe('setup exporter from env', () => {
912
987
assert ( listOfProcessors . length === 1 ) ;
913
988
assert ( listOfProcessors [ 0 ] instanceof BatchSpanProcessor ) ;
914
989
env . OTEL_TRACES_EXPORTER = '' ;
990
+ await sdk . shutdown ( ) ;
915
991
} ) ;
916
992
917
993
it ( 'use only default exporter when none value is provided with other exporters' , async ( ) => {
@@ -926,6 +1002,7 @@ describe('setup exporter from env', () => {
926
1002
assert ( listOfProcessors [ 0 ] instanceof BatchSpanProcessor ) ;
927
1003
928
1004
delete env . OTEL_TRACES_EXPORTER ;
1005
+ await sdk . shutdown ( ) ;
929
1006
} ) ;
930
1007
it ( 'log warning that only default exporter will be used since exporter list contains none with other exports ' , async ( ) => {
931
1008
env . OTEL_TRACES_EXPORTER = 'otlp,zipkin,none' ;
@@ -937,6 +1014,7 @@ describe('setup exporter from env', () => {
937
1014
'OTEL_TRACES_EXPORTER contains "none" along with other exporters. Using default otlp exporter.'
938
1015
) ;
939
1016
delete env . OTEL_TRACES_EXPORTER ;
1017
+ await sdk . shutdown ( ) ;
940
1018
} ) ;
941
1019
it ( 'should warn that provided exporter value is unrecognized and not able to be set up' , async ( ) => {
942
1020
env . OTEL_TRACES_EXPORTER = 'invalid' ;
@@ -954,6 +1032,7 @@ describe('setup exporter from env', () => {
954
1032
) ;
955
1033
956
1034
delete env . OTEL_TRACES_EXPORTER ;
1035
+ await sdk . shutdown ( ) ;
957
1036
} ) ;
958
1037
it ( 'setup zipkin, jaeger and otlp exporters' , async ( ) => {
959
1038
env . OTEL_TRACES_EXPORTER = 'zipkin, otlp, jaeger' ;
@@ -971,6 +1050,7 @@ describe('setup exporter from env', () => {
971
1050
972
1051
delete env . OTEL_TRACES_EXPORTER ;
973
1052
delete env . OTEL_EXPORTER_OTLP_TRACES_PROTOCOL ;
1053
+ await sdk . shutdown ( ) ;
974
1054
} ) ;
975
1055
it ( 'use the console exporter' , async ( ) => {
976
1056
env . OTEL_TRACES_EXPORTER = 'console, otlp' ;
@@ -983,5 +1063,6 @@ describe('setup exporter from env', () => {
983
1063
assert ( listOfProcessors [ 0 ] instanceof SimpleSpanProcessor ) ;
984
1064
assert ( listOfProcessors [ 1 ] instanceof BatchSpanProcessor ) ;
985
1065
delete env . OTEL_TRACES_EXPORTER ;
1066
+ await sdk . shutdown ( ) ;
986
1067
} ) ;
987
1068
} ) ;
0 commit comments