Skip to content

Commit 4b4a98f

Browse files
authored
Refactor public API and align with 1.10 and 1.11 of the SDK (#210)
This is quite a significant update from the previous code and includes a lot of refactorings as a result. In short, as the SDK since 1.10 includes an `OpenTelemetryBuilder`, we can base many extension methods directly on the interface it implements `IOpenTelemetryBuilder`. A significant change in this PR is removing the "magic" global override we used to replace `AddOpenTelemetry` with our behaviour. We no longer do this to avoid surprises and prefer an explicit small code change from consumers. We now also track the calls to the various builders to avoid bootstrapping components more than is required and log such circumstances. We expect the auto instrumentation tests to fail for now as those need to be uncoupled from the SDK workflow. Closes #164 Closes #175
1 parent be769bb commit 4b4a98f

File tree

95 files changed

+3116
-2234
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+3116
-2234
lines changed

.github/workflows/bootstrap/action.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ runs:
3838
uses: actions/setup-dotnet@v4
3939
with:
4040
global-json-file: ./global.json
41+
# 7.x is required for the dotnet-project-licenses tool.
42+
dotnet-version: |
43+
7.x
4144
4245
- id: dotnet
4346
shell: bash

.github/workflows/ci-docs.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,13 @@ jobs:
2727
- run: 'echo "Not required for docs"'
2828

2929
# dummy steps that allow to bypass those mandatory checks for tests
30-
build:
30+
test-linux:
31+
runs-on: ubuntu-latest
32+
steps:
33+
- run: 'echo "Not required for docs"'
34+
35+
# dummy steps that allow to bypass those mandatory checks for tests
36+
release-build:
3137
runs-on: ubuntu-latest
3238
steps:
3339
- run: 'echo "Not required for docs"'

.github/workflows/ci.yml

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ env:
2828
# update ci-docs.yml
2929
jobs:
3030
test-windows:
31+
name: Windows Tests
3132
runs-on: windows-latest
3233
steps:
3334
- uses: actions/checkout@v4
@@ -36,11 +37,12 @@ jobs:
3637
id: bootstrap
3738
uses: ./.github/workflows/bootstrap
3839

39-
- name: Test
40-
run: build.bat test --test-suite=skip-e2e
40+
- name: Unit Tests
41+
run: build.bat test --test-suite=unit
4142
shell: cmd
4243

43-
build:
44+
test-linux:
45+
name: Linux Tests
4446
runs-on: ubuntu-latest
4547
steps:
4648
- uses: actions/checkout@v4
@@ -49,9 +51,19 @@ jobs:
4951
id: bootstrap
5052
uses: ./.github/workflows/bootstrap
5153

52-
- name: Test
53-
run: ./build.sh test --test-suite=skip-e2e
54+
- name: Unit Tests
55+
run: ./build.sh test --test-suite=unit # For now, we limit to unit tests only, until we have a better way to run integration tests only for autoinstrumentation builds
56+
57+
# We still run the full release build on pull-requests this ensures packages are validated ahead of time
58+
release-build:
59+
name: Release Build
60+
runs-on: ubuntu-latest
61+
steps:
62+
- uses: actions/checkout@v4
63+
64+
- name: Bootstrap Action Workspace
65+
id: bootstrap
66+
uses: ./.github/workflows/bootstrap
5467

55-
# We still run the full release build on pull-requests this ensures packages are validated ahead of time
5668
- name: Release
5769
run: ./build.sh release -c

build/build.fsproj

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,37 @@
11
<Project Sdk="Microsoft.NET.Sdk">
2+
23
<PropertyGroup>
34
<TargetFramework>net9.0</TargetFramework>
45
<OutputType>Exe</OutputType>
56
<NoWarn>$(NoWarn);NU1701</NoWarn>
67
<IsPackable>false</IsPackable>
78
</PropertyGroup>
9+
810
<ItemGroup>
9-
<PackageReference Include="Argu" Version="6.1.4"/>
10-
<PackageReference Include="Bullseye" Version="4.2.1"/>
11+
<PackageReference Include="Argu" Version="6.2.5" />
12+
<PackageReference Include="Bullseye" Version="4.2.1" />
1113
<PackageReference Include="Octokit" Version="13.0.1" />
12-
<PackageReference Include="Proc.Fs" Version="0.8.1"/>
13-
<PackageReference Include="Fake.Tools.Git" Version="5.20.3"/>
14-
<PackageReference Remove="FSharp.Core"/>
15-
<PackageReference Include="FSharp.Core" Version="8.0.101"/>
14+
<PackageReference Include="Proc.Fs" Version="0.9.1" />
15+
<PackageReference Include="Fake.Tools.Git" Version="5.23.1" />
16+
<PackageReference Remove="FSharp.Core" />
17+
<PackageReference Include="FSharp.Core" Version="9.0.201" />
1618
</ItemGroup>
1719

1820
<ItemGroup>
19-
<None Include="..\*" LinkBase="_root"/>
21+
<None Include="..\*" LinkBase="_root" />
2022
</ItemGroup>
2123

2224
<ItemGroup>
23-
<Compile Include="scripts\BuildInformation.fs"/>
24-
<Compile Include="scripts\CommandLine.fs"/>
25+
<Compile Include="scripts\BuildInformation.fs" />
26+
<Compile Include="scripts\CommandLine.fs" />
2527
<Compile Include="scripts\Packaging.fs" />
26-
<Compile Include="scripts\Targets.fs"/>
27-
<Compile Include="scripts\Program.fs"/>
28-
<None Include="**\*"/>
29-
<None Remove="bin\**"/>
30-
<None Remove="obj\**"/>
31-
<None Remove="scripts\**"/>
32-
<None Remove="output\**"/>
28+
<Compile Include="scripts\Targets.fs" />
29+
<Compile Include="scripts\Program.fs" />
30+
<None Include="**\*" />
31+
<None Remove="bin\**" />
32+
<None Remove="obj\**" />
33+
<None Remove="scripts\**" />
34+
<None Remove="output\**" />
3335
</ItemGroup>
3436

3537
</Project>

build/scripts/CommandLine.fs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ with
7575
| Skip_Dirty_Check -> "Skip the clean checkout check that guards the release/publish targets"
7676
| Test_Suite _ -> "Specify the test suite to run, defaults to all"
7777

78-
7978
member this.StepName =
8079
match FSharpValue.GetUnionFields(this, typeof<Build>) with
8180
| case, _ -> case.Name.ToLowerInvariant()

examples/Example.AspNetCore.Mvc/Example.AspNetCore.Mvc.csproj

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
<Project Sdk="Microsoft.NET.Sdk.Web">
1+
<Project Sdk="Microsoft.NET.Sdk.Web">
22

33
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
4+
<TargetFramework>net9.0</TargetFramework>
55
<Nullable>enable</Nullable>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
8+
<UserSecretsId>1efafe93-6112-431d-b30f-786205a20ebe</UserSecretsId>
89
</PropertyGroup>
910

1011
<ItemGroup>
@@ -13,7 +14,7 @@
1314
</ItemGroup>
1415

1516
<ItemGroup>
16-
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.9.0" />
17+
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.11.0" />
1718
</ItemGroup>
1819

1920
<ItemGroup>

examples/Example.AspNetCore.Mvc/Program.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,29 @@
22
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
33
// See the LICENSE file in the project root for more information
44

5-
using Example.AspNetCore.Mvc.Controllers;
65
using OpenTelemetry;
6+
using OpenTelemetry.Resources;
77

88
var builder = WebApplication.CreateBuilder(args);
99

10-
builder.AddServiceDefaults();
10+
using var loggerFactory = LoggerFactory.Create(loggingBuilder => loggingBuilder
11+
.SetMinimumLevel(LogLevel.Trace)
12+
.AddConsole());
13+
14+
var logger = loggerFactory.CreateLogger("OpenTelemetry");
1115

1216
// Add services to the container.
1317
builder.Services
1418
.AddHttpClient()
1519
.AddOpenTelemetry()
16-
.WithTracing(t => t.AddSource(HomeController.ActivitySourceName));
20+
.ConfigureResource(r => r.AddService("MyNewService1"))
21+
.WithElasticDefaults(builder.Configuration);
22+
23+
builder.Services.AddOpenTelemetry()
24+
.ConfigureResource(r => r.AddService("MyNewService2"))
25+
.WithElasticDefaults(builder.Configuration);
26+
27+
//OpenTelemetrySdk.Create(b => b.WithElasticDefaults(builder.Configuration));
1728

1829
builder.Services
1930
.AddControllersWithViews();

examples/Example.AspNetCore.Mvc/Properties/launchSettings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
"https": {
1010
"commandName": "Project",
1111
"launchBrowser": true,
12+
"environmentVariables": {
13+
"ASPNETCORE_ENVIRONMENT": "Development"
14+
},
1215
"dotnetRunMessages": true,
1316
"applicationUrl": "https://localhost:7295;http://localhost:5247"
1417
},

examples/Example.AspNetCore.Mvc/appsettings.json

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,19 @@
22
"Logging": {
33
"LogLevel": {
44
"Default": "Information",
5-
"Microsoft.AspNetCore": "Warning",
6-
"Elastic.OpenTelemetry": "Information"
5+
"Microsoft.AspNetCore": "Warning"
76
},
87
"OpenTelemetry": {
98
"IncludeFormattedMessage": true,
109
"IncludeScopes": true,
1110
"ParseStateValues": true
1211
}
1312
},
14-
"AllowedHosts": "*"
13+
"AllowedHosts": "*",
14+
"Elastic": {
15+
"OpenTelemetry": {
16+
"LogLevel": "Trace",
17+
"LogDirectory": "C:\\Logs\\BrandNewLogs"
18+
}
19+
}
1520
}

examples/Example.AutoInstrumentation/Example.AutoInstrumentation.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net8.0</TargetFramework>
5+
<TargetFramework>net9.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>

examples/Example.Console/Example.Console.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.9.0" />
11+
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.11.1" />
1212
<PackageReference Include="OpenTelemetry.Instrumentation.StackExchangeRedis" Version="1.9.0-beta.1" />
1313
</ItemGroup>
1414

examples/Example.Console/Usage.cs

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
// See the LICENSE file in the project root for more information
44

55
using System.Diagnostics;
6-
using Elastic.OpenTelemetry;
7-
using Elastic.OpenTelemetry.Extensions;
86
using OpenTelemetry;
97
using OpenTelemetry.Resources;
108
using OpenTelemetry.Trace;
@@ -21,45 +19,50 @@ public static async Task BasicBuilderUsageAsync()
2119
{
2220
// NOTE: This sample assumes ENV VARs have been set to configure the Endpoint and Authorization header.
2321

24-
// Build an instrumentation session by creating an ElasticOpenTelemetryBuilder.
25-
// The application will be instrumented until the session is disposed.
26-
await using var session = new ElasticOpenTelemetryBuilder()
27-
.WithTracing(b => b.AddSource(ActivitySourceName))
28-
.Build();
22+
//// Build an instrumentation session by creating an ElasticOpenTelemetryBuilder.
23+
//// The application will be instrumented until the session is disposed.
24+
//await using var session = new ElasticOpenTelemetryBuilder()
25+
// .WithTracing(b => b.AddSource(ActivitySourceName))
26+
// .Build();
2927

30-
await using var session2 = new ElasticOpenTelemetryBuilder().Build();
28+
//await using var session2 = new ElasticOpenTelemetryBuilder().Build();
3129

32-
// This example adds the application activity source and fully customises the resource
33-
await using var session3 = new ElasticOpenTelemetryBuilder()
34-
.WithTracing(b => b
35-
.AddSource(ActivitySourceName)
36-
.ConfigureResource(r => r.Clear().AddService("CustomServiceName", serviceVersion: "2.2.2")))
37-
.Build();
30+
//// This example adds the application activity source and fully customises the resource
31+
//await using var session3 = new ElasticOpenTelemetryBuilder()
32+
// .WithTracing(b => b
33+
// .AddSource(ActivitySourceName)
34+
// .ConfigureResource(r => r.Clear().AddService("CustomServiceName", serviceVersion: "2.2.2")))
35+
// .Build();
3836

39-
await using var session4 = new ElasticOpenTelemetryBuilder()
40-
.WithTracing(t => t
41-
.ConfigureResource(rb => rb.AddService("TracerProviderBuilder", "3.3.3"))
42-
.AddRedisInstrumentation() // This can currently only be achieved using this overload or adding Elastic processors to the TPB (as below)
43-
.AddSource(ActivitySourceName)
44-
.AddConsoleExporter()
45-
)
46-
.WithTracing(tpb => tpb
47-
.ConfigureResource(rb => rb.AddService("TracerProviderBuilder", "3.3.3"))
48-
.AddRedisInstrumentation() // This can currently only be achieved using this overload or adding Elastic processors to the TPB (as below)
49-
.AddSource(ActivitySourceName)
50-
.AddConsoleExporter())
51-
.Build();
37+
//await using var session4 = new ElasticOpenTelemetryBuilder()
38+
// .WithTracing(t => t
39+
// .ConfigureResource(rb => rb.AddService("TracerProviderBuilder", "3.3.3"))
40+
// .AddRedisInstrumentation() // This can currently only be achieved using this overload or adding Elastic processors to the TPB (as below)
41+
// .AddSource(ActivitySourceName)
42+
// .AddConsoleExporter()
43+
// )
44+
// .WithTracing(tpb => tpb
45+
// .ConfigureResource(rb => rb.AddService("TracerProviderBuilder", "3.3.3"))
46+
// .AddRedisInstrumentation() // This can currently only be achieved using this overload or adding Elastic processors to the TPB (as below)
47+
// .AddSource(ActivitySourceName)
48+
// .AddConsoleExporter())
49+
// .Build();
5250

53-
//This is the most flexible approach for a consumer as they can include our processor(s) and exporter(s)
54-
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
55-
.AddSource(ActivitySourceName)
56-
.ConfigureResource(resource =>
57-
resource.AddService(
58-
serviceName: "OtelSdkApp",
59-
serviceVersion: "1.0.0"))
60-
.AddConsoleExporter()
61-
.AddElasticProcessors()
62-
.Build();
51+
using var sdk = OpenTelemetrySdk.Create(builder => builder
52+
.WithElasticMetrics()
53+
.WithElasticMetrics()
54+
.ConfigureResource(resource => resource.AddService("MyCustomServiceName")));
55+
56+
//This is the most flexible approach for a consumer as they can include our processor(s)
57+
//using var tracerProvider = Sdk.CreateTracerProviderBuilder()
58+
// .AddSource(ActivitySourceName)
59+
// .ConfigureResource(resource =>
60+
// resource.AddService(
61+
// serviceName: "OtelSdkApp",
62+
// serviceVersion: "1.0.0"))
63+
// .AddConsoleExporter()
64+
// .AddElasticProcessors()
65+
// .Build();
6366

6467
await DoStuffAsync();
6568

examples/Example.MinimalApi/Example.MinimalApi.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
</ItemGroup>
1313

1414
<ItemGroup>
15-
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.9.0" />
15+
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.11.0" />
1616
</ItemGroup>
1717

1818
</Project>

examples/Example.MinimalApi/Program.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@
88

99
var builder = WebApplication.CreateBuilder(args);
1010

11+
//builder.AddElasticOpenTelemetry();
12+
1113
// This will add the OpenTelemetry services using Elastic defaults
1214
builder.AddServiceDefaults();
1315

1416
builder.Services
1517
.AddHttpClient() // Adds IHttpClientFactory
16-
.AddOpenTelemetry() // Adds app specific tracing
18+
.AddElasticOpenTelemetry() // Adds app specific tracing
1719
.WithTracing(t => t.AddSource(Api.ActivitySourceName));
1820

1921
var app = builder.Build();

examples/Example.MinimalApi/Properties/launchSettings.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@
2828
"applicationUrl": "https://localhost:7140;http://localhost:5146",
2929
"environmentVariables": {
3030
"ASPNETCORE_ENVIRONMENT": "Development",
31-
"OTEL_RESOURCE_ATTRIBUTES": "service.name=minimal-api-example"
31+
"OTEL_RESOURCE_ATTRIBUTES": "service.name=minimal-api-example",
32+
"OTEL_EXPORTER_OTLP_ENDPOINT": "https://opentelemetry-playground-adbd73.apm.eu-west-1.aws.elastic.cloud:443",
33+
"OTEL_EXPORTER_OTLP_HEADERS": "Authorization=ApiKey cVY3d3NKTUJXcWZFRWJwb2xURjA6bmNrZ0JiQ29SRWlEdUM1dzVORGYwZw=="
3234
}
3335
},
3436
"IIS Express": {

examples/Example.MinimalApi/appsettings.Development.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
"Logging": {
33
"LogLevel": {
44
"Default": "Information",
5-
"Microsoft.AspNetCore": "Warning"
5+
"Microsoft.AspNetCore": "Warning",
6+
"Elastic.OpenTelemetry": "Trace"
67
}
78
}
89
}

examples/Example.WorkerService/Example.WorkerService.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.0" />
12-
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.9.0" />
11+
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.1" />
12+
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.11.1" />
1313
</ItemGroup>
1414

1515
<ItemGroup>

0 commit comments

Comments
 (0)