@@ -154,6 +154,7 @@ func Invoke(
154154 return queryDirectlyThroughMatching (
155155 ctx ,
156156 msResp ,
157+ nsEntry ,
157158 request .GetNamespaceId (),
158159 req ,
159160 shardContext ,
@@ -178,6 +179,12 @@ func Invoke(
178179 }
179180 queryID , completionCh := queryReg .BufferQuery (req .GetQuery ())
180181 defer queryReg .RemoveQuery (queryID )
182+
183+ msResp , err := api .MutableStateToGetResponse (mutableState )
184+ if err != nil {
185+ return nil , err
186+ }
187+
181188 workflowLease .GetReleaseFn ()(nil ) // release the lock - no access to mutable state beyond this point!
182189 select {
183190 case <- completionCh :
@@ -191,13 +198,28 @@ func Invoke(
191198 result := completionState .Result
192199 switch result .GetResultType () {
193200 case enumspb .QUERY_RESULT_TYPE_ANSWERED :
201+ emitWorkflowQueryMetrics (
202+ scope ,
203+ nsEntry ,
204+ msResp ,
205+ req .GetQuery ().GetQueryType (),
206+ nil ,
207+ )
194208 return & historyservice.QueryWorkflowResponse {
195209 Response : & workflowservice.QueryWorkflowResponse {
196210 QueryResult : result .GetAnswer (),
197211 },
198212 }, nil
199213 case enumspb .QUERY_RESULT_TYPE_FAILED :
200- return nil , serviceerror .NewQueryFailedWithFailure (result .GetErrorMessage (), result .GetFailure ())
214+ err := serviceerror .NewQueryFailedWithFailure (result .GetErrorMessage (), result .GetFailure ())
215+ emitWorkflowQueryMetrics (
216+ scope ,
217+ nsEntry ,
218+ msResp ,
219+ req .GetQuery ().GetQueryType (),
220+ err ,
221+ )
222+ return nil , err
201223 default :
202224 metrics .QueryRegistryInvalidStateCount .With (scope ).Record (1 )
203225 return nil , consts .ErrQueryEnteredInvalidState
@@ -211,6 +233,7 @@ func Invoke(
211233 return queryDirectlyThroughMatching (
212234 ctx ,
213235 msResp ,
236+ nsEntry ,
214237 request .GetNamespaceId (),
215238 req ,
216239 shardContext ,
@@ -221,12 +244,27 @@ func Invoke(
221244 priority ,
222245 )
223246 case workflow .QueryCompletionTypeFailed :
224- return nil , completionState .Err
247+ err = completionState .Err
248+ emitWorkflowQueryMetrics (
249+ scope ,
250+ nsEntry ,
251+ msResp ,
252+ req .GetQuery ().GetQueryType (),
253+ err ,
254+ )
255+ return nil , err
225256 default :
226257 metrics .QueryRegistryInvalidStateCount .With (scope ).Record (1 )
227258 return nil , consts .ErrQueryEnteredInvalidState
228259 }
229260 case <- ctx .Done ():
261+ emitWorkflowQueryMetrics (
262+ scope ,
263+ nsEntry ,
264+ msResp ,
265+ req .GetQuery ().GetQueryType (),
266+ ctx .Err (),
267+ )
230268 metrics .ConsistentQueryTimeoutCount .With (scope ).Record (1 )
231269 return nil , ctx .Err ()
232270 }
@@ -259,6 +297,7 @@ func queryWillTimeoutsBeforeFirstWorkflowTaskStart(
259297func queryDirectlyThroughMatching (
260298 ctx context.Context ,
261299 msResp * historyservice.GetMutableStateResponse ,
300+ nsEntry * namespace.Namespace ,
262301 namespaceID string ,
263302 queryRequest * workflowservice.QueryWorkflowRequest ,
264303 shard historyi.ShardContext ,
@@ -267,11 +306,18 @@ func queryDirectlyThroughMatching(
267306 matchingClient matchingservice.MatchingServiceClient ,
268307 metricsHandler metrics.Handler ,
269308 priority * commonpb.Priority ,
270- ) (* historyservice.QueryWorkflowResponse , error ) {
309+ ) (resp * historyservice.QueryWorkflowResponse , retError error ) {
271310
272311 startTime := time .Now ().UTC ()
273312 defer func () {
274313 metrics .DirectQueryDispatchLatency .With (metricsHandler ).Record (time .Since (startTime ))
314+ emitWorkflowQueryMetrics (
315+ metricsHandler ,
316+ nsEntry ,
317+ msResp ,
318+ queryRequest .GetQuery ().GetQueryType (),
319+ retError ,
320+ )
275321 }()
276322
277323 directive := worker_versioning .MakeDirectiveForWorkflowTask (
@@ -355,3 +401,27 @@ func queryDirectlyThroughMatching(
355401 QueryRejected : matchingResp .GetQueryRejected (),
356402 }}, err
357403}
404+
405+ func emitWorkflowQueryMetrics (
406+ metricsHandler metrics.Handler ,
407+ nsEntry * namespace.Namespace ,
408+ msResp * historyservice.GetMutableStateResponse ,
409+ queryType string ,
410+ err error ,
411+ ) {
412+ commonTags := []metrics.Tag {
413+ metrics .OperationTag (metrics .HistoryQueryWorkflowScope ),
414+ metrics .NamespaceTag (nsEntry .Name ().String ()),
415+ metrics .VersioningBehaviorTag (workflow .GetEffectiveVersioningBehavior (msResp .GetVersioningInfo ())),
416+ metrics .WorkflowStatusTag (msResp .GetWorkflowStatus ().String ()),
417+ metrics .QueryTypeTag (queryType ),
418+ }
419+
420+ if err == nil {
421+ metrics .WorkflowQuerySuccessCount .With (metricsHandler ).Record (1 , commonTags ... )
422+ } else if common .IsContextDeadlineExceededErr (err ) {
423+ metrics .WorkflowQueryTimeoutCount .With (metricsHandler ).Record (1 , commonTags ... )
424+ } else {
425+ metrics .WorkflowQueryFailureCount .With (metricsHandler ).Record (1 , commonTags ... )
426+ }
427+ }
0 commit comments