Skip to content

Commit a6dd9c0

Browse files
authored
fix metrics (#164)
1 parent c757127 commit a6dd9c0

File tree

1 file changed

+26
-4
lines changed

1 file changed

+26
-4
lines changed

client.go

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1719
var DefaultContentType = "application/json"
@@ -91,25 +93,45 @@ func (c *Client) NewRequest(service, method string, req any, opts ...client.Requ
9193
func (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

Comments
 (0)