1
- import type { EvaluationDetails , HookContext } from '@openfeature/server-sdk' ;
1
+ import type { EvaluationDetails , HookContext } from '@openfeature/core' ;
2
+ import { ErrorCode } from '@openfeature/core' ;
2
3
3
4
const addEvent = jest . fn ( ) ;
4
5
const recordException = jest . fn ( ) ;
@@ -13,6 +14,7 @@ jest.mock('@opentelemetry/api', () => ({
13
14
14
15
// Import must be after the mocks
15
16
import { TracingHook } from './tracing-hook' ;
17
+ import { ALL_EVENT_ATTRS } from '../conventions' ;
16
18
17
19
describe ( 'OpenTelemetry Hooks' , ( ) => {
18
20
const hookContext : HookContext = {
@@ -56,28 +58,52 @@ describe('OpenTelemetry Hooks', () => {
56
58
57
59
expect ( addEvent ) . toBeCalledWith ( 'feature_flag' , {
58
60
'feature_flag.key' : 'testFlagKey' ,
59
- 'feature_flag.provider_name ' : 'testProvider' ,
60
- 'feature_flag.variant' : 'enabled' ,
61
+ 'feature_flag.provider.name ' : 'testProvider' ,
62
+ 'feature_flag.result. variant' : 'enabled' ,
61
63
} ) ;
62
64
} ) ;
63
65
64
- it ( 'should use a stringified value as the variant value on the span event' , ( ) => {
66
+ it ( 'should use the error values on the span event' , ( ) => {
65
67
const evaluationDetails : EvaluationDetails < boolean > = {
68
+ value : false ,
66
69
flagKey : hookContext . flagKey ,
67
- value : true ,
70
+ errorCode : ErrorCode . PROVIDER_FATAL ,
71
+ errorMessage : 'fake error message' ,
68
72
flagMetadata : { } ,
69
73
} ;
70
74
71
75
tracingHook . after ( hookContext , evaluationDetails ) ;
72
76
73
77
expect ( addEvent ) . toBeCalledWith ( 'feature_flag' , {
74
78
'feature_flag.key' : 'testFlagKey' ,
75
- 'feature_flag.provider_name' : 'testProvider' ,
76
- 'feature_flag.variant' : 'true' ,
79
+ 'feature_flag.provider.name' : 'testProvider' ,
80
+ 'feature_flag.error.type' : ErrorCode . PROVIDER_FATAL . toLowerCase ( ) ,
81
+ 'feature_flag.error.message' : 'fake error message' ,
82
+ } ) ;
83
+ } ) ;
84
+
85
+ it ( 'should not call addEvent because there is no active span' , ( ) => {
86
+ getActiveSpan . mockReturnValueOnce ( undefined ) ;
87
+ const evaluationDetails : EvaluationDetails < boolean > = {
88
+ flagKey : hookContext . flagKey ,
89
+ value : true ,
90
+ variant : 'enabled' ,
91
+ flagMetadata : { } ,
92
+ } ;
93
+
94
+ tracingHook . after ( hookContext , evaluationDetails ) ;
95
+ expect ( addEvent ) . not . toBeCalled ( ) ;
96
+ } ) ;
97
+ } ) ;
98
+
99
+ describe ( 'with value attribute' , ( ) => {
100
+ beforeEach ( ( ) => {
101
+ tracingHook = new TracingHook ( {
102
+ includeAttributes : ALL_EVENT_ATTRS ,
77
103
} ) ;
78
104
} ) ;
79
105
80
- it ( 'should set the value without extra quotes if value is already a string ' , ( ) => {
106
+ it ( 'should set the value' , ( ) => {
81
107
const evaluationDetails : EvaluationDetails < string > = {
82
108
flagKey : hookContext . flagKey ,
83
109
value : 'already-string' ,
@@ -87,22 +113,29 @@ describe('OpenTelemetry Hooks', () => {
87
113
88
114
expect ( addEvent ) . toBeCalledWith ( 'feature_flag' , {
89
115
'feature_flag.key' : 'testFlagKey' ,
90
- 'feature_flag.provider_name ' : 'testProvider' ,
91
- 'feature_flag.variant ' : 'already-string' ,
116
+ 'feature_flag.provider.name ' : 'testProvider' ,
117
+ 'feature_flag.result.value ' : 'already-string' ,
92
118
} ) ;
93
119
} ) ;
94
120
95
- it ( 'should not call addEvent because there is no active span' , ( ) => {
96
- getActiveSpan . mockReturnValueOnce ( undefined ) ;
121
+ it ( 'should use the error values and value on the span event' , ( ) => {
97
122
const evaluationDetails : EvaluationDetails < boolean > = {
123
+ value : false ,
98
124
flagKey : hookContext . flagKey ,
99
- value : true ,
100
- variant : 'enabled ' ,
125
+ errorCode : ErrorCode . PROVIDER_FATAL ,
126
+ errorMessage : 'fake error message ' ,
101
127
flagMetadata : { } ,
102
128
} ;
103
129
104
130
tracingHook . after ( hookContext , evaluationDetails ) ;
105
- expect ( addEvent ) . not . toBeCalled ( ) ;
131
+
132
+ expect ( addEvent ) . toBeCalledWith ( 'feature_flag' , {
133
+ 'feature_flag.key' : 'testFlagKey' ,
134
+ 'feature_flag.provider.name' : 'testProvider' ,
135
+ 'feature_flag.result.value' : false ,
136
+ 'feature_flag.error.type' : ErrorCode . PROVIDER_FATAL . toLowerCase ( ) ,
137
+ 'feature_flag.error.message' : 'fake error message' ,
138
+ } ) ;
106
139
} ) ;
107
140
} ) ;
108
141
@@ -136,8 +169,8 @@ describe('OpenTelemetry Hooks', () => {
136
169
137
170
expect ( addEvent ) . toBeCalledWith ( 'feature_flag' , {
138
171
'feature_flag.key' : 'testFlagKey' ,
139
- 'feature_flag.provider_name ' : 'testProvider' ,
140
- 'feature_flag.variant' : 'enabled' ,
172
+ 'feature_flag.provider.name ' : 'testProvider' ,
173
+ 'feature_flag.result. variant' : 'enabled' ,
141
174
customAttr1 : 'one' ,
142
175
customAttr2 : 2 ,
143
176
customAttr3 : true ,
@@ -170,8 +203,8 @@ describe('OpenTelemetry Hooks', () => {
170
203
171
204
expect ( addEvent ) . toBeCalledWith ( 'feature_flag' , {
172
205
'feature_flag.key' : 'testFlagKey' ,
173
- 'feature_flag.provider_name ' : 'testProvider' ,
174
- 'feature_flag.variant' : 'enabled' ,
206
+ 'feature_flag.provider.name ' : 'testProvider' ,
207
+ 'feature_flag.result. variant' : 'enabled' ,
175
208
} ) ;
176
209
} ) ;
177
210
} ) ;
0 commit comments