monitoring: some bug fix
Signed-off-by: huanggze <loganhuang@yunify.com>
This commit is contained in:
@@ -1,15 +1,14 @@
|
||||
package prometheus
|
||||
package expressions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/prometheus/common/model"
|
||||
"github.com/prometheus/prometheus/promql"
|
||||
"github.com/prometheus/prometheus/storage/metric"
|
||||
"kubesphere.io/kubesphere/pkg/models/monitoring/expressions"
|
||||
)
|
||||
|
||||
func init() {
|
||||
expressions.Register("prometheus", labelReplace)
|
||||
register("prometheus", labelReplace)
|
||||
}
|
||||
|
||||
func labelReplace(input, ns string) (string, error) {
|
||||
@@ -18,7 +17,7 @@ func labelReplace(input, ns string) (string, error) {
|
||||
return "", err
|
||||
}
|
||||
|
||||
SetRecursive(root, ns)
|
||||
setRecursive(root, ns)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
@@ -27,39 +26,39 @@ func labelReplace(input, ns string) (string, error) {
|
||||
}
|
||||
|
||||
// Inspired by https://github.com/openshift/prom-label-proxy
|
||||
func SetRecursive(node promql.Node, namespace string) (err error) {
|
||||
func setRecursive(node promql.Node, namespace string) (err error) {
|
||||
switch n := node.(type) {
|
||||
case *promql.EvalStmt:
|
||||
if err := SetRecursive(n.Expr, namespace); err != nil {
|
||||
if err := setRecursive(n.Expr, namespace); err != nil {
|
||||
return err
|
||||
}
|
||||
case promql.Expressions:
|
||||
for _, e := range n {
|
||||
if err := SetRecursive(e, namespace); err != nil {
|
||||
if err := setRecursive(e, namespace); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
case *promql.AggregateExpr:
|
||||
if err := SetRecursive(n.Expr, namespace); err != nil {
|
||||
if err := setRecursive(n.Expr, namespace); err != nil {
|
||||
return err
|
||||
}
|
||||
case *promql.BinaryExpr:
|
||||
if err := SetRecursive(n.LHS, namespace); err != nil {
|
||||
if err := setRecursive(n.LHS, namespace); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := SetRecursive(n.RHS, namespace); err != nil {
|
||||
if err := setRecursive(n.RHS, namespace); err != nil {
|
||||
return err
|
||||
}
|
||||
case *promql.Call:
|
||||
if err := SetRecursive(n.Args, namespace); err != nil {
|
||||
if err := setRecursive(n.Args, namespace); err != nil {
|
||||
return err
|
||||
}
|
||||
case *promql.ParenExpr:
|
||||
if err := SetRecursive(n.Expr, namespace); err != nil {
|
||||
if err := setRecursive(n.Expr, namespace); err != nil {
|
||||
return err
|
||||
}
|
||||
case *promql.UnaryExpr:
|
||||
if err := SetRecursive(n.Expr, namespace); err != nil {
|
||||
if err := setRecursive(n.Expr, namespace); err != nil {
|
||||
return err
|
||||
}
|
||||
case *promql.NumberLiteral, *promql.StringLiteral:
|
||||
@@ -1,4 +1,4 @@
|
||||
package prometheus
|
||||
package expressions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
@@ -4,6 +4,6 @@ type labelReplaceFn func(expr, ns string) (string, error)
|
||||
|
||||
var ReplaceNamespaceFns = make(map[string]labelReplaceFn)
|
||||
|
||||
func Register(name string, fn labelReplaceFn) {
|
||||
func register(name string, fn labelReplaceFn) {
|
||||
ReplaceNamespaceFns[name] = fn
|
||||
}
|
||||
|
||||
@@ -10,21 +10,52 @@ import (
|
||||
|
||||
func TestSort(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
target string
|
||||
order string
|
||||
identifier string
|
||||
source string
|
||||
raw string
|
||||
expected string
|
||||
}{
|
||||
{"sort in ascending order", "node_cpu_utilisation", "asc", "node", "source-node-metrics.json", "sorted-node-metrics-asc.json"},
|
||||
{"sort in descending order", "node_memory_utilisation", "desc", "node", "source-node-metrics.json", "sorted-node-metrics-desc.json"},
|
||||
{"sort faulty metrics", "node_memory_utilisation", "desc", "node", "faulty-node-metrics.json", "faulty-node-metrics-sorted.json"},
|
||||
{"sort metrics with an blank node", "node_memory_utilisation", "desc", "node", "blank-node-metrics.json", "blank-node-metrics-sorted.json"},
|
||||
{
|
||||
target: "node_cpu_utilisation",
|
||||
order: "asc",
|
||||
identifier: "node",
|
||||
raw: "source-node-metrics.json",
|
||||
expected: "sorted-node-metrics-asc.json",
|
||||
},
|
||||
{
|
||||
target: "node_memory_utilisation",
|
||||
order: "desc",
|
||||
identifier: "node",
|
||||
raw: "source-node-metrics.json",
|
||||
expected: "sorted-node-metrics-desc.json",
|
||||
},
|
||||
{
|
||||
target: "node_memory_utilisation",
|
||||
order: "desc",
|
||||
identifier: "node",
|
||||
raw: "faulty-node-metrics.json",
|
||||
expected: "faulty-node-metrics-sorted.json",
|
||||
},
|
||||
{
|
||||
target: "node_memory_utilisation",
|
||||
order: "desc",
|
||||
identifier: "node",
|
||||
raw: "blank-node-metrics.json",
|
||||
expected: "blank-node-metrics-sorted.json",
|
||||
},
|
||||
{
|
||||
target: "node_memory_utilisation",
|
||||
order: "desc",
|
||||
identifier: "node",
|
||||
raw: "null-node-metrics.json",
|
||||
expected: "null-node-metrics-sorted.json",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
source, expected, err := jsonFromFile(tt.source, tt.expected)
|
||||
|
||||
for i, tt := range tests {
|
||||
t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
|
||||
source, expected, err := jsonFromFile(tt.raw, tt.expected)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -39,21 +70,46 @@ func TestSort(t *testing.T) {
|
||||
|
||||
func TestPage(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
page int
|
||||
limit int
|
||||
source string
|
||||
raw string
|
||||
expected string
|
||||
}{
|
||||
{"page 0 limit 5", 0, 5, "sorted-node-metrics-asc.json", "sorted-node-metrics-asc.json"},
|
||||
{"page 1 limit 5", 1, 5, "sorted-node-metrics-asc.json", "paged-node-metrics-1.json"},
|
||||
{"page 2 limit 5", 2, 5, "sorted-node-metrics-asc.json", "paged-node-metrics-2.json"},
|
||||
{"page 3 limit 5", 3, 5, "sorted-node-metrics-asc.json", "paged-node-metrics-3.json"},
|
||||
{"page faulty metrics", 1, 2, "faulty-node-metrics-sorted.json", "faulty-node-metrics-paged.json"},
|
||||
{
|
||||
page: 0,
|
||||
limit: 5,
|
||||
raw: "sorted-node-metrics-asc.json",
|
||||
expected: "sorted-node-metrics-asc.json",
|
||||
},
|
||||
{
|
||||
page: 1,
|
||||
limit: 5,
|
||||
raw: "sorted-node-metrics-asc.json",
|
||||
expected: "paged-node-metrics-1.json",
|
||||
},
|
||||
{
|
||||
page: 2,
|
||||
limit: 5,
|
||||
raw: "sorted-node-metrics-asc.json",
|
||||
expected: "paged-node-metrics-2.json",
|
||||
},
|
||||
{
|
||||
page: 3,
|
||||
limit: 5,
|
||||
raw: "sorted-node-metrics-asc.json",
|
||||
expected: "paged-node-metrics-3.json",
|
||||
},
|
||||
{
|
||||
page: 1,
|
||||
limit: 2,
|
||||
raw: "faulty-node-metrics-sorted.json",
|
||||
expected: "faulty-node-metrics-paged.json",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
source, expected, err := jsonFromFile(tt.source, tt.expected)
|
||||
|
||||
for i, tt := range tests {
|
||||
t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
|
||||
source, expected, err := jsonFromFile(tt.raw, tt.expected)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
53
pkg/models/monitoring/testdata/null-node-metrics-sorted.json
vendored
Normal file
53
pkg/models/monitoring/testdata/null-node-metrics-sorted.json
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"results": [
|
||||
{
|
||||
"metric_name": "node_disk_size_utilisation",
|
||||
"data": {
|
||||
"resultType": "vector",
|
||||
"result": [
|
||||
{},
|
||||
{},
|
||||
{}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"metric_name": "node_memory_utilisation",
|
||||
"data": {
|
||||
"resultType": "vector",
|
||||
"result": [
|
||||
{
|
||||
"metric": {
|
||||
"node": "i-2dazc1d6"
|
||||
},
|
||||
"value": [
|
||||
1585658599.195,
|
||||
0.5286875837861773
|
||||
]
|
||||
},
|
||||
{
|
||||
"metric": {
|
||||
"node": "i-hgcoippu"
|
||||
},
|
||||
"value": [
|
||||
1585658599.195,
|
||||
0.2497060264216553
|
||||
]
|
||||
},
|
||||
{
|
||||
"metric": {
|
||||
"node": "i-ezjb7gsk"
|
||||
},
|
||||
"value": [
|
||||
1585658599.195,
|
||||
0.23637090535053928
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"page": 1,
|
||||
"total_page": 1,
|
||||
"total_item": 3
|
||||
}
|
||||
45
pkg/models/monitoring/testdata/null-node-metrics.json
vendored
Normal file
45
pkg/models/monitoring/testdata/null-node-metrics.json
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"results": [
|
||||
{
|
||||
"metric_name": "node_disk_size_utilisation",
|
||||
"data": {
|
||||
"resultType": "vector"
|
||||
}
|
||||
},
|
||||
{
|
||||
"metric_name": "node_memory_utilisation",
|
||||
"data": {
|
||||
"resultType": "vector",
|
||||
"result": [
|
||||
{
|
||||
"metric": {
|
||||
"node": "i-2dazc1d6"
|
||||
},
|
||||
"value": [
|
||||
1585658599.195,
|
||||
0.5286875837861773
|
||||
]
|
||||
},
|
||||
{
|
||||
"metric": {
|
||||
"node": "i-ezjb7gsk"
|
||||
},
|
||||
"value": [
|
||||
1585658599.195,
|
||||
0.23637090535053928
|
||||
]
|
||||
},
|
||||
{
|
||||
"metric": {
|
||||
"node": "i-hgcoippu"
|
||||
},
|
||||
"value": [
|
||||
1585658599.195,
|
||||
0.2497060264216553
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user