opentelemetry-dotnet-instru.../docs
Igor Kiselev 6e307db05b
Automatic LoaderOptimization.SingleDomain (#4187)
* All non-default app domains use LoaderOptimization.SingleDomain

Solves "Loading this assembly would produce a different grant set from other instances" for IIS .Net Framework applications.
__DDVoidMethodType__  injected to mscorlib.
__DDVoidMethodType__.__DDPatchAppDomainSetup__ use reflection-created delegate that calls
OpenTelemetry.AutoInstrumentation.Loader.AppConfigUpdater.ModifyConfig to modify AppDomainSetup by setting LoaderOptimization.SingleDomain.
That method called from AppDomain.CreateDomain and AppDomainManager.CreateDomainHelper.
OpenTelemetry.AutoInstrumentation.Loader.AppConfigUpdater loader assembly loaded from __DDVoidMethodType__ static ctor.
Added helpers: SignatureBuilder and MemberResolver.

* Added installer parameter to skip GAC registration

Added Asp.Net tests without registration assemblies in GAC.
Removed LoaderOptimization=SingleDomain through registry change for ASP.Net tests.

* Removed LoaderOptimization workaround from test dockerfiles

* Code format applied

* Updated test build to produce no-GAC docker images

* Extended  SignatureBuilder by providing semi-safe wrappers

Moved it to be header-only.
Added unit tests for SignatureBuilder.

* Updated change log and documentation

* Removed Troubleshooting link from IIS instrumentation docs

* Fixed accident docker file changes

* Added comment about callers of AppConfigUpdater.ModifyConfig

* Update CHANGELOG.md typo based on review

Co-authored-by: Chris Ventura <45495992+nrcventura@users.noreply.github.com>

* Smaller cleanups

* Minor names/comments changes based on @zacharycmontoya review

* Fixed formatting

* Make AppConfigUpdater internal

---------

Co-authored-by: Chris Ventura <45495992+nrcventura@users.noreply.github.com>
2025-05-12 13:39:04 +02:00
..
images ASP.NET - auto registration for HttpModule (#2569) 2023-05-25 08:57:34 +00:00
internal [log4net] update docs (#4022) 2025-02-10 12:21:12 +01:00
CODE_OF_CONDUCT.md Rename default OTel branch to main (#40) 2021-01-28 10:26:31 -08:00
CONTRIBUTING.md [docs] Contributing first PR (#4159) 2025-04-17 06:27:34 +02:00
README.md Update README - SDK version (#4195) 2025-05-07 10:37:50 +02:00
config.md Bump OTel .NET to 1.12.0 (#4188) 2025-05-07 05:36:08 +00:00
design.md Fix links to instrumentation packages (#3405) 2024-05-10 17:33:58 +00:00
developing.md Make AspNetCoreBootstrapper all FrameworkReference assets private (#4103) 2025-03-20 03:32:07 +00:00
handling-opentelemetry-references.md Guide on Managing OpenTelemetry SDK/Instrumentation with Auto-Instrumentation (#3472) 2024-06-27 23:53:15 +00:00
iis-instrumentation.md Automatic LoaderOptimization.SingleDomain (#4187) 2025-05-12 13:39:04 +02:00
log-trace-correlation.md [log4net] update docs (#4022) 2025-02-10 12:21:12 +01:00
log4net-bridge.md [log4net] update docs (#4022) 2025-02-10 12:21:12 +01:00
manual-instrumentation.md Bump OpenTelemetry main packages to 1.10.0 (#3816) 2024-11-29 05:55:27 +01:00
plugins.md Bump OTel .NET to 1.12.0 (#4188) 2025-05-07 05:36:08 +00:00
releasing.md Bump lycheeverse/lychee-action from 2.3.0 to 2.4.0 (#4119) 2025-04-01 14:41:09 +02:00
troubleshooting.md Automatic LoaderOptimization.SingleDomain (#4187) 2025-05-12 13:39:04 +02:00
using-the-nuget-packages.md Bytecode instrumentation MongoDB (#3845) 2024-12-10 09:43:12 +01:00
versioning.md Update versioning before stable (#1707) 2022-12-07 08:59:06 +00:00
wcf-config.md Release 1.0.1 (#2971) 2023-09-21 11:32:21 +02:00
windows-service-instrumentation.md Update Note/Warnings md-syntax (#3081) 2023-11-08 18:46:52 +00:00

README.md

OpenTelemetry .NET Automatic Instrumentation

Slack NuGet NuGet OpenSSF Scorecard OpenSSF Best Practices FOSSA License Status FOSSA Security Status

This project adds OpenTelemetry instrumentation to .NET applications without having to modify their source code.


[!WARNING] The following documentation refers to the in-development version of OpenTelemetry .NET Automatic Instrumentation. Docs for the latest version (1.11.0) can be found in opentelemetry.io or here.


Quick start

If you'd like to try the instrumentation on an existing application before learning more about the configuration options and the project, use the recommended installation method described at Using the OpenTelemetry.AutoInstrumentation NuGet packages or use the appropriate install script:

[!NOTE] The NuGet packages are the recommended way to deploy automatic instrumentation, but they can't be used in all cases. See Limitations for details.

To see the telemetry from your application directly on the standard output, set the following environment variables to console before launching your application:

  • OTEL_TRACES_EXPORTER
  • OTEL_METRICS_EXPORTER
  • OTEL_LOGS_EXPORTER

For a demo using docker compose, clone this repository and follow the examples/demo/README.md.

Components

OpenTelemetry .NET Automatic Instrumentation is built on top of OpenTelemetry .NET:

You can find all references in OpenTelemetry.AutoInstrumentation.csproj and OpenTelemetry.AutoInstrumentation.AdditionalDeps/Directory.Build.props.

To automatically instrument applications, the OpenTelemetry .NET Automatic Instrumentation does the following:

  1. Injects and configures the OpenTelemetry .NET SDK into the application.
  2. Adds OpenTelemetry Instrumentation to key packages and APIs used by the application.

You can enable the OpenTelemetry .NET Automatic Instrumentation as a .NET Profiler to inject additional instrumentations of this project at runtime, using a technique known as monkey-patching. When enabled, the OpenTelemetry .NET Automatic Instrumentation generates traces for libraries that don't already generate traces using the OpenTelemetry .NET SDK.

See design.md for an architectural overview.

Status

The versioning information and stability guarantees can be found in the versioning documentation.

Compatibility

OpenTelemetry .NET Automatic Instrumentation should work with all officially supported operating systems and versions of .NET.

The minimal supported version of .NET Framework is 4.6.2.

Supported processor architectures are:

CI tests run against the following operating systems:

Instrumented libraries and frameworks

See config.md#instrumented-libraries-and-frameworks.

Get started

Considerations on scope

Instrumenting self-contained applications is supported through NuGet packages. Note that a self-contained application is automatically generated in .NET 7+ whenever the dotnet publish or dotnet build command is used with a Runtime Identifier (RID) parameter, for example when -r or --runtime is used when running the command.

Install using NuGet packages

The NuGet packages are the recommended way to deploy automatic instrumentation, but they can't be used in all cases. To install using the NuGet packages, see Using the OpenTelemetry.AutoInstrumentation NuGet packages. See Limitations for incompatible scenarios.

Install manually

To install the automatic instrumentation manually, download and extract the appropriate binaries from the latest release.

[!NOTE] The path where you put the binaries is referenced as $INSTALL_DIR.

Instrument a .NET application

When running your application, make sure to:

  1. Set the resources.
  2. Set the environment variables from the table below.
Environment variable .NET version Value
COR_ENABLE_PROFILING .NET Framework 1
COR_PROFILER .NET Framework {918728DD-259F-4A6A-AC2B-B85E1B658318}
COR_PROFILER_PATH_32 .NET Framework $INSTALL_DIR/win-x86/OpenTelemetry.AutoInstrumentation.Native.dll
COR_PROFILER_PATH_64 .NET Framework $INSTALL_DIR/win-x64/OpenTelemetry.AutoInstrumentation.Native.dll
CORECLR_ENABLE_PROFILING .NET 1
CORECLR_PROFILER .NET {918728DD-259F-4A6A-AC2B-B85E1B658318}
CORECLR_PROFILER_PATH .NET on Linux glibc $INSTALL_DIR/linux-x64/OpenTelemetry.AutoInstrumentation.Native.so
CORECLR_PROFILER_PATH .NET on Linux musl $INSTALL_DIR/linux-musl-x64/OpenTelemetry.AutoInstrumentation.Native.so
CORECLR_PROFILER_PATH .NET on macOS $INSTALL_DIR/osx-x64/OpenTelemetry.AutoInstrumentation.Native.dylib
CORECLR_PROFILER_PATH_32 .NET on Windows $INSTALL_DIR/win-x86/OpenTelemetry.AutoInstrumentation.Native.dll
CORECLR_PROFILER_PATH_64 .NET on Windows $INSTALL_DIR/win-x64/OpenTelemetry.AutoInstrumentation.Native.dll
DOTNET_ADDITIONAL_DEPS .NET $INSTALL_DIR/AdditionalDeps
DOTNET_SHARED_STORE .NET $INSTALL_DIR/store
DOTNET_STARTUP_HOOKS .NET $INSTALL_DIR/net/OpenTelemetry.AutoInstrumentation.StartupHook.dll
OTEL_DOTNET_AUTO_HOME All versions $INSTALL_DIR

[!NOTE] Some settings can be omitted on .NET. For more information, see config.md.

[!IMPORTANT] Starting in .NET 8, the environment variable DOTNET_EnableDiagnostics=0 disables all diagnostics, including the CLR Profiler facility which is needed to launch the instrumentation, if not using .NET Startup hooks. Ensure that DOTNET_EnableDiagnostics=1, or if you'd like to limit diagnostics only to the CLR Profiler, you may set both DOTNET_EnableDiagnostics=1 and DOTNET_EnableDiagnostics_Profiler=1 while setting other diagnostics features to 0. See this issue for more guidance.

Shell scripts

You can install OpenTelemetry .NET Automatic Instrumentation and instrument your .NET application using the provided Shell scripts.

[!NOTE] On macOS coreutils is required.

Example usage:

# Download the bash script
curl -sSfL https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases/download/v1.11.0/otel-dotnet-auto-install.sh -O

# Install core files
sh ./otel-dotnet-auto-install.sh

# Enable execution for the instrumentation script
chmod +x $HOME/.otel-dotnet-auto/instrument.sh

# Setup the instrumentation for the current shell session
. $HOME/.otel-dotnet-auto/instrument.sh

# Run your application with instrumentation
OTEL_SERVICE_NAME=myapp OTEL_RESOURCE_ATTRIBUTES=deployment.environment=staging,service.version=1.0.0 ./MyNetApp

NOTE: for air-gapped environments you can provide either the installation archive directly with:

LOCAL_PATH=<PATH_TO_ARCHIVE> sh ./otel-dotnet-auto-install.sh

or the folder with the archives, this has the added benefit that the install script will determine the correct archive to choose.

DOWNLOAD_DIR=<PATH_TO_FOLDER_WITH_ARCHIVES> sh ./otel-dotnet-auto-install.sh

otel-dotnet-auto-install.sh script uses environment variables as parameters:

Parameter Description Required Default value
OTEL_DOTNET_AUTO_HOME Location where binaries are to be installed No $HOME/.otel-dotnet-auto
OS_TYPE Possible values: linux-glibc, linux-musl, macos, windows No Calculated
ARCHITECTURE Possible values for Linux: x64, arm64 No Calculated
TMPDIR (deprecated) prefer DOWNLOAD_DIR No $(mktemp -d)
DOWNLOAD_DIR Folder to download the archive to. Will use local archive if it already exists No $TMPDIR or $(mktemp -d)
LOCAL_PATH Full path the archive to use for installation. (ideal for air-gapped scenarios) No Calculated
VERSION Version to download No 1.11.0

instrument.sh script uses environment variables as parameters:

Parameter Description Required Default value
ENABLE_PROFILING Whether to set the .NET CLR Profiler, possible values: true, false No true
OTEL_DOTNET_AUTO_HOME Location where binaries are to be installed No $HOME/.otel-dotnet-auto
OS_TYPE Possible values: linux-glibc, linux-musl, macos, windows No Calculated
ARCHITECTURE Possible values for Linux: x64, arm64 No Calculated

PowerShell module (Windows)

On Windows, you should install OpenTelemetry .NET Automatic Instrumentation and instrument your .NET application using the provided PowerShell module. Example usage (run as administrator):

# Download the module
$module_url = "https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases/download/v1.11.0/OpenTelemetry.DotNet.Auto.psm1"
$download_path = Join-Path $env:temp "OpenTelemetry.DotNet.Auto.psm1"
Invoke-WebRequest -Uri $module_url -OutFile $download_path -UseBasicParsing

# Import the module to use its functions
Import-Module $download_path

# Install core files (online vs offline method)
Install-OpenTelemetryCore
Install-OpenTelemetryCore -LocalPath "C:\Path\To\OpenTelemetry.zip" 

# Set up the instrumentation for the current PowerShell session
Register-OpenTelemetryForCurrentSession -OTelServiceName "MyServiceDisplayName"

# Run your application with instrumentation
.\MyNetApp.exe

You can get usage information by calling:

# List all available commands
Get-Command -Module OpenTelemetry.DotNet.Auto

# Get command's usage information
Get-Help Install-OpenTelemetryCore -Detailed

Updating OpenTelemetry installation:

# Import the previously downloaded module. After an update the module is found in the default install directory.
# Note: It's best to use the same version of the module for installation and uninstallation to ensure proper removal.
Import-Module "C:\Program Files\OpenTelemetry .NET AutoInstrumentation\OpenTelemetry.DotNet.Auto.psm1"

# If IIS was previously registered, use RegisterIIS = $true.
Update-OpenTelemetryCore -RegisterIIS $true

# If Windows services were previously registered, these must be re-registered manually.
Unregister-OpenTelemetryForWindowsService -WindowsServiceName MyServiceName
Update-OpenTelemetryCore
Register-OpenTelemetryForWindowsService -WindowsServiceName MyServiceName -OTelServiceName MyOtelServiceName

[!WARNING] The PowerShell module works only on PowerShell 5.1 which is the one installed by default on Windows.

Instrument a container

You can find our demonstrative example that uses Docker Compose here.

You can also consider using the Kubernetes Operator for OpenTelemetry Collector.

Instrument a Windows Service running a .NET application

See windows-service-instrumentation.md.

Instrument an ASP.NET application deployed on IIS

See iis-instrumentation.md.

Configuration

See config.md.

Manual instrumentation

See manual-instrumentation.md.

Log to trace correlation

See log-trace-correlation.md.

Troubleshooting

See troubleshooting.md.

Contact

See CONTRIBUTING.md.

Contributing

See CONTRIBUTING.md.

Community Roles

Maintainers (@open-telemetry/dotnet-instrumentation-maintainers):

Approvers (@open-telemetry/dotnet-instrumentation-approvers):

Emeritus Maintainer/Approver/Triager:

Learn more about roles in the community repository.