/// <summary> /// Translate SpanData to a protobuf ReportRequest for sending to the Satellite. /// </summary> /// <param name="spans">An enumerable of <see cref="SpanData" /></param> /// <returns>A <see cref="ReportRequest" /></returns> public ReportRequest Translate(ISpanRecorder spanBuffer) { _logger.Trace($"Serializing {spanBuffer.GetSpanCount()} spans to proto."); var timer = new Stopwatch(); timer.Start(); var request = new ReportRequest { Reporter = new Reporter { ReporterId = _options.TracerGuid }, Auth = new Auth { AccessToken = _options.AccessToken } }; _options.Tags.ToList().ForEach(t => request.Reporter.Tags.Add(new KeyValue().MakeKeyValueFromKvp(t))); spanBuffer.GetSpans().ToList().ForEach(span => { try { request.Spans.Add(new Span().MakeSpanFromSpanData(span)); } catch (Exception ex) { _logger.WarnException("Caught exception converting spans.", ex); spanBuffer.DroppedSpanCount++; } }); var metrics = new InternalMetrics { StartTimestamp = Timestamp.FromDateTime(spanBuffer.ReportStartTime.ToUniversalTime()), DurationMicros = Convert.ToUInt64((spanBuffer.ReportEndTime - spanBuffer.ReportStartTime).Ticks / 10), Counts = { new MetricsSample() { Name = "spans.dropped", IntValue = spanBuffer.DroppedSpanCount } } }; request.InternalMetrics = metrics; timer.Stop(); _logger.Trace($"Serialization complete in {timer.ElapsedMilliseconds}ms. Request size: {request.CalculateSize()}b."); return(request); }