Migrate ZPagesExporter to BatchExportActivityProcessor (#1108)
* Changing Zpages processor * updating changelog * updating to ZPagesProcessor * updating after merge * adding internal reset method
This commit is contained in:
parent
595c3bd0c3
commit
83adf75f01
|
|
@ -32,6 +32,7 @@ namespace Examples.Console
|
||||||
/// dotnet run -p Examples.Console.csproj jaeger -h localhost -p 6831
|
/// dotnet run -p Examples.Console.csproj jaeger -h localhost -p 6831
|
||||||
/// dotnet run -p Examples.Console.csproj prometheus -i 15 -p 9184 -d 2
|
/// dotnet run -p Examples.Console.csproj prometheus -i 15 -p 9184 -d 2
|
||||||
/// dotnet run -p Examples.Console.csproj otlp -e "localhost:55680"
|
/// dotnet run -p Examples.Console.csproj otlp -e "localhost:55680"
|
||||||
|
/// dotnet run -p Examples.Console.csproj zpages
|
||||||
///
|
///
|
||||||
/// The above must be run from the project root folder
|
/// The above must be run from the project root folder
|
||||||
/// (eg: C:\repos\opentelemetry-dotnet\src\examples\Console\).
|
/// (eg: C:\repos\opentelemetry-dotnet\src\examples\Console\).
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,6 @@ namespace Examples.Console
|
||||||
{
|
{
|
||||||
var zpagesOptions = new ZPagesExporterOptions() { Url = "http://localhost:7284/rpcz/", RetentionTime = 3600000 };
|
var zpagesOptions = new ZPagesExporterOptions() { Url = "http://localhost:7284/rpcz/", RetentionTime = 3600000 };
|
||||||
var zpagesExporter = new ZPagesExporter(zpagesOptions);
|
var zpagesExporter = new ZPagesExporter(zpagesOptions);
|
||||||
var zpagesProcessor = new ZPagesProcessor(zpagesExporter);
|
|
||||||
var httpServer = new ZPagesExporterStatsHttpServer(zpagesExporter);
|
var httpServer = new ZPagesExporterStatsHttpServer(zpagesExporter);
|
||||||
|
|
||||||
// Start the server
|
// Start the server
|
||||||
|
|
@ -36,8 +35,11 @@ namespace Examples.Console
|
||||||
|
|
||||||
using var openTelemetry = Sdk.CreateTracerProviderBuilder()
|
using var openTelemetry = Sdk.CreateTracerProviderBuilder()
|
||||||
.AddSource("zpages-test")
|
.AddSource("zpages-test")
|
||||||
.AddProcessor(zpagesProcessor)
|
.AddZPagesExporter(o =>
|
||||||
.AddZPagesExporter()
|
{
|
||||||
|
o.Url = zpagesOptions.Url;
|
||||||
|
o.RetentionTime = zpagesOptions.RetentionTime;
|
||||||
|
})
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
ActivitySource activitySource = new ActivitySource("zpages-test");
|
ActivitySource activitySource = new ActivitySource("zpages-test");
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,10 @@
|
||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
Renamed extension method from `UseZPagesExporter` to `AddZPagesExporter`.
|
* Renamed extension method from `UseZPagesExporter` to `AddZPagesExporter`
|
||||||
|
([#1066](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1066))
|
||||||
|
* Changed `ZPagesExporter` to use `ZPagesProcessor` by default
|
||||||
|
([#1108](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1108))
|
||||||
|
|
||||||
## 0.4.0-beta.2
|
## 0.4.0-beta.2
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -122,5 +122,17 @@ namespace OpenTelemetry.Exporter.ZPages.Implementation
|
||||||
// Clear the last hour's activity information list
|
// Clear the last hour's activity information list
|
||||||
CurrentHourList.Clear();
|
CurrentHourList.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static void Reset()
|
||||||
|
{
|
||||||
|
TotalCount.Clear();
|
||||||
|
TotalLatency.Clear();
|
||||||
|
CurrentHourList.Clear();
|
||||||
|
CurrentMinuteList.Clear();
|
||||||
|
ZQueue.Clear();
|
||||||
|
ProcessingList.Clear();
|
||||||
|
TotalEndedCount.Clear();
|
||||||
|
TotalErrorCount.Clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,7 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
// </copyright>
|
// </copyright>
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Timers;
|
using System.Timers;
|
||||||
using OpenTelemetry.Exporter.ZPages.Implementation;
|
using OpenTelemetry.Exporter.ZPages.Implementation;
|
||||||
using OpenTelemetry.Trace;
|
using OpenTelemetry.Trace;
|
||||||
|
|
@ -28,7 +25,7 @@ namespace OpenTelemetry.Exporter.ZPages
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Implements ZPages exporter.
|
/// Implements ZPages exporter.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ZPagesExporter : ActivityExporter
|
public class ZPagesExporter : ActivityExporterSync
|
||||||
{
|
{
|
||||||
internal readonly ZPagesExporterOptions Options;
|
internal readonly ZPagesExporterOptions Options;
|
||||||
private readonly Timer minuteTimer;
|
private readonly Timer minuteTimer;
|
||||||
|
|
@ -56,16 +53,10 @@ namespace OpenTelemetry.Exporter.ZPages
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override Task<ExportResult> ExportAsync(IEnumerable<Activity> batch, CancellationToken cancellationToken)
|
public override ExportResultSync Export(in Batch<Activity> batch)
|
||||||
{
|
{
|
||||||
// var spanDatas = batch as SpanData[] ?? batch.ToArray();
|
// var spanDatas = batch as SpanData[] ?? batch.ToArray();
|
||||||
return Task.FromResult(ExportResult.Success);
|
return ExportResultSync.Success;
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public override Task ShutdownAsync(CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
return Task.FromResult(ExportResult.Success);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ namespace OpenTelemetry.Trace
|
||||||
var zpagesExporter = new ZPagesExporter(exporterOptions);
|
var zpagesExporter = new ZPagesExporter(exporterOptions);
|
||||||
|
|
||||||
// TODO: Pick Simple vs Batching based on ZipkinExporterOptions
|
// TODO: Pick Simple vs Batching based on ZipkinExporterOptions
|
||||||
return builder.AddProcessor(new SimpleActivityProcessor(zpagesExporter));
|
return builder.AddProcessor(new ZPagesProcessor(zpagesExporter));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Threading;
|
|
||||||
using OpenTelemetry.Exporter.ZPages.Implementation;
|
using OpenTelemetry.Exporter.ZPages.Implementation;
|
||||||
#if NET452
|
#if NET452
|
||||||
using OpenTelemetry.Internal;
|
using OpenTelemetry.Internal;
|
||||||
|
|
@ -68,10 +67,6 @@ namespace OpenTelemetry.Exporter.ZPages
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// do not await, just start export
|
|
||||||
// it can still throw in synchronous part
|
|
||||||
_ = this.exporter.ExportAsync(new[] { activity }, CancellationToken.None);
|
|
||||||
|
|
||||||
// If the span name is not in the current minute list, add it to the span list.
|
// If the span name is not in the current minute list, add it to the span list.
|
||||||
if (!ZPagesActivityTracker.CurrentMinuteList.ContainsKey(activity.DisplayName))
|
if (!ZPagesActivityTracker.CurrentMinuteList.ContainsKey(activity.DisplayName))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,8 @@ namespace OpenTelemetry.Exporter.ZPages.Tests
|
||||||
Assert.NotEmpty(ZPagesActivityTracker.CurrentMinuteList);
|
Assert.NotEmpty(ZPagesActivityTracker.CurrentMinuteList);
|
||||||
ZPagesActivityTracker.PurgeCurrentMinuteData(null, null);
|
ZPagesActivityTracker.PurgeCurrentMinuteData(null, null);
|
||||||
Assert.Empty(ZPagesActivityTracker.CurrentMinuteList);
|
Assert.Empty(ZPagesActivityTracker.CurrentMinuteList);
|
||||||
|
|
||||||
|
ZPagesActivityTracker.ProcessingList.Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using OpenTelemetry.Exporter.ZPages.Implementation;
|
using OpenTelemetry.Exporter.ZPages.Implementation;
|
||||||
using OpenTelemetry.Resources;
|
using OpenTelemetry.Resources;
|
||||||
|
|
@ -54,19 +53,6 @@ namespace OpenTelemetry.Exporter.ZPages.Tests
|
||||||
Assert.Throws<ArgumentNullException>(() => builder.AddZPagesExporter());
|
Assert.Throws<ArgumentNullException>(() => builder.AddZPagesExporter());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task CheckingIntegration()
|
|
||||||
{
|
|
||||||
var batchActivity = new List<Activity> { CreateTestActivity() };
|
|
||||||
|
|
||||||
ZPagesExporter exporter = new ZPagesExporter(new ZPagesExporterOptions());
|
|
||||||
|
|
||||||
var exportResult = await exporter.ExportAsync(batchActivity, CancellationToken.None).ConfigureAwait(false);
|
|
||||||
Assert.Equal(ExportResult.Success, exportResult);
|
|
||||||
|
|
||||||
await exporter.ShutdownAsync(CancellationToken.None).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void CheckingCustomActivityProcessor()
|
public void CheckingCustomActivityProcessor()
|
||||||
{
|
{
|
||||||
|
|
@ -89,18 +75,20 @@ namespace OpenTelemetry.Exporter.ZPages.Tests
|
||||||
endCalled = true;
|
endCalled = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
var openTelemetrySdk = Sdk.CreateTracerProviderBuilder()
|
using var openTelemetrySdk = Sdk.CreateTracerProviderBuilder()
|
||||||
.AddSource(ActivitySourceName)
|
.AddSource(ActivitySourceName)
|
||||||
.AddProcessor(testActivityProcessor)
|
.AddProcessor(testActivityProcessor)
|
||||||
.AddZPagesExporter()
|
.AddZPagesExporter()
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
var source = new ActivitySource(ActivitySourceName);
|
using var source = new ActivitySource(ActivitySourceName);
|
||||||
var activity = source.StartActivity("Test Zipkin Activity");
|
using var activity = source.StartActivity("Test Zipkin Activity");
|
||||||
activity?.Stop();
|
activity?.Stop();
|
||||||
|
|
||||||
Assert.True(startCalled);
|
Assert.True(startCalled);
|
||||||
Assert.True(endCalled);
|
Assert.True(endCalled);
|
||||||
|
|
||||||
|
ZPagesActivityTracker.Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -129,11 +117,9 @@ namespace OpenTelemetry.Exporter.ZPages.Tests
|
||||||
};
|
};
|
||||||
ZPagesExporter exporter = new ZPagesExporter(options);
|
ZPagesExporter exporter = new ZPagesExporter(options);
|
||||||
var zpagesProcessor = new ZPagesProcessor(exporter);
|
var zpagesProcessor = new ZPagesProcessor(exporter);
|
||||||
var zpagesServer = new ZPagesExporterStatsHttpServer(exporter);
|
|
||||||
zpagesServer.Start();
|
|
||||||
|
|
||||||
var source = new ActivitySource(ActivitySourceName);
|
var source = new ActivitySource(ActivitySourceName);
|
||||||
var activity0 = source.StartActivity("Test Zipkin Activity");
|
var activity0 = source.StartActivity("Test Zipkin Activity 1");
|
||||||
zpagesProcessor.OnStart(activity0);
|
zpagesProcessor.OnStart(activity0);
|
||||||
|
|
||||||
// checking size of dictionaries from ZPagesActivityTracker
|
// checking size of dictionaries from ZPagesActivityTracker
|
||||||
|
|
@ -143,7 +129,7 @@ namespace OpenTelemetry.Exporter.ZPages.Tests
|
||||||
Assert.Single(ZPagesActivityTracker.TotalErrorCount);
|
Assert.Single(ZPagesActivityTracker.TotalErrorCount);
|
||||||
Assert.Single(ZPagesActivityTracker.TotalLatency);
|
Assert.Single(ZPagesActivityTracker.TotalLatency);
|
||||||
|
|
||||||
var activity1 = source.StartActivity("Test Zipkin Activity");
|
var activity1 = source.StartActivity("Test Zipkin Activity 1");
|
||||||
zpagesProcessor.OnStart(activity1);
|
zpagesProcessor.OnStart(activity1);
|
||||||
|
|
||||||
// checking size of dictionaries from ZPagesActivityTracker
|
// checking size of dictionaries from ZPagesActivityTracker
|
||||||
|
|
@ -175,11 +161,14 @@ namespace OpenTelemetry.Exporter.ZPages.Tests
|
||||||
Assert.Equal(0, ZPagesActivityTracker.ProcessingList.Last().Value);
|
Assert.Equal(0, ZPagesActivityTracker.ProcessingList.Last().Value);
|
||||||
Assert.Empty(ZPagesActivityTracker.ZQueue);
|
Assert.Empty(ZPagesActivityTracker.ZQueue);
|
||||||
|
|
||||||
|
var zpagesServer = new ZPagesExporterStatsHttpServer(exporter);
|
||||||
|
zpagesServer.Start();
|
||||||
|
|
||||||
using var httpResponseMessage = await HttpClient.GetAsync("http://localhost:7284/rpcz/");
|
using var httpResponseMessage = await HttpClient.GetAsync("http://localhost:7284/rpcz/");
|
||||||
Assert.True(httpResponseMessage.IsSuccessStatusCode);
|
Assert.True(httpResponseMessage.IsSuccessStatusCode);
|
||||||
|
|
||||||
var content = await httpResponseMessage.Content.ReadAsStringAsync();
|
var content = await httpResponseMessage.Content.ReadAsStringAsync();
|
||||||
Assert.Contains($"<td>Test Zipkin Activity</td>", content);
|
Assert.Contains($"<td>Test Zipkin Activity 1</td>", content);
|
||||||
Assert.Contains($"<td>Test Zipkin Activity 2</td>", content);
|
Assert.Contains($"<td>Test Zipkin Activity 2</td>", content);
|
||||||
|
|
||||||
zpagesProcessor.Dispose();
|
zpagesProcessor.Dispose();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue