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
|
package app
import (
"net"
"net/http"
"strconv"
schedmetrics "github.com/mesos/mesos-go/api/v1/cmd/example-scheduler/app/metrics"
xmetrics "github.com/mesos/mesos-go/api/v1/lib/extras/metrics"
"github.com/prometheus/client_golang/prometheus"
)
func initMetrics(cfg Config) *metricsAPI {
schedmetrics.Register()
metricsAddress := net.JoinHostPort(cfg.server.address, strconv.Itoa(cfg.metrics.port))
http.Handle(cfg.metrics.path, prometheus.Handler())
api := newMetricsAPI()
go forever("api-server", cfg.jobRestartDelay, api.jobStartCount, func() error { return http.ListenAndServe(metricsAddress, nil) })
return api
}
func newMetricAdder(m prometheus.Counter) xmetrics.Adder {
return func(x float64, _ ...string) { m.Add(x) }
}
func newMetricCounter(m prometheus.Counter) xmetrics.Counter {
return func(_ ...string) { m.Inc() }
}
func newMetricCounters(m *prometheus.CounterVec) xmetrics.Counter {
return func(s ...string) { m.WithLabelValues(s...).Inc() }
}
func newMetricWatcher(m prometheus.Summary) xmetrics.Watcher {
return func(x float64, _ ...string) { m.Observe(x) }
}
func newMetricWatchers(m *prometheus.SummaryVec) xmetrics.Watcher {
return func(x float64, s ...string) { m.WithLabelValues(s...).Observe(x) }
}
type metricsAPI struct {
eventErrorCount xmetrics.Counter
eventReceivedCount xmetrics.Counter
eventReceivedLatency xmetrics.Watcher
callCount xmetrics.Counter
callErrorCount xmetrics.Counter
callLatency xmetrics.Watcher
offersReceived xmetrics.Adder
offersDeclined xmetrics.Adder
tasksLaunched xmetrics.Adder
tasksFinished xmetrics.Counter
launchesPerOfferCycle xmetrics.Watcher
offeredResources xmetrics.Watcher
jobStartCount xmetrics.Counter
artifactDownloads xmetrics.Counter
}
func newMetricsAPI() *metricsAPI {
return &metricsAPI{
callCount: newMetricCounters(schedmetrics.CallCount),
callErrorCount: newMetricCounters(schedmetrics.CallErrorCount),
callLatency: newMetricWatchers(schedmetrics.CallLatency),
eventErrorCount: newMetricCounters(schedmetrics.EventErrorCount),
eventReceivedCount: newMetricCounters(schedmetrics.EventReceivedCount),
eventReceivedLatency: newMetricWatchers(schedmetrics.EventReceivedLatency),
offersReceived: newMetricAdder(schedmetrics.OffersReceived),
offersDeclined: newMetricAdder(schedmetrics.OffersDeclined),
tasksLaunched: newMetricAdder(schedmetrics.TasksLaunched),
tasksFinished: newMetricCounter(schedmetrics.TasksFinished),
launchesPerOfferCycle: newMetricWatcher(schedmetrics.TasksLaunchedPerOfferCycle),
offeredResources: newMetricWatchers(schedmetrics.OfferedResources),
jobStartCount: newMetricCounters(schedmetrics.JobStartCount),
artifactDownloads: newMetricCounter(schedmetrics.ArtifactDownloads),
}
}
|