Skip to content

Commit 2ac5f8a

Browse files
committed
got "hello world" off the ground
1 parent 6adfbdd commit 2ac5f8a

File tree

7 files changed

+136
-2
lines changed

7 files changed

+136
-2
lines changed

AI.Playground.slnx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@
99
<File Path="global.json" />
1010
<File Path="nuget.config" />
1111
</Folder>
12+
<Folder Name="/shared/">
13+
<Project Path="src\shared\Telemetry\Telemetry.csproj" Type="Classic C#" />
14+
</Folder>
1215
</Solution>

Directory.Packages.props

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,8 @@
77
<PackageVersion Include="CommunityToolkit.Aspire.Hosting.Ollama" Version="9.3.1-beta.259" />
88
<PackageVersion Include="CommunityToolkit.Aspire.OllamaSharp" Version="9.3.1-beta.259" />
99
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="9.0.4" />
10+
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.11.2" />
11+
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.11.2" />
12+
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.11.1" />
1013
</ItemGroup>
1114
</Project>

src/0-hello-world/AI.HelloWorld.Console/AI.HelloWorld.Console.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,8 @@
1111
<PackageReference Include="Microsoft.Extensions.Hosting" />
1212
</ItemGroup>
1313

14+
<ItemGroup>
15+
<ProjectReference Include="..\..\shared\Telemetry\Telemetry.csproj" />
16+
</ItemGroup>
17+
1418
</Project>
Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,30 @@
1-
using Microsoft.Extensions.Hosting;
1+
using AI.Telemetry;
2+
using Microsoft.Extensions.Hosting;
3+
using Microsoft.Extensions.AI;
4+
using Microsoft.Extensions.DependencyInjection;
5+
using OllamaSharp;
26

3-
var hostBuilder = new HostBuilder();
7+
var builder = new HostApplicationBuilder();
8+
9+
builder.Logging.ConfigureAiLogging();
10+
11+
builder.AddOllamaApiClient("chat")
12+
.AddChatClient()
13+
.UseFunctionInvocation()
14+
.UseOpenTelemetry()
15+
.UseLogging();
16+
17+
builder.Services.ConfigureAiTelemetry();
18+
19+
20+
var app = builder.Build();
21+
22+
await app.StartAsync();
23+
24+
var chatClient = app.Services.GetRequiredService<IChatClient>();
25+
26+
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
27+
var resp = await chatClient.GetResponseAsync("How many feet are in a meter?", cancellationToken:cts.Token);
28+
29+
Console.WriteLine(resp);
30+
await app.WaitForShutdownAsync();
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System.Reflection;
2+
using OpenTelemetry.Resources;
3+
4+
namespace AI.Telemetry;
5+
6+
public sealed class AssemblyVersionDetector : IResourceDetector
7+
{
8+
public Resource Detect()
9+
{
10+
var version = Assembly.GetExecutingAssembly().GetName().Version?.ToString();
11+
12+
IEnumerable<KeyValuePair<string, object>> attributes = Array.Empty<KeyValuePair<string, object>>();
13+
14+
if (version != null)
15+
{
16+
attributes =
17+
[
18+
new KeyValuePair<string, object>("service.version", version)
19+
];
20+
}
21+
22+
return new Resource(attributes);
23+
}
24+
}
25+
26+
public static class ServiceVersionDetectorExtensions
27+
{
28+
public static ResourceBuilder AddServiceVersionDetector(this ResourceBuilder builder)
29+
{
30+
return builder.AddDetector(new AssemblyVersionDetector());
31+
}
32+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<ImplicitUsings>enable</ImplicitUsings>
5+
<Nullable>enable</Nullable>
6+
<RootNamespace>AI.Telemetry</RootNamespace>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
11+
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
12+
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
13+
</ItemGroup>
14+
15+
</Project>
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Microsoft.Extensions.Logging;
3+
using OpenTelemetry;
4+
using OpenTelemetry.Metrics;
5+
using OpenTelemetry.Resources;
6+
using OpenTelemetry.Trace;
7+
8+
namespace AI.Telemetry;
9+
10+
public static class TelemetryExtensions
11+
{
12+
public static ILoggingBuilder ConfigureAiLogging(this ILoggingBuilder builder)
13+
{
14+
var resourceBuilder = ResourceBuilder.CreateDefault();
15+
resourceBuilder
16+
.AddEnvironmentVariableDetector()
17+
.AddTelemetrySdk()
18+
.AddServiceVersionDetector();
19+
20+
builder.AddOpenTelemetry(options => { options.SetResourceBuilder(resourceBuilder); });
21+
22+
23+
return builder;
24+
}
25+
26+
public static IServiceCollection ConfigureAiTelemetry(this IServiceCollection services,
27+
Action<MeterProviderBuilder>? additionalMeters = null,
28+
Action<TracerProviderBuilder>? additionalTracers = null)
29+
{
30+
services
31+
.AddOpenTelemetry()
32+
.ConfigureResource(builder =>
33+
{
34+
builder
35+
.AddEnvironmentVariableDetector()
36+
.AddTelemetrySdk()
37+
.AddServiceVersionDetector();
38+
})
39+
.UseOtlpExporter()
40+
.WithMetrics(c =>
41+
{
42+
c.AddRuntimeInstrumentation();
43+
44+
additionalMeters?.Invoke(c);
45+
})
46+
.WithTracing(c => { additionalTracers?.Invoke(c); });
47+
48+
return services;
49+
}
50+
}

0 commit comments

Comments
 (0)