Add Prometheus metrics

This commit is contained in:
Ivan Danyliuk 2018-05-24 18:51:16 +03:00
parent 7a8c56631d
commit 3e5381840c
No known key found for this signature in database
GPG Key ID: 97ED33CE024E1DBF
3 changed files with 48 additions and 40 deletions

11
main.go
View File

@ -12,10 +12,11 @@ import (
func main() {
var (
name = flag.String("name", "randomstring", "Public chat name used for this health bots")
interval = flag.Duration("interval", 5*time.Second, "Interval for health check")
rpcHost = flag.String("rpc", "http://localhost:8545", "Host:port to statusd's RPC endpoint")
isSender = flag.Bool("send", true, "Select bot role, sender or responder")
name = flag.String("name", "randomstring", "Public chat name used for this health bots")
interval = flag.Duration("interval", 5*time.Second, "Interval for health check")
rpcHost = flag.String("rpc", "http://localhost:8545", "Host:port to statusd's RPC endpoint")
statsPort = flag.String("statsPort", ":8080", "Host:port to bind to for exposed Prometheus metrics")
isSender = flag.Bool("send", true, "Select bot role, sender or responder")
)
flag.Parse()
@ -37,7 +38,7 @@ func main() {
}
if *isSender {
startSender(ch, *interval)
startSender(ch, *interval, *statsPort)
} else {
startReceiver(ch)
select {}

View File

@ -7,13 +7,12 @@ import (
"github.com/status-im/status-go-sdk"
)
func startSender(ch *sdk.Channel, interval time.Duration) {
func startSender(ch *sdk.Channel, interval time.Duration, statsPort string) {
var (
counter int
ticker = time.NewTicker(interval)
statsTicker = time.NewTicker(10 * time.Second)
pending = make(map[int]time.Time)
recvCh = make(chan Msg, 1000)
counter int
ticker = time.NewTicker(interval)
pending = make(map[int]time.Time)
recvCh = make(chan Msg, 1000)
)
if _, err := ch.Subscribe(func(m *sdk.Msg) {
@ -30,7 +29,7 @@ func startSender(ch *sdk.Channel, interval time.Duration) {
log.Fatal(err)
}
stats := NewStats()
stats := NewStats(statsPort)
for {
select {
@ -58,8 +57,6 @@ func startSender(ch *sdk.Channel, interval time.Duration) {
delete(pending, c)
dur := time.Since(start)
stats.AddRountrip(dur)
case <-statsTicker.C:
stats.Print()
}
}
}

View File

@ -1,47 +1,57 @@
package main
import (
"fmt"
"sync"
"log"
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
msgsSent = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "msgs_sent",
Help: "Messages sent by bot",
})
msgsReceived = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "msgs_received",
Help: "Message responses received by bot",
})
msgsLatencies = prometheus.NewSummary(prometheus.SummaryOpts{
Name: "msgs_responses_latency",
Help: "Latencies of responses to bot messages",
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
})
)
func init() {
// Metrics have to be registered to be exposed
prometheus.MustRegister(msgsSent)
prometheus.MustRegister(msgsReceived)
prometheus.MustRegister(msgsLatencies)
}
// Stats represents messages' statistics.
type Stats struct {
mx sync.RWMutex
sent int
received int
delays []time.Duration
}
// NewStats returns new empty Stats object.
func NewStats() *Stats {
func NewStats(statsPort string) *Stats {
go func() {
http.Handle("/metrics", promhttp.Handler())
log.Fatal(http.ListenAndServe(statsPort, nil))
}()
return &Stats{}
}
// AddSent adds information about sent messages.
func (s *Stats) AddSent() {
s.mx.Lock()
defer s.mx.Unlock()
s.sent++
msgsSent.Inc()
}
// AddRoundtrip adds information about successful message roundtrip.
func (s *Stats) AddRountrip(d time.Duration) {
s.mx.Lock()
defer s.mx.Unlock()
s.received++
s.delays = append(s.delays, d)
}
// Print dumps stats to the console.
func (s *Stats) Print() {
s.mx.RLock()
defer s.mx.RUnlock()
fmt.Println("-------------------------")
fmt.Println("Time:", time.Now())
fmt.Println("Sent:", s.sent)
fmt.Println("Received:", s.received)
fmt.Println("Delays:", s.delays)
fmt.Println("-------------------------")
msgsReceived.Inc()
msgsLatencies.Observe(float64(d / time.Millisecond))
}