/// <summary> /// Adds the services used by the Heap Dump actuator /// </summary> /// <param name="services">Reference to the service collection</param> /// <param name="configuration">Reference to the configuration system</param> /// <returns>A reference to the service collection</returns> public static IServiceCollection AddHeapDumpActuatorServices(this IServiceCollection services, IConfiguration configuration) { if (services == null) { throw new ArgumentNullException(nameof(services)); } if (configuration == null) { throw new ArgumentNullException(nameof(configuration)); } var options = new HeapDumpEndpointOptions(configuration); services.TryAddSingleton <IHeapDumpOptions>(options); services.TryAddEnumerable(ServiceDescriptor.Singleton(typeof(IEndpointOptions), options)); services.TryAddSingleton <HeapDumpEndpoint>(); services.TryAddSingleton <IHeapDumpEndpoint>(provider => provider.GetRequiredService <HeapDumpEndpoint>()); return(services); }
public async Task HandleHeapDumpRequestAsync_ReturnsExpected() { if (EndpointServiceCollectionExtensions.IsHeapDumpSupported()) { var opts = new HeapDumpEndpointOptions(); var mopts = new ActuatorManagementOptions(); mopts.EndpointOptions.Add(opts); IServiceCollection serviceCollection = new ServiceCollection(); serviceCollection.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Trace)); var loggerFactory = serviceCollection.BuildServiceProvider().GetService <ILoggerFactory>(); var logger1 = loggerFactory.CreateLogger <WindowsHeapDumper>(); var logger2 = loggerFactory.CreateLogger <HeapDumpEndpoint>(); var logger3 = loggerFactory.CreateLogger <HeapDumpEndpointMiddleware>(); var logger4 = loggerFactory.CreateLogger <HeapDumper>(); // WindowsHeapDumper should be used with .NET Core 3.1 on Windows. HeapDumper should be used with Linux and .NET 5 on Windows var obs = (Platform.IsWindows && RuntimeInformation.FrameworkDescription.StartsWith(".NET Core", StringComparison.InvariantCultureIgnoreCase)) ? new WindowsHeapDumper(opts, logger: logger1) : !Platform.IsOSX ? (IHeapDumper) new HeapDumper(opts, logger: logger4) : throw new InvalidOperationException("Unsupported Platfornm"); var ep = new HeapDumpEndpoint(opts, obs, logger2); var middle = new HeapDumpEndpointMiddleware(null, ep, mopts, logger3); var context = CreateRequest("GET", "/heapdump"); await middle.HandleHeapDumpRequestAsync(context); context.Response.Body.Seek(0, SeekOrigin.Begin); var buffer = new byte[1024]; await context.Response.Body.ReadAsync(buffer, 0, 1024); Assert.NotEqual(0, buffer[0]); } else { return; } }
public async void HandleHeapDumpRequestAsync_ReturnsExpected() { if (EndpointServiceCollectionExtensions.IsHeapDumpSupported()) { var opts = new HeapDumpEndpointOptions(); var mopts = new ActuatorManagementOptions(); mopts.EndpointOptions.Add(opts); IServiceCollection serviceCollection = new ServiceCollection(); serviceCollection.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Trace)); var loggerFactory = serviceCollection.BuildServiceProvider().GetService <ILoggerFactory>(); var logger1 = loggerFactory.CreateLogger <WindowsHeapDumper>(); var logger2 = loggerFactory.CreateLogger <HeapDumpEndpoint>(); var logger3 = loggerFactory.CreateLogger <HeapDumpEndpointMiddleware>(); var logger4 = loggerFactory.CreateLogger <LinuxHeapDumper>(); var obs = Platform.IsWindows ? (IHeapDumper) new WindowsHeapDumper(opts, logger: logger1) : Platform.IsLinux ? (IHeapDumper) new LinuxHeapDumper(opts, logger: logger4) : throw new InvalidOperationException("Unsupported Platfornm"); var ep = new HeapDumpEndpoint(opts, obs, logger2); var middle = new HeapDumpEndpointMiddleware(null, ep, mopts, logger3); var context = CreateRequest("GET", "/heapdump"); await middle.HandleHeapDumpRequestAsync(context); context.Response.Body.Seek(0, SeekOrigin.Begin); var buffer = new byte[1024]; await context.Response.Body.ReadAsync(buffer, 0, 1024); Assert.NotEqual(0, buffer[0]); } else { return; } }
/// <summary> /// Adds actuator endpoint providing Heap Dumps to OWIN pipeline /// </summary> /// <param name="builder">Your <see cref="IAppBuilder"/></param> /// <param name="config"><see cref="IConfiguration"/> for configuring the endpoint</param> /// <param name="applicationPathOnDisk">Provide the path to the app directory if heap dumps are failing due to access restrictions</param> /// <param name="loggerFactory"><see cref="ILoggerFactory"/> for logging inside the middleware and its components</param> /// <returns>Your <see cref="IAppBuilder"/> with Heap Dump middleware attached</returns> public static IAppBuilder UseHeapDumpActuator(this IAppBuilder builder, IConfiguration config, string applicationPathOnDisk = null, ILoggerFactory loggerFactory = null) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } if (config == null) { throw new ArgumentNullException(nameof(config)); } IHeapDumpOptions options = new HeapDumpEndpointOptions(config); var mgmtOptions = ManagementOptions.Get(config); foreach (var mgmt in mgmtOptions) { mgmt.EndpointOptions.Add(options); } var heapDumper = new HeapDumper(options, applicationPathOnDisk, loggerFactory?.CreateLogger <HeapDumper>()); return(builder.UseHeapDumpActuator(options, heapDumper, loggerFactory)); }
public async void HandleHeapDumpRequestAsync_ReturnsExpected() { if (Environment.OSVersion.Platform == PlatformID.Win32NT) { var opts = new HeapDumpEndpointOptions(); var mopts = TestHelper.GetManagementOptions(opts); IServiceCollection serviceCollection = new ServiceCollection(); serviceCollection.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Trace)); var loggerFactory = serviceCollection.BuildServiceProvider().GetService <ILoggerFactory>(); var logger1 = loggerFactory.CreateLogger <WindowsHeapDumper>(); var logger2 = loggerFactory.CreateLogger <HeapDumpEndpoint>(); var logger3 = loggerFactory.CreateLogger <HeapDumpEndpointMiddleware>(); var obs = new WindowsHeapDumper(opts, logger: logger1); var ep = new HeapDumpEndpoint(opts, obs, logger2); var middle = new HeapDumpEndpointMiddleware(null, ep, mopts, logger3); var context = CreateRequest("GET", "/heapdump"); await middle.HandleHeapDumpRequestAsync(context); context.Response.Body.Seek(0, SeekOrigin.Begin); var buffer = new byte[1024]; await context.Response.Body.ReadAsync(buffer, 0, 1024); Assert.NotEqual(0, buffer[0]); } else if (Platform.IsLinux) { // TODO: Make a request and verify } else { return; } }