Пример #1
0
        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);
        }
Пример #3
0
        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"));
        }
Пример #4
0
        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);
        }
Пример #5
0
        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));
        }
Пример #7
0
        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"));
        }
Пример #8
0
        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"));
        }
Пример #9
0
        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));
        }
Пример #10
0
        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);
            }
        }
Пример #11
0
        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);
            }
        }
Пример #12
0
        /// <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));
        }
Пример #13
0
 public ThreadDumpHandler(ThreadDumpEndpoint endpoint, IEnumerable <ISecurityService> securityServices, ILogger <ThreadDumpHandler> logger = null)
     : base(endpoint, securityServices, null, true, logger)
 {
 }
Пример #14
0
 public ThreadDumpHandler(ThreadDumpEndpoint endpoint, ISecurityService securityService, ILogger <ThreadDumpHandler> logger = null)
     : base(endpoint, securityService, null, true, logger)
 {
 }