summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorWolfy-J <[email protected]>2019-06-25 17:38:29 +0300
committerWolfy-J <[email protected]>2019-06-25 17:38:29 +0300
commitc8459e1e5933f8bf5bc25635ce13724d492e5ebe (patch)
tree56c5807d9e3b426835b4e6dea21ee976e3c13050 /cmd
parente19c5d46dcb866c8f0d91779c95a2340a217ee55 (diff)
prometheus
Diffstat (limited to 'cmd')
-rw-r--r--cmd/rr/http/metrics.go86
-rw-r--r--cmd/rr/main.go4
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{})