Skip to content

Commit a08c265

Browse files
committed
Add tests for intereceptor
1 parent 5d5d061 commit a08c265

File tree

4 files changed

+113
-22
lines changed

4 files changed

+113
-22
lines changed

interceptor_test.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package connect_go_prometheus
2+
3+
import (
4+
"context"
5+
"net/http"
6+
"net/http/httptest"
7+
"testing"
8+
9+
"github.com/bufbuild/connect-go"
10+
"github.com/easyCZ/connect-go-prometheus/gen/greet"
11+
"github.com/easyCZ/connect-go-prometheus/gen/greet/greetconnect"
12+
prom "github.com/prometheus/client_golang/prometheus"
13+
"github.com/prometheus/client_golang/prometheus/testutil"
14+
"github.com/stretchr/testify/require"
15+
)
16+
17+
func TestInterceptor_WithHistogram(t *testing.T) {
18+
reg := prom.NewRegistry()
19+
opts := []MetricsOption{
20+
WithHistogram(true),
21+
WithNamespace("namespace"),
22+
WithSubsystem("subsystem"),
23+
WithConstLabels(prom.Labels{"component": "foo"}),
24+
WithHistogramBuckets([]float64{1, 5}),
25+
}
26+
clientMetrics := NewClientMetrics(opts...)
27+
serverMetrics := NewServerMetrics(opts...)
28+
29+
reg.MustRegister(clientMetrics, serverMetrics)
30+
31+
intereceptor := NewInterceptor(clientMetrics, serverMetrics)
32+
33+
_, handler := greetconnect.NewGreetServiceHandler(greetconnect.UnimplementedGreetServiceHandler{}, connect.WithInterceptors(intereceptor))
34+
srv := httptest.NewServer(handler)
35+
36+
client := greetconnect.NewGreetServiceClient(http.DefaultClient, srv.URL, connect.WithInterceptors(intereceptor))
37+
_, err := client.Greet(context.Background(), connect.NewRequest(&greet.GreetRequest{
38+
Name: "elza",
39+
}))
40+
require.Error(t, err)
41+
require.Equal(t, connect.CodeOf(err), connect.CodeUnimplemented)
42+
43+
expectedMetrics := []string{
44+
"namespace_subsystem_connect_client_handled_seconds",
45+
"namespace_subsystem_connect_client_handled_total",
46+
"namespace_subsystem_connect_client_started_total",
47+
48+
"namespace_subsystem_connect_server_handled_seconds",
49+
"namespace_subsystem_connect_server_handled_total",
50+
"namespace_subsystem_connect_server_started_total",
51+
}
52+
count, err := testutil.GatherAndCount(reg, expectedMetrics...)
53+
require.NoError(t, err)
54+
require.Equal(t, len(expectedMetrics), count)
55+
}
56+
57+
func TestInterceptor_WithoutHistogram(t *testing.T) {
58+
reg := prom.NewRegistry()
59+
opts := []MetricsOption{
60+
WithNamespace("namespace"),
61+
WithSubsystem("subsystem"),
62+
WithConstLabels(prom.Labels{"component": "foo"}),
63+
}
64+
clientMetrics := NewClientMetrics(opts...)
65+
serverMetrics := NewServerMetrics(opts...)
66+
67+
reg.MustRegister(clientMetrics, serverMetrics)
68+
69+
intereceptor := NewInterceptor(clientMetrics, serverMetrics)
70+
71+
_, handler := greetconnect.NewGreetServiceHandler(greetconnect.UnimplementedGreetServiceHandler{}, connect.WithInterceptors(intereceptor))
72+
srv := httptest.NewServer(handler)
73+
74+
client := greetconnect.NewGreetServiceClient(http.DefaultClient, srv.URL, connect.WithInterceptors(intereceptor))
75+
_, err := client.Greet(context.Background(), connect.NewRequest(&greet.GreetRequest{
76+
Name: "elza",
77+
}))
78+
require.Error(t, err)
79+
require.Equal(t, connect.CodeOf(err), connect.CodeUnimplemented)
80+
81+
expectedMetrics := []string{
82+
"namespace_subsystem_connect_client_handled_total",
83+
"namespace_subsystem_connect_client_started_total",
84+
85+
"namespace_subsystem_connect_server_handled_total",
86+
"namespace_subsystem_connect_server_started_total",
87+
}
88+
count, err := testutil.GatherAndCount(reg, expectedMetrics...)
89+
require.NoError(t, err)
90+
require.Equal(t, len(expectedMetrics), count)
91+
}

metrics.go

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -83,29 +83,30 @@ func NewClientMetrics(opts ...MetricsOption) *Metrics {
8383
return m
8484
}
8585

86+
var _ prom.Collector = (*Metrics)(nil)
87+
8688
type Metrics struct {
8789
requestStarted *prom.CounterVec
8890
requestHandled *prom.CounterVec
8991
requestHandledSeconds *prom.HistogramVec
9092
}
9193

92-
// Register registers the ClientMetrics with a prometheus.Registry
93-
func (m *Metrics) Register(registry *prom.Registry) error {
94-
if err := registry.Register(m.requestStarted); err != nil {
95-
return err
96-
}
97-
98-
if err := registry.Register(m.requestHandled); err != nil {
99-
return err
94+
// Describe implements Describe as required by prom.Collector
95+
func (m *Metrics) Describe(c chan<- *prom.Desc) {
96+
m.requestStarted.Describe(c)
97+
m.requestHandled.Describe(c)
98+
if m.requestHandledSeconds != nil {
99+
m.requestHandledSeconds.Describe(c)
100100
}
101+
}
101102

103+
// Collect implements collect as required by prom.Collector
104+
func (m *Metrics) Collect(c chan<- prom.Metric) {
105+
m.requestStarted.Collect(c)
106+
m.requestHandled.Collect(c)
102107
if m.requestHandledSeconds != nil {
103-
if err := registry.Register(m.requestHandledSeconds); err != nil {
104-
return err
105-
}
108+
m.requestHandledSeconds.Collect(c)
106109
}
107-
108-
return nil
109110
}
110111

111112
func (m *Metrics) ReportStarted(callType, service, method string) {

metrics_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func TestServerMetrics(t *testing.T) {
2020
WithConstLabels(prom.Labels{"component": "foo"}),
2121
WithHistogramBuckets([]float64{0.5, 1, 1.5}),
2222
)
23-
require.NoError(t, sm.Register(reg))
23+
require.NoError(t, reg.Register(sm))
2424

2525
started := sm.requestStarted.WithLabelValues("unary", greetconnect.GreetServiceName, "Greet")
2626
started.Inc()
@@ -50,28 +50,28 @@ func TestServerMetrics(t *testing.T) {
5050

5151
func TestClientMetrics(t *testing.T) {
5252
reg := prom.NewRegistry()
53-
sm := NewClientMetrics(
53+
cm := NewClientMetrics(
5454
WithHistogram(true),
5555
WithNamespace("namespace"),
5656
WithSubsystem("subsystem"),
5757
WithConstLabels(prom.Labels{"component": "foo"}),
5858
WithHistogramBuckets([]float64{0.5, 1, 1.5}),
5959
)
60-
require.NoError(t, sm.Register(reg))
60+
require.NoError(t, reg.Register(cm))
6161

62-
started := sm.requestStarted.WithLabelValues("unary", greetconnect.GreetServiceName, "Greet")
62+
started := cm.requestStarted.WithLabelValues("unary", greetconnect.GreetServiceName, "Greet")
6363
started.Inc()
6464
require.EqualValues(t, float64(1), testutil.ToFloat64(started))
6565

66-
handled := sm.requestHandled.WithLabelValues("unary", greetconnect.GreetServiceName, "Greet", connect.CodeAborted.String())
66+
handled := cm.requestHandled.WithLabelValues("unary", greetconnect.GreetServiceName, "Greet", connect.CodeAborted.String())
6767
handled.Inc()
6868
require.EqualValues(t, 1, testutil.ToFloat64(handled))
6969

70-
if sm.requestHandledSeconds != nil {
71-
handledHist := sm.requestHandledSeconds.WithLabelValues("unary", greetconnect.GreetServiceName, "Greet", connect.CodeAborted.String())
70+
if cm.requestHandledSeconds != nil {
71+
handledHist := cm.requestHandledSeconds.WithLabelValues("unary", greetconnect.GreetServiceName, "Greet", connect.CodeAborted.String())
7272
handledHist.Observe(1)
7373

74-
err := testutil.CollectAndCompare(sm.requestHandledSeconds, strings.NewReader(`
74+
err := testutil.CollectAndCompare(cm.requestHandledSeconds, strings.NewReader(`
7575
# HELP namespace_subsystem_connect_client_handled_seconds Histogram of RPCs handled client-side
7676
# TYPE namespace_subsystem_connect_client_handled_seconds histogram
7777
namespace_subsystem_connect_client_handled_seconds_bucket{code="aborted",component="foo",method="Greet",service="greet.v1.GreetService",type="unary",le="0.5"} 0

options.go

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)