Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions examples/OpenTelemetryTracing/OpenTelemetryTracing.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<LangVersion>10</LangVersion>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\Proto.OpenTelemetry\Proto.OpenTelemetry.csproj" />
<ProjectReference Include="..\..\src\Proto.Remote\Proto.Remote.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Console" />
<PackageReference Include="OpenTelemetry" />
<PackageReference Include="OpenTelemetry.Exporter.Jaeger" />
</ItemGroup>

</Project>
59 changes: 59 additions & 0 deletions examples/OpenTelemetryTracing/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using OpenTelemetry;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using Proto;
using Proto.OpenTelemetry;
using Proto.Remote;
using Proto.Remote.GrpcNet;

var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
Log.SetLoggerFactory(loggerFactory);

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("OpenTelemetryTracingSample"))
.AddProtoActorInstrumentation()
.AddJaegerExporter()
.Build();

var system1 = new ActorSystem().WithRemote(GrpcNetRemoteConfig.BindToLocalhost(12000));
var system2 = new ActorSystem().WithRemote(GrpcNetRemoteConfig.BindToLocalhost(12001));

await system1.Remote().StartAsync();
await system2.Remote().StartAsync();

var remoteProps = Props.FromFunc(ctx =>
{
if (ctx.Message is string msg)
{
Console.WriteLine($"[remote] received '{msg}' traceId={Activity.Current?.TraceId}");
ctx.Respond("pong");
}
return Task.CompletedTask;
}).WithTracing();

system2.Root.SpawnNamed(remoteProps, "remote");

var localProps = Props.FromFunc(async ctx =>
{
if (ctx.Message is string msg)
{
Console.WriteLine($"[local] received '{msg}' traceId={Activity.Current?.TraceId}");
var remotePid = PID.FromAddress("127.0.0.1:12001", "remote");
var res = await ctx.RequestAsync<string>(remotePid, "ping");
Console.WriteLine($"[local] got reply '{res}' traceId={Activity.Current?.TraceId}");
}
}).WithTracing();

var localPid = system1.Root.Spawn(localProps);

var tracedRoot = system1.Root.WithTracing();

using var rootActivity = new ActivitySource(Proto.OpenTelemetry.ProtoTags.ActivitySourceName).StartActivity("root");
tracedRoot.Send(localPid, "start");

Console.WriteLine("Press enter to exit");
Console.ReadLine();
19 changes: 19 additions & 0 deletions examples/OpenTelemetryTracing/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# OpenTelemetryTracing

Demonstrates Proto.Actor tracing with OpenTelemetry and a Jaeger exporter. The sample runs two actor systems communicating over gRPC Remote and shows trace context flowing from a local actor to a remote actor.

## Run

1. Start Jaeger:

```bash
docker run --rm -p 16686:16686 -p 6831:6831/udp jaegertracing/all-in-one:1.39
```

2. Run the example:

```bash
dotnet run --project examples/OpenTelemetryTracing
```

3. Open [http://localhost:16686](http://localhost:16686) and look for the `OpenTelemetryTracingSample` service to see spans for the root, local actor and remote actor belonging to the same trace.
Loading