Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-workhorse
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-workhorse
Commits
99a43bf6
Commit
99a43bf6
authored
Nov 14, 2017
by
Kim "BKC" Carlbäcker
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Track Gitaly Connections in Prometheus
parent
92601a16
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1073 additions
and
0 deletions
+1073
-0
internal/gitaly/gitaly.go
internal/gitaly/gitaly.go
+3
-0
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/LICENSE
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/LICENSE
+201
-0
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/README.md
...or/github.com/grpc-ecosystem/go-grpc-prometheus/README.md
+247
-0
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client.go
...or/github.com/grpc-ecosystem/go-grpc-prometheus/client.go
+39
-0
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client_metrics.go
...b.com/grpc-ecosystem/go-grpc-prometheus/client_metrics.go
+165
-0
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client_reporter.go
....com/grpc-ecosystem/go-grpc-prometheus/client_reporter.go
+46
-0
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server.go
...or/github.com/grpc-ecosystem/go-grpc-prometheus/server.go
+48
-0
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server_metrics.go
...b.com/grpc-ecosystem/go-grpc-prometheus/server_metrics.go
+208
-0
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server_reporter.go
....com/grpc-ecosystem/go-grpc-prometheus/server_reporter.go
+46
-0
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/test_all.sh
.../github.com/grpc-ecosystem/go-grpc-prometheus/test_all.sh
+14
-0
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/util.go
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/util.go
+50
-0
vendor/vendor.json
vendor/vendor.json
+6
-0
No files found.
internal/gitaly/gitaly.go
View file @
99a43bf6
...
...
@@ -3,6 +3,7 @@ package gitaly
import
(
"sync"
grpc_prometheus
"github.com/grpc-ecosystem/go-grpc-prometheus"
pb
"gitlab.com/gitlab-org/gitaly-proto/go"
"gitlab.com/gitlab-org/gitaly/auth"
gitalyclient
"gitlab.com/gitlab-org/gitaly/client"
...
...
@@ -97,6 +98,8 @@ func CloseConnections() {
func
newConnection
(
server
Server
)
(
*
grpc
.
ClientConn
,
error
)
{
connOpts
:=
append
(
gitalyclient
.
DefaultDialOpts
,
grpc
.
WithPerRPCCredentials
(
gitalyauth
.
RPCCredentials
(
server
.
Token
)),
grpc
.
WithStreamInterceptor
(
grpc_prometheus
.
StreamClientInterceptor
),
grpc
.
WithUnaryInterceptor
(
grpc_prometheus
.
UnaryClientInterceptor
),
)
return
gitalyclient
.
Dial
(
server
.
Address
,
connOpts
)
...
...
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/LICENSE
0 → 100644
View file @
99a43bf6
This diff is collapsed.
Click to expand it.
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/README.md
0 → 100644
View file @
99a43bf6
This diff is collapsed.
Click to expand it.
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client.go
0 → 100644
View file @
99a43bf6
// Copyright 2016 Michal Witkowski. All Rights Reserved.
// See LICENSE for licensing terms.
// gRPC Prometheus monitoring interceptors for client-side gRPC.
package
grpc_prometheus
import
(
prom
"github.com/prometheus/client_golang/prometheus"
)
var
(
// DefaultClientMetrics is the default instance of ClientMetrics. It is
// intended to be used in conjunction the default Prometheus metrics
// registry.
DefaultClientMetrics
=
NewClientMetrics
()
// UnaryClientInterceptor is a gRPC client-side interceptor that provides Prometheus monitoring for Unary RPCs.
UnaryClientInterceptor
=
DefaultClientMetrics
.
UnaryClientInterceptor
()
// StreamClientInterceptor is a gRPC client-side interceptor that provides Prometheus monitoring for Streaming RPCs.
StreamClientInterceptor
=
DefaultClientMetrics
.
StreamClientInterceptor
()
)
func
init
()
{
prom
.
MustRegister
(
DefaultClientMetrics
.
clientStartedCounter
)
prom
.
MustRegister
(
DefaultClientMetrics
.
clientHandledCounter
)
prom
.
MustRegister
(
DefaultClientMetrics
.
clientStreamMsgReceived
)
prom
.
MustRegister
(
DefaultClientMetrics
.
clientStreamMsgSent
)
}
// EnableClientHandlingTimeHistogram turns on recording of handling time of
// RPCs. Histogram metrics can be very expensive for Prometheus to retain and
// query. This function acts on the DefaultClientMetrics variable and the
// default Prometheus metrics registry.
func
EnableClientHandlingTimeHistogram
(
opts
...
HistogramOption
)
{
DefaultClientMetrics
.
EnableClientHandlingTimeHistogram
(
opts
...
)
prom
.
Register
(
DefaultClientMetrics
.
clientHandledHistogram
)
}
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client_metrics.go
0 → 100644
View file @
99a43bf6
package
grpc_prometheus
import
(
"io"
prom
"github.com/prometheus/client_golang/prometheus"
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
)
// ClientMetrics represents a collection of metrics to be registered on a
// Prometheus metrics registry for a gRPC client.
type
ClientMetrics
struct
{
clientStartedCounter
*
prom
.
CounterVec
clientHandledCounter
*
prom
.
CounterVec
clientStreamMsgReceived
*
prom
.
CounterVec
clientStreamMsgSent
*
prom
.
CounterVec
clientHandledHistogramEnabled
bool
clientHandledHistogramOpts
prom
.
HistogramOpts
clientHandledHistogram
*
prom
.
HistogramVec
}
// NewClientMetrics returns a ClientMetrics object. Use a new instance of
// ClientMetrics when not using the default Prometheus metrics registry, for
// example when wanting to control which metrics are added to a registry as
// opposed to automatically adding metrics via init functions.
func
NewClientMetrics
()
*
ClientMetrics
{
return
&
ClientMetrics
{
clientStartedCounter
:
prom
.
NewCounterVec
(
prom
.
CounterOpts
{
Name
:
"grpc_client_started_total"
,
Help
:
"Total number of RPCs started on the client."
,
},
[]
string
{
"grpc_type"
,
"grpc_service"
,
"grpc_method"
}),
clientHandledCounter
:
prom
.
NewCounterVec
(
prom
.
CounterOpts
{
Name
:
"grpc_client_handled_total"
,
Help
:
"Total number of RPCs completed by the client, regardless of success or failure."
,
},
[]
string
{
"grpc_type"
,
"grpc_service"
,
"grpc_method"
,
"grpc_code"
}),
clientStreamMsgReceived
:
prom
.
NewCounterVec
(
prom
.
CounterOpts
{
Name
:
"grpc_client_msg_received_total"
,
Help
:
"Total number of RPC stream messages received by the client."
,
},
[]
string
{
"grpc_type"
,
"grpc_service"
,
"grpc_method"
}),
clientStreamMsgSent
:
prom
.
NewCounterVec
(
prom
.
CounterOpts
{
Name
:
"grpc_client_msg_sent_total"
,
Help
:
"Total number of gRPC stream messages sent by the client."
,
},
[]
string
{
"grpc_type"
,
"grpc_service"
,
"grpc_method"
}),
clientHandledHistogramEnabled
:
false
,
clientHandledHistogramOpts
:
prom
.
HistogramOpts
{
Name
:
"grpc_client_handling_seconds"
,
Help
:
"Histogram of response latency (seconds) of the gRPC until it is finished by the application."
,
Buckets
:
prom
.
DefBuckets
,
},
clientHandledHistogram
:
nil
,
}
}
// Describe sends the super-set of all possible descriptors of metrics
// collected by this Collector to the provided channel and returns once
// the last descriptor has been sent.
func
(
m
*
ClientMetrics
)
Describe
(
ch
chan
<-
*
prom
.
Desc
)
{
m
.
clientStartedCounter
.
Describe
(
ch
)
m
.
clientHandledCounter
.
Describe
(
ch
)
m
.
clientStreamMsgReceived
.
Describe
(
ch
)
m
.
clientStreamMsgSent
.
Describe
(
ch
)
if
m
.
clientHandledHistogramEnabled
{
m
.
clientHandledHistogram
.
Describe
(
ch
)
}
}
// Collect is called by the Prometheus registry when collecting
// metrics. The implementation sends each collected metric via the
// provided channel and returns once the last metric has been sent.
func
(
m
*
ClientMetrics
)
Collect
(
ch
chan
<-
prom
.
Metric
)
{
m
.
clientStartedCounter
.
Collect
(
ch
)
m
.
clientHandledCounter
.
Collect
(
ch
)
m
.
clientStreamMsgReceived
.
Collect
(
ch
)
m
.
clientStreamMsgSent
.
Collect
(
ch
)
if
m
.
clientHandledHistogramEnabled
{
m
.
clientHandledHistogram
.
Collect
(
ch
)
}
}
// EnableClientHandlingTimeHistogram turns on recording of handling time of RPCs.
// Histogram metrics can be very expensive for Prometheus to retain and query.
func
(
m
*
ClientMetrics
)
EnableClientHandlingTimeHistogram
(
opts
...
HistogramOption
)
{
for
_
,
o
:=
range
opts
{
o
(
&
m
.
clientHandledHistogramOpts
)
}
if
!
m
.
clientHandledHistogramEnabled
{
m
.
clientHandledHistogram
=
prom
.
NewHistogramVec
(
m
.
clientHandledHistogramOpts
,
[]
string
{
"grpc_type"
,
"grpc_service"
,
"grpc_method"
},
)
}
m
.
clientHandledHistogramEnabled
=
true
}
// UnaryClientInterceptor is a gRPC client-side interceptor that provides Prometheus monitoring for Unary RPCs.
func
(
m
*
ClientMetrics
)
UnaryClientInterceptor
()
func
(
ctx
context
.
Context
,
method
string
,
req
,
reply
interface
{},
cc
*
grpc
.
ClientConn
,
invoker
grpc
.
UnaryInvoker
,
opts
...
grpc
.
CallOption
)
error
{
return
func
(
ctx
context
.
Context
,
method
string
,
req
,
reply
interface
{},
cc
*
grpc
.
ClientConn
,
invoker
grpc
.
UnaryInvoker
,
opts
...
grpc
.
CallOption
)
error
{
monitor
:=
newClientReporter
(
m
,
Unary
,
method
)
monitor
.
SentMessage
()
err
:=
invoker
(
ctx
,
method
,
req
,
reply
,
cc
,
opts
...
)
if
err
!=
nil
{
monitor
.
ReceivedMessage
()
}
monitor
.
Handled
(
grpc
.
Code
(
err
))
return
err
}
}
// StreamServerInterceptor is a gRPC client-side interceptor that provides Prometheus monitoring for Streaming RPCs.
func
(
m
*
ClientMetrics
)
StreamClientInterceptor
()
func
(
ctx
context
.
Context
,
desc
*
grpc
.
StreamDesc
,
cc
*
grpc
.
ClientConn
,
method
string
,
streamer
grpc
.
Streamer
,
opts
...
grpc
.
CallOption
)
(
grpc
.
ClientStream
,
error
)
{
return
func
(
ctx
context
.
Context
,
desc
*
grpc
.
StreamDesc
,
cc
*
grpc
.
ClientConn
,
method
string
,
streamer
grpc
.
Streamer
,
opts
...
grpc
.
CallOption
)
(
grpc
.
ClientStream
,
error
)
{
monitor
:=
newClientReporter
(
m
,
clientStreamType
(
desc
),
method
)
clientStream
,
err
:=
streamer
(
ctx
,
desc
,
cc
,
method
,
opts
...
)
if
err
!=
nil
{
monitor
.
Handled
(
grpc
.
Code
(
err
))
return
nil
,
err
}
return
&
monitoredClientStream
{
clientStream
,
monitor
},
nil
}
}
func
clientStreamType
(
desc
*
grpc
.
StreamDesc
)
grpcType
{
if
desc
.
ClientStreams
&&
!
desc
.
ServerStreams
{
return
ClientStream
}
else
if
!
desc
.
ClientStreams
&&
desc
.
ServerStreams
{
return
ServerStream
}
return
BidiStream
}
// monitoredClientStream wraps grpc.ClientStream allowing each Sent/Recv of message to increment counters.
type
monitoredClientStream
struct
{
grpc
.
ClientStream
monitor
*
clientReporter
}
func
(
s
*
monitoredClientStream
)
SendMsg
(
m
interface
{})
error
{
err
:=
s
.
ClientStream
.
SendMsg
(
m
)
if
err
==
nil
{
s
.
monitor
.
SentMessage
()
}
return
err
}
func
(
s
*
monitoredClientStream
)
RecvMsg
(
m
interface
{})
error
{
err
:=
s
.
ClientStream
.
RecvMsg
(
m
)
if
err
==
nil
{
s
.
monitor
.
ReceivedMessage
()
}
else
if
err
==
io
.
EOF
{
s
.
monitor
.
Handled
(
codes
.
OK
)
}
else
{
s
.
monitor
.
Handled
(
grpc
.
Code
(
err
))
}
return
err
}
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client_reporter.go
0 → 100644
View file @
99a43bf6
// Copyright 2016 Michal Witkowski. All Rights Reserved.
// See LICENSE for licensing terms.
package
grpc_prometheus
import
(
"time"
"google.golang.org/grpc/codes"
)
type
clientReporter
struct
{
metrics
*
ClientMetrics
rpcType
grpcType
serviceName
string
methodName
string
startTime
time
.
Time
}
func
newClientReporter
(
m
*
ClientMetrics
,
rpcType
grpcType
,
fullMethod
string
)
*
clientReporter
{
r
:=
&
clientReporter
{
metrics
:
m
,
rpcType
:
rpcType
,
}
if
r
.
metrics
.
clientHandledHistogramEnabled
{
r
.
startTime
=
time
.
Now
()
}
r
.
serviceName
,
r
.
methodName
=
splitMethodName
(
fullMethod
)
r
.
metrics
.
clientStartedCounter
.
WithLabelValues
(
string
(
r
.
rpcType
),
r
.
serviceName
,
r
.
methodName
)
.
Inc
()
return
r
}
func
(
r
*
clientReporter
)
ReceivedMessage
()
{
r
.
metrics
.
clientStreamMsgReceived
.
WithLabelValues
(
string
(
r
.
rpcType
),
r
.
serviceName
,
r
.
methodName
)
.
Inc
()
}
func
(
r
*
clientReporter
)
SentMessage
()
{
r
.
metrics
.
clientStreamMsgSent
.
WithLabelValues
(
string
(
r
.
rpcType
),
r
.
serviceName
,
r
.
methodName
)
.
Inc
()
}
func
(
r
*
clientReporter
)
Handled
(
code
codes
.
Code
)
{
r
.
metrics
.
clientHandledCounter
.
WithLabelValues
(
string
(
r
.
rpcType
),
r
.
serviceName
,
r
.
methodName
,
code
.
String
())
.
Inc
()
if
r
.
metrics
.
clientHandledHistogramEnabled
{
r
.
metrics
.
clientHandledHistogram
.
WithLabelValues
(
string
(
r
.
rpcType
),
r
.
serviceName
,
r
.
methodName
)
.
Observe
(
time
.
Since
(
r
.
startTime
)
.
Seconds
())
}
}
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server.go
0 → 100644
View file @
99a43bf6
// Copyright 2016 Michal Witkowski. All Rights Reserved.
// See LICENSE for licensing terms.
// gRPC Prometheus monitoring interceptors for server-side gRPC.
package
grpc_prometheus
import
(
prom
"github.com/prometheus/client_golang/prometheus"
"google.golang.org/grpc"
)
var
(
// DefaultServerMetrics is the default instance of ServerMetrics. It is
// intended to be used in conjunction the default Prometheus metrics
// registry.
DefaultServerMetrics
=
NewServerMetrics
()
// UnaryServerInterceptor is a gRPC server-side interceptor that provides Prometheus monitoring for Unary RPCs.
UnaryServerInterceptor
=
DefaultServerMetrics
.
UnaryServerInterceptor
()
// StreamServerInterceptor is a gRPC server-side interceptor that provides Prometheus monitoring for Streaming RPCs.
StreamServerInterceptor
=
DefaultServerMetrics
.
StreamServerInterceptor
()
)
func
init
()
{
prom
.
MustRegister
(
DefaultServerMetrics
.
serverStartedCounter
)
prom
.
MustRegister
(
DefaultServerMetrics
.
serverHandledCounter
)
prom
.
MustRegister
(
DefaultServerMetrics
.
serverStreamMsgReceived
)
prom
.
MustRegister
(
DefaultServerMetrics
.
serverStreamMsgSent
)
}
// Register takes a gRPC server and pre-initializes all counters to 0. This
// allows for easier monitoring in Prometheus (no missing metrics), and should
// be called *after* all services have been registered with the server. This
// function acts on the DefaultServerMetrics variable.
func
Register
(
server
*
grpc
.
Server
)
{
DefaultServerMetrics
.
InitializeMetrics
(
server
)
}
// EnableHandlingTimeHistogram turns on recording of handling time
// of RPCs. Histogram metrics can be very expensive for Prometheus
// to retain and query. This function acts on the DefaultServerMetrics
// variable and the default Prometheus metrics registry.
func
EnableHandlingTimeHistogram
(
opts
...
HistogramOption
)
{
DefaultServerMetrics
.
EnableHandlingTimeHistogram
(
opts
...
)
prom
.
Register
(
DefaultServerMetrics
.
serverHandledHistogram
)
}
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server_metrics.go
0 → 100644
View file @
99a43bf6
package
grpc_prometheus
import
(
prom
"github.com/prometheus/client_golang/prometheus"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
// ServerMetrics represents a collection of metrics to be registered on a
// Prometheus metrics registry for a gRPC server.
type
ServerMetrics
struct
{
serverStartedCounter
*
prom
.
CounterVec
serverHandledCounter
*
prom
.
CounterVec
serverStreamMsgReceived
*
prom
.
CounterVec
serverStreamMsgSent
*
prom
.
CounterVec
serverHandledHistogramEnabled
bool
serverHandledHistogramOpts
prom
.
HistogramOpts
serverHandledHistogram
*
prom
.
HistogramVec
}
// NewServerMetrics returns a ServerMetrics object. Use a new instance of
// ServerMetrics when not using the default Prometheus metrics registry, for
// example when wanting to control which metrics are added to a registry as
// opposed to automatically adding metrics via init functions.
func
NewServerMetrics
()
*
ServerMetrics
{
return
&
ServerMetrics
{
serverStartedCounter
:
prom
.
NewCounterVec
(
prom
.
CounterOpts
{
Name
:
"grpc_server_started_total"
,
Help
:
"Total number of RPCs started on the server."
,
},
[]
string
{
"grpc_type"
,
"grpc_service"
,
"grpc_method"
}),
serverHandledCounter
:
prom
.
NewCounterVec
(
prom
.
CounterOpts
{
Name
:
"grpc_server_handled_total"
,
Help
:
"Total number of RPCs completed on the server, regardless of success or failure."
,
},
[]
string
{
"grpc_type"
,
"grpc_service"
,
"grpc_method"
,
"grpc_code"
}),
serverStreamMsgReceived
:
prom
.
NewCounterVec
(
prom
.
CounterOpts
{
Name
:
"grpc_server_msg_received_total"
,
Help
:
"Total number of RPC stream messages received on the server."
,
},
[]
string
{
"grpc_type"
,
"grpc_service"
,
"grpc_method"
}),
serverStreamMsgSent
:
prom
.
NewCounterVec
(
prom
.
CounterOpts
{
Name
:
"grpc_server_msg_sent_total"
,
Help
:
"Total number of gRPC stream messages sent by the server."
,
},
[]
string
{
"grpc_type"
,
"grpc_service"
,
"grpc_method"
}),
serverHandledHistogramEnabled
:
false
,
serverHandledHistogramOpts
:
prom
.
HistogramOpts
{
Name
:
"grpc_server_handling_seconds"
,
Help
:
"Histogram of response latency (seconds) of gRPC that had been application-level handled by the server."
,
Buckets
:
prom
.
DefBuckets
,
},
serverHandledHistogram
:
nil
,
}
}
type
HistogramOption
func
(
*
prom
.
HistogramOpts
)
// WithHistogramBuckets allows you to specify custom bucket ranges for histograms if EnableHandlingTimeHistogram is on.
func
WithHistogramBuckets
(
buckets
[]
float64
)
HistogramOption
{
return
func
(
o
*
prom
.
HistogramOpts
)
{
o
.
Buckets
=
buckets
}
}
// EnableHandlingTimeHistogram enables histograms being registered when
// registering the ServerMetrics on a Prometheus registry. Histograms can be
// expensive on Prometheus servers. It takes options to configure histogram
// options such as the defined buckets.
func
(
m
*
ServerMetrics
)
EnableHandlingTimeHistogram
(
opts
...
HistogramOption
)
{
for
_
,
o
:=
range
opts
{
o
(
&
m
.
serverHandledHistogramOpts
)
}
if
!
m
.
serverHandledHistogramEnabled
{
m
.
serverHandledHistogram
=
prom
.
NewHistogramVec
(
m
.
serverHandledHistogramOpts
,
[]
string
{
"grpc_type"
,
"grpc_service"
,
"grpc_method"
},
)
}
m
.
serverHandledHistogramEnabled
=
true
}
// Describe sends the super-set of all possible descriptors of metrics
// collected by this Collector to the provided channel and returns once
// the last descriptor has been sent.
func
(
m
*
ServerMetrics
)
Describe
(
ch
chan
<-
*
prom
.
Desc
)
{
m
.
serverStartedCounter
.
Describe
(
ch
)
m
.
serverHandledCounter
.
Describe
(
ch
)
m
.
serverStreamMsgReceived
.
Describe
(
ch
)
m
.
serverStreamMsgSent
.
Describe
(
ch
)
if
m
.
serverHandledHistogramEnabled
{
m
.
serverHandledHistogram
.
Describe
(
ch
)
}
}
// Collect is called by the Prometheus registry when collecting
// metrics. The implementation sends each collected metric via the
// provided channel and returns once the last metric has been sent.
func
(
m
*
ServerMetrics
)
Collect
(
ch
chan
<-
prom
.
Metric
)
{
m
.
serverStartedCounter
.
Collect
(
ch
)
m
.
serverHandledCounter
.
Collect
(
ch
)
m
.
serverStreamMsgReceived
.
Collect
(
ch
)
m
.
serverStreamMsgSent
.
Collect
(
ch
)
if
m
.
serverHandledHistogramEnabled
{
m
.
serverHandledHistogram
.
Collect
(
ch
)
}
}
// UnaryServerInterceptor is a gRPC server-side interceptor that provides Prometheus monitoring for Unary RPCs.
func
(
m
*
ServerMetrics
)
UnaryServerInterceptor
()
func
(
ctx
context
.
Context
,
req
interface
{},
info
*
grpc
.
UnaryServerInfo
,
handler
grpc
.
UnaryHandler
)
(
interface
{},
error
)
{
return
func
(
ctx
context
.
Context
,
req
interface
{},
info
*
grpc
.
UnaryServerInfo
,
handler
grpc
.
UnaryHandler
)
(
interface
{},
error
)
{
monitor
:=
newServerReporter
(
m
,
Unary
,
info
.
FullMethod
)
monitor
.
ReceivedMessage
()
resp
,
err
:=
handler
(
ctx
,
req
)
monitor
.
Handled
(
grpc
.
Code
(
err
))
if
err
==
nil
{
monitor
.
SentMessage
()
}
return
resp
,
err
}
}
// StreamServerInterceptor is a gRPC server-side interceptor that provides Prometheus monitoring for Streaming RPCs.
func
(
m
*
ServerMetrics
)
StreamServerInterceptor
()
func
(
srv
interface
{},
ss
grpc
.
ServerStream
,
info
*
grpc
.
StreamServerInfo
,
handler
grpc
.
StreamHandler
)
error
{
return
func
(
srv
interface
{},
ss
grpc
.
ServerStream
,
info
*
grpc
.
StreamServerInfo
,
handler
grpc
.
StreamHandler
)
error
{
monitor
:=
newServerReporter
(
m
,
streamRpcType
(
info
),
info
.
FullMethod
)
err
:=
handler
(
srv
,
&
monitoredServerStream
{
ss
,
monitor
})
monitor
.
Handled
(
grpc
.
Code
(
err
))
return
err
}
}
// InitializeMetrics initializes all metrics, with their appropriate null
// value, for all gRPC methods registered on a gRPC server. This is useful, to
// ensure that all metrics exist when collecting and querying.
func
(
m
*
ServerMetrics
)
InitializeMetrics
(
server
*
grpc
.
Server
)
{
serviceInfo
:=
server
.
GetServiceInfo
()
for
serviceName
,
info
:=
range
serviceInfo
{
for
_
,
mInfo
:=
range
info
.
Methods
{
preRegisterMethod
(
m
,
serviceName
,
&
mInfo
)
}
}
}
// Register registers all server metrics in a given metrics registry. Depending
// on histogram options and whether they are enabled, histogram metrics are
// also registered.
//
// Deprecated: ServerMetrics implements Prometheus Collector interface. You can
// register an instance of ServerMetrics directly by using
// prometheus.Register(m).
func
(
m
*
ServerMetrics
)
Register
(
r
prom
.
Registerer
)
error
{
return
r
.
Register
(
m
)
}
// MustRegister tries to register all server metrics and panics on an error.
//
// Deprecated: ServerMetrics implements Prometheus Collector interface. You can
// register an instance of ServerMetrics directly by using
// prometheus.MustRegister(m).
func
(
m
*
ServerMetrics
)
MustRegister
(
r
prom
.
Registerer
)
{
r
.
MustRegister
(
m
)
}
func
streamRpcType
(
info
*
grpc
.
StreamServerInfo
)
grpcType
{
if
info
.
IsClientStream
&&
!
info
.
IsServerStream
{
return
ClientStream
}
else
if
!
info
.
IsClientStream
&&
info
.
IsServerStream
{
return
ServerStream
}
return
BidiStream
}
// monitoredStream wraps grpc.ServerStream allowing each Sent/Recv of message to increment counters.
type
monitoredServerStream
struct
{
grpc
.
ServerStream
monitor
*
serverReporter
}
func
(
s
*
monitoredServerStream
)
SendMsg
(
m
interface
{})
error
{
err
:=
s
.
ServerStream
.
SendMsg
(
m
)
if
err
==
nil
{
s
.
monitor
.
SentMessage
()
}
return
err
}
func
(
s
*
monitoredServerStream
)
RecvMsg
(
m
interface
{})
error
{
err
:=
s
.
ServerStream
.
RecvMsg
(
m
)
if
err
==
nil
{
s
.
monitor
.
ReceivedMessage
()
}
return
err
}
// preRegisterMethod is invoked on Register of a Server, allowing all gRPC services labels to be pre-populated.
func
preRegisterMethod
(
metrics
*
ServerMetrics
,
serviceName
string
,
mInfo
*
grpc
.
MethodInfo
)
{
methodName
:=
mInfo
.
Name
methodType
:=
string
(
typeFromMethodInfo
(
mInfo
))
// These are just references (no increments), as just referencing will create the labels but not set values.
metrics
.
serverStartedCounter
.
GetMetricWithLabelValues
(
methodType
,
serviceName
,
methodName
)
metrics
.
serverStreamMsgReceived
.
GetMetricWithLabelValues
(
methodType
,
serviceName
,
methodName
)
metrics
.
serverStreamMsgSent
.
GetMetricWithLabelValues
(
methodType
,
serviceName
,
methodName
)
if
metrics
.
serverHandledHistogramEnabled
{
metrics
.
serverHandledHistogram
.
GetMetricWithLabelValues
(
methodType
,
serviceName
,
methodName
)
}
for
_
,
code
:=
range
allCodes
{
metrics
.
serverHandledCounter
.
GetMetricWithLabelValues
(
methodType
,
serviceName
,
methodName
,
code
.
String
())
}
}
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server_reporter.go
0 → 100644
View file @
99a43bf6
// Copyright 2016 Michal Witkowski. All Rights Reserved.
// See LICENSE for licensing terms.
package
grpc_prometheus
import
(
"time"
"google.golang.org/grpc/codes"
)
type
serverReporter
struct
{
metrics
*
ServerMetrics
rpcType
grpcType
serviceName
string
methodName
string
startTime
time
.
Time
}
func
newServerReporter
(
m
*
ServerMetrics
,
rpcType
grpcType
,
fullMethod
string
)
*
serverReporter
{
r
:=
&
serverReporter
{
metrics
:
m
,
rpcType
:
rpcType
,
}
if
r
.
metrics
.
serverHandledHistogramEnabled
{
r
.
startTime
=
time
.
Now
()
}
r
.
serviceName
,
r
.
methodName
=
splitMethodName
(
fullMethod
)
r
.
metrics
.
serverStartedCounter
.
WithLabelValues
(
string
(
r
.
rpcType
),
r
.
serviceName
,
r
.
methodName
)
.
Inc
()
return
r
}
func
(
r
*
serverReporter
)
ReceivedMessage
()
{
r
.
metrics
.
serverStreamMsgReceived
.
WithLabelValues
(
string
(
r
.
rpcType
),
r
.
serviceName
,
r
.
methodName
)
.
Inc
()
}
func
(
r
*
serverReporter
)
SentMessage
()
{
r
.
metrics
.
serverStreamMsgSent
.
WithLabelValues
(
string
(
r
.
rpcType
),
r
.
serviceName
,
r
.
methodName
)
.
Inc
()
}
func
(
r
*
serverReporter
)
Handled
(
code
codes
.
Code
)
{
r
.
metrics
.
serverHandledCounter
.
WithLabelValues
(
string
(
r
.
rpcType
),
r
.
serviceName
,
r
.
methodName
,
code
.
String
())
.
Inc
()
if
r
.
metrics
.
serverHandledHistogramEnabled
{
r
.
metrics
.
serverHandledHistogram
.
WithLabelValues
(
string
(
r
.
rpcType
),
r
.
serviceName
,
r
.
methodName
)
.
Observe
(
time
.
Since
(
r
.
startTime
)
.
Seconds
())
}
}
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/test_all.sh
0 → 100755
View file @
99a43bf6
#!/usr/bin/env bash
set
-e
echo
""
>
coverage.txt
for
d
in
$(
go list ./... |
grep
-v
vendor
)
;
do
echo
-e
"TESTS FOR: for
\0
33[0;35m
${
d
}
\0
33[0m"
go
test
-race
-v
-coverprofile
=
profile.coverage.out
-covermode
=
atomic
$d
if
[
-f
profile.coverage.out
]
;
then
cat
profile.coverage.out
>>
coverage.txt
rm
profile.coverage.out
fi
echo
""
done
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/util.go
0 → 100644
View file @
99a43bf6
// Copyright 2016 Michal Witkowski. All Rights Reserved.
// See LICENSE for licensing terms.
package
grpc_prometheus
import
(
"strings"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
)
type
grpcType
string
const
(
Unary
grpcType
=
"unary"
ClientStream
grpcType
=
"client_stream"
ServerStream
grpcType
=
"server_stream"
BidiStream
grpcType
=
"bidi_stream"
)
var
(
allCodes
=
[]
codes
.
Code
{
codes
.
OK
,
codes
.
Canceled
,
codes
.
Unknown
,
codes
.
InvalidArgument
,
codes
.
DeadlineExceeded
,
codes
.
NotFound
,
codes
.
AlreadyExists
,
codes
.
PermissionDenied
,
codes
.
Unauthenticated
,
codes
.
ResourceExhausted
,
codes
.
FailedPrecondition
,
codes
.
Aborted
,
codes
.
OutOfRange
,
codes
.
Unimplemented
,
codes
.
Internal
,
codes
.
Unavailable
,
codes
.
DataLoss
,
}
)
func
splitMethodName
(
fullMethodName
string
)
(
string
,
string
)
{
fullMethodName
=
strings
.
TrimPrefix
(
fullMethodName
,
"/"
)
// remove leading slash
if
i
:=
strings
.
Index
(
fullMethodName
,
"/"
);
i
>=
0
{
return
fullMethodName
[
:
i
],
fullMethodName
[
i
+
1
:
]
}
return
"unknown"
,
"unknown"
}
func
typeFromMethodInfo
(
mInfo
*
grpc
.
MethodInfo
)
grpcType
{
if
mInfo
.
IsClientStream
==
false
&&
mInfo
.
IsServerStream
==
false
{
return
Unary
}
if
mInfo
.
IsClientStream
==
true
&&
mInfo
.
IsServerStream
==
false
{
return
ClientStream
}
if
mInfo
.
IsClientStream
==
false
&&
mInfo
.
IsServerStream
==
true
{
return
ServerStream
}
return
BidiStream
}
vendor/vendor.json
View file @
99a43bf6
...
...
@@ -90,6 +90,12 @@
"path"
:
"github.com/gorilla/websocket"
,
"revision"
:
"e8f0f8aaa98dfb6586cbdf2978d511e3199a960a"
},
{
"checksumSHA1"
:
"s7J8PdKJFnoBFg6MowXLTvix7ug="
,
"path"
:
"github.com/grpc-ecosystem/go-grpc-prometheus"
,
"revision"
:
"0dafe0d496ea71181bf2dd039e7e3f44b6bd11a7"
,
"revisionTime"
:
"2017-08-26T09:06:48Z"
},
{
"checksumSHA1"
:
"6TbprMZzwDk+SaW+JxdxvnauyDk="
,
"path"
:
"github.com/jfbus/httprs"
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment