mirror of
https://github.com/grafana/tempo.git
synced 2025-03-14 03:06:42 +00:00
* 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>
127 lines
3.5 KiB
Go
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)
|
|
})
|
|
}
|