func TestQuery(t *testing.T) { defer leaktest.AfterTest(t)() var tsrv server.TestServer if err := tsrv.Start(); err != nil { t.Fatal(err) } defer tsrv.Stop() // Populate data directly. tsdb := tsrv.TsDB() if err := tsdb.StoreData(ts.Resolution10s, []tspb.TimeSeriesData{ { Name: "test.metric", Source: "source1", Datapoints: []tspb.TimeSeriesDatapoint{ { TimestampNanos: 400 * 1e9, Value: 100.0, }, { TimestampNanos: 500 * 1e9, Value: 200.0, }, { TimestampNanos: 520 * 1e9, Value: 300.0, }, }, }, { Name: "test.metric", Source: "source2", Datapoints: []tspb.TimeSeriesDatapoint{ { TimestampNanos: 400 * 1e9, Value: 100.0, }, { TimestampNanos: 500 * 1e9, Value: 200.0, }, { TimestampNanos: 510 * 1e9, Value: 250.0, }, { TimestampNanos: 530 * 1e9, Value: 350.0, }, }, }, { Name: "other.metric", Datapoints: []tspb.TimeSeriesDatapoint{ { TimestampNanos: 400 * 1e9, Value: 100.0, }, { TimestampNanos: 500 * 1e9, Value: 200.0, }, { TimestampNanos: 510 * 1e9, Value: 250.0, }, }, }, }); err != nil { t.Fatal(err) } expectedResult := &tspb.TimeSeriesQueryResponse{ Results: []tspb.TimeSeriesQueryResponse_Result{ { Query: tspb.Query{ Name: "test.metric", Sources: []string{"source1", "source2"}, Downsampler: tspb.TimeSeriesQueryAggregator_AVG.Enum(), SourceAggregator: tspb.TimeSeriesQueryAggregator_SUM.Enum(), Derivative: tspb.TimeSeriesQueryDerivative_NONE.Enum(), }, Datapoints: []tspb.TimeSeriesDatapoint{ { TimestampNanos: 505 * 1e9, Value: 400.0, }, { TimestampNanos: 515 * 1e9, Value: 500.0, }, { TimestampNanos: 525 * 1e9, Value: 600.0, }, }, }, { Query: tspb.Query{ Name: "other.metric", Sources: []string{""}, Downsampler: tspb.TimeSeriesQueryAggregator_AVG.Enum(), SourceAggregator: tspb.TimeSeriesQueryAggregator_SUM.Enum(), Derivative: tspb.TimeSeriesQueryDerivative_NONE.Enum(), }, Datapoints: []tspb.TimeSeriesDatapoint{ { TimestampNanos: 505 * 1e9, Value: 200.0, }, { TimestampNanos: 515 * 1e9, Value: 250.0, }, }, }, { Query: tspb.Query{ Name: "test.metric", Sources: []string{"source1", "source2"}, Downsampler: tspb.TimeSeriesQueryAggregator_MAX.Enum(), SourceAggregator: tspb.TimeSeriesQueryAggregator_MAX.Enum(), Derivative: tspb.TimeSeriesQueryDerivative_DERIVATIVE.Enum(), }, Datapoints: []tspb.TimeSeriesDatapoint{ { TimestampNanos: 505 * 1e9, Value: 1.0, }, { TimestampNanos: 515 * 1e9, Value: 5.0, }, { TimestampNanos: 525 * 1e9, Value: 5.0, }, }, }, }, } conn, err := tsrv.RPCContext().GRPCDial(tsrv.Ctx.Addr) if err != nil { t.Fatal(err) } response, err := tspb.NewTimeSeriesClient(conn).Query(context.Background(), &tspb.TimeSeriesQueryRequest{ StartNanos: 500 * 1e9, EndNanos: 526 * 1e9, Queries: []tspb.Query{ { Name: "test.metric", }, { Name: "other.metric", }, { Name: "test.metric", Downsampler: tspb.TimeSeriesQueryAggregator_MAX.Enum(), SourceAggregator: tspb.TimeSeriesQueryAggregator_MAX.Enum(), Derivative: tspb.TimeSeriesQueryDerivative_DERIVATIVE.Enum(), }, }, }) if err != nil { t.Fatal(err) } for _, r := range response.Results { sort.Strings(r.Sources) } if !proto.Equal(response, expectedResult) { t.Fatalf("actual response \n%v\n did not match expected response \n%v", response, expectedResult) } }
func TestHttpQuery(t *testing.T) { defer leaktest.AfterTest(t)() var tsrv server.TestServer if err := tsrv.Start(); err != nil { t.Fatal(err) } defer tsrv.Stop() // Populate data directly. tsdb := tsrv.TsDB() if err := tsdb.StoreData(ts.Resolution10s, []ts.TimeSeriesData{ { Name: "test.metric", Source: "source1", Datapoints: []ts.TimeSeriesDatapoint{ { TimestampNanos: 400 * 1e9, Value: 100.0, }, { TimestampNanos: 500 * 1e9, Value: 200.0, }, { TimestampNanos: 520 * 1e9, Value: 300.0, }, }, }, { Name: "test.metric", Source: "source2", Datapoints: []ts.TimeSeriesDatapoint{ { TimestampNanos: 400 * 1e9, Value: 100.0, }, { TimestampNanos: 500 * 1e9, Value: 200.0, }, { TimestampNanos: 510 * 1e9, Value: 250.0, }, { TimestampNanos: 530 * 1e9, Value: 350.0, }, }, }, { Name: "other.metric", Datapoints: []ts.TimeSeriesDatapoint{ { TimestampNanos: 400 * 1e9, Value: 100.0, }, { TimestampNanos: 500 * 1e9, Value: 200.0, }, { TimestampNanos: 510 * 1e9, Value: 250.0, }, }, }, }); err != nil { t.Fatal(err) } expectedResult := ts.TimeSeriesQueryResponse{ Results: []ts.TimeSeriesQueryResponse_Result{ { Query: ts.Query{ Name: "test.metric", Sources: []string{"source1", "source2"}, Downsampler: ts.TimeSeriesQueryAggregator_AVG.Enum(), SourceAggregator: ts.TimeSeriesQueryAggregator_SUM.Enum(), Derivative: ts.TimeSeriesQueryDerivative_NONE.Enum(), }, Datapoints: []ts.TimeSeriesDatapoint{ { TimestampNanos: 505 * 1e9, Value: 400.0, }, { TimestampNanos: 515 * 1e9, Value: 500.0, }, { TimestampNanos: 525 * 1e9, Value: 600.0, }, }, }, { Query: ts.Query{ Name: "other.metric", Sources: []string{""}, Downsampler: ts.TimeSeriesQueryAggregator_AVG.Enum(), SourceAggregator: ts.TimeSeriesQueryAggregator_SUM.Enum(), Derivative: ts.TimeSeriesQueryDerivative_NONE.Enum(), }, Datapoints: []ts.TimeSeriesDatapoint{ { TimestampNanos: 505 * 1e9, Value: 200.0, }, { TimestampNanos: 515 * 1e9, Value: 250.0, }, }, }, { Query: ts.Query{ Name: "test.metric", Sources: []string{"source1", "source2"}, Downsampler: ts.TimeSeriesQueryAggregator_MAX.Enum(), SourceAggregator: ts.TimeSeriesQueryAggregator_MAX.Enum(), Derivative: ts.TimeSeriesQueryDerivative_DERIVATIVE.Enum(), }, Datapoints: []ts.TimeSeriesDatapoint{ { TimestampNanos: 505 * 1e9, Value: 1.0, }, { TimestampNanos: 515 * 1e9, Value: 5.0, }, { TimestampNanos: 525 * 1e9, Value: 5.0, }, }, }, }, } var response ts.TimeSeriesQueryResponse session := makeTestHTTPSession(t, &tsrv.Ctx.Context, tsrv.HTTPAddr()) if err := session.PostProto(ts.URLQuery, &ts.TimeSeriesQueryRequest{ StartNanos: 500 * 1e9, EndNanos: 526 * 1e9, Queries: []ts.Query{ { Name: "test.metric", }, { Name: "other.metric", }, { Name: "test.metric", Downsampler: ts.TimeSeriesQueryAggregator_MAX.Enum(), SourceAggregator: ts.TimeSeriesQueryAggregator_MAX.Enum(), Derivative: ts.TimeSeriesQueryDerivative_DERIVATIVE.Enum(), }, }, }, &response); err != nil { t.Fatal(err) } for _, r := range response.Results { sort.Strings(r.Sources) } if !reflect.DeepEqual(response, expectedResult) { t.Fatalf("actual response \n%v\n did not match expected response \n%v", response, expectedResult) } }