public void ToJaegerSpan() { var parentSpanContext = Mock.Of <ISpanContext>(c => c.SpanId == SpanIdGenerator.ThreadInstance.CreateNew()); var span = SpanFactory.CreateSpan(parentSpanContext); JaegerSpan jaegerSpan = span.ToJaegerSpan(); Assert.Equal("TestOperation", jaegerSpan.OperationName); Assert.Equal(span.TraceId.Higher, jaegerSpan.TraceIdHigh); Assert.Equal(span.TraceId.Lower, jaegerSpan.TraceIdLow); Assert.Equal((long)span.SpanId, jaegerSpan.SpanId); Assert.Equal((long)span.Context.ParentId, jaegerSpan.ParentSpanId); Assert.Equal(0x1, jaegerSpan.Flags); Assert.Equal(span.StartTime.UtcDateTime.ToEpochMicroseconds(), jaegerSpan.StartTime); Assert.Equal((long)(span.Duration.TotalMilliseconds * 1000), jaegerSpan.Duration); var tags = jaegerSpan.Tags.ToArray(); Assert.Equal(4, tags.Length); Assert.All(tags, t => Assert.Equal(JaegerTagType.STRING, t.VType)); Assert.Single(tags, t => t.Key == "k0" && t.VStr == "v0"); Assert.Single(tags, t => t.Key == "k1" && t.VStr == "v1"); Assert.Single(tags, t => t.Key == Tags.Env && t.VStr == "Test"); Assert.Single(tags, t => t.Key == Tags.Version && t.VStr == "v1.0"); }
public void JaegerTraceExporter_SpansSplitToBatches_SpansIncludedInBatches(string protocolType, int maxPayloadSizeInBytes) { TProtocolFactory protocolFactory = protocolType == "Compact" ? new TCompactProtocol.Factory() : new TBinaryProtocol.Factory(); var client = new TestJaegerClient(); // Arrange using var jaegerExporter = new JaegerExporter( new JaegerExporterOptions { MaxPayloadSizeInBytes = maxPayloadSizeInBytes }, protocolFactory, client); jaegerExporter.SetResourceAndInitializeBatch(Resource.Empty); // Create six spans, each taking more space than the previous one var spans = new JaegerSpan[6]; for (int i = 0; i < 6; i++) { spans[i] = CreateTestJaegerSpan( additionalAttributes: new Dictionary <string, object> { ["foo"] = new string('_', 10 * i), }); } var protocol = protocolFactory.GetProtocol(); var serializedSpans = spans.Select(s => { s.Write(protocol); var data = protocol.WrittenData.ToArray(); protocol.Clear(); return(data); }).ToArray(); // Act var sentBatches = new List <byte[]>(); foreach (var span in spans) { jaegerExporter.AppendSpan(span); var sentBatch = client.LastWrittenData; if (sentBatch != null) { sentBatches.Add(sentBatch); client.LastWrittenData = null; } } // Assert // Appending the six spans will send two batches with the first four spans Assert.Equal(2, sentBatches.Count); Assert.True( ContainsSequence(sentBatches[0], serializedSpans[0]), "Expected span data not found in sent batch"); Assert.True( ContainsSequence(sentBatches[0], serializedSpans[1]), "Expected span data not found in sent batch"); Assert.True( ContainsSequence(sentBatches[1], serializedSpans[2]), "Expected span data not found in sent batch"); Assert.True( ContainsSequence(sentBatches[1], serializedSpans[3]), "Expected span data not found in sent batch"); // jaegerExporter.Batch should contain the two remaining spans Assert.Equal(2U, jaegerExporter.NumberOfSpansInCurrentBatch); jaegerExporter.SendCurrentBatch(); Assert.True(client.LastWrittenData != null); var serializedBatch = client.LastWrittenData; Assert.True( ContainsSequence(serializedBatch, serializedSpans[4]), "Expected span data not found in unsent batch"); Assert.True( ContainsSequence(serializedBatch, serializedSpans[5]), "Expected span data not found in unsent batch"); }
public void JaegerTraceExporter_SpansSplitToBatches_SpansIncludedInBatches() { // Arrange var memoryTransport = new InMemoryTransport(); using var jaegerExporter = new JaegerExporter( new JaegerExporterOptions { MaxPayloadSizeInBytes = 1500 }, memoryTransport); jaegerExporter.SetResourceAndInitializeBatch(Resource.Empty); var tempTransport = new InMemoryTransport(initialCapacity: 3000); var protocol = new TCompactProtocol(tempTransport); // Create six spans, each taking more space than the previous one var spans = new JaegerSpan[6]; for (int i = 0; i < 6; i++) { spans[i] = CreateTestJaegerSpan( additionalAttributes: new Dictionary<string, object> { ["foo"] = new string('_', 10 * i), }); } var serializedSpans = spans.Select(s => { s.Write(protocol); return tempTransport.ToArray(); }).ToArray(); // Act var sentBatches = new List<byte[]>(); foreach (var span in spans) { jaegerExporter.AppendSpan(span); var sentBatch = memoryTransport.ToArray(); if (sentBatch.Length > 0) { sentBatches.Add(sentBatch); } } // Assert // Appending the six spans will send two batches with the first four spans Assert.Equal(2, sentBatches.Count); Assert.True( ContainsSequence(sentBatches[0], serializedSpans[0]), "Expected span data not found in sent batch"); Assert.True( ContainsSequence(sentBatches[0], serializedSpans[1]), "Expected span data not found in sent batch"); Assert.True( ContainsSequence(sentBatches[1], serializedSpans[2]), "Expected span data not found in sent batch"); Assert.True( ContainsSequence(sentBatches[1], serializedSpans[3]), "Expected span data not found in sent batch"); // jaegerExporter.Batch should contain the two remaining spans Assert.Equal(2, jaegerExporter.Batch.Count); jaegerExporter.Batch.Write(protocol); var serializedBatch = tempTransport.ToArray(); Assert.True( ContainsSequence(serializedBatch, serializedSpans[4]), "Expected span data not found in unsent batch"); Assert.True( ContainsSequence(serializedBatch, serializedSpans[5]), "Expected span data not found in unsent batch"); }