Merge pull request #2262 from sanek9/master
Append application metrics to /metrics so that prometheus can read #1616
This commit is contained in:
commit
c470c61061
@ -184,6 +184,17 @@ func (s byName) Less(i, j int) bool {
|
|||||||
return s.prometheusLabels[i].GetName() < s.prometheusLabels[j].GetName()
|
return s.prometheusLabels[i].GetName() < s.prometheusLabels[j].GetName()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func prometheusLabelSetToCadvisorLabels(promLabels model.Metric) map[string]string {
|
||||||
|
labels := make(map[string]string)
|
||||||
|
for k, v := range promLabels {
|
||||||
|
if string(k) == "__name__" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
labels[string(k)] = string(v)
|
||||||
|
}
|
||||||
|
return labels
|
||||||
|
}
|
||||||
|
|
||||||
func prometheusLabelSetToCadvisorLabel(promLabels model.Metric) string {
|
func prometheusLabelSetToCadvisorLabel(promLabels model.Metric) string {
|
||||||
labels := labelSetToLabelPairs(promLabels)
|
labels := labelSetToLabelPairs(promLabels)
|
||||||
sort.Sort(byName{labels})
|
sort.Sort(byName{labels})
|
||||||
@ -247,11 +258,13 @@ func (collector *PrometheusCollector) Collect(metrics map[string][]v1.MetricVal)
|
|||||||
// TODO Handle multiple labels nicer. Prometheus metrics can have multiple
|
// TODO Handle multiple labels nicer. Prometheus metrics can have multiple
|
||||||
// labels, cadvisor only accepts a single string for the metric label.
|
// labels, cadvisor only accepts a single string for the metric label.
|
||||||
label := prometheusLabelSetToCadvisorLabel(sample.Metric)
|
label := prometheusLabelSetToCadvisorLabel(sample.Metric)
|
||||||
|
labels := prometheusLabelSetToCadvisorLabels(sample.Metric)
|
||||||
|
|
||||||
metric := v1.MetricVal{
|
metric := v1.MetricVal{
|
||||||
FloatValue: float64(sample.Value),
|
FloatValue: float64(sample.Value),
|
||||||
Timestamp: sample.Timestamp.Time(),
|
Timestamp: sample.Timestamp.Time(),
|
||||||
Label: label,
|
Label: label,
|
||||||
|
Labels: labels,
|
||||||
}
|
}
|
||||||
newMetrics[metName] = append(newMetrics[metName], metric)
|
newMetrics[metName] = append(newMetrics[metName], metric)
|
||||||
if len(newMetrics) > collector.metricCountLimit {
|
if len(newMetrics) > collector.metricCountLimit {
|
||||||
|
@ -69,6 +69,7 @@ type MetricValBasic struct {
|
|||||||
type MetricVal struct {
|
type MetricVal struct {
|
||||||
// Label associated with a metric
|
// Label associated with a metric
|
||||||
Label string `json:"label,omitempty"`
|
Label string `json:"label,omitempty"`
|
||||||
|
Labels map[string]string `json:"labels,omitempty"`
|
||||||
|
|
||||||
// Time at which the metric was queried
|
// Time at which the metric was queried
|
||||||
Timestamp time.Time `json:"timestamp"`
|
Timestamp time.Time `json:"timestamp"`
|
||||||
|
@ -1674,7 +1674,24 @@ func (c *PrometheusCollector) collectContainersInfo(ch chan<- prometheus.Metric)
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if c.includedMetrics.Has(container.AppMetrics) {
|
||||||
|
for metricLabel, v := range stats.CustomMetrics {
|
||||||
|
for _, metric := range v {
|
||||||
|
clabels := make([]string, len(rawLabels), len(rawLabels)+len(metric.Labels))
|
||||||
|
cvalues := make([]string, len(rawLabels), len(rawLabels)+len(metric.Labels))
|
||||||
|
copy(clabels, labels)
|
||||||
|
copy(cvalues, values)
|
||||||
|
for label, value := range metric.Labels {
|
||||||
|
clabels = append(clabels, sanitizeLabelName("app_"+label))
|
||||||
|
cvalues = append(cvalues, value)
|
||||||
}
|
}
|
||||||
|
desc := prometheus.NewDesc(metricLabel, "Custom application metric.", clabels, nil)
|
||||||
|
ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, float64(metric.FloatValue), cvalues...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrometheusCollector) collectVersionInfo(ch chan<- prometheus.Metric) {
|
func (c *PrometheusCollector) collectVersionInfo(ch chan<- prometheus.Metric) {
|
||||||
|
@ -62,6 +62,7 @@ var allMetrics = container.MetricSet{
|
|||||||
container.NetworkAdvancedTcpUsageMetrics: struct{}{},
|
container.NetworkAdvancedTcpUsageMetrics: struct{}{},
|
||||||
container.NetworkUdpUsageMetrics: struct{}{},
|
container.NetworkUdpUsageMetrics: struct{}{},
|
||||||
container.ProcessMetrics: struct{}{},
|
container.ProcessMetrics: struct{}{},
|
||||||
|
container.AppMetrics: struct{}{},
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p testSubcontainersInfoProvider) SubcontainersInfo(string, *info.ContainerInfoRequest) ([]*info.ContainerInfo, error) {
|
func (p testSubcontainersInfoProvider) SubcontainersInfo(string, *info.ContainerInfoRequest) ([]*info.ContainerInfo, error) {
|
||||||
@ -377,6 +378,38 @@ func (p testSubcontainersInfoProvider) SubcontainersInfo(string, *info.Container
|
|||||||
NrUninterruptible: 53,
|
NrUninterruptible: 53,
|
||||||
NrIoWait: 54,
|
NrIoWait: 54,
|
||||||
},
|
},
|
||||||
|
CustomMetrics: map[string][]info.MetricVal{
|
||||||
|
"container_custom_app_metric_1": {
|
||||||
|
{
|
||||||
|
FloatValue: float64(1.1),
|
||||||
|
Timestamp: time.Now(),
|
||||||
|
Label: "testlabel_1_1_1",
|
||||||
|
Labels: map[string]string{"test_label": "1_1", "test_label_2": "2_1"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
FloatValue: float64(1.2),
|
||||||
|
Timestamp: time.Now(),
|
||||||
|
Label: "testlabel_1_1_2",
|
||||||
|
Labels: map[string]string{"test_label": "1_2", "test_label_2": "2_2"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"container_custom_app_metric_2": {
|
||||||
|
{
|
||||||
|
FloatValue: float64(2),
|
||||||
|
Timestamp: time.Now(),
|
||||||
|
Label: "testlabel2",
|
||||||
|
Labels: map[string]string{"test_label": "test_value"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"container_custom_app_metric_3": {
|
||||||
|
{
|
||||||
|
FloatValue: float64(3),
|
||||||
|
Timestamp: time.Now(),
|
||||||
|
Label: "testlabel3",
|
||||||
|
Labels: map[string]string{"test_label": "test_value"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
10
metrics/testdata/prometheus_metrics
vendored
10
metrics/testdata/prometheus_metrics
vendored
@ -46,6 +46,16 @@ container_cpu_usage_seconds_total{container_env_foo_env="prod",container_label_f
|
|||||||
# HELP container_cpu_user_seconds_total Cumulative user cpu time consumed in seconds.
|
# HELP container_cpu_user_seconds_total Cumulative user cpu time consumed in seconds.
|
||||||
# TYPE container_cpu_user_seconds_total counter
|
# TYPE container_cpu_user_seconds_total counter
|
||||||
container_cpu_user_seconds_total{container_env_foo_env="prod",container_label_foo_label="bar",id="testcontainer",image="test",name="testcontaineralias",zone_name="hello"} 6e-09 1395066363000
|
container_cpu_user_seconds_total{container_env_foo_env="prod",container_label_foo_label="bar",id="testcontainer",image="test",name="testcontaineralias",zone_name="hello"} 6e-09 1395066363000
|
||||||
|
# HELP container_custom_app_metric_1 Custom application metric.
|
||||||
|
# TYPE container_custom_app_metric_1 gauge
|
||||||
|
container_custom_app_metric_1{app_test_label="1_1",app_test_label_2="2_1",container_env_foo_env="prod",container_label_foo_label="bar",id="testcontainer",image="test",name="testcontaineralias",zone_name="hello"} 1.1
|
||||||
|
container_custom_app_metric_1{app_test_label="1_2",app_test_label_2="2_2",container_env_foo_env="prod",container_label_foo_label="bar",id="testcontainer",image="test",name="testcontaineralias",zone_name="hello"} 1.2
|
||||||
|
# HELP container_custom_app_metric_2 Custom application metric.
|
||||||
|
# TYPE container_custom_app_metric_2 gauge
|
||||||
|
container_custom_app_metric_2{app_test_label="test_value",container_env_foo_env="prod",container_label_foo_label="bar",id="testcontainer",image="test",name="testcontaineralias",zone_name="hello"} 2
|
||||||
|
# HELP container_custom_app_metric_3 Custom application metric.
|
||||||
|
# TYPE container_custom_app_metric_3 gauge
|
||||||
|
container_custom_app_metric_3{app_test_label="test_value",container_env_foo_env="prod",container_label_foo_label="bar",id="testcontainer",image="test",name="testcontaineralias",zone_name="hello"} 3
|
||||||
# HELP container_file_descriptors Number of open file descriptors for the container.
|
# HELP container_file_descriptors Number of open file descriptors for the container.
|
||||||
# TYPE container_file_descriptors gauge
|
# TYPE container_file_descriptors gauge
|
||||||
container_file_descriptors{container_env_foo_env="prod",container_label_foo_label="bar",id="testcontainer",image="test",name="testcontaineralias",zone_name="hello"} 5 1395066363000
|
container_file_descriptors{container_env_foo_env="prod",container_label_foo_label="bar",id="testcontainer",image="test",name="testcontaineralias",zone_name="hello"} 5 1395066363000
|
||||||
|
Loading…
Reference in New Issue
Block a user