1
1
package metrics
2
2
3
3
import (
4
- "github.com/prometheus/client_golang/prometheus"
5
4
openmetrics "github.com/prometheus/client_golang/prometheus"
6
5
)
7
6
8
7
// ClientMetrics represents a collection of metrics to be registered on a
9
8
// Prometheus metrics registry for a gRPC client.
10
9
type ClientMetrics struct {
11
- clientRegister openmetrics.Registerer
12
-
13
10
clientStartedCounter * openmetrics.CounterVec
14
11
clientHandledCounter * openmetrics.CounterVec
15
12
clientStreamMsgReceived * openmetrics.CounterVec
16
13
clientStreamMsgSent * openmetrics.CounterVec
17
14
18
- clientHandledHistogramEnabled bool
19
- clientHandledHistogramOpts openmetrics.HistogramOpts
20
- clientHandledHistogram * openmetrics.HistogramVec
21
-
22
- clientStreamRecvHistogramEnabled bool
23
- clientStreamRecvHistogramOpts openmetrics.HistogramOpts
24
- clientStreamRecvHistogram * openmetrics.HistogramVec
25
-
26
- clientStreamSendHistogramEnabled bool
27
- clientStreamSendHistogramOpts openmetrics.HistogramOpts
28
- clientStreamSendHistogram * openmetrics.HistogramVec
15
+ // clientHandledHistogram can be nil
16
+ clientHandledHistogram * openmetrics.HistogramVec
17
+ // clientStreamRecvHistogram can be nil
18
+ clientStreamRecvHistogram * openmetrics.HistogramVec
19
+ // clientStreamSendHistogram can be nil
20
+ clientStreamSendHistogram * openmetrics.HistogramVec
29
21
}
30
22
31
- // NewClientMetrics returns a ClientMetrics object. Use a new instance of
32
- // ClientMetrics when not using the default Prometheus metrics registry, for
33
- // example when wanting to control which metrics are added to a registry as
34
- // opposed to automatically adding metrics via init functions.
35
- func NewClientMetrics (clientRegistry prometheus.Registerer , counterOpts ... CounterOption ) * ClientMetrics {
36
- opts := counterOptions (counterOpts )
23
+ // NewClientMetrics returns a new ClientMetrics object.
24
+ func NewClientMetrics (opts ... ClientMetricsOption ) * ClientMetrics {
25
+ var config clientMetricsConfig
26
+ config .apply (opts )
37
27
return & ClientMetrics {
38
- clientRegister : clientRegistry ,
39
28
clientStartedCounter : openmetrics .NewCounterVec (
40
- opts .apply (openmetrics.CounterOpts {
29
+ config . counterOpts .apply (openmetrics.CounterOpts {
41
30
Name : "grpc_client_started_total" ,
42
31
Help : "Total number of RPCs started on the client." ,
43
32
}), []string {"grpc_type" , "grpc_service" , "grpc_method" }),
44
33
45
34
clientHandledCounter : openmetrics .NewCounterVec (
46
- opts .apply (openmetrics.CounterOpts {
35
+ config . counterOpts .apply (openmetrics.CounterOpts {
47
36
Name : "grpc_client_handled_total" ,
48
37
Help : "Total number of RPCs completed by the client, regardless of success or failure." ,
49
38
}), []string {"grpc_type" , "grpc_service" , "grpc_method" , "grpc_code" }),
50
39
51
40
clientStreamMsgReceived : openmetrics .NewCounterVec (
52
- opts .apply (openmetrics.CounterOpts {
41
+ config . counterOpts .apply (openmetrics.CounterOpts {
53
42
Name : "grpc_client_msg_received_total" ,
54
43
Help : "Total number of RPC stream messages received by the client." ,
55
44
}), []string {"grpc_type" , "grpc_service" , "grpc_method" }),
56
45
57
46
clientStreamMsgSent : openmetrics .NewCounterVec (
58
- opts .apply (openmetrics.CounterOpts {
47
+ config . counterOpts .apply (openmetrics.CounterOpts {
59
48
Name : "grpc_client_msg_sent_total" ,
60
49
Help : "Total number of gRPC stream messages sent by the client." ,
61
50
}), []string {"grpc_type" , "grpc_service" , "grpc_method" }),
62
51
63
- clientHandledHistogramEnabled : false ,
64
- clientHandledHistogramOpts : openmetrics.HistogramOpts {
65
- Name : "grpc_client_handling_seconds" ,
66
- Help : "Histogram of response latency (seconds) of the gRPC until it is finished by the application." ,
67
- Buckets : openmetrics .DefBuckets ,
68
- },
69
- clientHandledHistogram : nil ,
70
- clientStreamRecvHistogramEnabled : false ,
71
- clientStreamRecvHistogramOpts : openmetrics.HistogramOpts {
72
- Name : "grpc_client_msg_recv_handling_seconds" ,
73
- Help : "Histogram of response latency (seconds) of the gRPC single message receive." ,
74
- Buckets : openmetrics .DefBuckets ,
75
- },
76
- clientStreamRecvHistogram : nil ,
77
- clientStreamSendHistogramEnabled : false ,
78
- clientStreamSendHistogramOpts : openmetrics.HistogramOpts {
79
- Name : "grpc_client_msg_send_handling_seconds" ,
80
- Help : "Histogram of response latency (seconds) of the gRPC single message send." ,
81
- Buckets : openmetrics .DefBuckets ,
82
- },
83
- clientStreamSendHistogram : nil ,
52
+ clientHandledHistogram : config .clientHandledHistogram ,
53
+ clientStreamRecvHistogram : config .clientStreamRecvHistogram ,
54
+ clientStreamSendHistogram : config .clientStreamSendHistogram ,
84
55
}
85
56
}
86
57
87
- // Register registers the provided Collector with the custom register.
58
+ // NewRegisteredClientMetrics returns a custom ClientMetrics object registered
59
+ // with the user's registry, and registers some common metrics associated
60
+ // with every instance.
61
+ func NewRegisteredClientMetrics (registry openmetrics.Registerer , opts ... ClientMetricsOption ) * ClientMetrics {
62
+ customClientMetrics := NewClientMetrics (opts ... )
63
+ customClientMetrics .MustRegister (registry )
64
+ return customClientMetrics
65
+ }
66
+
67
+ // Register registers the metrics with the registry.
88
68
// returns error much like DefaultRegisterer of Prometheus.
89
- func (m * ClientMetrics ) Register (c openmetrics.Collector ) error {
90
- return m .clientRegister .Register (c )
69
+ func (m * ClientMetrics ) Register (registry openmetrics.Registerer ) error {
70
+ for _ , collector := range m .toRegister () {
71
+ if err := registry .Register (collector ); err != nil {
72
+ return err
73
+ }
74
+ }
75
+ return nil
91
76
}
92
77
93
- // MustRegister registers the provided Collectors with the custom Registerer
78
+ // MustRegister registers the metrics with the registry
94
79
// and panics if any error occurs much like DefaultRegisterer of Prometheus.
95
- func (m * ClientMetrics ) MustRegister (c openmetrics.Collector ) {
96
- m .clientRegister .MustRegister (c )
80
+ func (m * ClientMetrics ) MustRegister (registry openmetrics.Registerer ) {
81
+ registry .MustRegister (m .toRegister ()... )
82
+ }
83
+
84
+ func (m * ClientMetrics ) toRegister () []openmetrics.Collector {
85
+ res := []openmetrics.Collector {
86
+ m .clientStartedCounter ,
87
+ m .clientHandledCounter ,
88
+ m .clientStreamMsgReceived ,
89
+ m .clientStreamMsgSent ,
90
+ }
91
+ if m .clientHandledHistogram != nil {
92
+ res = append (res , m .clientHandledHistogram )
93
+ }
94
+ if m .clientStreamRecvHistogram != nil {
95
+ res = append (res , m .clientStreamRecvHistogram )
96
+ }
97
+ if m .clientStreamSendHistogram != nil {
98
+ res = append (res , m .clientStreamSendHistogram )
99
+ }
100
+ return res
97
101
}
98
102
99
103
// Describe sends the super-set of all possible descriptors of metrics
@@ -104,13 +108,13 @@ func (m *ClientMetrics) Describe(ch chan<- *openmetrics.Desc) {
104
108
m .clientHandledCounter .Describe (ch )
105
109
m .clientStreamMsgReceived .Describe (ch )
106
110
m .clientStreamMsgSent .Describe (ch )
107
- if m .clientHandledHistogramEnabled {
111
+ if m .clientHandledHistogram != nil {
108
112
m .clientHandledHistogram .Describe (ch )
109
113
}
110
- if m .clientStreamRecvHistogramEnabled {
114
+ if m .clientStreamRecvHistogram != nil {
111
115
m .clientStreamRecvHistogram .Describe (ch )
112
116
}
113
- if m .clientStreamSendHistogramEnabled {
117
+ if m .clientStreamSendHistogram != nil {
114
118
m .clientStreamSendHistogram .Describe (ch )
115
119
}
116
120
}
@@ -123,65 +127,13 @@ func (m *ClientMetrics) Collect(ch chan<- openmetrics.Metric) {
123
127
m .clientHandledCounter .Collect (ch )
124
128
m .clientStreamMsgReceived .Collect (ch )
125
129
m .clientStreamMsgSent .Collect (ch )
126
- if m .clientHandledHistogramEnabled {
130
+ if m .clientHandledHistogram != nil {
127
131
m .clientHandledHistogram .Collect (ch )
128
132
}
129
- if m .clientStreamRecvHistogramEnabled {
133
+ if m .clientStreamRecvHistogram != nil {
130
134
m .clientStreamRecvHistogram .Collect (ch )
131
135
}
132
- if m .clientStreamSendHistogramEnabled {
136
+ if m .clientStreamSendHistogram != nil {
133
137
m .clientStreamSendHistogram .Collect (ch )
134
138
}
135
139
}
136
-
137
- // EnableClientHandlingTimeHistogram turns on recording of handling time of RPCs.
138
- // Histogram metrics can be very expensive for Prometheus to retain and query.
139
- func (m * ClientMetrics ) EnableClientHandlingTimeHistogram (opts ... HistogramOption ) error {
140
- for _ , o := range opts {
141
- o (& m .clientHandledHistogramOpts )
142
- }
143
- if ! m .clientHandledHistogramEnabled {
144
- m .clientHandledHistogram = openmetrics .NewHistogramVec (
145
- m .clientHandledHistogramOpts ,
146
- []string {"grpc_type" , "grpc_service" , "grpc_method" },
147
- )
148
- }
149
- m .clientHandledHistogramEnabled = true
150
- return m .clientRegister .Register (m .clientHandledHistogram )
151
- }
152
-
153
- // EnableClientStreamReceiveTimeHistogram turns on recording of single message receive time of streaming RPCs.
154
- // Histogram metrics can be very expensive for Prometheus to retain and query.
155
- func (m * ClientMetrics ) EnableClientStreamReceiveTimeHistogram (opts ... HistogramOption ) error {
156
- for _ , o := range opts {
157
- o (& m .clientStreamRecvHistogramOpts )
158
- }
159
-
160
- if ! m .clientStreamRecvHistogramEnabled {
161
- m .clientStreamRecvHistogram = openmetrics .NewHistogramVec (
162
- m .clientStreamRecvHistogramOpts ,
163
- []string {"grpc_type" , "grpc_service" , "grpc_method" },
164
- )
165
- }
166
-
167
- m .clientStreamRecvHistogramEnabled = true
168
- return m .clientRegister .Register (m .clientStreamRecvHistogram )
169
- }
170
-
171
- // EnableClientStreamSendTimeHistogram turns on recording of single message send time of streaming RPCs.
172
- // Histogram metrics can be very expensive for Prometheus to retain and query.
173
- func (m * ClientMetrics ) EnableClientStreamSendTimeHistogram (opts ... HistogramOption ) error {
174
- for _ , o := range opts {
175
- o (& m .clientStreamSendHistogramOpts )
176
- }
177
-
178
- if ! m .clientStreamSendHistogramEnabled {
179
- m .clientStreamSendHistogram = openmetrics .NewHistogramVec (
180
- m .clientStreamSendHistogramOpts ,
181
- []string {"grpc_type" , "grpc_service" , "grpc_method" },
182
- )
183
- }
184
-
185
- m .clientStreamSendHistogramEnabled = true
186
- return m .clientRegister .Register (m .clientStreamSendHistogram )
187
- }
0 commit comments