Skip to content

Commit

Permalink
Add fixtures and Unit tests for API
Browse files Browse the repository at this point in the history
Signed-off-by: Navin Shrinivas <karupal2002@gmail.com>
  • Loading branch information
NavinShrinivas committed Feb 1, 2024
1 parent d1f2e8c commit c98bb4d
Show file tree
Hide file tree
Showing 6 changed files with 187 additions and 101 deletions.
52 changes: 52 additions & 0 deletions cmd/query/app/fixture/otlp2jaeger-in.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{
"resourceSpans":[
{
"resource":{
"attributes":[
{
"key":"service.name",
"value":{
"stringValue":"telemetrygen"
}
}
]
},
"scopeSpans":[
{
"scope":{
"name":"telemetrygen"
},
"spans":[
{
"traceId":"83a9efd15c1c98a977e0711cc93ee28b",
"spanId":"e127af99e3b3e074",
"parentSpanId":"909541b92cf05311",
"name":"okey-dokey-0",
"kind":2,
"startTimeUnixNano":"1706678909209712000",
"endTimeUnixNano":"1706678909209835000",
"attributes":[
{
"key":"net.peer.ip",
"value":{
"stringValue":"1.2.3.4"
}
},
{
"key":"peer.service",
"value":{
"stringValue":"telemetrygen-client"
}
}
],
"status":{

}
}
]
}
],
"schemaUrl":"https://opentelemetry.io/schemas/1.4.0"
}
]
}
59 changes: 59 additions & 0 deletions cmd/query/app/fixture/otlp2jaeger-out.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
{
"data": [
{
"traceID": "83a9efd15c1c98a977e0711cc93ee28b",
"spans": [
{
"traceID": "83a9efd15c1c98a977e0711cc93ee28b",
"spanID": "e127af99e3b3e074",
"operationName": "okey-dokey-0",
"references": [
{
"refType": "CHILD_OF",
"traceID": "83a9efd15c1c98a977e0711cc93ee28b",
"spanID": "909541b92cf05311"
}
],
"startTime": 1706678909209712,
"duration": 123,
"tags": [
{
"key": "otel.library.name",
"type": "string",
"value": "telemetrygen"
},
{
"key": "net.peer.ip",
"type": "string",
"value": "1.2.3.4"
},
{
"key": "peer.service",
"type": "string",
"value": "telemetrygen-client"
},
{
"key": "span.kind",
"type": "string",
"value": "server"
}
],
"logs": [],
"processID": "p1",
"warnings": null
}
],
"processes": {
"p1": {
"serviceName": "telemetrygen",
"tags": []
}
},
"warnings": null
}
],
"total": 0,
"limit": 0,
"offset": 0,
"errors": null
}
6 changes: 3 additions & 3 deletions cmd/query/app/http_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,13 +202,13 @@ func (aH *APIHandler) transformOTLP(w http.ResponseWriter, r *http.Request) {
}

var uiErrors []structuredError
batches, err := OTLP2model(body)
batches, err := otlp2model(body)

if aH.handleError(w, err, http.StatusInternalServerError) {
return
}

traces, err := BatchesToTraces(batches)
traces, err := batchesToTraces(batches)

if aH.handleError(w, err, http.StatusInternalServerError) {
return
Expand All @@ -217,7 +217,7 @@ func (aH *APIHandler) transformOTLP(w http.ResponseWriter, r *http.Request) {
uiTraces := make([]*ui.Trace, len(traces))

for i, v := range traces {
uiTrace, uiErr := aH.convertModelToUI(&v, false)
uiTrace, uiErr := aH.convertModelToUI(v, false)
if uiErr != nil {
uiErrors = append(uiErrors, *uiErr)
}
Expand Down
51 changes: 51 additions & 0 deletions cmd/query/app/http_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"math"
"net/http"
"net/http/httptest"
"os"
"testing"
"time"

Expand Down Expand Up @@ -270,6 +271,33 @@ func TestWriteJSON(t *testing.T) {
}
}

func readOTLPTraces(t *testing.T) (interface{}, error) {
dat, err := os.ReadFile("./fixture/otlp2jaeger-in.json")
if err != nil {
return nil, err
} else {
require.NoError(t, err)
var out interface{}
err := json.Unmarshal(dat, out)
require.NoError(t, err)
return out, nil

}
}

func readJaegerTraces(t *testing.T) (interface{}, error) {
dat, err := os.ReadFile("./fixture/otlp2jaeger-out.json")
if err != nil {
return nil, err
} else {
var out interface{}
require.NoError(t, err)
err := json.Unmarshal(dat, out)
require.NoError(t, err)
return out, nil
}
}

func TestGetTrace(t *testing.T) {
testCases := []struct {
suffix string
Expand Down Expand Up @@ -623,6 +651,29 @@ func TestGetOperationsLegacyStorageFailure(t *testing.T) {
require.Error(t, err)
}

func TestTransformOTLPSuccess(t *testing.T) {
withTestServer(func(ts *testServer) {
var response interface{}
request, err := readOTLPTraces(t)
require.NoError(t, err)
err = postJSON(ts.server.URL+"/api/transform", request, response)
require.NoError(t, err)
corectResponse, err := readJaegerTraces(t)
require.NoError(t, err)
assert.Equal(t, response, corectResponse)
}, querysvc.QueryServiceOptions{})
}

func TestTransformOTLPEmptyFailure(t *testing.T) {
withTestServer(func(ts *testServer) {
var response interface{}
var request interface{} // Keeping request empty for checking behaviour

Check failure on line 670 in cmd/query/app/http_handler_test.go

View workflow job for this annotation

GitHub Actions / lint

S1021: should merge variable declaration with assignment on next line (gosimple)
request = ""
err := postJSON(ts.server.URL+"/api/transform", request, response)
require.Error(t, err)
}, querysvc.QueryServiceOptions{})
}

func TestGetMetricsSuccess(t *testing.T) {
mr := &metricsmocks.Reader{}
apiHandlerOptions := []HandlerOption{
Expand Down
51 changes: 20 additions & 31 deletions cmd/query/app/otlp_translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import (
"github.com/jaegertracing/jaeger/model"
)

func OTLP2model(OTLPSpans []byte) ([]*model.Batch, error) {
func otlp2model(OTLPSpans []byte) ([]*model.Batch, error) {

Check failure on line 26 in cmd/query/app/otlp_translator.go

View workflow job for this annotation

GitHub Actions / lint

captLocal: `OTLPSpans' should not be capitalized (gocritic)
ptraceUnmarshaler := ptrace.JSONUnmarshaler{}
otlpTraces, err := ptraceUnmarshaler.UnmarshalTraces(OTLPSpans)
if err != nil {
Expand All @@ -33,39 +33,28 @@ func OTLP2model(OTLPSpans []byte) ([]*model.Batch, error) {
if err != nil {
return nil, fmt.Errorf("cannot transform OTLP to Jaeger: %w", err)
}

return jaegerBatches, nil
}

func BatchesToTraces(jaegerBatches []*model.Batch) ([]model.Trace, error) {
var jaegerTraces []model.Trace
spanMap := make(map[model.TraceID][]*model.Span)
for _, v := range jaegerBatches {
DenormalizeProcess(v)
FlattenToSpansMaps(v, spanMap)
}
for _, v := range spanMap {
jaegerTrace := model.Trace{
Spans: v,
}
jaegerTraces = append(jaegerTraces, jaegerTrace)
}
return jaegerTraces, nil
}

func DenormalizeProcess(m *model.Batch) {
for _, v := range m.Spans {
v.Process = m.Process
}
}

func FlattenToSpansMaps(m *model.Batch, spanMap map[model.TraceID][]*model.Span) {
for _, v := range m.Spans {
val, ok := spanMap[v.TraceID]
if !ok {
spanMap[v.TraceID] = []*model.Span{v}
} else {
spanMap[v.TraceID] = append(val, v)
func batchesToTraces(jaegerBatches []*model.Batch) ([]*model.Trace, error) {
var traces []*model.Trace
traceMap := make(map[model.TraceID]*model.Trace)
for _, batch := range jaegerBatches {
for _, span := range batch.Spans {
if span.Process == nil {
span.Process = batch.Process
}
trace, ok := traceMap[span.TraceID]
if !ok {
newtrace := model.Trace{
Spans: []*model.Span{span},
}
traceMap[span.TraceID] = &newtrace
traces = append(traces, &newtrace)
} else {
trace.Spans = append(trace.Spans, span)
}
}
}
return traces, nil
}
69 changes: 2 additions & 67 deletions cmd/query/app/otlp_translator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func TestBatchesToTraces(t *testing.T) {

mainBatch := []*model.Batch{b1, b2}

traces, err := BatchesToTraces(mainBatch)
traces, err := batchesToTraces(mainBatch)
require.Nil(t, err)

Check failure on line 34 in cmd/query/app/otlp_translator_test.go

View workflow job for this annotation

GitHub Actions / lint

error-nil: use require.NoError (testifylint)

s1 := []*model.Span{
Expand Down Expand Up @@ -63,71 +63,6 @@ func TestBatchesToTraces(t *testing.T) {
t2 := model.Trace{
Spans: s2,
}
mainTrace := []model.Trace{t1, t2}
mainTrace := []*model.Trace{&t1, &t2}
assert.Equal(t, mainTrace, traces)
}

func TestFlattenToSpanMaps(t *testing.T) {
b1 := &model.Batch{
Spans: []*model.Span{
{TraceID: model.NewTraceID(1, 2), SpanID: model.NewSpanID(1), OperationName: "x"},
{TraceID: model.NewTraceID(1, 3), SpanID: model.NewSpanID(2), OperationName: "y"},
},
}

b2 := &model.Batch{
Spans: []*model.Span{
{TraceID: model.NewTraceID(1, 2), SpanID: model.NewSpanID(2), OperationName: "z"},
},
}

t1 := []*model.Span{
{TraceID: model.NewTraceID(1, 2), SpanID: model.NewSpanID(1), OperationName: "x"},
{TraceID: model.NewTraceID(1, 2), SpanID: model.NewSpanID(2), OperationName: "z"},
}

t2 := []*model.Span{{TraceID: model.NewTraceID(1, 3), SpanID: model.NewSpanID(2), OperationName: "y"}}
spanMap := make(map[model.TraceID][]*model.Span)
FlattenToSpansMaps(b1, spanMap)
FlattenToSpansMaps(b2, spanMap)
assert.Equal(t, t1, spanMap[model.NewTraceID(1, 2)])
assert.Equal(t, t2, spanMap[model.NewTraceID(1, 3)])
}

func TestDenormalizeProcess(t *testing.T) {
b1 := &model.Batch{
Spans: []*model.Span{
{
TraceID: model.NewTraceID(1, 2),
SpanID: model.NewSpanID(1),
OperationName: "x",
},
{
TraceID: model.NewTraceID(1, 3),
SpanID: model.NewSpanID(2),
OperationName: "y",
},
},
Process: model.NewProcess("process1", model.KeyValues{}),
}

b2 := &model.Batch{
Spans: []*model.Span{
{
TraceID: model.NewTraceID(1, 2),
SpanID: model.NewSpanID(1),
OperationName: "x",
Process: model.NewProcess("process1", model.KeyValues{}),
},
{
TraceID: model.NewTraceID(1, 3),
SpanID: model.NewSpanID(2),
OperationName: "y",
Process: model.NewProcess("process1", model.KeyValues{}),
},
},
Process: model.NewProcess("process1", model.KeyValues{}),
}
DenormalizeProcess(b1)
assert.Equal(t, b1, b2)
}

0 comments on commit c98bb4d

Please sign in to comment.