private TracingDto Convert(IEnumerable <SpanModel> spanModel , Dictionary <string, SpanProcessModel> processModel) { Dictionary <string, SpanProcess> dict_process = new Dictionary <string, SpanProcess>(); SpanProcessModelEqualityComparer spanProcessModelEquality = new SpanProcessModelEqualityComparer(); var tracing = new TracingDto() { TraceID = spanModel.FirstOrDefault()?.TraceId, Warnings = new string[0], Spans = spanModel.Select(s => _Mapper.Map <SpanDto>(s, m => { m.AfterMap((v, dto) => { SpanModel model = null; if ((model = v as SpanModel) != null) { var process = processModel.FirstOrDefault(f => spanProcessModelEquality.Equals(f.Value, model.Process)); dto.ProcessId = process.Key ?? "--"; if (process.Value != null && !dict_process.ContainsKey(dto.ProcessId)) { dict_process.Add(dto.ProcessId, _Mapper.Map <SpanProcess>(process.Value)); ; } } }); })).OrderBy(a => a.StartTime).ToArray() }; tracing.Processes = dict_process; return(tracing); }
public async Task StoreAsync(IEnumerable <Span> spans, CancellationToken cancellationToken = default) { var spanModels = new List <SpanModel>(); var tagModels = new List <TagModel>(); var logModels = new List <LogModel>(); var logFieldModels = new List <LogFieldModel>(); var baggageModels = new List <BaggageModel>(); var referenceModels = new List <SpanReferenceModel>(); foreach (var span in spans) { spanModels.Add(SpanModel.Map(span)); tagModels.AddRange(TagModel.Map(span.Tags, span.SpanId)); var logModelsTemp = LogModel.Map(span.Logs, span.SpanId); logModels.AddRange(logModelsTemp); foreach (var logModel in logModelsTemp) { logFieldModels.AddRange(logModel.Fields); } baggageModels.AddRange(BaggageModel.Map(span.Baggages, span.SpanId)); referenceModels.AddRange(SpanReferenceModel.Map(span.References, span.SpanId)); } try { using (var conn = await GetConnectionAsync()) using (var bulkCopy = new SqlBulkCopy(conn)) { using (var reader = ObjectReader.Create(spanModels, "SpanId", "TraceId", "Sampled", "OperationName", "Duration", "StartTimestamp", "FinishTimestamp")) { bulkCopy.DestinationTableName = "Spans"; await bulkCopy.WriteToServerAsync(reader); } using (var reader = ObjectReader.Create(tagModels, "TagId", "SpanId", "Key", "Value")) { bulkCopy.DestinationTableName = "Tags"; await bulkCopy.WriteToServerAsync(reader); } using (var reader = ObjectReader.Create(logModels, "LogId", "SpanId", "Timestamp")) { bulkCopy.DestinationTableName = "Logs"; await bulkCopy.WriteToServerAsync(reader); } using (var reader = ObjectReader.Create(logFieldModels, "LogFieldId", "LogId", "Key", "Value")) { bulkCopy.DestinationTableName = "LogFields"; await bulkCopy.WriteToServerAsync(reader); } using (var reader = ObjectReader.Create(baggageModels, "BaggageId", "SpanId", "Key", "Value")) { bulkCopy.DestinationTableName = "Baggages"; await bulkCopy.WriteToServerAsync(reader); } using (var reader = ObjectReader.Create(referenceModels, "SpanReferenceId", "Reference", "SpanId", "ParentId")) { bulkCopy.DestinationTableName = "SpanReferences"; await bulkCopy.WriteToServerAsync(reader); } } } catch (Exception ex) { } }