@@ -26,7 +26,6 @@ import (
26
26
27
27
"github.com/weaveworks/common/httpgrpc"
28
28
httpgrpc_server "github.com/weaveworks/common/httpgrpc/server"
29
- "github.com/weaveworks/common/instrument"
30
29
"github.com/weaveworks/common/logging"
31
30
"github.com/weaveworks/common/middleware"
32
31
"github.com/weaveworks/common/signals"
@@ -178,6 +177,14 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) {
178
177
f .BoolVar (& cfg .LogRequestAtInfoLevel , "server.log-request-at-info-level-enabled" , false , "Optionally log requests at info level instead of debug level. Applies to request headers as well if server.log-request-headers is enabled." )
179
178
}
180
179
180
+ func (cfg * Config ) registererOrDefault () prometheus.Registerer {
181
+ // If user doesn't supply a Registerer/gatherer, use Prometheus' by default.
182
+ if cfg .Registerer != nil {
183
+ return cfg .Registerer
184
+ }
185
+ return prometheus .DefaultRegisterer
186
+ }
187
+
181
188
// Server wraps a HTTP and gRPC server, and some common initialization.
182
189
//
183
190
// Servers will be automatically instrumented for Prometheus metrics.
@@ -202,39 +209,32 @@ type Server struct {
202
209
Gatherer prometheus.Gatherer
203
210
}
204
211
205
- // New makes a new Server
212
+ // New makes a new Server. It will panic if the metrics cannot be registered.
206
213
func New (cfg Config ) (* Server , error ) {
214
+ metrics := NewServerMetrics (cfg )
215
+ metrics .MustRegister (cfg .registererOrDefault ())
216
+ return newServer (cfg , metrics )
217
+ }
218
+
219
+ // NewWithMetrics makes a new Server using the provided Metrics. It will not attempt to register the metrics,
220
+ // the user is responsible for doing so.
221
+ func NewWithMetrics (cfg Config , metrics * Metrics ) (* Server , error ) {
222
+ return newServer (cfg , metrics )
223
+ }
224
+
225
+ func newServer (cfg Config , metrics * Metrics ) (* Server , error ) {
207
226
// If user doesn't supply a logging implementation, by default instantiate
208
227
// logrus.
209
228
log := cfg .Log
210
229
if log == nil {
211
230
log = logging .NewLogrus (cfg .LogLevel )
212
231
}
213
232
214
- // If user doesn't supply a registerer/gatherer, use Prometheus' by default.
215
- reg := cfg .Registerer
216
- if reg == nil {
217
- reg = prometheus .DefaultRegisterer
218
- }
219
233
gatherer := cfg .Gatherer
220
234
if gatherer == nil {
221
235
gatherer = prometheus .DefaultGatherer
222
236
}
223
237
224
- tcpConnections := prometheus .NewGaugeVec (prometheus.GaugeOpts {
225
- Namespace : cfg .MetricsNamespace ,
226
- Name : "tcp_connections" ,
227
- Help : "Current number of accepted TCP connections." ,
228
- }, []string {"protocol" })
229
- reg .MustRegister (tcpConnections )
230
-
231
- tcpConnectionsLimit := prometheus .NewGaugeVec (prometheus.GaugeOpts {
232
- Namespace : cfg .MetricsNamespace ,
233
- Name : "tcp_connections_limit" ,
234
- Help : "The max number of TCP connections that can be accepted (0 means no limit)." ,
235
- }, []string {"protocol" })
236
- reg .MustRegister (tcpConnectionsLimit )
237
-
238
238
network := cfg .HTTPListenNetwork
239
239
if network == "" {
240
240
network = DefaultNetwork
@@ -244,9 +244,9 @@ func New(cfg Config) (*Server, error) {
244
244
if err != nil {
245
245
return nil , err
246
246
}
247
- httpListener = middleware .CountingListener (httpListener , tcpConnections .WithLabelValues ("http" ))
247
+ httpListener = middleware .CountingListener (httpListener , metrics . TcpConnections .WithLabelValues ("http" ))
248
248
249
- tcpConnectionsLimit .WithLabelValues ("http" ).Set (float64 (cfg .HTTPConnLimit ))
249
+ metrics . TcpConnectionsLimit .WithLabelValues ("http" ).Set (float64 (cfg .HTTPConnLimit ))
250
250
if cfg .HTTPConnLimit > 0 {
251
251
httpListener = netutil .LimitListener (httpListener , cfg .HTTPConnLimit )
252
252
}
@@ -268,9 +268,9 @@ func New(cfg Config) (*Server, error) {
268
268
if err != nil {
269
269
return nil , err
270
270
}
271
- grpcListener = middleware .CountingListener (grpcListener , tcpConnections .WithLabelValues ("grpc" ))
271
+ grpcListener = middleware .CountingListener (grpcListener , metrics . TcpConnections .WithLabelValues ("grpc" ))
272
272
273
- tcpConnectionsLimit .WithLabelValues ("grpc" ).Set (float64 (cfg .GRPCConnLimit ))
273
+ metrics . TcpConnectionsLimit .WithLabelValues ("grpc" ).Set (float64 (cfg .GRPCConnLimit ))
274
274
if cfg .GRPCConnLimit > 0 {
275
275
grpcListener = netutil .LimitListener (grpcListener , cfg .GRPCConnLimit )
276
276
}
@@ -316,41 +316,6 @@ func New(cfg Config) (*Server, error) {
316
316
}
317
317
}
318
318
319
- // Prometheus histograms for requests.
320
- requestDuration := prometheus .NewHistogramVec (prometheus.HistogramOpts {
321
- Namespace : cfg .MetricsNamespace ,
322
- Name : "request_duration_seconds" ,
323
- Help : "Time (in seconds) spent serving HTTP requests." ,
324
- Buckets : instrument .DefBuckets ,
325
- NativeHistogramBucketFactor : cfg .MetricsNativeHistogramFactor ,
326
- NativeHistogramMaxBucketNumber : 100 ,
327
- NativeHistogramMinResetDuration : time .Hour ,
328
- }, []string {"method" , "route" , "status_code" , "ws" })
329
- reg .MustRegister (requestDuration )
330
-
331
- receivedMessageSize := prometheus .NewHistogramVec (prometheus.HistogramOpts {
332
- Namespace : cfg .MetricsNamespace ,
333
- Name : "request_message_bytes" ,
334
- Help : "Size (in bytes) of messages received in the request." ,
335
- Buckets : middleware .BodySizeBuckets ,
336
- }, []string {"method" , "route" })
337
- reg .MustRegister (receivedMessageSize )
338
-
339
- sentMessageSize := prometheus .NewHistogramVec (prometheus.HistogramOpts {
340
- Namespace : cfg .MetricsNamespace ,
341
- Name : "response_message_bytes" ,
342
- Help : "Size (in bytes) of messages sent in response." ,
343
- Buckets : middleware .BodySizeBuckets ,
344
- }, []string {"method" , "route" })
345
- reg .MustRegister (sentMessageSize )
346
-
347
- inflightRequests := prometheus .NewGaugeVec (prometheus.GaugeOpts {
348
- Namespace : cfg .MetricsNamespace ,
349
- Name : "inflight_requests" ,
350
- Help : "Current number of inflight requests." ,
351
- }, []string {"method" , "route" })
352
- reg .MustRegister (inflightRequests )
353
-
354
319
log .WithField ("http" , httpListener .Addr ()).WithField ("grpc" , grpcListener .Addr ()).Infof ("server listening on addresses" )
355
320
356
321
// Setup gRPC server
@@ -362,14 +327,14 @@ func New(cfg Config) (*Server, error) {
362
327
grpcMiddleware := []grpc.UnaryServerInterceptor {
363
328
serverLog .UnaryServerInterceptor ,
364
329
otgrpc .OpenTracingServerInterceptor (opentracing .GlobalTracer ()),
365
- middleware .UnaryServerInstrumentInterceptor (requestDuration ),
330
+ middleware .UnaryServerInstrumentInterceptor (metrics . RequestDuration ),
366
331
}
367
332
grpcMiddleware = append (grpcMiddleware , cfg .GRPCMiddleware ... )
368
333
369
334
grpcStreamMiddleware := []grpc.StreamServerInterceptor {
370
335
serverLog .StreamServerInterceptor ,
371
336
otgrpc .OpenTracingStreamServerInterceptor (opentracing .GlobalTracer ()),
372
- middleware .StreamServerInstrumentInterceptor (requestDuration ),
337
+ middleware .StreamServerInstrumentInterceptor (metrics . RequestDuration ),
373
338
}
374
339
grpcStreamMiddleware = append (grpcStreamMiddleware , cfg .GRPCStreamMiddleware ... )
375
340
@@ -394,7 +359,11 @@ func New(cfg Config) (*Server, error) {
394
359
grpc .MaxRecvMsgSize (cfg .GPRCServerMaxRecvMsgSize ),
395
360
grpc .MaxSendMsgSize (cfg .GRPCServerMaxSendMsgSize ),
396
361
grpc .MaxConcurrentStreams (uint32 (cfg .GPRCServerMaxConcurrentStreams )),
397
- grpc .StatsHandler (middleware .NewStatsHandler (receivedMessageSize , sentMessageSize , inflightRequests )),
362
+ grpc .StatsHandler (middleware .NewStatsHandler (
363
+ metrics .ReceivedMessageSize ,
364
+ metrics .SentMessageSize ,
365
+ metrics .InflightRequests ,
366
+ )),
398
367
}
399
368
grpcOptions = append (grpcOptions , cfg .GRPCOptions ... )
400
369
if grpcTLSConfig != nil {
@@ -439,10 +408,10 @@ func New(cfg Config) (*Server, error) {
439
408
defaultLogMiddleware ,
440
409
middleware.Instrument {
441
410
RouteMatcher : router ,
442
- Duration : requestDuration ,
443
- RequestBodySize : receivedMessageSize ,
444
- ResponseBodySize : sentMessageSize ,
445
- InflightRequests : inflightRequests ,
411
+ Duration : metrics . RequestDuration ,
412
+ RequestBodySize : metrics . ReceivedMessageSize ,
413
+ ResponseBodySize : metrics . SentMessageSize ,
414
+ InflightRequests : metrics . InflightRequests ,
446
415
},
447
416
}
448
417
var httpMiddleware []middleware.Interface
@@ -480,7 +449,7 @@ func New(cfg Config) (*Server, error) {
480
449
GRPC : grpcServer ,
481
450
GRPCOnHTTPServer : grpcOnHttpServer ,
482
451
Log : log ,
483
- Registerer : reg ,
452
+ Registerer : cfg . registererOrDefault () ,
484
453
Gatherer : gatherer ,
485
454
}, nil
486
455
}
0 commit comments