Skip to content

v7.0.0+ Terminating a process while metrics are being collected results in an unhandled exception #2940

Open
@schmittjoseph

Description

@schmittjoseph

Description

Starting in v7.0.0 GA, a net7.0 build of dotnet-monitor will throw an unhandled exception when collecting metrics from a process if that process is terminated (e.g. sigkill). In the scenario where the metrics are being reported back via HTTP (e.g. GET /livemetrics), the unhandled exception will cause the HTTP stream to be forcefully dropped.

This does not repro on a net6.0 build of the same commit.

Other information

Example exception:

MMI9K5OETE0 => RequestPath:/processes RequestId:0HMMI9K5OETE0:00000001 => Microsoft.Diagnostics.Monitoring.WebApi.Controllers.DiagController.GetProcesses (Microsoft.Diagnostics.Monitoring.WebApi)      
Written to HTTP stream.
13:02:48 fail: Microsoft.AspNetCore.Server.Kestrel[13]      => SpanId:a4174681a7a83767, TraceId:7edd03af5146fd23dc863ded2b28f389, ParentId:0000000000000000 => ConnectionId:0HMMI9K5OETE0 => RequestPath:/livemetrics RequestId:0HMMI9K5OETE0:00000002      Connection id "0HMMI9K5OETE0", Request id "0HMMI9K5OETE0:00000002": 
An unhandled exception was thrown by the application.      
System.Exception: Read past end of stream.        
at FastSerialization.IOStreamStreamReader.Fill(Int32 minimum)        
at FastSerialization.MemoryStreamReader.ReadByte()        
at FastSerialization.Deserializer.ReadObject()        
at Microsoft.Diagnostics.Tracing.EventPipeEventSource.Process()        
at Microsoft.Diagnostics.Monitoring.EventPipe.DiagnosticsEventPipeProcessor.<>c__DisplayClass11_0.<b__1>d.MoveNext()      --- End of stack trace from previous location ---        
at Microsoft.Diagnostics.Monitoring.EventPipe.DiagnosticsEventPipeProcessor.<>c__DisplayClass11_0.<b__1>d.MoveNext()      --- End of stack trace from previous location ---        
at Microsoft.Diagnostics.Monitoring.EventPipe.DiagnosticsEventPipeProcessor.Process(DiagnosticsClient client, TimeSpan duration, CancellationToken token)        
at Microsoft.Diagnostics.Monitoring.Pipeline.RunAsyncCore(CancellationToken token)        
at Microsoft.Diagnostics.Monitoring.Pipeline.RunAsyncCore(CancellationToken token)        
at Microsoft.Diagnostics.Monitoring.Pipeline.SafeExecuteTask(Func`1 acquireTask)        
at Microsoft.Diagnostics.Monitoring.WebApi.MetricsUtilities.CaptureLiveMetricsAsync(TaskCompletionSource`1 startCompletionSource, IEndpointInfo endpointInfo, EventPipeCounterPipelineSettings settings, Stream outputStream, CancellationToken token) in dotnet-monitor\src\Microsoft.Diagnostics.Monitoring.WebApi\Utilities\MetricsUtilities.cs:line 29        
at Microsoft.Diagnostics.Monitoring.WebApi.OutputStreamResult.<>c__DisplayClass5_0.<b__0>d.MoveNext() in dotnet-monitor\src\Microsoft.Diagnostics.Monitoring.WebApi\OutputStreamResult.cs:line 51      --- End of stack trace from previous location ---        
at Microsoft.Diagnostics.Monitoring.WebApi.ActionContextExtensions.<>c__DisplayClass1_0.<b__0>d.MoveNext() in dotnet-monitor\src\Microsoft.Diagnostics.Monitoring.WebApi\ActionContextExtensions.cs:line 122      --- End of stack trace from previous location ---        
at Microsoft.Diagnostics.Monitoring.WebApi.ExecutionHelper.InvokeAsync[T](Func`2 action, ILogger logger, CancellationToken token) in dotnet-monitor\src\Microsoft.Diagnostics.Monitoring.WebApi\ActionContextExtensions.cs:line 46        
at Microsoft.Diagnostics.Monitoring.WebApi.ActionContextExtensions.InvokeAsync(ActionContext context, Func`2 action, ILogger logger) in dotnet-monitor\src\Microsoft.Diagnostics.Monitoring.WebApi\ActionContextExtensions.cs:line 126        
at Microsoft.Diagnostics.Monitoring.WebApi.OutputStreamResult.ExecuteResultAsync(ActionContext context) in dotnet-monitor\src\Microsoft.Diagnostics.Monitoring.WebApi\OutputStreamResult.cs:line 39        
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|30_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)        
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)        
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)        
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|28_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)        
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)        
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)        
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)        
at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)        
at Microsoft.Diagnostics.Tools.Monitor.RequestLimitMiddleware.Invoke(HttpContext context) in dotnet-monitor\src\Tools\dotnet-monitor\RequestLimitMiddleware.cs:line 63        
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)        
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)        
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions