public static void UseThreadDumpActuator(IConfiguration configuration, MediaTypeVersion version, IThreadDumper threadDumper = null, ILoggerFactory loggerFactory = null) { var options = new ThreadDumpEndpointOptions(configuration); if (version == MediaTypeVersion.V2 && options.Id == "dump") { options.Id = "threaddump"; } _mgmtOptions.RegisterEndpointOptions(configuration, options); threadDumper = threadDumper ?? new ThreadDumper(options); IActuatorHandler handler; switch (version) { case MediaTypeVersion.V1: var ep = new ThreadDumpEndpoint(options, threadDumper, CreateLogger <ThreadDumpEndpoint>(loggerFactory)); handler = new ThreadDumpHandler(ep, SecurityServices, _mgmtOptions, CreateLogger <ThreadDumpHandler>(loggerFactory)); break; default: var ep2 = new ThreadDumpEndpoint_v2(options, threadDumper, CreateLogger <ThreadDumpEndpoint_v2>(loggerFactory)); handler = new ThreadDumpHandler_v2(ep2, SecurityServices, _mgmtOptions, CreateLogger <ThreadDumpHandler_v2>(loggerFactory)); break; } ConfiguredHandlers.Add(handler); }
public void Constructor_BindsConfigurationCorrectly() { var appsettings = new Dictionary <string, string>() { ["management:endpoints:enabled"] = "false", ["management:endpoints:loggers:enabled"] = "false", ["management:endpoints:dump:enabled"] = "true", ["management:endpoints:cloudfoundry:validatecertificates"] = "true", ["management:endpoints:cloudfoundry:enabled"] = "true" }; ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddInMemoryCollection(appsettings); var config = configurationBuilder.Build(); var opts = new ThreadDumpEndpointOptions(config); var cloudOpts = new CloudFoundryEndpointOptions(config); var ep = new ThreadDumpEndpoint(opts, new ThreadDumper(opts)); Assert.True(cloudOpts.Enabled); Assert.Equal(string.Empty, cloudOpts.Id); Assert.Equal(string.Empty, cloudOpts.Path); Assert.True(cloudOpts.ValidateCertificates); Assert.True(opts.Enabled); Assert.Equal("dump", opts.Id); Assert.Equal("dump", opts.Path); Assert.True(ep.Enabled); }
public void ThreadDumpEndpointMiddleware_PathAndVerbMatching_ReturnsExpected() { var actOptions = new ActuatorManagementOptions() { Path = "/", Exposure = new Exposure { Include = new List <string> { "*" } } }; var opts = new ThreadDumpEndpointOptions(); actOptions.EndpointOptions.Add(opts); ThreadDumper obs = new ThreadDumper(opts); var ep = new ThreadDumpEndpoint(opts, obs); var middle = new ThreadDumpEndpointMiddleware(null, ep, new List <IManagementOptions> { actOptions }); Assert.True(middle.RequestVerbAndPathMatch("GET", "/dump")); Assert.False(middle.RequestVerbAndPathMatch("PUT", "/dump")); Assert.False(middle.RequestVerbAndPathMatch("GET", "/badpath")); }
public void Invoke_CallsDumpThreads() { var dumper = new TestThreadDumper(); var ep = new ThreadDumpEndpoint(new ThreadDumpEndpointOptions(), dumper); var result = ep.Invoke(); Assert.NotNull(result); Assert.True(dumper.DumpThreadsCalled); }
public static void UseThreadDumpActuator(IConfiguration configuration, IThreadDumper threadDumper = null, ILoggerFactory loggerFactory = null) { var options = new ThreadDumpOptions(configuration); threadDumper = threadDumper ?? new ThreadDumper(options); var ep = new ThreadDumpEndpoint(options, threadDumper, CreateLogger <ThreadDumpEndpoint>(loggerFactory)); var handler = new ThreadDumpHandler(ep, SecurityService, CreateLogger <ThreadDumpHandler>(loggerFactory)); ConfiguredHandlers.Add(handler); }
private static IAppBuilder UseThreadDumpComponents(IAppBuilder builder, IThreadDumpOptions options, IThreadDumper threadDumper, ILoggerFactory loggerFactory) { var endpoint = new ThreadDumpEndpoint(options, threadDumper, loggerFactory?.CreateLogger <ThreadDumpEndpoint>()); var logger = loggerFactory?.CreateLogger <EndpointOwinMiddleware <List <ThreadInfo> > >(); var mgmtOptions = ManagementOptions.Get(); return(builder.Use <EndpointOwinMiddleware <List <ThreadInfo> > >(endpoint, mgmtOptions, new List <HttpMethod> { HttpMethod.Get }, true, logger)); }
public void ThreadDumpEndpointMiddleware_PathAndVerbMatching_ReturnsExpected() { var opts = new ThreadDumpOptions(); ThreadDumper obs = new ThreadDumper(opts); var ep = new ThreadDumpEndpoint(opts, obs); var middle = new ThreadDumpEndpointMiddleware(null, ep); Assert.True(middle.RequestVerbAndPathMatch("GET", "/dump")); Assert.False(middle.RequestVerbAndPathMatch("PUT", "/dump")); Assert.False(middle.RequestVerbAndPathMatch("GET", "/badpath")); }
public void ThreadDumpEndpointMiddleware_PathAndVerbMatching_ReturnsExpected() { var opts = new ThreadDumpEndpointOptions(); var mgmtOptions = TestHelpers.GetManagementOptions(opts); ThreadDumper obs = new ThreadDumper(opts); var ep = new ThreadDumpEndpoint(opts, obs); var middle = new EndpointOwinMiddleware <List <ThreadInfo> >(null, ep, mgmtOptions); Assert.True(middle.RequestVerbAndPathMatch("GET", "/cloudfoundryapplication/dump")); Assert.False(middle.RequestVerbAndPathMatch("PUT", "/cloudfoundryapplication/dump")); Assert.False(middle.RequestVerbAndPathMatch("GET", "/cloudfoundryapplication/badpath")); }
public void IsDumpRequest_ReturnsExpected() { var opts = new ThreadDumpOptions(); ThreadDumper obs = new ThreadDumper(opts); var ep = new ThreadDumpEndpoint(opts, obs); var middle = new ThreadDumpEndpointMiddleware(null, ep); var context = CreateRequest("GET", "/dump"); Assert.True(middle.IsThreadDumpRequest(context)); var context2 = CreateRequest("PUT", "/dump"); Assert.False(middle.IsThreadDumpRequest(context2)); var context3 = CreateRequest("GET", "/badpath"); Assert.False(middle.IsThreadDumpRequest(context3)); }
public async void HandleThreadDumpRequestAsync_ReturnsExpected() { if (Environment.OSVersion.Platform == PlatformID.Win32NT) { var opts = new ThreadDumpOptions(); ThreadDumper obs = new ThreadDumper(opts); var ep = new ThreadDumpEndpoint(opts, obs); var middle = new ThreadDumpEndpointMiddleware(null, ep); var context = CreateRequest("GET", "/dump"); await middle.HandleThreadDumpRequestAsync(context); context.Response.Body.Seek(0, SeekOrigin.Begin); StreamReader rdr = new StreamReader(context.Response.Body); string json = await rdr.ReadToEndAsync(); Assert.StartsWith("[", json); Assert.EndsWith("]", json); } }
public async void HandleThreadDumpRequestAsync_ReturnsExpected() { if (Platform.IsWindows) { var opts = new ThreadDumpEndpointOptions(); var mgmtOptions = new ActuatorManagementOptions(); mgmtOptions.EndpointOptions.Add(opts); ThreadDumper obs = new ThreadDumper(opts); var ep = new ThreadDumpEndpoint(opts, obs); var middle = new ThreadDumpEndpointMiddleware(null, ep, mgmtOptions); var context = CreateRequest("GET", "/dump"); await middle.HandleThreadDumpRequestAsync(context); context.Response.Body.Seek(0, SeekOrigin.Begin); var rdr = new StreamReader(context.Response.Body); var json = await rdr.ReadToEndAsync(); Assert.StartsWith("[", json); Assert.EndsWith("]", json); } }
/// <summary> /// Add HealthCheck actuator endpoint to OWIN Pipeline /// </summary> /// <param name="builder">OWIN <see cref="IAppBuilder" /></param> /// <param name="options">Options for configuring the thread dump endpoint</param> /// <param name="threadDumper">Class responsible for dumping threads</param> /// <param name="loggerFactory">For logging within the middleware</param> /// <returns>OWIN <see cref="IAppBuilder" /> with Health Endpoint added</returns> public static IAppBuilder UseThreadDumpActuator(this IAppBuilder builder, IThreadDumpOptions options, IThreadDumper threadDumper, ILoggerFactory loggerFactory = null) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } if (options == null) { throw new ArgumentNullException(nameof(options)); } if (threadDumper == null) { throw new ArgumentNullException(nameof(threadDumper)); } var endpoint = new ThreadDumpEndpoint(options, threadDumper, loggerFactory?.CreateLogger <ThreadDumpEndpoint>()); var logger = loggerFactory?.CreateLogger <EndpointOwinMiddleware <List <ThreadInfo> > >(); return(builder.Use <EndpointOwinMiddleware <List <ThreadInfo> > >(endpoint, new List <HttpMethod> { HttpMethod.Get }, true, logger)); }
public ThreadDumpHandler(ThreadDumpEndpoint endpoint, IEnumerable <ISecurityService> securityServices, ILogger <ThreadDumpHandler> logger = null) : base(endpoint, securityServices, null, true, logger) { }
public ThreadDumpHandler(ThreadDumpEndpoint endpoint, ISecurityService securityService, ILogger <ThreadDumpHandler> logger = null) : base(endpoint, securityService, null, true, logger) { }