Merge pull request #2076 from huanggze/custom-monitoring
api: list metric labels and values
This commit is contained in:
@@ -8,4 +8,5 @@ type Interface interface {
|
||||
GetNamedMetrics(metrics []string, time time.Time, opt QueryOption) []Metric
|
||||
GetNamedMetricsOverTime(metrics []string, start, end time.Time, step time.Duration, opt QueryOption) []Metric
|
||||
GetMetadata(namespace string) []Metadata
|
||||
GetMetricLabelSet(expr string, start, end time.Time) []map[string]string
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"github.com/prometheus/client_golang/api"
|
||||
apiv1 "github.com/prometheus/client_golang/api/prometheus/v1"
|
||||
"github.com/prometheus/common/model"
|
||||
"k8s.io/klog"
|
||||
"kubesphere.io/kubesphere/pkg/simple/client/monitoring"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -135,6 +136,7 @@ func (p prometheus) GetMetadata(namespace string) []monitoring.Metadata {
|
||||
matchTarget := fmt.Sprintf("{namespace=\"%s\"}", namespace)
|
||||
items, err := p.client.TargetsMetadata(context.Background(), matchTarget, "", "")
|
||||
if err != nil {
|
||||
klog.Error(err)
|
||||
return meta
|
||||
}
|
||||
|
||||
@@ -155,6 +157,30 @@ func (p prometheus) GetMetadata(namespace string) []monitoring.Metadata {
|
||||
return meta
|
||||
}
|
||||
|
||||
func (p prometheus) GetMetricLabelSet(expr string, start, end time.Time) []map[string]string {
|
||||
var res []map[string]string
|
||||
|
||||
labelSet, err := p.client.Series(context.Background(), []string{expr}, start, end)
|
||||
if err != nil {
|
||||
klog.Error(err)
|
||||
return []map[string]string{}
|
||||
}
|
||||
|
||||
for _, item := range labelSet {
|
||||
var tmp = map[string]string{}
|
||||
for key, val := range item {
|
||||
if key == "__name__" {
|
||||
continue
|
||||
}
|
||||
tmp[string(key)] = string(val)
|
||||
}
|
||||
|
||||
res = append(res, tmp)
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func parseQueryRangeResp(value model.Value) monitoring.MetricData {
|
||||
res := monitoring.MetricData{MetricType: monitoring.MetricTypeMatrix}
|
||||
|
||||
|
||||
@@ -120,6 +120,41 @@ func TestGetMetadata(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetMetricLabelSet(t *testing.T) {
|
||||
tests := []struct {
|
||||
fakeResp string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
fakeResp: "labels-prom.json",
|
||||
expected: "labels-res.json",
|
||||
},
|
||||
{
|
||||
fakeResp: "labels-error-prom.json",
|
||||
expected: "labels-error-res.json",
|
||||
},
|
||||
}
|
||||
|
||||
for i, tt := range tests {
|
||||
t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
|
||||
var expected []map[string]string
|
||||
err := jsonFromFile(tt.expected, &expected)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
srv := mockPrometheusService("/api/v1/series", tt.fakeResp)
|
||||
defer srv.Close()
|
||||
|
||||
client, _ := NewPrometheus(&Options{Endpoint: srv.URL})
|
||||
result := client.GetMetricLabelSet("default", time.Now(), time.Now())
|
||||
if diff := cmp.Diff(result, expected); diff != "" {
|
||||
t.Fatalf("%T differ (-got, +want): %s", expected, diff)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func mockPrometheusService(pattern, fakeResp string) *httptest.Server {
|
||||
mux := http.NewServeMux()
|
||||
mux.HandleFunc(pattern, func(res http.ResponseWriter, req *http.Request) {
|
||||
|
||||
5
pkg/simple/client/monitoring/prometheus/testdata/labels-error-prom.json
vendored
Normal file
5
pkg/simple/client/monitoring/prometheus/testdata/labels-error-prom.json
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status":"error",
|
||||
"errorType":"bad_data",
|
||||
"error":"1:6: parse error: unexpected left brace '{'"
|
||||
}
|
||||
1
pkg/simple/client/monitoring/prometheus/testdata/labels-error-res.json
vendored
Normal file
1
pkg/simple/client/monitoring/prometheus/testdata/labels-error-res.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
[]
|
||||
125
pkg/simple/client/monitoring/prometheus/testdata/labels-prom.json
vendored
Normal file
125
pkg/simple/client/monitoring/prometheus/testdata/labels-prom.json
vendored
Normal file
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"status":"success",
|
||||
"data":[
|
||||
{
|
||||
"__name__":"kube_configmap_info",
|
||||
"configmap":"grafana-dashboard-cluster-total",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.140:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-prwbc",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"__name__":"kube_configmap_info",
|
||||
"configmap":"grafana-dashboard-cluster-total",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.172:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-6x2gr",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"__name__":"kube_configmap_info",
|
||||
"configmap":"grafana-dashboard-cluster-total",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.173:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-6646f8489d-2l482",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"__name__":"kube_configmap_info",
|
||||
"configmap":"grafana-dashboard-cluster-total",
|
||||
"instance":"10.233.99.140:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-prwbc"
|
||||
},
|
||||
{
|
||||
"__name__":"kube_configmap_info",
|
||||
"configmap":"grafana-dashboard-k8s-resources-workload",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.173:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-6646f8489d-2l482",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"__name__":"kube_configmap_info",
|
||||
"configmap":"grafana-dashboard-k8s-resources-workload",
|
||||
"instance":"10.233.99.140:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-prwbc"
|
||||
},
|
||||
{
|
||||
"__name__":"kube_configmap_info",
|
||||
"configmap":"grafana-dashboard-k8s-resources-workload",
|
||||
"instance":"10.233.99.172:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-6x2gr"
|
||||
},
|
||||
{
|
||||
"__name__":"kube_configmap_info",
|
||||
"configmap":"grafana-dashboard-namespace-by-pod",
|
||||
"instance":"10.233.99.172:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-6x2gr"
|
||||
},
|
||||
{
|
||||
"__name__":"kube_configmap_info",
|
||||
"configmap":"grafana-dashboard-persistentvolumesusage",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.140:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-prwbc",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"__name__":"kube_configmap_info",
|
||||
"configmap":"grafana-dashboard-persistentvolumesusage",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.172:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-6x2gr",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"__name__":"kube_configmap_info",
|
||||
"configmap":"grafana-dashboard-persistentvolumesusage",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.173:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-6646f8489d-2l482",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"__name__":"kube_configmap_info",
|
||||
"configmap":"grafana-dashboard-proxy",
|
||||
"instance":"10.233.99.172:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-6x2gr"
|
||||
},
|
||||
{
|
||||
"__name__":"kube_configmap_info",
|
||||
"configmap":"grafana-dashboard-scheduler",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.140:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-prwbc",
|
||||
"service":"kube-state-metrics"
|
||||
}
|
||||
]
|
||||
}
|
||||
109
pkg/simple/client/monitoring/prometheus/testdata/labels-res.json
vendored
Normal file
109
pkg/simple/client/monitoring/prometheus/testdata/labels-res.json
vendored
Normal file
@@ -0,0 +1,109 @@
|
||||
[
|
||||
{
|
||||
"configmap":"grafana-dashboard-cluster-total",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.140:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-prwbc",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"configmap":"grafana-dashboard-cluster-total",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.172:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-6x2gr",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"configmap":"grafana-dashboard-cluster-total",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.173:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-6646f8489d-2l482",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"configmap":"grafana-dashboard-cluster-total",
|
||||
"instance":"10.233.99.140:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-prwbc"
|
||||
},
|
||||
{
|
||||
"configmap":"grafana-dashboard-k8s-resources-workload",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.173:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-6646f8489d-2l482",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"configmap":"grafana-dashboard-k8s-resources-workload",
|
||||
"instance":"10.233.99.140:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-prwbc"
|
||||
},
|
||||
{
|
||||
"configmap":"grafana-dashboard-k8s-resources-workload",
|
||||
"instance":"10.233.99.172:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-6x2gr"
|
||||
},
|
||||
{
|
||||
"configmap":"grafana-dashboard-namespace-by-pod",
|
||||
"instance":"10.233.99.172:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-6x2gr"
|
||||
},
|
||||
{
|
||||
"configmap":"grafana-dashboard-persistentvolumesusage",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.140:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-prwbc",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"configmap":"grafana-dashboard-persistentvolumesusage",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.172:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-6x2gr",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"configmap":"grafana-dashboard-persistentvolumesusage",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.173:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-6646f8489d-2l482",
|
||||
"service":"kube-state-metrics"
|
||||
},
|
||||
{
|
||||
"configmap":"grafana-dashboard-proxy",
|
||||
"instance":"10.233.99.172:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-6x2gr"
|
||||
},
|
||||
{
|
||||
"configmap":"grafana-dashboard-scheduler",
|
||||
"endpoint":"https-main",
|
||||
"instance":"10.233.99.140:8443",
|
||||
"job":"kube-state-metrics",
|
||||
"namespace":"kubesphere-monitoring-system",
|
||||
"pod":"kube-state-metrics-869dc86c5b-prwbc",
|
||||
"service":"kube-state-metrics"
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user