Skip to content

Commit

Permalink
Separate detectors (#111)
Browse files Browse the repository at this point in the history
* separate instrumentation and resource detectors
* env var to enable specific detectors, wipes default list
  • Loading branch information
matt-hensley authored Aug 30, 2024
1 parent a688b61 commit 88566a7
Show file tree
Hide file tree
Showing 24 changed files with 670 additions and 204 deletions.
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,18 @@

## Unreleased

### BREAKING CHANGES

* Separates resource detectors and instrumentations. Removes resource detector
names from `Grafana.OpenTelemetry.Instrumentation` enumeration. Adds new
`Grafana.OpenTelemetry.ResourceDetectors` enumeration.
([#111](https://github.com/grafana/grafana-opentelemetry-dotnet/pull/111))
* Add new environment variable `GRAFANA_DOTNET_RESOURCEDETECTORS`. Setting this
will cause only the provided resource detectors to be enabled.
([#111](https://github.com/grafana/grafana-opentelemetry-dotnet/pull/111))

### Bug Fixes

* Remove workaround for stable `service.instance.id` across signals
([#108](https://github.com/grafana/grafana-opentelemetry-dotnet/pull/108))

Expand Down
53 changes: 53 additions & 0 deletions docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
* [Extra steps to activate specific instrumentations](#extra-steps-to-activate-specific-instrumentations)
* [ASP.NET (`AspNet`)](#aspnet-aspnet)
* [OWIN (`Owin`)](#owin-owin)
* [Resource detector configuration](#resource-detector-configuration)
* [Specifying resource detectors](#specifying-resource-detectors)
* [Disabling resource detectors](#disabling-resource-detectors)
* [Custom configuration](#custom-configuration)
* [Supported environment variables](#supported-environment-variables)

Expand Down Expand Up @@ -172,6 +175,55 @@ from the table above:
export GRAFANA_DOTNET_DISABLE_INSTRUMENTATIONS="Process,NetRuntime"
```

## Resource detector configuration

### Specifying resource detectors

Default resource detectors can be overridden by removing them from the `ResourceDetectors`
set in the configuration and specifying which resource detectors to enable:

```csharp
using var tracerProvider = Sdk.CreateMeterProviderBuilder()
.UseGrafana(config =>
{
config.ResourceDetectors.Clear(ResourceDetector.Host);
config.ResourceDetectors.Add(ResourceDetector.Process);
})
.Build();
```

Alternatively, resource detectors can be specified by the environment
variable `GRAFANA_DOTNET_RESOURCEDETECTORS`. This variable can be
populated with a comma-separated list of resource detector identifiers:

```sh
export GRAFANA_DOTNET_RESOURCEDETECTORS="Process"
```

### Disabling resource detectors

By default, `Host`, `Process`, and `ProcessRuntime` resource detectors are enabled.
Resource detectors can be disabled by removing them from the `ResourceDetectors`
set in the configuration:

```csharp
using var tracerProvider = Sdk.CreateMeterProviderBuilder()
.UseGrafana(config =>
{
config.ResourceDetectors.Remove(ResourceDetector.Host);
config.ResourceDetectors.Remove(ResourceDetector.Process);
})
.Build();
```

Alternatively, resource detectors can be disabled by the environment
variable `GRAFANA_DOTNET_DISABLE_RESOURCEDETECTORS`. This variable can be
populated with a comma-separated list of resource detector identifiers:

```sh
export GRAFANA_DOTNET_DISABLE_RESOURCEDETECTORS="Host,Process"
```

### Adding instrumentations not supported by the distribution

Instrumentations not included in the distribution can easily be added by
Expand Down Expand Up @@ -309,3 +361,4 @@ are not contained in the distribution.
| Variable | Example value | Description |
| ----------------------------------------- | ------------------ | ----------- |
| `GRAFANA_DOTNET_DISABLE_INSTRUMENTATIONS` | "Process,NetRuntime" | A comma-separated list of instrumentations to disable. |
| `GRAFANA_DOTNET_DISABLE_RESOURCEDETECTORS`| "Host" | A comma-separated list of resource detectors to disable. |
49 changes: 45 additions & 4 deletions src/Grafana.OpenTelemetry.Base/GrafanaOpenTelemetrySettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ namespace Grafana.OpenTelemetry
public class GrafanaOpenTelemetrySettings
{
internal const string DisableInstrumentationsEnvVarName = "GRAFANA_DOTNET_DISABLE_INSTRUMENTATIONS";
internal const string DisableResourceDetectorsEnvVarName = "GRAFANA_DOTNET_DISABLE_RESOURCEDETECTORS";
internal const string ResourceDetectorsEnvVarName = "GRAFANA_DOTNET_RESOURCEDETECTORS";
internal const string ServiceNameEnvVarName = "OTEL_SERVICE_NAME";

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

/// <summary>
/// Gets the list of resource detectors to be activated.
///
/// By default, all only resource detectors that do not impact application startup are activated.
/// </summary>
public HashSet<ResourceDetector> ResourceDetectors { get; } = new HashSet<ResourceDetector>(new ResourceDetector[]
{
// Activating the container resource detector by default always populates a `container.id` attribute,
// even when running in a non-container Linux setting.
// ResourceDetector.Container,
ResourceDetector.Host,
ResourceDetector.Process,
ResourceDetector.ProcessRuntime,
});

/// <summary>
/// Gets or sets the logical name of the service to be instrumented.
///
Expand Down Expand Up @@ -97,10 +114,6 @@ internal GrafanaOpenTelemetrySettings(IConfiguration configuration)
// De-activate it until the related issue is resolved: https://github.com/grafana/app-o11y/issues/378
Instrumentations.Remove(Instrumentation.AWSLambda);

// Activating the container resource detector by default always populates a `container.id` attribute,
// even when running in a non-container Linux setting.
Instrumentations.Remove(Instrumentation.ContainerResource);

var disableInstrumentations = configuration[DisableInstrumentationsEnvVarName];

if (!string.IsNullOrEmpty(disableInstrumentations))
Expand All @@ -114,6 +127,34 @@ internal GrafanaOpenTelemetrySettings(IConfiguration configuration)
}
}

var resourceDetectors = configuration[ResourceDetectorsEnvVarName];

if (!string.IsNullOrEmpty(resourceDetectors))
{
ResourceDetectors.Clear();

foreach (var resourceDetectorStr in resourceDetectors.Split(new char[] { ',', ':' }))
{
if (Enum.TryParse<ResourceDetector>(resourceDetectorStr, out var resourceDetector))
{
ResourceDetectors.Add(resourceDetector);
}
}
}

var disableResourceDetectors = configuration[DisableResourceDetectorsEnvVarName];

if (!string.IsNullOrEmpty(disableResourceDetectors))
{
foreach (var resourceDetectorStr in disableResourceDetectors.Split(new char[] { ',', ':' }))
{
if (Enum.TryParse<ResourceDetector>(resourceDetectorStr, out var resourceDetector))
{
ResourceDetectors.Remove(resourceDetector);
}
}
}

var serviceName = configuration[ServiceNameEnvVarName];

if (!string.IsNullOrEmpty(serviceName))
Expand Down
27 changes: 0 additions & 27 deletions src/Grafana.OpenTelemetry.Base/Instrumentations/AWSResource.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -98,36 +98,6 @@ public enum Instrumentation
/// <summary>
/// WCF traces (OpenTelemetry.Instrumentation.Wcf)
/// </summary>
Wcf,

/// <summary>
/// AWS Resource Detector (OpenTelemetry.ResourceDetectors.AWS)
/// </summary>
AWSResource,

/// <summary>
/// Azure Resource Detector (OpenTelemetry.ResourceDetectors.Azure)
/// </summary>
AzureResource,

/// <summary>
/// Container Resource Detector (OpenTelemetry.ResourceDetectors.Container)
/// </summary>
ContainerResource,

/// <summary>
/// Host Resource Detector (OpenTelemetry.ResourceDetectors.Host)
/// </summary>
HostResource,

/// <summary>
/// Process Resource Detector (OpenTelemetry.ResourceDetectors.Process)
/// </summary>
ProcessResource,

/// <summary>
/// Process Runtime Resource Detector (OpenTelemetry.ResourceDetectors.ProcessRuntime)
/// </summary>
ProcessRuntimeResource
Wcf
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
//

using System;
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

namespace Grafana.OpenTelemetry
Expand Down Expand Up @@ -35,16 +33,6 @@ internal abstract class InstrumentationInitializer
new SqlClientInitializer(),
new StackExchangeRedisInitializer(),
new WcfInitializer(),
new AzureResourceInitializer(),
#if NET6_0_OR_GREATER
new ContainerResourceInitializer(),
#endif
#if !NETSTANDARD
new AWSResourceInitializer(),
new HostResourceInitializer(),
new ProcessResourceInitializer(),
new ProcessRuntimeResourceInitializer()
#endif
};

abstract public Instrumentation Id { get; }
Expand All @@ -54,7 +42,6 @@ public void Initialize(TracerProviderBuilder builder)
try
{
InitializeTracing(builder);
InitializeResource(builder);

GrafanaOpenTelemetryEventSource.Log.EnabledTracingInstrumentation(Id.ToString());
}
Expand All @@ -69,7 +56,6 @@ public void Initialize(MeterProviderBuilder builder)
try
{
InitializeMetrics(builder);
InitializeResource(builder);

GrafanaOpenTelemetryEventSource.Log.EnabledMetricsInstrumentation(Id.ToString());
}
Expand All @@ -79,25 +65,10 @@ public void Initialize(MeterProviderBuilder builder)
}
}

protected void InitializeResource(TracerProviderBuilder builder)
{
builder.ConfigureResource(resourceBuilder => InitializeResourceDetector(resourceBuilder));
}

protected void InitializeResource(MeterProviderBuilder builder)
{
builder.ConfigureResource(resourceBuilder => InitializeResourceDetector(resourceBuilder));
}

protected virtual void InitializeTracing(TracerProviderBuilder builder)
{ }

protected virtual void InitializeMetrics(MeterProviderBuilder builder)
{ }

protected virtual ResourceBuilder InitializeResourceDetector(ResourceBuilder builder)
{
return builder;
}
}
}
19 changes: 19 additions & 0 deletions src/Grafana.OpenTelemetry.Base/MeterProviderBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public static MeterProviderBuilder UseGrafana(this MeterProviderBuilder builder,
return builder
.AddGrafanaExporter(settings?.ExporterSettings)
.AddInstrumentations(settings?.Instrumentations)
.AddResourceDetectors(settings?.ResourceDetectors)
.ConfigureResource(resourceBuilder => resourceBuilder.AddGrafanaResource(settings));
}

Expand Down Expand Up @@ -67,5 +68,23 @@ internal static MeterProviderBuilder AddInstrumentations(this MeterProviderBuild

return builder;
}

internal static MeterProviderBuilder AddResourceDetectors(this MeterProviderBuilder builder, HashSet<ResourceDetector> resourceDetectors)
{
if (resourceDetectors == null)
{
return builder;
}

foreach (var initializer in ResourceDetectorInitializer.Initializers)
{
if (resourceDetectors.Contains(initializer.Id))
{
initializer.Initialize(builder);
}
}

return builder;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//
// Copyright Grafana Labs
// SPDX-License-Identifier: Apache-2.0
//

#if !NETSTANDARD
using OpenTelemetry.Resources;

namespace Grafana.OpenTelemetry
{
internal class AWSEBSDetectorInitializer : ResourceDetectorInitializer
{
public override ResourceDetector Id { get; } = ResourceDetector.AWSEBSDetector;

protected override ResourceBuilder InitializeResourceDetector(ResourceBuilder builder)
{
return builder.AddAWSEBSDetector();
}
}
}
#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//
// Copyright Grafana Labs
// SPDX-License-Identifier: Apache-2.0
//

#if !NETSTANDARD
using OpenTelemetry.Resources;

namespace Grafana.OpenTelemetry
{
internal class AWSEC2DetectorInitializer : ResourceDetectorInitializer
{
public override ResourceDetector Id { get; } = ResourceDetector.AWSEC2Detector;

protected override ResourceBuilder InitializeResourceDetector(ResourceBuilder builder)
{
return builder.AddAWSEC2Detector();
}
}
}
#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//
// Copyright Grafana Labs
// SPDX-License-Identifier: Apache-2.0
//

#if !NETSTANDARD && !NETFRAMEWORK
using OpenTelemetry.Resources;

namespace Grafana.OpenTelemetry
{
internal class AWSECSDetectorInitializer : ResourceDetectorInitializer
{
public override ResourceDetector Id { get; } = ResourceDetector.AWSECSDetector;

protected override ResourceBuilder InitializeResourceDetector(ResourceBuilder builder)
{
return builder.AddAWSECSDetector();
}
}
}
#endif
Loading

0 comments on commit 88566a7

Please sign in to comment.