Skip to content

Commit 88566a7

Browse files
authored
Separate detectors (#111)
* separate instrumentation and resource detectors * env var to enable specific detectors, wipes default list
1 parent a688b61 commit 88566a7

24 files changed

+670
-204
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22

33
## Unreleased
44

5+
### BREAKING CHANGES
6+
7+
* Separates resource detectors and instrumentations. Removes resource detector
8+
names from `Grafana.OpenTelemetry.Instrumentation` enumeration. Adds new
9+
`Grafana.OpenTelemetry.ResourceDetectors` enumeration.
10+
([#111](https://github.com/grafana/grafana-opentelemetry-dotnet/pull/111))
11+
* Add new environment variable `GRAFANA_DOTNET_RESOURCEDETECTORS`. Setting this
12+
will cause only the provided resource detectors to be enabled.
13+
([#111](https://github.com/grafana/grafana-opentelemetry-dotnet/pull/111))
14+
15+
### Bug Fixes
16+
517
* Remove workaround for stable `service.instance.id` across signals
618
([#108](https://github.com/grafana/grafana-opentelemetry-dotnet/pull/108))
719

docs/configuration.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
* [Extra steps to activate specific instrumentations](#extra-steps-to-activate-specific-instrumentations)
1414
* [ASP.NET (`AspNet`)](#aspnet-aspnet)
1515
* [OWIN (`Owin`)](#owin-owin)
16+
* [Resource detector configuration](#resource-detector-configuration)
17+
* [Specifying resource detectors](#specifying-resource-detectors)
18+
* [Disabling resource detectors](#disabling-resource-detectors)
1619
* [Custom configuration](#custom-configuration)
1720
* [Supported environment variables](#supported-environment-variables)
1821

@@ -172,6 +175,55 @@ from the table above:
172175
export GRAFANA_DOTNET_DISABLE_INSTRUMENTATIONS="Process,NetRuntime"
173176
```
174177

178+
## Resource detector configuration
179+
180+
### Specifying resource detectors
181+
182+
Default resource detectors can be overridden by removing them from the `ResourceDetectors`
183+
set in the configuration and specifying which resource detectors to enable:
184+
185+
```csharp
186+
using var tracerProvider = Sdk.CreateMeterProviderBuilder()
187+
.UseGrafana(config =>
188+
{
189+
config.ResourceDetectors.Clear(ResourceDetector.Host);
190+
config.ResourceDetectors.Add(ResourceDetector.Process);
191+
})
192+
.Build();
193+
```
194+
195+
Alternatively, resource detectors can be specified by the environment
196+
variable `GRAFANA_DOTNET_RESOURCEDETECTORS`. This variable can be
197+
populated with a comma-separated list of resource detector identifiers:
198+
199+
```sh
200+
export GRAFANA_DOTNET_RESOURCEDETECTORS="Process"
201+
```
202+
203+
### Disabling resource detectors
204+
205+
By default, `Host`, `Process`, and `ProcessRuntime` resource detectors are enabled.
206+
Resource detectors can be disabled by removing them from the `ResourceDetectors`
207+
set in the configuration:
208+
209+
```csharp
210+
using var tracerProvider = Sdk.CreateMeterProviderBuilder()
211+
.UseGrafana(config =>
212+
{
213+
config.ResourceDetectors.Remove(ResourceDetector.Host);
214+
config.ResourceDetectors.Remove(ResourceDetector.Process);
215+
})
216+
.Build();
217+
```
218+
219+
Alternatively, resource detectors can be disabled by the environment
220+
variable `GRAFANA_DOTNET_DISABLE_RESOURCEDETECTORS`. This variable can be
221+
populated with a comma-separated list of resource detector identifiers:
222+
223+
```sh
224+
export GRAFANA_DOTNET_DISABLE_RESOURCEDETECTORS="Host,Process"
225+
```
226+
175227
### Adding instrumentations not supported by the distribution
176228

177229
Instrumentations not included in the distribution can easily be added by
@@ -309,3 +361,4 @@ are not contained in the distribution.
309361
| Variable | Example value | Description |
310362
| ----------------------------------------- | ------------------ | ----------- |
311363
| `GRAFANA_DOTNET_DISABLE_INSTRUMENTATIONS` | "Process,NetRuntime" | A comma-separated list of instrumentations to disable. |
364+
| `GRAFANA_DOTNET_DISABLE_RESOURCEDETECTORS`| "Host" | A comma-separated list of resource detectors to disable. |

src/Grafana.OpenTelemetry.Base/GrafanaOpenTelemetrySettings.cs

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ namespace Grafana.OpenTelemetry
1717
public class GrafanaOpenTelemetrySettings
1818
{
1919
internal const string DisableInstrumentationsEnvVarName = "GRAFANA_DOTNET_DISABLE_INSTRUMENTATIONS";
20+
internal const string DisableResourceDetectorsEnvVarName = "GRAFANA_DOTNET_DISABLE_RESOURCEDETECTORS";
21+
internal const string ResourceDetectorsEnvVarName = "GRAFANA_DOTNET_RESOURCEDETECTORS";
2022
internal const string ServiceNameEnvVarName = "OTEL_SERVICE_NAME";
2123

2224
/// <summary>
@@ -39,6 +41,21 @@ public class GrafanaOpenTelemetrySettings
3941
/// </summary>
4042
public HashSet<Instrumentation> Instrumentations { get; } = new HashSet<Instrumentation>((Instrumentation[])Enum.GetValues(typeof(Instrumentation)));
4143

44+
/// <summary>
45+
/// Gets the list of resource detectors to be activated.
46+
///
47+
/// By default, all only resource detectors that do not impact application startup are activated.
48+
/// </summary>
49+
public HashSet<ResourceDetector> ResourceDetectors { get; } = new HashSet<ResourceDetector>(new ResourceDetector[]
50+
{
51+
// Activating the container resource detector by default always populates a `container.id` attribute,
52+
// even when running in a non-container Linux setting.
53+
// ResourceDetector.Container,
54+
ResourceDetector.Host,
55+
ResourceDetector.Process,
56+
ResourceDetector.ProcessRuntime,
57+
});
58+
4259
/// <summary>
4360
/// Gets or sets the logical name of the service to be instrumented.
4461
///
@@ -97,10 +114,6 @@ internal GrafanaOpenTelemetrySettings(IConfiguration configuration)
97114
// De-activate it until the related issue is resolved: https://github.com/grafana/app-o11y/issues/378
98115
Instrumentations.Remove(Instrumentation.AWSLambda);
99116

100-
// Activating the container resource detector by default always populates a `container.id` attribute,
101-
// even when running in a non-container Linux setting.
102-
Instrumentations.Remove(Instrumentation.ContainerResource);
103-
104117
var disableInstrumentations = configuration[DisableInstrumentationsEnvVarName];
105118

106119
if (!string.IsNullOrEmpty(disableInstrumentations))
@@ -114,6 +127,34 @@ internal GrafanaOpenTelemetrySettings(IConfiguration configuration)
114127
}
115128
}
116129

130+
var resourceDetectors = configuration[ResourceDetectorsEnvVarName];
131+
132+
if (!string.IsNullOrEmpty(resourceDetectors))
133+
{
134+
ResourceDetectors.Clear();
135+
136+
foreach (var resourceDetectorStr in resourceDetectors.Split(new char[] { ',', ':' }))
137+
{
138+
if (Enum.TryParse<ResourceDetector>(resourceDetectorStr, out var resourceDetector))
139+
{
140+
ResourceDetectors.Add(resourceDetector);
141+
}
142+
}
143+
}
144+
145+
var disableResourceDetectors = configuration[DisableResourceDetectorsEnvVarName];
146+
147+
if (!string.IsNullOrEmpty(disableResourceDetectors))
148+
{
149+
foreach (var resourceDetectorStr in disableResourceDetectors.Split(new char[] { ',', ':' }))
150+
{
151+
if (Enum.TryParse<ResourceDetector>(resourceDetectorStr, out var resourceDetector))
152+
{
153+
ResourceDetectors.Remove(resourceDetector);
154+
}
155+
}
156+
}
157+
117158
var serviceName = configuration[ServiceNameEnvVarName];
118159

119160
if (!string.IsNullOrEmpty(serviceName))

src/Grafana.OpenTelemetry.Base/Instrumentations/AWSResource.cs

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/Grafana.OpenTelemetry.Base/Instrumentations/Instrumentation.cs

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -98,36 +98,6 @@ public enum Instrumentation
9898
/// <summary>
9999
/// WCF traces (OpenTelemetry.Instrumentation.Wcf)
100100
/// </summary>
101-
Wcf,
102-
103-
/// <summary>
104-
/// AWS Resource Detector (OpenTelemetry.ResourceDetectors.AWS)
105-
/// </summary>
106-
AWSResource,
107-
108-
/// <summary>
109-
/// Azure Resource Detector (OpenTelemetry.ResourceDetectors.Azure)
110-
/// </summary>
111-
AzureResource,
112-
113-
/// <summary>
114-
/// Container Resource Detector (OpenTelemetry.ResourceDetectors.Container)
115-
/// </summary>
116-
ContainerResource,
117-
118-
/// <summary>
119-
/// Host Resource Detector (OpenTelemetry.ResourceDetectors.Host)
120-
/// </summary>
121-
HostResource,
122-
123-
/// <summary>
124-
/// Process Resource Detector (OpenTelemetry.ResourceDetectors.Process)
125-
/// </summary>
126-
ProcessResource,
127-
128-
/// <summary>
129-
/// Process Runtime Resource Detector (OpenTelemetry.ResourceDetectors.ProcessRuntime)
130-
/// </summary>
131-
ProcessRuntimeResource
101+
Wcf
132102
}
133103
}

src/Grafana.OpenTelemetry.Base/Instrumentations/InstrumentationInitializer.cs

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
//
55

66
using System;
7-
using OpenTelemetry.Logs;
87
using OpenTelemetry.Metrics;
9-
using OpenTelemetry.Resources;
108
using OpenTelemetry.Trace;
119

1210
namespace Grafana.OpenTelemetry
@@ -35,16 +33,6 @@ internal abstract class InstrumentationInitializer
3533
new SqlClientInitializer(),
3634
new StackExchangeRedisInitializer(),
3735
new WcfInitializer(),
38-
new AzureResourceInitializer(),
39-
#if NET6_0_OR_GREATER
40-
new ContainerResourceInitializer(),
41-
#endif
42-
#if !NETSTANDARD
43-
new AWSResourceInitializer(),
44-
new HostResourceInitializer(),
45-
new ProcessResourceInitializer(),
46-
new ProcessRuntimeResourceInitializer()
47-
#endif
4836
};
4937

5038
abstract public Instrumentation Id { get; }
@@ -54,7 +42,6 @@ public void Initialize(TracerProviderBuilder builder)
5442
try
5543
{
5644
InitializeTracing(builder);
57-
InitializeResource(builder);
5845

5946
GrafanaOpenTelemetryEventSource.Log.EnabledTracingInstrumentation(Id.ToString());
6047
}
@@ -69,7 +56,6 @@ public void Initialize(MeterProviderBuilder builder)
6956
try
7057
{
7158
InitializeMetrics(builder);
72-
InitializeResource(builder);
7359

7460
GrafanaOpenTelemetryEventSource.Log.EnabledMetricsInstrumentation(Id.ToString());
7561
}
@@ -79,25 +65,10 @@ public void Initialize(MeterProviderBuilder builder)
7965
}
8066
}
8167

82-
protected void InitializeResource(TracerProviderBuilder builder)
83-
{
84-
builder.ConfigureResource(resourceBuilder => InitializeResourceDetector(resourceBuilder));
85-
}
86-
87-
protected void InitializeResource(MeterProviderBuilder builder)
88-
{
89-
builder.ConfigureResource(resourceBuilder => InitializeResourceDetector(resourceBuilder));
90-
}
91-
9268
protected virtual void InitializeTracing(TracerProviderBuilder builder)
9369
{ }
9470

9571
protected virtual void InitializeMetrics(MeterProviderBuilder builder)
9672
{ }
97-
98-
protected virtual ResourceBuilder InitializeResourceDetector(ResourceBuilder builder)
99-
{
100-
return builder;
101-
}
10273
}
10374
}

src/Grafana.OpenTelemetry.Base/MeterProviderBuilderExtensions.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public static MeterProviderBuilder UseGrafana(this MeterProviderBuilder builder,
4040
return builder
4141
.AddGrafanaExporter(settings?.ExporterSettings)
4242
.AddInstrumentations(settings?.Instrumentations)
43+
.AddResourceDetectors(settings?.ResourceDetectors)
4344
.ConfigureResource(resourceBuilder => resourceBuilder.AddGrafanaResource(settings));
4445
}
4546

@@ -67,5 +68,23 @@ internal static MeterProviderBuilder AddInstrumentations(this MeterProviderBuild
6768

6869
return builder;
6970
}
71+
72+
internal static MeterProviderBuilder AddResourceDetectors(this MeterProviderBuilder builder, HashSet<ResourceDetector> resourceDetectors)
73+
{
74+
if (resourceDetectors == null)
75+
{
76+
return builder;
77+
}
78+
79+
foreach (var initializer in ResourceDetectorInitializer.Initializers)
80+
{
81+
if (resourceDetectors.Contains(initializer.Id))
82+
{
83+
initializer.Initialize(builder);
84+
}
85+
}
86+
87+
return builder;
88+
}
7089
}
7190
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//
2+
// Copyright Grafana Labs
3+
// SPDX-License-Identifier: Apache-2.0
4+
//
5+
6+
#if !NETSTANDARD
7+
using OpenTelemetry.Resources;
8+
9+
namespace Grafana.OpenTelemetry
10+
{
11+
internal class AWSEBSDetectorInitializer : ResourceDetectorInitializer
12+
{
13+
public override ResourceDetector Id { get; } = ResourceDetector.AWSEBSDetector;
14+
15+
protected override ResourceBuilder InitializeResourceDetector(ResourceBuilder builder)
16+
{
17+
return builder.AddAWSEBSDetector();
18+
}
19+
}
20+
}
21+
#endif
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//
2+
// Copyright Grafana Labs
3+
// SPDX-License-Identifier: Apache-2.0
4+
//
5+
6+
#if !NETSTANDARD
7+
using OpenTelemetry.Resources;
8+
9+
namespace Grafana.OpenTelemetry
10+
{
11+
internal class AWSEC2DetectorInitializer : ResourceDetectorInitializer
12+
{
13+
public override ResourceDetector Id { get; } = ResourceDetector.AWSEC2Detector;
14+
15+
protected override ResourceBuilder InitializeResourceDetector(ResourceBuilder builder)
16+
{
17+
return builder.AddAWSEC2Detector();
18+
}
19+
}
20+
}
21+
#endif
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//
2+
// Copyright Grafana Labs
3+
// SPDX-License-Identifier: Apache-2.0
4+
//
5+
6+
#if !NETSTANDARD && !NETFRAMEWORK
7+
using OpenTelemetry.Resources;
8+
9+
namespace Grafana.OpenTelemetry
10+
{
11+
internal class AWSECSDetectorInitializer : ResourceDetectorInitializer
12+
{
13+
public override ResourceDetector Id { get; } = ResourceDetector.AWSECSDetector;
14+
15+
protected override ResourceBuilder InitializeResourceDetector(ResourceBuilder builder)
16+
{
17+
return builder.AddAWSECSDetector();
18+
}
19+
}
20+
}
21+
#endif

0 commit comments

Comments
 (0)