package datasource import ( "encoding/json" "testing" "time" ) func BenchmarkMetrics(b *testing.B) { payload := []byte(`[{"metric":{"__name__":"vm_rows"},"value":[1583786142,"13763"]},{"metric":{"__name__":"vm_requests", "foo":"bar", "baz": "qux"},"value":[1583786140,"2000"]}]`) var pi promInstant if err := json.Unmarshal(payload, &pi.Result); err != nil { b.Fatalf(err.Error()) } b.Run("Instant", func(b *testing.B) { for i := 0; i < b.N; i++ { _, _ = pi.metrics() } }) } func TestGetPrometheusReqTimestamp(t *testing.T) { offset := 30 * time.Minute testCases := []struct { name string s *VMStorage queryTimeAlignment bool originTS, expTS string }{ { "with eval_offset, find previous offset point", &VMStorage{ evaluationOffset: &offset, evaluationInterval: time.Hour, lookBack: 1 * time.Minute, }, false, "2023-08-28T11:11:00+00:00", "2023-08-28T10:30:00+00:00", }, { "with eval_offset", &VMStorage{ evaluationOffset: &offset, evaluationInterval: time.Hour, }, true, "2023-08-28T11:41:00+00:00", "2023-08-28T11:30:00+00:00", }, { "with query align", &VMStorage{ evaluationInterval: time.Hour, }, true, "2023-08-28T11:11:00+00:00", "2023-08-28T11:00:00+00:00", }, { "with query align and lookback", &VMStorage{ evaluationInterval: time.Hour, lookBack: 1 * time.Minute, }, true, "2023-08-28T11:11:00+00:00", "2023-08-28T10:59:00+00:00", }, { "without query align", &VMStorage{ evaluationInterval: time.Hour, }, false, "2023-08-28T11:11:00+00:00", "2023-08-28T11:11:00+00:00", }, } for _, tc := range testCases { oldAlignPara := *queryTimeAlignment *queryTimeAlignment = tc.queryTimeAlignment originT, _ := time.Parse(time.RFC3339, tc.originTS) expT, _ := time.Parse(time.RFC3339, tc.expTS) gotTS := tc.s.adjustReqTimestamp(originT) if !gotTS.Equal(expT) { t.Fatalf("get wrong prometheus request timestamp, expect %s, got %s", expT, gotTS) } *queryTimeAlignment = oldAlignPara } }