(t *testing.T)
| 453 | } |
| 454 | |
| 455 | func TestReportQueryStatsFormat(t *testing.T) { |
| 456 | outputBuf := bytes.NewBuffer(nil) |
| 457 | logger := log.NewSyncLogger(log.NewLogfmtLogger(outputBuf)) |
| 458 | userID := "fake" |
| 459 | req, _ := http.NewRequest(http.MethodGet, "http://localhost:8080/prometheus/api/v1/query", nil) |
| 460 | resp := &http.Response{ContentLength: 1000} |
| 461 | responseTime := time.Second |
| 462 | statusCode := http.StatusOK |
| 463 | |
| 464 | type testCase struct { |
| 465 | queryString url.Values |
| 466 | queryStats *querier_stats.QueryStats |
| 467 | header http.Header |
| 468 | responseErr error |
| 469 | expectedLog string |
| 470 | enabledRulerQueryStatsLog bool |
| 471 | source string |
| 472 | } |
| 473 | |
| 474 | tests := map[string]testCase{ |
| 475 | "should not include query and header details if empty": { |
| 476 | expectedLog: `level=info msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=0 response_series_count=0 fetched_series_count=0 fetched_chunks_count=0 fetched_samples_count=0 fetched_chunks_bytes=0 fetched_data_bytes=0 split_queries=0 status_code=200 response_size=1000 samples_scanned=0`, |
| 477 | source: requestmeta.SourceAPI, |
| 478 | }, |
| 479 | "should include query length and string at the end": { |
| 480 | queryString: url.Values(map[string][]string{"query": {"up"}}), |
| 481 | expectedLog: `level=info msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=0 response_series_count=0 fetched_series_count=0 fetched_chunks_count=0 fetched_samples_count=0 fetched_chunks_bytes=0 fetched_data_bytes=0 split_queries=0 status_code=200 response_size=1000 samples_scanned=0 query_length=2 param_query=up`, |
| 482 | source: requestmeta.SourceAPI, |
| 483 | }, |
| 484 | "should include query stats": { |
| 485 | queryStats: &querier_stats.QueryStats{ |
| 486 | QueryResponseSeries: 100, |
| 487 | Stats: querier_stats.Stats{ |
| 488 | WallTime: 3 * time.Second, |
| 489 | QueryStorageWallTime: 100 * time.Minute, |
| 490 | FetchedSeriesCount: 100, |
| 491 | FetchedChunksCount: 200, |
| 492 | FetchedSamplesCount: 300, |
| 493 | FetchedChunkBytes: 1024, |
| 494 | FetchedDataBytes: 2048, |
| 495 | SplitQueries: 10, |
| 496 | }, |
| 497 | }, |
| 498 | expectedLog: `level=info msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=3 response_series_count=100 fetched_series_count=100 fetched_chunks_count=200 fetched_samples_count=300 fetched_chunks_bytes=1024 fetched_data_bytes=2048 split_queries=10 status_code=200 response_size=1000 samples_scanned=0 query_storage_wall_time_seconds=6000`, |
| 499 | source: requestmeta.SourceAPI, |
| 500 | }, |
| 501 | "should include user agent": { |
| 502 | header: http.Header{"User-Agent": []string{"Grafana"}}, |
| 503 | expectedLog: `level=info msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=0 response_series_count=0 fetched_series_count=0 fetched_chunks_count=0 fetched_samples_count=0 fetched_chunks_bytes=0 fetched_data_bytes=0 split_queries=0 status_code=200 response_size=1000 samples_scanned=0 user_agent=Grafana`, |
| 504 | source: requestmeta.SourceAPI, |
| 505 | }, |
| 506 | "should include engine type": { |
| 507 | header: http.Header{http.CanonicalHeaderKey(engine.TypeHeader): []string{string(engine.Thanos)}}, |
| 508 | expectedLog: `level=info msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=0 response_series_count=0 fetched_series_count=0 fetched_chunks_count=0 fetched_samples_count=0 fetched_chunks_bytes=0 fetched_data_bytes=0 split_queries=0 status_code=200 response_size=1000 samples_scanned=0 engine_type=thanos`, |
| 509 | source: requestmeta.SourceAPI, |
| 510 | }, |
| 511 | "should include block store type": { |
| 512 | header: http.Header{http.CanonicalHeaderKey(querier.BlockStoreTypeHeader): []string{"parquet"}}, |
nothing calls this directly
no test coverage detected