query_hints.test.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import { getQueryHints, SUM_HINT_THRESHOLD_COUNT } from '../query_hints';
  2. describe('getQueryHints()', () => {
  3. it('returns no hints for no series', () => {
  4. expect(getQueryHints('', [])).toEqual(null);
  5. });
  6. it('returns no hints for empty series', () => {
  7. expect(getQueryHints('', [{ datapoints: [] }])).toEqual(null);
  8. });
  9. it('returns no hint for a monotonically decreasing series', () => {
  10. const series = [{ datapoints: [[23, 1000], [22, 1001]] }];
  11. const hints = getQueryHints('metric', series);
  12. expect(hints).toEqual(null);
  13. });
  14. it('returns no hint for a flat series', () => {
  15. const series = [{ datapoints: [[null, 1000], [23, 1001], [null, 1002], [23, 1003]] }];
  16. const hints = getQueryHints('metric', series);
  17. expect(hints).toEqual(null);
  18. });
  19. it('returns a rate hint for a monotonically increasing series', () => {
  20. const series = [{ datapoints: [[23, 1000], [24, 1001]] }];
  21. const hints = getQueryHints('metric', series);
  22. expect(hints!.length).toBe(1);
  23. expect(hints![0]).toMatchObject({
  24. label: 'Time series is monotonically increasing.',
  25. fix: {
  26. action: {
  27. type: 'ADD_RATE',
  28. query: 'metric',
  29. },
  30. },
  31. });
  32. });
  33. it('returns no rate hint for a monotonically increasing series that already has a rate', () => {
  34. const series = [{ datapoints: [[23, 1000], [24, 1001]] }];
  35. const hints = getQueryHints('rate(metric[1m])', series);
  36. expect(hints).toEqual(null);
  37. });
  38. it('returns a rate hint w/o action for a complex monotonically increasing series', () => {
  39. const series = [{ datapoints: [[23, 1000], [24, 1001]] }];
  40. const hints = getQueryHints('sum(metric)', series);
  41. expect(hints!.length).toBe(1);
  42. expect(hints![0].label).toContain('rate()');
  43. expect(hints![0].fix).toBeUndefined();
  44. });
  45. it('returns a rate hint for a monotonically increasing series with missing data', () => {
  46. const series = [{ datapoints: [[23, 1000], [null, 1001], [24, 1002]] }];
  47. const hints = getQueryHints('metric', series);
  48. expect(hints!.length).toBe(1);
  49. expect(hints![0]).toMatchObject({
  50. label: 'Time series is monotonically increasing.',
  51. fix: {
  52. action: {
  53. type: 'ADD_RATE',
  54. query: 'metric',
  55. },
  56. },
  57. });
  58. });
  59. it('returns a histogram hint for a bucket series', () => {
  60. const series = [{ datapoints: [[23, 1000]] }];
  61. const hints = getQueryHints('metric_bucket', series);
  62. expect(hints!.length).toBe(1);
  63. expect(hints![0]).toMatchObject({
  64. label: 'Time series has buckets, you probably wanted a histogram.',
  65. fix: {
  66. action: {
  67. type: 'ADD_HISTOGRAM_QUANTILE',
  68. query: 'metric_bucket',
  69. },
  70. },
  71. });
  72. });
  73. it('returns a sum hint when many time series results are returned for a simple metric', () => {
  74. const seriesCount = SUM_HINT_THRESHOLD_COUNT;
  75. const series = Array.from({ length: seriesCount }, _ => ({
  76. datapoints: [[0, 0], [0, 0]],
  77. }));
  78. const hints = getQueryHints('metric', series);
  79. expect(hints!.length).toBe(1);
  80. expect(hints![0]).toMatchObject({
  81. type: 'ADD_SUM',
  82. label: 'Many time series results returned.',
  83. fix: {
  84. label: 'Consider aggregating with sum().',
  85. action: {
  86. type: 'ADD_SUM',
  87. query: 'metric',
  88. preventSubmit: true,
  89. },
  90. },
  91. });
  92. });
  93. });