forked from cloudfoundry/gorouter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
metrics_reporter.go
75 lines (59 loc) · 2.16 KB
/
metrics_reporter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package metrics
import (
"net/http"
"code.cloudfoundry.org/gorouter/metrics/reporter"
"code.cloudfoundry.org/gorouter/route"
dropsondeMetrics "github.com/cloudfoundry/dropsonde/metrics"
"fmt"
"strings"
"time"
)
type MetricsReporter struct {
}
func NewMetricsReporter() *MetricsReporter {
return &MetricsReporter{}
}
func (m *MetricsReporter) CaptureBadRequest(req *http.Request) {
dropsondeMetrics.BatchIncrementCounter("rejected_requests")
}
func (m *MetricsReporter) CaptureBadGateway(req *http.Request) {
dropsondeMetrics.BatchIncrementCounter("bad_gateways")
}
func (m *MetricsReporter) CaptureRoutingRequest(b *route.Endpoint, req *http.Request) {
dropsondeMetrics.BatchIncrementCounter("total_requests")
componentName, ok := b.Tags["component"]
if ok && len(componentName) > 0 {
dropsondeMetrics.BatchIncrementCounter(fmt.Sprintf("requests.%s", componentName))
if strings.HasPrefix(componentName, "dea-") {
dropsondeMetrics.BatchIncrementCounter("routed_app_requests")
}
}
}
func (m *MetricsReporter) CaptureRoutingResponse(b *route.Endpoint, res *http.Response, t time.Time, d time.Duration) {
dropsondeMetrics.BatchIncrementCounter(getResponseCounterName(res))
dropsondeMetrics.BatchIncrementCounter("responses")
latency := float64(d / time.Millisecond)
unit := "ms"
dropsondeMetrics.SendValue("latency", latency, unit)
componentName, ok := b.Tags["component"]
if ok && len(componentName) > 0 {
dropsondeMetrics.SendValue(fmt.Sprintf("latency.%s", componentName), latency, unit)
}
}
func (c *MetricsReporter) CaptureRouteStats(totalRoutes int, msSinceLastUpdate uint64) {
dropsondeMetrics.SendValue("total_routes", float64(totalRoutes), "")
dropsondeMetrics.SendValue("ms_since_last_registry_update", float64(msSinceLastUpdate), "ms")
}
func (c *MetricsReporter) CaptureRegistryMessage(msg reporter.ComponentTagged) {
dropsondeMetrics.IncrementCounter("registry_message." + msg.Component())
}
func getResponseCounterName(res *http.Response) string {
var statusCode int
if res != nil {
statusCode = res.StatusCode / 100
}
if statusCode >= 2 && statusCode <= 5 {
return fmt.Sprintf("responses.%dxx", statusCode)
}
return "responses.xxx"
}