.NET
| Traces | Metrics | App Logs | Custom Logs | Profiling |
|---|---|---|---|---|
| ✅ | ✅ | ✖ | ✅ | ✅ |
1. Prerequisites
- Middleware Host Agent (for host-based mode). If your app is containerized, point it to the Host Agent using
MW_AGENT_SERVICE.- Docker default bridge gateway:
172.17.0.1. - Kubernetes service DNS:
mw-service.mw-agent-ns.svc.cluster.local.
- Docker default bridge gateway:
- .NET 6.0+ Check with:
1dotnet --version
2. Host-based instrumentation (with Host Agent)
1 Add the Middleware reference (Logger & helpers)
Download the latest Middleware.dll and reference it in your project:
1<!-- .csproj -->
2<ItemGroup>
3 <Reference Include="Middleware">
4 <HintPath>path\to\Middleware.dll</HintPath>
5 </Reference>
6</ItemGroup>The dotnet-plugin release notes confirm .NET 6+ compatibility and the Middleware.Logger.Logger API for custom logs.
2 Install the auto-instrumentation binaries
- Download installer
1curl -sSfL https://install.middleware.io/apm/dotnet/v1.0.0-rc.1/scripts/mw-dotnet-auto-install.sh -O - Install core files (adds ~/.mw-dotnet-auto/):
1sh ./mw-dotnet-auto-install.sh 2rm -f mw-dotnet-auto-install.sh - Allow the instrumentation script:
1chmod +x $HOME/.mw-dotnet-auto/instrument.sh - Run your app with instrumentation:
1MW_API_KEY="<MW_API_KEY>" \
2. $HOME/.mw-dotnet-auto/instrument.sh && \
3OTEL_SERVICE_NAME="{APM-SERVICE-NAME}" \
4dotnet path/to/YourApplication.dll- Download installer
1$install = Join-Path $env:temp "mw-dotnet-auto-install-setup.ps1" 2Invoke-WebRequest -Uri "https://install.middleware.io/apm/dotnet/v1.0.0-rc.1/scripts/mw-dotnet-auto-install-setup.ps1" -OutFile $install -UseBasicParsing - Execute:
1. $install - Register service name in session:
1Register-OpenTelemetryForCurrentSession -OTelServiceName "{APM-SERVICE-NAME}" - Run your app
1.\YourNetApp.exe
- Install deps and Middleware auto-installer:
1RUN apt-get update && apt-get install -y curl unzip 2RUN curl -sSfL https://install.middleware.io/apm/dotnet/v1.0.0-rc.1/scripts/mw-dotnet-auto-install.sh -O 3RUN bash mw-dotnet-auto-install.sh 4RUN rm -rf mw-dotnet-auto-install.sh 5RUN chmod +x $HOME/.mw-dotnet-auto/instrument.sh 6 7# ... your app build/publish here ... - Start with instrumentation:
1CMD . $HOME/.mw-dotnet-auto/instrument.sh && dotnet Mw-WebApplication.dll - If using ASP.NET, expose ports/URLs explicitly:
1ENV ASPNETCORE_HTTP_PORTS=5000 2ENV ASPNETCORE_URLS=http://0.0.0.0:5000 - Add connectivity/env:
1ENV MW_AGENT_SERVICE=172.17.0.1 2ENV MW_API_KEY=<MW_API_KEY>
- Install deps and Middleware auto-installer:
1RUN apt-get update && apt-get install -y curl unzip 2RUN curl -sSfL https://install.middleware.io/apm/dotnet/v1.0.0-rc.1/scripts/mw-dotnet-auto-install.sh -O 3RUN bash mw-dotnet-auto-install.sh 4RUN rm -rf mw-dotnet-auto-install.sh 5RUN chmod +x $HOME/.mw-dotnet-auto/instrument.sh 6 7# ... your app build/publish here ... - Start with instrumentation:
1CMD . $HOME/.mw-dotnet-auto/instrument.sh && dotnet Mw-WebApplication.dll - If using ASP.NET, expose ports/URLs explicitly:
1ENV ASPNETCORE_HTTP_PORTS=5000 2ENV ASPNETCORE_URLS=http://0.0.0.0:5000 - Add the following environment variables to your container:
1MW_AGENT_SERVICE=mw-service.mw-agent-ns.svc.cluster.local
2MW_API_KEY="your-initial-token"The default namespace for running the Middleware agent is mw-service.mw-agent-ns.svc.cluster.local.
3. Sending custom data (optional)
Custom logs (Middleware logger)
1using Middleware.Logger;
2
3Logger.Info("This is info log");
4Logger.Warning("This is info log");
5Logger.Debug("This is info log");
6Logger.Error(new Exception("oops"));Application logs (OpenTelemetry console exporter)
Add packages to your .csproj:
1<Project Sdk="Microsoft.NET.Sdk.Web">
2 <ItemGroup>
3 <PackageReference Include="OpenTelemetry" Version="1.5.1" />
4 <PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.5.1" />
5 </ItemGroup>
6</Project>Wire up logging:
1using OpenTelemetry.Logs;
2using OpenTelemetry.Resources;
3
4var builder = WebApplication.CreateBuilder(args);
5
6builder.Logging.AddOpenTelemetry(options =>
7{
8 options.AddConsoleExporter();
9});
10
11var app = builder.Build();
12app.Run();4. View your data
After deployment, give it 3–5 minutes and check APM → Traces, Logs, and Continuous Profiling in Middleware.
5. Serverless / Direct (no Host Agent)
Use the NuGet package and configure via appsettings.json.
1 Install package
1dotnet add package MW.APM(Available for .NET 6.0 / .NET Framework 4.8 as of v1.2.0.)
2 Program configuration
1// Program.cs
2var builder = WebApplication.CreateBuilder(args);
3
4var configuration = new ConfigurationBuilder()
5 .SetBasePath(Directory.GetCurrentDirectory())
6 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
7 .AddEnvironmentVariables()
8 .Build();
9
10builder.Services.ConfigureMWInstrumentation(configuration);
11
12// optional: additional logging sinks
13builder.Logging.AddConfiguration(configuration.GetSection("Logging"));
14builder.Logging.AddConsole();
15builder.Logging.SetMinimumLevel(LogLevel.Debug);
16
17// After var app = builder.Build();
18Logger.Init(app.Services.GetRequiredService<ILoggerFactory>());3 Account & routing (appsettings.json)
1{
2 "MW": {
3 "ApiKey": "<MW_API_KEY>",
4 "TargetURL": "https://<MW_UID>.middleware.io:443",
5 "ServiceName": "<service-name>",
6 }
7}6. Environment variables — quick reference
| Variable | Where | Purpose | Example |
|---|---|---|---|
MW_AGENT_SERVICE | Host (containers) | Address/DNS of Host Agent | 172.17.0.1 (Docker), mw-service.mw-agent-ns.svc.cluster.local (K8s) |
MW_API_KEY | Host & Docker | Auth token used by installer/runtime | xxxx... |
OTEL_SERVICE_NAME | Host | APM service name (auto-exporter uses this) | orders-api |
ASPNETCORE_HTTP_PORTS, ASPNETCORE_URLS | Docker (ASP.NET) | Bind HTTP ports / URLs inside container | 5000, http://0.0.0.0:5000 |
Serverless/direct uses appsettings.json keys under MW (ApiKey, TargetURL, ServiceName, etc.) rather than these env vars.
7. Troubleshooting
- No data (Host mode):
- Verify the Host Agent is running and reachable. In containers, set
MW_AGENT_SERVICEto your bridge gateway or K8s service DNS. - Ensure you prepended the instrumentation script before dotnet ....
- Verify the Host Agent is running and reachable. In containers, set
- Windows session not instrumented:
- Re-run
Register-OpenTelemetryForCurrentSession -OTelServiceName "{APM-SERVICE-NAME}"before launching the app.
- Re-run
- Docker ASP.NET not listening:
- Set
ASPNETCORE_HTTP_PORTSandASPNETCORE_URLSas shown above and map the port in your runtime.
- Set
- Prefer direct ingest / serverless:
- Use the MW.APM package and
appsettings.jsonconfig withTargetURLto bypass a local agent. (NuGet package & config shown above.
- Use the MW.APM package and
- Need cluster-wide auto-instrumentation:
- Middleware supports OTel Kubernetes auto-instrumentation (including .NET) if you’d rather manage it at the platform layer.
Need assistance or want to learn more about Middleware? Contact our support team at [email protected] or join our Slack channel.