@@ -6,79 +6,94 @@ import { mapStatus } from '../../src/utils/mapStatus';
66import { createSpan } from '../helpers/createSpan' ;
77
88describe ( 'mapStatus' , ( ) => {
9- const statusTestTable : [ number , undefined | number | string , undefined | string , SpanStatus ] [ ] = [
10- [ - 1 , undefined , undefined , { code : SPAN_STATUS_ERROR , message : 'unknown_error' } ] ,
11- [ 3 , undefined , undefined , { code : SPAN_STATUS_ERROR , message : 'unknown_error' } ] ,
12- [ 0 , undefined , undefined , { code : SPAN_STATUS_OK } ] ,
13- [ 1 , undefined , undefined , { code : SPAN_STATUS_OK } ] ,
14- [ 2 , undefined , undefined , { code : SPAN_STATUS_ERROR , message : 'unknown_error' } ] ,
15-
9+ const statusTestTable : [ undefined | number | string , undefined | string , SpanStatus ] [ ] = [
1610 // http codes
17- [ 2 , 400 , undefined , { code : SPAN_STATUS_ERROR , message : 'failed_precondition ' } ] ,
18- [ 2 , 401 , undefined , { code : SPAN_STATUS_ERROR , message : 'unauthenticated' } ] ,
19- [ 2 , 403 , undefined , { code : SPAN_STATUS_ERROR , message : 'permission_denied' } ] ,
20- [ 2 , 404 , undefined , { code : SPAN_STATUS_ERROR , message : 'not_found' } ] ,
21- [ 2 , 409 , undefined , { code : SPAN_STATUS_ERROR , message : 'aborted ' } ] ,
22- [ 2 , 429 , undefined , { code : SPAN_STATUS_ERROR , message : 'resource_exhausted' } ] ,
23- [ 2 , 499 , undefined , { code : SPAN_STATUS_ERROR , message : 'cancelled' } ] ,
24- [ 2 , 500 , undefined , { code : SPAN_STATUS_ERROR , message : 'internal_error' } ] ,
25- [ 2 , 501 , undefined , { code : SPAN_STATUS_ERROR , message : 'unimplemented' } ] ,
26- [ 2 , 503 , undefined , { code : SPAN_STATUS_ERROR , message : 'unavailable' } ] ,
27- [ 2 , 504 , undefined , { code : SPAN_STATUS_ERROR , message : 'deadline_exceeded' } ] ,
28- [ 2 , 999 , undefined , { code : SPAN_STATUS_ERROR , message : 'unknown_error' } ] ,
11+ [ 400 , undefined , { code : SPAN_STATUS_ERROR , message : 'invalid_argument ' } ] ,
12+ [ 401 , undefined , { code : SPAN_STATUS_ERROR , message : 'unauthenticated' } ] ,
13+ [ 403 , undefined , { code : SPAN_STATUS_ERROR , message : 'permission_denied' } ] ,
14+ [ 404 , undefined , { code : SPAN_STATUS_ERROR , message : 'not_found' } ] ,
15+ [ 409 , undefined , { code : SPAN_STATUS_ERROR , message : 'already_exists ' } ] ,
16+ [ 429 , undefined , { code : SPAN_STATUS_ERROR , message : 'resource_exhausted' } ] ,
17+ [ 499 , undefined , { code : SPAN_STATUS_ERROR , message : 'cancelled' } ] ,
18+ [ 500 , undefined , { code : SPAN_STATUS_ERROR , message : 'internal_error' } ] ,
19+ [ 501 , undefined , { code : SPAN_STATUS_ERROR , message : 'unimplemented' } ] ,
20+ [ 503 , undefined , { code : SPAN_STATUS_ERROR , message : 'unavailable' } ] ,
21+ [ 504 , undefined , { code : SPAN_STATUS_ERROR , message : 'deadline_exceeded' } ] ,
22+ [ 999 , undefined , { code : SPAN_STATUS_ERROR , message : 'unknown_error' } ] ,
2923
30- [ 2 , '400' , undefined , { code : SPAN_STATUS_ERROR , message : 'failed_precondition ' } ] ,
31- [ 2 , '401' , undefined , { code : SPAN_STATUS_ERROR , message : 'unauthenticated' } ] ,
32- [ 2 , '403' , undefined , { code : SPAN_STATUS_ERROR , message : 'permission_denied' } ] ,
33- [ 2 , '404' , undefined , { code : SPAN_STATUS_ERROR , message : 'not_found' } ] ,
34- [ 2 , '409' , undefined , { code : SPAN_STATUS_ERROR , message : 'aborted ' } ] ,
35- [ 2 , '429' , undefined , { code : SPAN_STATUS_ERROR , message : 'resource_exhausted' } ] ,
36- [ 2 , '499' , undefined , { code : SPAN_STATUS_ERROR , message : 'cancelled' } ] ,
37- [ 2 , '500' , undefined , { code : SPAN_STATUS_ERROR , message : 'internal_error' } ] ,
38- [ 2 , '501' , undefined , { code : SPAN_STATUS_ERROR , message : 'unimplemented' } ] ,
39- [ 2 , '503' , undefined , { code : SPAN_STATUS_ERROR , message : 'unavailable' } ] ,
40- [ 2 , '504' , undefined , { code : SPAN_STATUS_ERROR , message : 'deadline_exceeded' } ] ,
41- [ 2 , '999' , undefined , { code : SPAN_STATUS_ERROR , message : 'unknown_error' } ] ,
24+ [ '400' , undefined , { code : SPAN_STATUS_ERROR , message : 'invalid_argument ' } ] ,
25+ [ '401' , undefined , { code : SPAN_STATUS_ERROR , message : 'unauthenticated' } ] ,
26+ [ '403' , undefined , { code : SPAN_STATUS_ERROR , message : 'permission_denied' } ] ,
27+ [ '404' , undefined , { code : SPAN_STATUS_ERROR , message : 'not_found' } ] ,
28+ [ '409' , undefined , { code : SPAN_STATUS_ERROR , message : 'already_exists ' } ] ,
29+ [ '429' , undefined , { code : SPAN_STATUS_ERROR , message : 'resource_exhausted' } ] ,
30+ [ '499' , undefined , { code : SPAN_STATUS_ERROR , message : 'cancelled' } ] ,
31+ [ '500' , undefined , { code : SPAN_STATUS_ERROR , message : 'internal_error' } ] ,
32+ [ '501' , undefined , { code : SPAN_STATUS_ERROR , message : 'unimplemented' } ] ,
33+ [ '503' , undefined , { code : SPAN_STATUS_ERROR , message : 'unavailable' } ] ,
34+ [ '504' , undefined , { code : SPAN_STATUS_ERROR , message : 'deadline_exceeded' } ] ,
35+ [ '999' , undefined , { code : SPAN_STATUS_ERROR , message : 'unknown_error' } ] ,
4236
4337 // grpc codes
44- [ 2 , undefined , '1' , { code : SPAN_STATUS_ERROR , message : 'cancelled' } ] ,
45- [ 2 , undefined , '2' , { code : SPAN_STATUS_ERROR , message : 'unknown_error' } ] ,
46- [ 2 , undefined , '3' , { code : SPAN_STATUS_ERROR , message : 'invalid_argument' } ] ,
47- [ 2 , undefined , '4' , { code : SPAN_STATUS_ERROR , message : 'deadline_exceeded' } ] ,
48- [ 2 , undefined , '5' , { code : SPAN_STATUS_ERROR , message : 'not_found' } ] ,
49- [ 2 , undefined , '6' , { code : SPAN_STATUS_ERROR , message : 'already_exists' } ] ,
50- [ 2 , undefined , '7' , { code : SPAN_STATUS_ERROR , message : 'permission_denied' } ] ,
51- [ 2 , undefined , '8' , { code : SPAN_STATUS_ERROR , message : 'resource_exhausted' } ] ,
52- [ 2 , undefined , '9' , { code : SPAN_STATUS_ERROR , message : 'failed_precondition' } ] ,
53- [ 2 , undefined , '10' , { code : SPAN_STATUS_ERROR , message : 'aborted' } ] ,
54- [ 2 , undefined , '11' , { code : SPAN_STATUS_ERROR , message : 'out_of_range' } ] ,
55- [ 2 , undefined , '12' , { code : SPAN_STATUS_ERROR , message : 'unimplemented' } ] ,
56- [ 2 , undefined , '13' , { code : SPAN_STATUS_ERROR , message : 'internal_error' } ] ,
57- [ 2 , undefined , '14' , { code : SPAN_STATUS_ERROR , message : 'unavailable' } ] ,
58- [ 2 , undefined , '15' , { code : SPAN_STATUS_ERROR , message : 'data_loss' } ] ,
59- [ 2 , undefined , '16' , { code : SPAN_STATUS_ERROR , message : 'unauthenticated' } ] ,
60- [ 2 , undefined , '999' , { code : SPAN_STATUS_ERROR , message : 'unknown_error' } ] ,
38+ [ undefined , '1' , { code : SPAN_STATUS_ERROR , message : 'cancelled' } ] ,
39+ [ undefined , '2' , { code : SPAN_STATUS_ERROR , message : 'unknown_error' } ] ,
40+ [ undefined , '3' , { code : SPAN_STATUS_ERROR , message : 'invalid_argument' } ] ,
41+ [ undefined , '4' , { code : SPAN_STATUS_ERROR , message : 'deadline_exceeded' } ] ,
42+ [ undefined , '5' , { code : SPAN_STATUS_ERROR , message : 'not_found' } ] ,
43+ [ undefined , '6' , { code : SPAN_STATUS_ERROR , message : 'already_exists' } ] ,
44+ [ undefined , '7' , { code : SPAN_STATUS_ERROR , message : 'permission_denied' } ] ,
45+ [ undefined , '8' , { code : SPAN_STATUS_ERROR , message : 'resource_exhausted' } ] ,
46+ [ undefined , '9' , { code : SPAN_STATUS_ERROR , message : 'failed_precondition' } ] ,
47+ [ undefined , '10' , { code : SPAN_STATUS_ERROR , message : 'aborted' } ] ,
48+ [ undefined , '11' , { code : SPAN_STATUS_ERROR , message : 'out_of_range' } ] ,
49+ [ undefined , '12' , { code : SPAN_STATUS_ERROR , message : 'unimplemented' } ] ,
50+ [ undefined , '13' , { code : SPAN_STATUS_ERROR , message : 'internal_error' } ] ,
51+ [ undefined , '14' , { code : SPAN_STATUS_ERROR , message : 'unavailable' } ] ,
52+ [ undefined , '15' , { code : SPAN_STATUS_ERROR , message : 'data_loss' } ] ,
53+ [ undefined , '16' , { code : SPAN_STATUS_ERROR , message : 'unauthenticated' } ] ,
54+ [ undefined , '999' , { code : SPAN_STATUS_ERROR , message : 'unknown_error' } ] ,
6155
6256 // http takes precedence over grpc
63- [ 2 , '400' , '2' , { code : SPAN_STATUS_ERROR , message : 'failed_precondition ' } ] ,
57+ [ '400' , '2' , { code : SPAN_STATUS_ERROR , message : 'invalid_argument ' } ] ,
6458 ] ;
6559
66- it . each ( statusTestTable ) (
67- 'works with otelStatus=%i, httpCode=%s, grpcCode=%s' ,
68- ( otelStatus , httpCode , grpcCode , expected ) => {
69- const span = createSpan ( ) ;
70- span . setStatus ( { code : otelStatus } ) ;
60+ it . each ( statusTestTable ) ( 'works with httpCode=%s, grpcCode=%s' , ( httpCode , grpcCode , expected ) => {
61+ const span = createSpan ( ) ;
62+ span . setStatus ( { code : 0 } ) ; // UNSET
63+
64+ if ( httpCode ) {
65+ span . setAttribute ( SemanticAttributes . HTTP_STATUS_CODE , httpCode ) ;
66+ }
67+
68+ if ( grpcCode ) {
69+ span . setAttribute ( SemanticAttributes . RPC_GRPC_STATUS_CODE , grpcCode ) ;
70+ }
71+
72+ const actual = mapStatus ( span ) ;
73+ expect ( actual ) . toEqual ( expected ) ;
74+ } ) ;
75+
76+ it ( 'returns ok span status when is UNSET present on span' , ( ) => {
77+ const span = createSpan ( ) ;
78+ span . setStatus ( { code : 0 } ) ; // UNSET
79+ expect ( mapStatus ( span ) ) . toEqual ( { code : SPAN_STATUS_OK } ) ;
80+ } ) ;
7181
72- if ( httpCode ) {
73- span . setAttribute ( SemanticAttributes . HTTP_STATUS_CODE , httpCode ) ;
74- }
82+ it ( 'returns ok span status when already present on span' , ( ) => {
83+ const span = createSpan ( ) ;
84+ span . setStatus ( { code : 1 } ) ; // OK
85+ expect ( mapStatus ( span ) ) . toEqual ( { code : SPAN_STATUS_OK } ) ;
86+ } ) ;
7587
76- if ( grpcCode ) {
77- span . setAttribute ( SemanticAttributes . RPC_GRPC_STATUS_CODE , grpcCode ) ;
78- }
88+ it ( 'returns error status when span already has error status' , ( ) => {
89+ const span = createSpan ( ) ;
90+ span . setStatus ( { code : 2 , message : 'invalid_argument' } ) ; // ERROR
91+ expect ( mapStatus ( span ) ) . toEqual ( { code : SPAN_STATUS_ERROR , message : 'invalid_argument' } ) ;
92+ } ) ;
7993
80- const actual = mapStatus ( span ) ;
81- expect ( actual ) . toEqual ( expected ) ;
82- } ,
83- ) ;
94+ it ( 'returns unknown error status when code is unknown' , ( ) => {
95+ const span = createSpan ( ) ;
96+ span . setStatus ( { code : - 1 as 0 } ) ;
97+ expect ( mapStatus ( span ) ) . toEqual ( { code : SPAN_STATUS_ERROR , message : 'unknown_error' } ) ;
98+ } ) ;
8499} ) ;
0 commit comments