diff options
author | Wolfy-J <[email protected]> | 2019-06-25 17:38:29 +0300 |
---|---|---|
committer | Wolfy-J <[email protected]> | 2019-06-25 17:38:29 +0300 |
commit | c8459e1e5933f8bf5bc25635ce13724d492e5ebe (patch) | |
tree | 56c5807d9e3b426835b4e6dea21ee976e3c13050 /cmd | |
parent | e19c5d46dcb866c8f0d91779c95a2340a217ee55 (diff) |
prometheus
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/rr/http/metrics.go | 86 | ||||
-rw-r--r-- | cmd/rr/main.go | 4 |
2 files changed, 89 insertions, 1 deletions
diff --git a/cmd/rr/http/metrics.go b/cmd/rr/http/metrics.go new file mode 100644 index 00000000..f9d3c079 --- /dev/null +++ b/cmd/rr/http/metrics.go @@ -0,0 +1,86 @@ +package http + +import ( + "github.com/prometheus/client_golang/prometheus" + "github.com/spf13/cobra" + rr "github.com/spiral/roadrunner/cmd/rr/cmd" + rrhttp "github.com/spiral/roadrunner/service/http" + "github.com/spiral/roadrunner/service/metrics" + "strconv" +) + +func init() { + cobra.OnInitialize(func() { + svc, _ := rr.Container.Get(metrics.ID) + mtr, ok := svc.(*metrics.Service) + if !ok || !mtr.Enabled() { + return + } + + ht, _ := rr.Container.Get(rrhttp.ID) + if ht, ok := ht.(*rrhttp.Service); ok { + collector := newCollector() + + // register metrics + mtr.MustRegister(collector.requestCounter) + mtr.MustRegister(collector.requestDuration) + + // collect events + ht.AddListener(collector.listener) + } + }) +} + +// listener provide debug callback for system events. With colors! +type metricCollector struct { + requestCounter *prometheus.CounterVec + requestDuration *prometheus.HistogramVec +} + +func newCollector() *metricCollector { + return &metricCollector{ + requestCounter: prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "rr_http_total", + Help: "Total number of handled http requests after server restart.", + }, + []string{"status"}, + ), + requestDuration: prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Name: "rr_http_request_duration", + Help: "HTTP request duration.", + Buckets: []float64{0.25, 0.5, 1, 10, 20, 60}, + }, + []string{"status"}, + ), + } +} + +// listener listens to http events and generates nice looking output. +func (c *metricCollector) listener(event int, ctx interface{}) { + // http events + switch event { + case rrhttp.EventResponse: + e := ctx.(*rrhttp.ResponseEvent) + + c.requestCounter.With(prometheus.Labels{ + "status": strconv.Itoa(e.Response.Status), + }).Inc() + + c.requestDuration.With(prometheus.Labels{ + "status": strconv.Itoa(e.Response.Status), + }).Observe(e.Elapsed().Seconds()) + + case rrhttp.EventError: + e := ctx.(*rrhttp.ErrorEvent) + + c.requestCounter.With(prometheus.Labels{ + "status": "500", + }).Inc() + + c.requestDuration.With(prometheus.Labels{ + "status": "500", + }).Observe(e.Elapsed().Seconds()) + } +} diff --git a/cmd/rr/main.go b/cmd/rr/main.go index 6f325fb4..6fb10ba6 100644 --- a/cmd/rr/main.go +++ b/cmd/rr/main.go @@ -24,12 +24,13 @@ package main import ( rr "github.com/spiral/roadrunner/cmd/rr/cmd" - "github.com/spiral/roadrunner/service/headers" // services (plugins) "github.com/spiral/roadrunner/service/env" + "github.com/spiral/roadrunner/service/headers" "github.com/spiral/roadrunner/service/http" "github.com/spiral/roadrunner/service/limit" + "github.com/spiral/roadrunner/service/metrics" "github.com/spiral/roadrunner/service/rpc" "github.com/spiral/roadrunner/service/static" @@ -42,6 +43,7 @@ func main() { rr.Container.Register(env.ID, &env.Service{}) rr.Container.Register(rpc.ID, &rpc.Service{}) rr.Container.Register(http.ID, &http.Service{}) + rr.Container.Register(metrics.ID, &metrics.Service{}) rr.Container.Register(headers.ID, &headers.Service{}) rr.Container.Register(static.ID, &static.Service{}) rr.Container.Register(limit.ID, &limit.Service{}) |