Registration of custom function to map container name to prometheus labels
This commit is contained in:
parent
8dcf46b153
commit
5db9f8674e
@ -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)
|
||||||
|
@ -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 {
|
||||||
|
@ -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...)
|
||||||
|
@ -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{})
|
||||||
|
Loading…
Reference in New Issue
Block a user