in transport/transporttest/recorder.go [106:155]
func (r *RecorderTransport) record(ctx context.Context, stream io.Reader) error {
reader, err := zlib.NewReader(stream)
if err != nil {
if err == io.ErrUnexpectedEOF {
if contextDone(ctx) {
return ctx.Err()
}
// truly unexpected
}
panic(err)
}
decoder := json.NewDecoder(reader)
// The first object of any request must be a metadata struct.
var metadataPayload struct {
Metadata metadata `json:"metadata"`
}
if err := decoder.Decode(&metadataPayload); err != nil {
panic(err)
}
r.recordMetadata(&metadataPayload.Metadata)
for {
var payload struct {
Error *model.Error `json:"error"`
Metrics *model.Metrics `json:"metricset"`
Span *model.Span `json:"span"`
Transaction *model.Transaction `json:"transaction"`
}
err := decoder.Decode(&payload)
if err == io.EOF || (err == io.ErrUnexpectedEOF && contextDone(ctx)) {
break
} else if err != nil {
panic(err)
}
r.mu.Lock()
switch {
case payload.Error != nil:
r.payloads.Errors = append(r.payloads.Errors, *payload.Error)
case payload.Metrics != nil:
r.payloads.Metrics = append(r.payloads.Metrics, *payload.Metrics)
case payload.Span != nil:
r.payloads.Spans = append(r.payloads.Spans, *payload.Span)
case payload.Transaction != nil:
r.payloads.Transactions = append(r.payloads.Transactions, *payload.Transaction)
}
r.mu.Unlock()
}
return nil
}