(t *testing.T)
| 1907 | } |
| 1908 | |
| 1909 | func TestMaxOverTimeForSpanAttribute(t *testing.T) { |
| 1910 | req := &tempopb.QueryRangeRequest{ |
| 1911 | Start: 1, |
| 1912 | End: uint64(3 * time.Second), |
| 1913 | Step: uint64(1 * time.Second), |
| 1914 | Query: "{ } | max_over_time(span.http.status_code) by (span.foo)", |
| 1915 | } |
| 1916 | |
| 1917 | // A variety of spans across times, durations, and series. All durations are powers of 2 for simplicity |
| 1918 | in := []Span{ |
| 1919 | newMockSpan(nil).WithStartTime(uint64(1*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 200).WithDuration(128), |
| 1920 | newMockSpan(nil).WithStartTime(uint64(1*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 404).WithDuration(256), |
| 1921 | newMockSpan(nil).WithStartTime(uint64(1*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 200).WithDuration(512), |
| 1922 | |
| 1923 | newMockSpan(nil).WithStartTime(uint64(2*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 200).WithDuration(256), |
| 1924 | newMockSpan(nil).WithStartTime(uint64(2*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 200).WithDuration(64), |
| 1925 | newMockSpan(nil).WithStartTime(uint64(2*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 200).WithDuration(256), |
| 1926 | newMockSpan(nil).WithStartTime(uint64(2*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 200).WithDuration(8), |
| 1927 | |
| 1928 | newMockSpan(nil).WithStartTime(uint64(3*time.Second)).WithSpanString("foo", "baz").WithSpanInt("http.status_code", 201).WithDuration(512), |
| 1929 | newMockSpan(nil).WithStartTime(uint64(3*time.Second)).WithSpanString("foo", "baz").WithSpanInt("http.status_code", 401).WithDuration(1024), |
| 1930 | newMockSpan(nil).WithStartTime(uint64(3*time.Second)).WithSpanString("foo", "baz").WithSpanInt("http.status_code", 500).WithDuration(512), |
| 1931 | } |
| 1932 | |
| 1933 | in2 := []Span{ |
| 1934 | newMockSpan(nil).WithStartTime(uint64(1*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 100).WithDuration(128), |
| 1935 | newMockSpan(nil).WithStartTime(uint64(1*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 200).WithDuration(256), |
| 1936 | newMockSpan(nil).WithStartTime(uint64(1*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 300).WithDuration(512), |
| 1937 | newMockSpan(nil).WithStartTime(uint64(1*time.Second)).WithSpanString("foo", "baz").WithSpanInt("http.status_code", 204).WithDuration(512), |
| 1938 | |
| 1939 | newMockSpan(nil).WithStartTime(uint64(2*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 400).WithDuration(256), |
| 1940 | newMockSpan(nil).WithStartTime(uint64(2*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 401).WithDuration(64), |
| 1941 | newMockSpan(nil).WithStartTime(uint64(2*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 402).WithDuration(256), |
| 1942 | newMockSpan(nil).WithStartTime(uint64(2*time.Second)).WithSpanString("foo", "bar").WithSpanInt("http.status_code", 403).WithDuration(8), |
| 1943 | |
| 1944 | newMockSpan(nil).WithStartTime(uint64(3*time.Second)).WithSpanString("foo", "baz").WithSpanInt("http.status_code", 200).WithDuration(512), |
| 1945 | newMockSpan(nil).WithStartTime(uint64(3*time.Second)).WithSpanString("foo", "baz").WithSpanInt("http.status_code", 300).WithDuration(1024), |
| 1946 | newMockSpan(nil).WithStartTime(uint64(3*time.Second)).WithSpanString("foo", "baz").WithSpanInt("http.status_code", 400).WithDuration(512), |
| 1947 | } |
| 1948 | |
| 1949 | result, seriesCount, err := runTraceQLMetric(req, in, in2) |
| 1950 | require.NoError(t, err) |
| 1951 | require.Equal(t, len(result), seriesCount) |
| 1952 | |
| 1953 | fooBaz := result[LabelsFromArgs("span.foo", "baz").MapKey()] |
| 1954 | fooBar := result[LabelsFromArgs("span.foo", "bar").MapKey()] |
| 1955 | |
| 1956 | // Alas,we cannot compare with require.Equal because NaN != NaN |
| 1957 | // foo.baz = (204, NaN, 500) |
| 1958 | assert.Equal(t, 204.0, fooBaz.Values[0]) |
| 1959 | assert.True(t, math.IsNaN(fooBaz.Values[1])) |
| 1960 | assert.Equal(t, 500.0, fooBaz.Values[2]) |
| 1961 | |
| 1962 | // foo.bar = (404,403, NaN) |
| 1963 | assert.Equal(t, 404.0, fooBar.Values[0]) |
| 1964 | assert.Equal(t, 403.0, fooBar.Values[1]) |
| 1965 | assert.True(t, math.IsNaN(fooBar.Values[2])) |
| 1966 |
nothing calls this directly
no test coverage detected