geziyor/metrics/metrics.go
2019-07-08 14:51:54 +03:00

109 lines
3.4 KiB
Go

package metrics
import (
"github.com/go-kit/kit/metrics"
"github.com/go-kit/kit/metrics/discard"
"github.com/go-kit/kit/metrics/expvar"
"github.com/go-kit/kit/metrics/prometheus"
stdprometheus "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"net/http"
)
// Type represents metrics Types
type Type int
const (
// Discard discards any metrics.
Discard Type = iota
// Prometheus starts server at :2112 and exports metrics data to /metrics
Prometheus
// ExpVar uses built-in expvar package
ExpVar
)
// Metrics type stores metrics
type Metrics struct {
RequestCounter metrics.Counter
ResponseCounter metrics.Counter
PanicCounter metrics.Counter
RobotsTxtRequestCounter metrics.Counter
RobotsTxtResponseCounter metrics.Counter
RobotsTxtForbiddenCounter metrics.Counter
}
// NewMetrics creates new metrics with given metrics.Type
func NewMetrics(metricsType Type) *Metrics {
switch metricsType {
case Discard:
return &Metrics{
RequestCounter: discard.NewCounter(),
ResponseCounter: discard.NewCounter(),
PanicCounter: discard.NewCounter(),
RobotsTxtRequestCounter: discard.NewCounter(),
RobotsTxtResponseCounter: discard.NewCounter(),
RobotsTxtForbiddenCounter: discard.NewCounter(),
}
case ExpVar:
return &Metrics{
RequestCounter: expvar.NewCounter("request_count"),
ResponseCounter: expvar.NewCounter("response_count"),
PanicCounter: expvar.NewCounter("panic_count"),
RobotsTxtRequestCounter: expvar.NewCounter("robotstxt_request_count"),
RobotsTxtResponseCounter: expvar.NewCounter("robotstxt_response_count"),
RobotsTxtForbiddenCounter: expvar.NewCounter("robotstxt_forbidden_count"),
}
case Prometheus:
return &Metrics{
RequestCounter: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "geziyor",
Name: "request_count",
Help: "Request count",
}, []string{"method"}),
ResponseCounter: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "geziyor",
Name: "response_count",
Help: "Response count",
}, []string{"status"}),
PanicCounter: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "geziyor",
Name: "panic_count",
Help: "Panic count",
}, []string{}),
RobotsTxtRequestCounter: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "geziyor",
Name: "robotstxt_request_count",
Help: "Robotstxt request count",
}, []string{}),
RobotsTxtResponseCounter: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "geziyor",
Name: "robotstxt_response_count",
Help: "Robotstxt response count",
}, []string{"status"}),
RobotsTxtForbiddenCounter: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "geziyor",
Name: "robotstxt_forbidden_count",
Help: "Robotstxt forbidden count",
}, []string{"method"}),
}
default:
return nil
}
}
// StartMetricsServer starts server that handles metrics
// Prometheus: http://localhost:2112/metrics
// Expvar : http://localhost:2112/debug/vars
func StartMetricsServer(metricsType Type) *http.Server {
if metricsType == Prometheus {
http.Handle("/metrics", promhttp.Handler())
}
server := &http.Server{Addr: ":2112"}
go func() {
server.ListenAndServe()
}()
return server
}