2020-02-23 22:50:17 +01:00
|
|
|
package resolver
|
|
|
|
|
|
|
|
import (
|
|
|
|
"blocky/config"
|
|
|
|
"fmt"
|
|
|
|
)
|
|
|
|
|
2020-02-23 23:21:57 +01:00
|
|
|
// MetricsResolver resolver that records metrics about requests/response
|
2020-02-23 22:50:17 +01:00
|
|
|
type MetricsResolver struct {
|
|
|
|
NextResolver
|
|
|
|
cfg config.PrometheusConfig
|
|
|
|
metrics Metrics
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m MetricsResolver) handleMetrics(req *Request, resp *Response) {
|
|
|
|
if m.cfg.Enable {
|
|
|
|
m.metrics.RecordStats(req, resp)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-23 23:21:57 +01:00
|
|
|
// Resolve resolves the passed request
|
2020-02-23 22:50:17 +01:00
|
|
|
func (m MetricsResolver) Resolve(req *Request) (*Response, error) {
|
|
|
|
resp, err := m.next.Resolve(req)
|
|
|
|
|
|
|
|
m.handleMetrics(req, resp)
|
|
|
|
|
|
|
|
return resp, err
|
|
|
|
}
|
|
|
|
|
2020-02-23 23:21:57 +01:00
|
|
|
// Configuration gets the config of this resolver in a string slice
|
2020-02-23 22:50:17 +01:00
|
|
|
func (m MetricsResolver) Configuration() (result []string) {
|
|
|
|
result = append(result, "metrics:")
|
|
|
|
result = append(result, fmt.Sprintf(" Enable = %t", m.cfg.Enable))
|
|
|
|
result = append(result, fmt.Sprintf(" Port = %d", m.cfg.Port))
|
|
|
|
result = append(result, fmt.Sprintf(" Path = %s", m.cfg.Path))
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m MetricsResolver) String() string {
|
|
|
|
return "metrics resolver"
|
|
|
|
}
|
|
|
|
|
2020-02-23 23:21:57 +01:00
|
|
|
// NewMetricsResolver creates a new intance of the MetricsResolver type
|
2020-02-23 22:50:17 +01:00
|
|
|
func NewMetricsResolver(cfg config.PrometheusConfig) MetricsResolver {
|
|
|
|
if cfg.Path == "" {
|
|
|
|
cfg.Path = "/metrics"
|
|
|
|
}
|
|
|
|
|
|
|
|
if cfg.Port == 0 {
|
|
|
|
cfg.Port = 4000
|
|
|
|
}
|
|
|
|
|
|
|
|
metrics := NewMetrics(cfg)
|
|
|
|
metrics.Start()
|
|
|
|
|
|
|
|
return MetricsResolver{cfg: cfg, metrics: metrics}
|
|
|
|
}
|