tempo/modules/frontend/combiner/trace_by_id_v2_test.go
Joe Elliott 6c07024064 Add TraceQL query hint to retrieve most recent results ordered by trace start time (#4238)
* Added ordered results

Signed-off-by: Joe Elliott <number101010@gmail.com>

* add most_recent query hint

Signed-off-by: Joe Elliott <number101010@gmail.com>

* changelog, docs and lint

Signed-off-by: Joe Elliott <number101010@gmail.com>

* e2e tests - fixed tag search

Signed-off-by: Joe Elliott <number101010@gmail.com>

* lint

Signed-off-by: Joe Elliott <number101010@gmail.com>

* remove clone changes

Signed-off-by: Joe Elliott <number101010@gmail.com>

* review

Signed-off-by: Joe Elliott <number101010@gmail.com>

* make shards configurable

Signed-off-by: Joe Elliott <number101010@gmail.com>

* dont mess with me lint. i will uninstall you

Signed-off-by: Joe Elliott <number101010@gmail.com>

* Make all endpoints search backwards in time

Signed-off-by: Joe Elliott <number101010@gmail.com>

* nice work on this one carles

Signed-off-by: Joe Elliott <number101010@gmail.com>

* consolidate block meta functions

Signed-off-by: Joe Elliott <number101010@gmail.com>

* fix merge :P

Signed-off-by: Joe Elliott <number101010@gmail.com>

* remove tests

Signed-off-by: Joe Elliott <number101010@gmail.com>

* don't bother tracking normal searches

Signed-off-by: Joe Elliott <number101010@gmail.com>

---------

Signed-off-by: Joe Elliott <number101010@gmail.com>
2025-02-12 16:33:10 -05:00

127 lines
3.5 KiB
Go

package combiner
import (
"bytes"
"io"
"net/http"
"testing"
"github.com/gogo/protobuf/jsonpb"
"github.com/gogo/protobuf/proto"
"github.com/grafana/tempo/pkg/api"
"github.com/grafana/tempo/pkg/tempopb"
"github.com/grafana/tempo/pkg/util/test"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
type MockResponse struct {
resp *http.Response
}
func (m MockResponse) HTTPResponse() *http.Response {
return m.resp
}
func (m MockResponse) RequestData() any {
return nil
}
func (m MockResponse) IsMetadata() bool {
return false
}
func TestNewTraceByIdV2ReturnsAPartialTrace(t *testing.T) {
traceResponse := &tempopb.TraceByIDResponse{
Trace: test.MakeTrace(2, []byte{0x01, 0x02}),
Metrics: &tempopb.TraceByIDMetrics{},
}
resBytes, err := proto.Marshal(traceResponse)
require.NoError(t, err)
response := http.Response{
StatusCode: 200,
Header: map[string][]string{
"Content-Type": {"application/protobuf"},
},
Body: io.NopCloser(bytes.NewReader(resBytes)),
}
combiner := NewTraceByIDV2(10, api.HeaderAcceptJSON)
err = combiner.AddResponse(MockResponse{&response})
require.NoError(t, err)
res, err := combiner.HTTPFinal()
require.NoError(t, err)
actualResp := &tempopb.TraceByIDResponse{}
err = new(jsonpb.Unmarshaler).Unmarshal(res.Body, actualResp)
require.NoError(t, err)
assert.Equal(t, actualResp.Status, tempopb.TraceByIDResponse_PARTIAL)
}
func TestNewTraceByIdV2ReturnsAPartialTraceOnPartialTraceReturnedByQuerier(t *testing.T) {
traceResponse := &tempopb.TraceByIDResponse{
Trace: test.MakeTrace(2, []byte{0x01, 0x02}),
Status: tempopb.TraceByIDResponse_PARTIAL,
Metrics: &tempopb.TraceByIDMetrics{},
}
resBytes, err := proto.Marshal(traceResponse)
require.NoError(t, err)
response := http.Response{
StatusCode: 200,
Header: map[string][]string{
"Content-Type": {"application/protobuf"},
},
Body: io.NopCloser(bytes.NewReader(resBytes)),
}
combiner := NewTraceByIDV2(10, api.HeaderAcceptJSON)
err = combiner.AddResponse(MockResponse{&response})
require.NoError(t, err)
res, err := combiner.HTTPFinal()
require.NoError(t, err)
actualResp := &tempopb.TraceByIDResponse{}
err = new(jsonpb.Unmarshaler).Unmarshal(res.Body, actualResp)
require.NoError(t, err)
assert.Equal(t, actualResp.Status, tempopb.TraceByIDResponse_PARTIAL)
}
func TestNewTraceByIDV2(t *testing.T) {
traceResponse := &tempopb.TraceByIDResponse{
Trace: test.MakeTrace(2, []byte{0x01, 0x02}),
Metrics: &tempopb.TraceByIDMetrics{},
}
resBytes, err := proto.Marshal(traceResponse)
require.NoError(t, err)
response := http.Response{
StatusCode: 200,
Header: map[string][]string{
"Content-Type": {"application/protobuf"},
},
Body: io.NopCloser(bytes.NewReader(resBytes)),
}
t.Run("returns a combined trace response as JSON", func(t *testing.T) {
combiner := NewTraceByIDV2(100_000, api.HeaderAcceptJSON)
err = combiner.AddResponse(MockResponse{&response})
require.NoError(t, err)
res, err := combiner.HTTPFinal()
require.NoError(t, err)
assert.Equal(t, "application/json", res.Header.Get("Content-Type"))
actualResp := &tempopb.TraceByIDResponse{}
err = new(jsonpb.Unmarshaler).Unmarshal(res.Body, actualResp)
require.NoError(t, err)
})
t.Run("returns a combined trace response as protobuff", func(t *testing.T) {
combiner := NewTraceByIDV2(100_000, api.HeaderAcceptProtobuf)
err = combiner.AddResponse(MockResponse{&response})
require.NoError(t, err)
res, err := combiner.HTTPFinal()
require.NoError(t, err)
require.NotNil(t, res)
})
}