Registration of custom function to map container name to prometheus labels

This commit is contained in:
Jimmi Dyson 2015-10-06 14:48:37 +01:00
parent 8dcf46b153
commit 5db9f8674e
4 changed files with 28 additions and 12 deletions

View File

@ -78,11 +78,13 @@ func main() {
mux := http.DefaultServeMux mux := http.DefaultServeMux
// Register all HTTP handlers. // Register all HTTP handlers.
err = cadvisorHttp.RegisterHandlers(mux, containerManager, *httpAuthFile, *httpAuthRealm, *httpDigestFile, *httpDigestRealm, *prometheusEndpoint) err = cadvisorHttp.RegisterHandlers(mux, containerManager, *httpAuthFile, *httpAuthRealm, *httpDigestFile, *httpDigestRealm)
if err != nil { if err != nil {
glog.Fatalf("Failed to register HTTP handlers: %v", err) glog.Fatalf("Failed to register HTTP handlers: %v", err)
} }
cadvisorHttp.RegisterPrometheusHandler(mux, containerManager, *prometheusEndpoint, nil)
// Start the manager. // Start the manager.
if err := containerManager.Start(); err != nil { if err := containerManager.Start(); err != nil {
glog.Fatalf("Failed to start container manager: %v", err) glog.Fatalf("Failed to start container manager: %v", err)

View File

@ -31,7 +31,7 @@ import (
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
func RegisterHandlers(mux httpMux.Mux, containerManager manager.Manager, httpAuthFile, httpAuthRealm, httpDigestFile, httpDigestRealm, prometheusEndpoint string) error { func RegisterHandlers(mux httpMux.Mux, containerManager manager.Manager, httpAuthFile, httpAuthRealm, httpDigestFile, httpDigestRealm string) error {
// Basic health handler. // Basic health handler.
if err := healthz.RegisterHandler(mux); err != nil { if err := healthz.RegisterHandler(mux); err != nil {
return fmt.Errorf("failed to register healthz handler: %s", err) return fmt.Errorf("failed to register healthz handler: %s", err)
@ -85,13 +85,15 @@ func RegisterHandlers(mux httpMux.Mux, containerManager manager.Manager, httpAut
} }
} }
collector := metrics.NewPrometheusCollector(containerManager)
prometheus.MustRegister(collector)
http.Handle(prometheusEndpoint, prometheus.Handler())
return nil return nil
} }
func RegisterPrometheusHandler(mux httpMux.Mux, containerManager manager.Manager, prometheusEndpoint string, containerNameToLabelsFunc metrics.ContainerNameToLabelsFunc) {
collector := metrics.NewPrometheusCollector(containerManager, containerNameToLabelsFunc)
prometheus.MustRegister(collector)
mux.Handle(prometheusEndpoint, prometheus.Handler())
}
func staticHandlerNoAuth(w http.ResponseWriter, r *http.Request) { func staticHandlerNoAuth(w http.ResponseWriter, r *http.Request) {
err := static.HandleRequest(w, r.URL) err := static.HandleRequest(w, r.URL)
if err != nil { if err != nil {

View File

@ -68,17 +68,21 @@ func (cm *containerMetric) desc(baseLabels []string) *prometheus.Desc {
return prometheus.NewDesc(cm.name, cm.help, append(baseLabels, cm.extraLabels...), nil) return prometheus.NewDesc(cm.name, cm.help, append(baseLabels, cm.extraLabels...), nil)
} }
type ContainerNameToLabelsFunc func(containerName string) map[string]string
// PrometheusCollector implements prometheus.Collector. // PrometheusCollector implements prometheus.Collector.
type PrometheusCollector struct { type PrometheusCollector struct {
infoProvider infoProvider infoProvider infoProvider
errors prometheus.Gauge errors prometheus.Gauge
containerMetrics []containerMetric containerMetrics []containerMetric
containerNameToLabels ContainerNameToLabelsFunc
} }
// NewPrometheusCollector returns a new PrometheusCollector. // NewPrometheusCollector returns a new PrometheusCollector.
func NewPrometheusCollector(infoProvider infoProvider) *PrometheusCollector { func NewPrometheusCollector(infoProvider infoProvider, f ContainerNameToLabelsFunc) *PrometheusCollector {
c := &PrometheusCollector{ c := &PrometheusCollector{
infoProvider: infoProvider, infoProvider: infoProvider,
containerNameToLabels: f,
errors: prometheus.NewGauge(prometheus.GaugeOpts{ errors: prometheus.NewGauge(prometheus.GaugeOpts{
Namespace: "container", Namespace: "container",
Name: "scrape_error", Name: "scrape_error",
@ -500,6 +504,14 @@ func (c *PrometheusCollector) collectContainersInfo(ch chan<- prometheus.Metric)
} }
baseLabelValues := []string{id, name, image}[:len(baseLabels)] baseLabelValues := []string{id, name, image}[:len(baseLabels)]
if c.containerNameToLabels != nil {
newLabels := c.containerNameToLabels(name)
for k, v := range newLabels {
baseLabels = append(baseLabels, k)
baseLabelValues = append(baseLabelValues, v)
}
}
// Container spec // Container spec
desc := prometheus.NewDesc("container_start_time_seconds", "Start time of the container since unix epoch in seconds.", baseLabels, nil) desc := prometheus.NewDesc("container_start_time_seconds", "Start time of the container since unix epoch in seconds.", baseLabels, nil)
ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, float64(container.Spec.CreationTime.Unix()), baseLabelValues...) ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, float64(container.Spec.CreationTime.Unix()), baseLabelValues...)

View File

@ -152,7 +152,7 @@ func (p testSubcontainersInfoProvider) SubcontainersInfo(string, *info.Container
} }
func TestPrometheusCollector(t *testing.T) { func TestPrometheusCollector(t *testing.T) {
prometheus.MustRegister(NewPrometheusCollector(testSubcontainersInfoProvider{})) prometheus.MustRegister(NewPrometheusCollector(testSubcontainersInfoProvider{}, nil))
rw := httptest.NewRecorder() rw := httptest.NewRecorder()
prometheus.Handler().ServeHTTP(rw, &http.Request{}) prometheus.Handler().ServeHTTP(rw, &http.Request{})