forked from cloudfoundry/bbs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
db_stat_metron_notifier.go
118 lines (99 loc) · 3.47 KB
/
db_stat_metron_notifier.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package metrics
import (
"os"
"time"
"code.cloudfoundry.org/bbs/db/sqldb/helpers/monitor"
"code.cloudfoundry.org/clock"
logging "code.cloudfoundry.org/diego-logging-client"
"code.cloudfoundry.org/lager"
"github.com/tedsuo/ifrit"
)
const (
DefaultEmitFrequency = 60 * time.Second
dbOpenConnectionsMetric = "DBOpenConnections"
dbWaitDurationMetric = "DBWaitDuration"
dbWaitCountMetric = "DBWaitCount"
dbQueriesTotalMetric = "DBQueriesTotal"
dbQueriesSucceededMetric = "DBQueriesSucceeded"
dbQueriesFailedMetric = "DBQueriesFailed"
dbQueriesInFlightMetric = "DBQueriesInFlight"
dbQueryDurationMaxMetric = "DBQueryDurationMax"
)
//go:generate counterfeiter . DBStats
type DBStats interface {
OpenConnections() int
WaitDuration() time.Duration
WaitCount() int64
}
type dbStatMetronNotifier struct {
logger lager.Logger
clock clock.Clock
dbStats DBStats
metronClient logging.IngressClient
monitor monitor.Monitor
}
func NewDBStatMetronNotifier(logger lager.Logger, clock clock.Clock, dbStats DBStats, metronClient logging.IngressClient, monitor monitor.Monitor) ifrit.Runner {
return &dbStatMetronNotifier{
logger: logger,
clock: clock,
dbStats: dbStats,
metronClient: metronClient,
monitor: monitor,
}
}
func (notifier *dbStatMetronNotifier) Run(signals <-chan os.Signal, ready chan<- struct{}) error {
logger := notifier.logger.Session("db-stat-metron-notifier")
logger.Info("starting", lager.Data{"interval": DefaultEmitFrequency})
defer logger.Info("completed")
ticker := notifier.clock.NewTicker(DefaultEmitFrequency)
close(ready)
for {
select {
case <-signals:
return nil
case <-ticker.C():
logger.Debug("emitting-metrics")
openConnections := notifier.dbStats.OpenConnections()
err := notifier.metronClient.SendMetric(dbOpenConnectionsMetric, openConnections)
if err != nil {
logger.Error("failed-sending-db-open-connections-count", err)
}
waitDuration := notifier.dbStats.WaitDuration()
err = notifier.metronClient.SendDuration(dbWaitDurationMetric, waitDuration)
if err != nil {
logger.Error("failed-sending-db-wait-duration", err)
}
waitCount := notifier.dbStats.WaitCount()
err = notifier.metronClient.SendMetric(dbWaitCountMetric, int(waitCount))
if err != nil {
logger.Error("failed-sending-db-wait-count", err)
}
total := notifier.monitor.Total()
err = notifier.metronClient.SendMetric(dbQueriesTotalMetric, int(total))
if err != nil {
logger.Error("failed-sending-db-queries-total-count", err)
}
succeeded := notifier.monitor.Succeeded()
err = notifier.metronClient.SendMetric(dbQueriesSucceededMetric, int(succeeded))
if err != nil {
logger.Error("failed-sending-db-queries-succeeded-count", err)
}
failed := notifier.monitor.Failed()
err = notifier.metronClient.SendMetric(dbQueriesFailedMetric, int(failed))
if err != nil {
logger.Error("failed-sending-db-queries-failed-count", err)
}
inFlightMax := notifier.monitor.ReadAndResetInFlightMax()
err = notifier.metronClient.SendMetric(dbQueriesInFlightMetric, int(inFlightMax))
if err != nil {
logger.Error("failed-sending-db-queries-in-flight-count", err)
}
durationMax := notifier.monitor.ReadAndResetDurationMax()
err = notifier.metronClient.SendDuration(dbQueryDurationMaxMetric, durationMax)
if err != nil {
logger.Error("failed-sending-db-query-duration-max", err)
}
logger.Debug("done-emitting-metrics")
}
}
}