Ctrl K
ComunidadGuías…

prom/client_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package prom

import (
	"context"
	"net/http"
	"net/http/httptest"
	"sort"
	"strconv"
	"testing"

	"github.com/coroot/coroot/db"
	"github.com/coroot/coroot/model"
	"github.com/coroot/coroot/timeseries"
	"github.com/coroot/coroot/utils"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestQueryRange(t *testing.T) {
	data := `{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"__name__":"metric","instance":"10.244.0.67:80","job":"job1"},"values":[[1675329024.959,"1"],[1675329040.959,"0.1"],[1675329082.959,"0.04"]]},{"metric":{"__name__":"metric","instance":"10.244.1.135:80","job":"job1"},"values":[[1675329024,"0.02"],[1675329041,"0.2"],[1675329082,"2"]]}]}}`

	from := timeseries.Time(1675329022)
	to := timeseries.Time(1675329082)
	step := timeseries.Duration(15)

	h := func(w http.ResponseWriter, r *http.Request) {
		assert.Equal(t, http.MethodPost, r.Method)
		assert.Equal(t, "/api/v1/query_range", r.URL.Path)
		assert.NoError(t, r.ParseForm())
		assert.Equal(t, "metric", r.Form.Get("query"))
		assert.Equal(t, from.Truncate(step).String(), r.Form.Get("start"))
		assert.Equal(t, to.Truncate(step).String(), r.Form.Get("end"))
		assert.Equal(t, strconv.FormatInt(int64(step), 10), r.Form.Get("step"))
		w.Write([]byte(data))
	}
	ts := httptest.NewServer(http.HandlerFunc(h))
	defer ts.Close()

	cfg := &db.IntegrationPrometheus{
		Url:           ts.URL,
		TlsSkipVerify: true,
	}
	client, err := NewClient(cfg, nil)
	require.NoError(t, err)

	ctx := context.Background()

	res, err := client.QueryRange(ctx, `metric`, utils.NewStringSet("instance", "job").Has, from, to, step)
	assert.NoError(t, err)

	assert.Len(t, res, 2)

	sort.Slice(res, func(i, j int) bool { return res[i].LabelsHash < res[j].LabelsHash })

	assert.Equal(t, model.Labels{"instance": "10.244.1.135:80", "job": "job1"}, res[0].Labels)
	assert.Equal(t, uint64(0x4d16a3f5248f3b7c), res[0].LabelsHash)
	assert.Equal(t, "TimeSeries(1675329015, 5, 15, [0.020000 0.200000 . . 2])", res[0].Values.String())

	assert.Equal(t, model.Labels{"instance": "10.244.0.67:80", "job": "job1"}, res[1].Labels)
	assert.Equal(t, uint64(0xef00d4db0b8b83bd), res[1].LabelsHash)
	assert.Equal(t, "TimeSeries(1675329015, 5, 15, [1 0.100000 . . 0.040000])", res[1].Values.String())
}

func Test_AddExtraSelector(t *testing.T) {
	check := func(src, extraSelector, expected string) {
		actual, err := AddExtraSelector(src, extraSelector)
		assert.NoError(t, err)
		assert.Equal(t, expected, actual)
	}
	check(
		`metric`,
		`{cluster="us-west-1", prom_instance=~"us.+"}`,
		`metric{cluster="us-west-1",prom_instance=~"us.+"}`)

	check(
		`rate(metric{label="value"}[1m])`,
		`{cluster="us-west-1", prom_instance=~"us.+"}`,
		`rate(metric{cluster="us-west-1",label="value",prom_instance=~"us.+"}[1m])`)

	check(
		`rate(node_resources_cpu_usage_seconds_total{mode!="idle"}[30s]) / ignoring(mode) group_left sum(rate(node_resources_cpu_usage_seconds_total[30s])) without(mode)*100`,
		`{cluster="cluster1"}`,
		`rate(node_resources_cpu_usage_seconds_total{cluster="cluster1",mode!="idle"}[30s]) / ignoring (mode) group_left () sum without (mode) (rate(node_resources_cpu_usage_seconds_total{cluster="cluster1"}[30s])) * 100`)
}