Loading

Elastic APM .NET Agent release notes

Review the changes, fixes, and more in each version of Elastic APM .NET Agent.

To check for security updates, go to Security announcements for the Elastic stack.

Release date: December 2, 2024

  • Phase one logger optimisations #2503
  • Fixes and enhancements for Azure Functions #2505
  • Azure Function service name logic #2508

Release date: November 18, 2024

  • Remove netcoreapp2.0 from Elastic.Apm.Profiler.Managed.Loader #2471
  • Fix span linking for Azure ServiceBus #2474
  • Support K8S_ATTACH environment variable for activation #2482

Release date: October 11, 2024

  • Improve OTel bridge compatibility with existing Azure instrumentation #2455
  • Revert skipping of System.Web to fix profiler-based installation #2457
  • Limit attribute count and truncate values in ElasticActivityListener #2461
  • Add IntakeResponse deserialization for detailed error logging #2460

Release date: September 11, 2024

  • Hard exclude several system processes from being auto instrumented #2431
  • Disabling the agent should not try to enqueue events, now a NOOP #2436

Release date: August 28, 2024

  • Relax ECS container ID regex #2430

Release date: August 19, 2024

  • Ensure we capture baggage when capturing Errors during unsampled transactions #2427
  • Ensure safer access to System.Web.Security.Roles #2425
  • Fix a bug that prevented the addition of filters to payloadsenders #2426
  • SetAgentActivationMethod throws CultureNotFoundException in global-invariant mode #2423

Release date: August 15, 2024

  • Update to latest MongoDB.Driver.Core to address a breaking change #2419
  • Adding filters should not force initialization of Agent #2418

Release date: August 14, 2024

  • Fixed check for SqlRoleProvider under AspNet Identity 2 #2415

Release date: August 12, 2024

  • Global file logging, making it easier to diagnose the agent no matter the deployment type #2371
  • Skip instrumentation of System.Web to prevent rare double configuration initialization issue #2389

Release date: July 3, 2024

  • Fix Linux build dependency of glibc #2389

Release date: June 18, 2024

  • Release Automation fix #2380

Release date: June 18, 2024

  • Clean up dependency graph for .NET core installations #2308
  • Open Telemetry Bridge should only log when enabled #2356
  • Bump Microsoft.AspNetCore.Http dep to 2.1.22 #2166
  • Fix message format for logging in managed profiler #2350
  • Only mark bodies as redacted if explicitly configured to do so #2225
  • Do not read claims from SqlRoleProvider under classic ASP.NET #2377

Release date: May 16, 2024

  • Remove invalid profiler method integrations #2349

Release date: April 30, 2024

  • Add IServiceCollection extension methods to register ApmAgent #2331

  • Add support for transaction_name_groups and use_path_as_transaction_name #2326

  • Fix race condition on Add in redis profiler #2303

  • Further logging refinements in ElasticApmModule #2299

  • Update to .NET 8 SDK #2304

  • Update troubleshooting section of docs #2302

  • Fix bug when handling of multiple cookie entries with the same name #2310

  • Clarify logging behaviour in troubleshooting doc #2314

  • Fix agent-zip for 5.0.0 #2336

Release date: February 20, 2024
This release introduces more thorough sanitization of request/response cookies to align with the APM spec. The incoming Cookie is now redacted by default. The cookies it contains are extracted and sanitized according to the SanitizeFieldNames configuration. Response headers are now correctly sanitized, including the Set-Cookie header. This is a behaviour change!

  • Fully implement the sanitization spec for request/response headers #2290
  • Include process information in metadata stanza when emitting events to apm-server #2272
  • Switch to Licence expression rather than file #2264
  • Cleanup of packages thanks to Framework reference #2267
  • Limit memory usage when capturing SOAP request bodies #2274
  • Address a few synchronization issues in the codebase #2276
  • Truncate unknown keys logging from central config parser #2277
  • Ensure exposed default constants are readonly #2278
  • Fix duplicate key errors on dropped span stats update #2283
  • Remove RegexConverter, not used in serialization from and to apm-server #2279
  • Cleanup some dead code and one instance of null propagation in tooling NOT userfacing code
    #2280

Release date: January 8, 2024

  • TagObjects not guaranteed to be unique #2241
  • Move logging caching over to ConditionalWeaktable #2242
  • Add additional logging to outgoing http call propagation #2247
  • Address multiple structured logging violations #2249
  • Update MongoDB drivers to 2.19.0 #2245

Release date: December 13, 2023
This release fixes a bug in Elastic.Apm.AspNetCore when using UseElasticApm() not correctly setting status codes. The bug was not present in the more commonly used Elastic.Apm.NetCoreAll since it uses a DiagnosticListener approach. With this release we ensure both packages use the exact same DiagnosticListener mechanism to instrument ASP.NET Core.

  • Remove ApmMiddleWare, only use DiagnosticSource listener for ASP.NET Core #2213
  • Move StartupHooks over to netstandard2.0 #2239

Release date: November 21, 2023

  • Prevent server certificate callback runtime exception #2213
  • Fix duration.sum.us value in JSON #2219
  • Return total memory when limit is max value #2214
  • Ensure baggage gets copied with baggage prefix by #2220

Release date: October 19, 2023

  • Support OnExecuteRequestStep available in new .NET versions for IIS modules #2196

Release date: September 20, 2023

  • Enable OpenTelemetryBridge by default #2140
  • Update and optimise OTel bridge #2157
  • Add Baggage support #2147
  • Trace in-process Azure Functions #2160
  • Internalize SqlClient Instrumentation #2165
  • Ensure OpenTelemetryBridge respects Agents sampling decisions #2170
  • DroppedSpanStats: do not flatten duration #2178
  • Change cloud.project.id for GCP metadata to be the project-id #2180
  • Handle SqlExceptions when accessing user claims #2182

Release date: August 8, 2023

  • .NET Full Framework now always loads configuration from web or app.config #2069
  • Add Npgsql 7.x support to profiler #2103
  • Backend dependencies granularity for NoSQL and Messaging #2104
  • Send domain name when detected #2067
  • Log when we detect LegacyAspNetSynchronizationContext #2136
  • Fix to not send start stack trace when below configured duration #2126
  • Agent.Configuration now always points to ConfigurationStore’s configuration #2109
  • Reduce logging noise for stack frame capturing #2142
  • Move Redis Profiler registration to ConditionalWeakTable #2148

Release date: April 28, 2023

  • Enable listening to Microsoft.Data.SqlClient.EventSource on .NET full framework #2050
  • Eager load APM configuration #2054
  • Increase logging of profiler if expected rejit target is not found #2049

Release date: April 5, 2023

  • Prevent sending activation_method in metadata for 8.7.0 #2041

Release date: February 27, 2023

  • Support for Azure Functions through new Elastic.Apm.Azure.Functions nuget package #1981
  • Support new Elasticsearch Client: Elastic.Clients.Elasticsearch #1935
  • Suppport latest version of Microsoft.Data.SqlClient #1988
  • Support latest version OracleManagedDataAccess #1988
  • Loose MSVC redistributable as requirement for the profiler #1983
  • Add support for sending agent activation method to the server #1983
  • NullReferenceException in span compression #1999
  • Improve profiler logging by always enabling agent logging too #1970
  • Normalize OpenTelemetry Bridge config section to OpenTelemetryBridgeEnabled #1972
  • Try to enable TLS 1.2 in all scenarios #1926
  • OTel bridge span’s destination service may contain null resource #1964
  • AppSettings ElasticApm:Enabled is not fully honored in ASP.NET Classic #1961

Release date: December 5, 2022

  • Improve handling of multiple agent initialization #1867
  • Enable CloudMetadataProvider on Azure Functions #1877
  • CentralConfig: handle MaxAge header with less than 5 sec according to spec #1831 and #1892
  • Add basic agent logging preamble #1897
  • Publish docker image with agent #1665 and #1907
  • Add .NET 7 support #1860 and #1917
  • Improve SOAP action parsing #1930
  • Fix transaction trace id not aligned when transaction is created from OTel bridge without parent #1881 and #1882
  • Avoid NRE during startup hook init #1904 and #1905
  • Avoid panic in file-logging setup #1918 and #1927
  • Use Span timing instead of cumulative SqlCommand statistics #1869 and #1922
  • Enable DOTNET_STARTUP_HOOKS for .NET 7 #1900 and #1933

Release date: October 13, 2022

  • Profiler based agent is now GA
  • Capture request body in ASP.NET Full Framework #379 and #1806
  • UseWindowsCredentials: new configuration to force the agent to use the credentials of the authenticated Windows user when events are sent to the APM Server #1825 and #1832
  • Fix incorrect transaction name in ASP.NET Web Api #1637 and #1800
  • Fix potential NullReferenceException in TraceContinuationStrategy implementation #1802 and #1803 and #1804
  • Fix container ID parsing in AWS ECS/Fargate environments #1779 and #1780
  • Use correct default value for ExitSpanMinDuration #1789 and #1814
  • Fixed crashes on some SOAP 1.2 requests when using GetBufferedInputStream #1759 and #1811
  • Group MetricSets in BreakdownMetricsProvider #1678 and #1816

Release date: August 28, 2022

  • Introduce the TraceContinuationStrategy config #1637 and #1739
  • Span Links with Azure ServiceBus #1638 and #1749
  • Improve db granularity #1664 and #1765
  • Add config option span_stack_trace_min_duration #1529 and #1795
  • Fix default for the ApplicationNamespaces config #1746
  • Flow SynchronizationContext across public API calls #1660 and #1755
  • PayloadSender threading improvements #1571 and #1753
  • Include Accept header on APM server info call (caused errors when reading APM Server info) #1624 and #1773
  • Significantly improved the performance of database query parsing #1763 and #1781
  • Fix FillApmServerInfo : Invalid ElasticApm_ApiKey throws Exception #1735 and #1787

Release date: June 15, 2022

  • Improved logging around fetching central configuration #1626 and #1732
  • Crash during assembly loading with the profiler based agent #1705 and #1710
  • Handling RouteData with null in legacy ASP.NET Core 2.2 apps #1729

Release date: June 2, 2022

  • Automatic capturing of incoming HTTP Requests on ASP.NET Core with the Profiler based agent #1610 and #1726
  • By disabling system.cpu.total.norm.pct, the agent won’t create any instance of the PerformanceCounter type (workaround for issue: #1724 and #1725
  • Transaction names for incoming HTTP requests returning 404 but matching a valid route, will include the URL path instead of using unknown route #1715 and #1723

Release date: May 12, 2022

  • Improved database span names based on parsed SQL statements #242 and #1657
  • Dedicated working loop thread for sending APM events #1571 and #1670
  • Fixed span type for MongoDB - with this a MongoDB logo will show up on the service map #1677
  • InvalidCastException in AspNetCoreDiagnosticListener #1674
  • MVC: handling area:null when creating transaction name based on routing #1683
  • Handle missing .Stop events in AspNetCoreDiagnosticListener #1676 and #1685

Release date: March 10, 2022

  • Make sure events are sent after APM Server timeout #1630 and #1634
  • Error on composite span validation #1631 and #1639
  • OpenTelemetry (Activity) bridge - APM Server version check #1648

Release date: February 9, 2022

  • Span compression and dropping fast exit spans. New settings: ExitSpanMinDuration, SpanCompressionEnabled, SpanCompressionExactMatchMaxDuration, SpanCompressionSameKindMaxDuration #1329 and #1475 and #1620
  • NpgSql 6.x support #1602 and #1611
  • Capture transaction name on errors #1574 and #1589
  • .NET 6 support with startup hook #1590 and #1603

Release date: January 12, 2022

  • OpenTelemetry Bridge - integration with System.Diagnostics.Activity - Beta #1521 and #1498
  • Failed sending event error with missing span.context.destination.service.name required field on older APM Servers #1563 and #1564 )
  • Implement Dropped span statistics #1511
  • Ignore duplicate Diagnostic listener subscriptions #1119 and #1515
  • Implement User-Agent spec for .NET agent #1525 and #1518
  • Add message related properties to transactions and spans #1512
  • Add profiler auto instrumentation #1522 and #1534
  • Add profiler auto instrumentation for RabbitMQ #1223 and #1548
  • Platform detection: Handle .NET 6 #1513 and #1528
  • Remove use of Socket.Encrypted to determine secure #1492
  • Auto-infer destination.service.resource and adapt public API #1330 and #1520
  • Stop recording transaction metrics #1523 and #1540
  • Capture spans for new Azure Storage SDKs #1352 and #1484
  • Use Environment.MachineName to get HostName #1504 and #1509
  • Check context is not null when sanitizing error request headers #1503 and #1510
  • Improve Performance counter handling for metrics on Windows #1505 and #1536
  • Collect .NET Framework GC metrics only when filtering supported #1346 and #1538
  • Handle enabled/recording=false configuration when capturing errors #1557
  • Serialize to writer directly #1354
  • Better logging in PayloadSenderV2 on task cancellation #1356
  • Propagate Trace context in exit spans #1350, #1344, and #1358
  • Get Command and Key for StackExchange.Redis spans #1364 and #1374
  • Add CosmosDB integration to NetCoreAll #1474
  • Use 10K limit for CaptureBody similar to the Java agent #1359 and #1368
  • Unset parentId if TraceContextIgnoreSampledFalse is active #1362
  • Make sure BreakdownMetricsProvider prints 1K warning only once per collection #1361 and #1367
  • Sanitize Central config request URI and headers in logs #1376 and #1471
  • Honor Transaction.Outcome set by public API in auto instrumentation #1349 and #1472
  • Use Kubernetes pod id determined from cgroup file #1481
  • CosmosDb support #1154 and #1342
  • Support "Time spent by span type" (aka Breakdown metrics) #227 and #1271
  • Prefer W3C traceparent over elastic-apm-traceparent #1302
  • Add TraceContextIgnoreSampledFalse config setting #1310
  • Create transactions for Azure Service Bus Processors #1321 and #1331
  • Add instrumentation for Azure Service Bus #1157 and #1225
  • Add Azure storage integration #1156 and #1155 and #1247
  • Internalize Newtonsoft.Json - no more dependency on Newtonsoft.Json #1241
  • Internalize Ben.Demystifier - no more dependency on Ben.Demystifier #1232 and #1275
  • Add MongoDb support #1158 and #1215
  • Capture inner exceptions #1267 and #1277
  • Add configured hostname #1289 and #1290
  • Use TraceLogger as default logger in ASP.NET Full Framework #1263 and #1288
  • Fix issue around setting Recording to false #1250 and #1252
  • ASP.NET: Move error capturing to Error event handler #1259
  • Use Logger to log exception in AgentComponents initialization #1254 and #1305
  • Fix NullReferenceException in Elastic.Apm.Extensions.Logging #1309 and #1311
  • Get transaction name from Web API controller route template #1189
  • Add GC Heap Stats capturing for .NET 5.0 #1195 and #1196
  • Lazily access the agent in ElasticApmProfiler redis integration #1190 and #1192
  • Add TargetFramework NET5.0 to Elastic.Apm.AspNetCore and related packages #1194 and #1198
  • Add support for capturing redis commands from StackExchange.Redis (documentation) #874 and #1063
  • Introduce ServerUrl config - (ServerUrls is still working but will be removed in the future) #1035 and #1065
  • Support for more k8s cgroup path patterns #968 and #1048
  • SanitizeFieldNames config became changeable though Kibana central configuration #1082
  • Azure App Service cloud metadata collection #1083
  • Capture error logs as APM errors from Microsoft.Extensions.Logging automatically and extend the Public API to capture custom logs as APM errors #894 and #1135
  • Support changing log level through Kibana central configuration and support "off" level #970 and #1096
  • NullReferenceException with disabled agent on Transaction.Custom #1080 and #1081
  • ASP.NET Core, enabled=false in appsettings.json does not disable public Agent API #1077 and #1078
  • System.IO.IOException on ASP.NET Classic #1113 and #1115
  • Memory issue with gRPC #1116 and #1118
  • Ensuring ETW sessions are terminated on agent shutdown #897 and #1124
  • NullReferenceException with custom IConfigurationReader implementation in MetricsCollector #1109
  • Fixes around zero code change agent setup with DOTNET_STARTUP_HOOKS #1138 and #1165
  • Access Request.InputStream only when SOAP header present #1113
    and #1115
  • Introduce GetLabel<T> method on IExecutionSegment #1033 and #1057
  • Increased transaction duration due to stack trace capturing #1039 and #1052
  • Warning with Synchronous operations are disallowed on ASP.NET Core during request body capturing #1044 and #1053
  • SqlClient instrumentation on .NET 5 #1025 and #1042
  • UseAllElasticApm with IHostBuilder missing auto instrumentation #1059 and #1060
  • Agent loading with zero code change on .NET Core #71 and #828
  • gRPC support #478 and #969
  • Add ability to configure Hostname #932 and #974
  • Add Enabled and Recording configuration #122) and #997
  • Add FullFrameworkConfigurationReaderType config to load custom configuration reader on ASP.NET #912
  • Capture User id and email on ASP.NET #540 and #978
  • Support boolean and numeric labels in addition to string labels #967, #788, #473, #191, #788, #473, #191, and #982
  • Collecting metrics based on cGroup #937 and #1000
  • ITransaction.SetService API to support multiple services in a single process #1001 and #1002
  • Collecting cloud metadata (supporting AWS, Azure, GCP) #918 and #1003
  • Transaction grouping on ASP.NET #201 and #973
  • Entity Framework 6 support on .NET Core #902 and #913
  • #992 On ASP.NET Core CurrentTransaction is null in some cases (issues: #934, #972)
  • #971 Avoid double initialization in HostBuilderExtensions
  • #999 Capture body with large file error (issue: #960)
  • Service map: missing connection between .NET services (#909)
  • Elasticsearch client instrumentation #329
  • Introducing Elastic.Apm.Extensions.Hosting package with an extension method on IHostBuilder #537
  • Stack trace improvements: async call stack demystification (#847) and showing frames from user code for outgoing HTTP calls (#845)
  • Making fields on IError public #847
  • Service map improvements: #893
  • Missing traces from the Kibana traces list due to setting Transaction.ParentId to an Activity #888
  • Exception around runtime detection #859
  • Missing outgoing HTTP calls in .NET Framework applications and causing memory issues #896
  • Memory issue in SqlEventListener #851
  • Auto instrumentation for SqlClient (documentation)
  • Introducing Filter API #792 (documentation)
  • Auto-detect culprit for exceptions #740
  • New config settings: ExcludedNamespaces, ApplicationNamespaces (documentation)
  • Keep Activity.Current.TraceId in sync with the Trace ID used by the agent #800
  • Report Kubernetes system metadata #741
  • Database connection string parsing issue with Oracle #795
  • Introducing ITransaction.EnsureParentId() to integrate with RUM in dynamically loaded HTML pages (including page loads in ASP.NET Core) #771
  • New config setting: ApiKey #733
  • Memory issue in .NET Full Framework with default metrics turned on #750
  • Parsing for Oracle connection strings #749
  • StackOverflowException when using the Elastic.Apm.SerilogEnricher package and the log level is set to Verbose #753
  • Fix log spamming issues #736, #738
  • Fix turning HTTP 415 responses in ASP.NET Core to HTTP 500 when request body capturing is active #739
  • Fix disabling GC metrics collection in case no GC is triggered during the first "5*MetricsInterval" of the process #745
  • New GC metrics: clr.gc.count, clr.gc.gen[X]size, where [X]: heap generation #697
  • Capturing SOAP action name as part of the transaction name #683
  • New config options: ServiceNodeName, VerifyServerCert, DisableMetrics, UseElasticTraceparentHeader (docs)
  • Full W3C TraceContext support #717
  • Fix transaction name generation in ASP.NET Core 3.x #647
  • Fix around HTTP request body sanitization #712
  • Entity framework support with Interceptor (docs)
  • Sanitization of HTTP headers and request body (docs)
  • Central configuration - 2 new configs: CAPTURE_BODY and TRANSACTION_MAX_SPANS. #577.
  • Support for global labels (docs)
  • Custom context (docs)
  • Dropping support for ASP.NET Core 2.0 (which is already end of life) (docs)
  • De-dotting labels. #583.
  • Request body capturing TypeLoadException in ASP.NET Core 3.0. #604.
  • Metrics collection: filtering NaN and Infinity. #589.
  • Capturing request body with ASP.NET Core erased the body in some scenarios #539.
  • Integration with Serilog caused missing logs and diagnostic traces with NullReferenceException #544, #545.
  • Configure transaction max spans. #472
  • Fixing missing "Date Modified" field on the files from the 1.1.0 packages causing an error while executing dotnet pack or nuget pack on a project with Elastic APM Agent packages. #527
  • ASP.NET Support, documentation can be found here
  • Central configuration (Beta)
  • Addressed some performance issues #359
  • Improved error handling in ASP.NET Core #512
  • Fix for mono #164
  • Reading request body in ASP.NET Core. Also introduced two new settings: CaptureBody and CaptureBodyContentTypes. By default this feature is turned off, this is an opt-in feature and can be turned on with the CaptureBody setting. #402
  • NullReferenceException on .NET Framework with outgoing HTTP calls created with HttpClient in case the response code is HTTP3xx #450
  • Added missing net461 target to the Elastic.Apm package
  • Handling Labels with null #429

The 1.0.0 GA release of the Elastic APM .NET Agent. Stabilization of the 1.0.0-beta feature for production usage.

  • Out of the box integration with ILoggerFactory and the logging infrastructure in ASP.NET Core #249
  • Introduced StackTraceLimit and SpanFramesMinDurationInMilliseconds configs #374
  • The Public Agent API now support Elastic.Apm.Agent.Tracer.CurrentSpan #391
  • Thread safety for some bookkeeping around spans #394
  • Auto instrumentation automatically creates sub-spans in case a span is already active #391