@@ -12,6 +12,8 @@ import (
1212 "go.unistack.org/micro/v3/options"
1313 "go.unistack.org/micro/v3/semconv"
1414 "go.unistack.org/micro/v3/tracer"
15+
16+ "go.unistack.org/micro-client-http/v3/status"
1517)
1618
1719var DefaultContentType = "application/json"
@@ -91,25 +93,45 @@ func (c *Client) NewRequest(service, method string, req any, opts ...client.Requ
9193func (c * Client ) Call (ctx context.Context , req client.Request , rsp any , opts ... client.CallOption ) error {
9294 ts := time .Now ()
9395 c .opts .Meter .Counter (semconv .ClientRequestInflight , "endpoint" , req .Endpoint ()).Inc ()
96+
9497 var sp tracer.Span
9598 ctx , sp = c .opts .Tracer .Start (ctx , req .Endpoint ()+ " rpc-client" ,
9699 tracer .WithSpanKind (tracer .SpanKindClient ),
97100 tracer .WithSpanLabels ("endpoint" , req .Endpoint ()),
98101 )
102+ defer sp .Finish ()
103+
99104 err := c .funcCall (ctx , req , rsp , opts ... )
105+
100106 c .opts .Meter .Counter (semconv .ClientRequestInflight , "endpoint" , req .Endpoint ()).Dec ()
101107 te := time .Since (ts )
102108 c .opts .Meter .Summary (semconv .ClientRequestLatencyMicroseconds , "endpoint" , req .Endpoint ()).Update (te .Seconds ())
103109 c .opts .Meter .Histogram (semconv .ClientRequestDurationSeconds , "endpoint" , req .Endpoint ()).Update (te .Seconds ())
104110
105- if me := errors .FromError (err ); me == nil {
106- sp .Finish ()
107- c .opts .Meter .Counter (semconv .ClientRequestTotal , "endpoint" , req .Endpoint (), "status" , "success" , "code" , strconv .Itoa (int (200 ))).Inc ()
111+ var (
112+ statusCode int
113+ statusLabel string
114+ )
115+
116+ if err == nil {
117+ statusCode = http .StatusOK
118+ statusLabel = "success"
119+ } else if st , ok := status .FromError (err ); ok {
120+ statusCode = st .Code ()
121+ statusLabel = "failure"
122+ sp .SetStatus (tracer .SpanStatusError , err .Error ())
123+ } else if me := errors .FromError (err ); me != nil {
124+ statusCode = int (me .Code )
125+ statusLabel = "failure"
126+ sp .SetStatus (tracer .SpanStatusError , err .Error ())
108127 } else {
128+ statusCode = http .StatusInternalServerError
129+ statusLabel = "failure"
109130 sp .SetStatus (tracer .SpanStatusError , err .Error ())
110- c .opts .Meter .Counter (semconv .ClientRequestTotal , "endpoint" , req .Endpoint (), "status" , "failure" , "code" , strconv .Itoa (int (me .Code ))).Inc ()
111131 }
112132
133+ c .opts .Meter .Counter (semconv .ClientRequestTotal , "endpoint" , req .Endpoint (), "status" , statusLabel , "code" , strconv .Itoa (statusCode )).Inc ()
134+
113135 return err
114136}
115137
0 commit comments