diff --git a/docs/prometheus.md b/docs/prometheus.md index 62ec000f..d3f94517 100644 --- a/docs/prometheus.md +++ b/docs/prometheus.md @@ -30,7 +30,7 @@ Here is a list of the metrics we provide: - `mgmt_resources_total`: The number of resources that mgmt is managing - `mgmt_checkapply_total`: The number of CheckApply's that mgmt has run - `mgmt_failures_total`: The number of resources that have failed -- `mgmt_failures_current`: The number of resources that have failed +- `mgmt_failures`: The number of resources that have failed - `mgmt_graph_start_time_seconds`: Start time of the current graph since unix epoch in seconds For each metric, you will get some extra labels: diff --git a/prometheus/prometheus.go b/prometheus/prometheus.go index 905af280..8e1a2805 100644 --- a/prometheus/prometheus.go +++ b/prometheus/prometheus.go @@ -16,7 +16,7 @@ // along with this program. If not, see . // Package prometheus provides functions that are useful to control and manage -// the build-in prometheus instance. +// the built-in prometheus instance. package prometheus import ( @@ -170,6 +170,15 @@ func (obj *Prometheus) InitKindMetrics(kinds []string) error { } } } + + obj.managedResources.With(prometheus.Labels{"kind": kind}) + + failures := []string{"soft", "hard"} + for _, f := range failures { + failLabels := prometheus.Labels{"kind": kind, "failure": f} + obj.failedResourcesTotal.With(failLabels) + obj.failedResources.With(failLabels) + } } return nil } diff --git a/prometheus/prometheus_test.go b/prometheus/prometheus_test.go new file mode 100644 index 00000000..d4b396a4 --- /dev/null +++ b/prometheus/prometheus_test.go @@ -0,0 +1,75 @@ +// Mgmt +// Copyright (C) 2013-2017+ James Shubin and the project contributors +// Written by James Shubin and the project contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package prometheus + +import ( + "testing" + + "github.com/prometheus/client_golang/prometheus" +) + +// TestInitKindMetrics tests that we are initializing the Prometheus +// metrics correctly for all kind of resources. +func TestInitKindMetrics(t *testing.T) { + var prom Prometheus + prom.Init() + prom.InitKindMetrics([]string{"file", "exec"}) + + // Get a list of metrics collected by Prometheus. + // This is the only way to get Prometheus metrics + // without implicitly creating them. + gatherer := prometheus.DefaultGatherer + metrics, err := gatherer.Gather() + if err != nil { + t.Errorf("Error while gathering metrics: %s", err) + return + } + + // expectedMetrics is a map: keys are metrics name and + // values are expected and actual count of metrics with + // that name. + expectedMetrics := map[string][2]int{ + "mgmt_checkapply_total": [2]int{ + 16, 0, + }, + "mgmt_failures_total": [2]int{ + 4, 0, + }, + "mgmt_failures": [2]int{ + 4, 0, + }, + "mgmt_resources": [2]int{ + 2, 0, + }, + } + + for _, metric := range metrics { + for name, count := range expectedMetrics { + if *metric.Name == name { + value := len(metric.Metric) + expectedMetrics[name] = [2]int{count[0], value} + } + } + } + + for name, count := range expectedMetrics { + if count[1] != count[0] { + t.Errorf("%s: Expected %d metrics, got %d metrics", name, count[0], count[1]) + } + } +}