Skip to content

Commit 5241d26

Browse files
authored
Add OpenTelemetry tracing example (#2187)
1 parent ae4b50d commit 5241d26

3 files changed

Lines changed: 98 additions & 0 deletions

File tree

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net6.0</TargetFramework>
6+
<LangVersion>10</LangVersion>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<ProjectReference Include="..\..\src\Proto.OpenTelemetry\Proto.OpenTelemetry.csproj" />
11+
<ProjectReference Include="..\..\src\Proto.Remote\Proto.Remote.csproj" />
12+
</ItemGroup>
13+
14+
<ItemGroup>
15+
<PackageReference Include="Microsoft.Extensions.Logging.Console" />
16+
<PackageReference Include="OpenTelemetry" />
17+
<PackageReference Include="OpenTelemetry.Exporter.Jaeger" />
18+
</ItemGroup>
19+
20+
</Project>
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System;
2+
using System.Diagnostics;
3+
using System.Threading.Tasks;
4+
using Microsoft.Extensions.Logging;
5+
using OpenTelemetry;
6+
using OpenTelemetry.Resources;
7+
using OpenTelemetry.Trace;
8+
using Proto;
9+
using Proto.OpenTelemetry;
10+
using Proto.Remote;
11+
using Proto.Remote.GrpcNet;
12+
13+
var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
14+
Log.SetLoggerFactory(loggerFactory);
15+
16+
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
17+
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("OpenTelemetryTracingSample"))
18+
.AddProtoActorInstrumentation()
19+
.AddJaegerExporter()
20+
.Build();
21+
22+
var system1 = new ActorSystem().WithRemote(GrpcNetRemoteConfig.BindToLocalhost(12000));
23+
var system2 = new ActorSystem().WithRemote(GrpcNetRemoteConfig.BindToLocalhost(12001));
24+
25+
await system1.Remote().StartAsync();
26+
await system2.Remote().StartAsync();
27+
28+
var remoteProps = Props.FromFunc(ctx =>
29+
{
30+
if (ctx.Message is string msg)
31+
{
32+
Console.WriteLine($"[remote] received '{msg}' traceId={Activity.Current?.TraceId}");
33+
ctx.Respond("pong");
34+
}
35+
return Task.CompletedTask;
36+
}).WithTracing();
37+
38+
system2.Root.SpawnNamed(remoteProps, "remote");
39+
40+
var localProps = Props.FromFunc(async ctx =>
41+
{
42+
if (ctx.Message is string msg)
43+
{
44+
Console.WriteLine($"[local] received '{msg}' traceId={Activity.Current?.TraceId}");
45+
var remotePid = PID.FromAddress("127.0.0.1:12001", "remote");
46+
var res = await ctx.RequestAsync<string>(remotePid, "ping");
47+
Console.WriteLine($"[local] got reply '{res}' traceId={Activity.Current?.TraceId}");
48+
}
49+
}).WithTracing();
50+
51+
var localPid = system1.Root.Spawn(localProps);
52+
53+
var tracedRoot = system1.Root.WithTracing();
54+
55+
using var rootActivity = new ActivitySource(Proto.OpenTelemetry.ProtoTags.ActivitySourceName).StartActivity("root");
56+
tracedRoot.Send(localPid, "start");
57+
58+
Console.WriteLine("Press enter to exit");
59+
Console.ReadLine();
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# OpenTelemetryTracing
2+
3+
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.
4+
5+
## Run
6+
7+
1. Start Jaeger:
8+
9+
```bash
10+
docker run --rm -p 16686:16686 -p 6831:6831/udp jaegertracing/all-in-one:1.39
11+
```
12+
13+
2. Run the example:
14+
15+
```bash
16+
dotnet run --project examples/OpenTelemetryTracing
17+
```
18+
19+
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.

0 commit comments

Comments
 (0)