public void Contstructor_BindsConfigurationCorrectly()
        {
            var appsettings = new Dictionary <string, string>()
            {
                ["management:endpoints:enabled"]            = "false",
                ["management:endpoints:sensitive"]          = "false",
                ["management:endpoints:path"]               = "/cloudfoundryapplication",
                ["management:endpoints:loggers:enabled"]    = "false",
                ["management:endpoints:loggers:sensitive"]  = "true",
                ["management:endpoints:heapdump:enabled"]   = "true",
                ["management:endpoints:heapdump:sensitive"] = "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 HeapDumpOptions(config);
            CloudFoundryOptions cloudOpts = new CloudFoundryOptions(config);

            Assert.True(cloudOpts.Enabled);
            Assert.False(cloudOpts.Sensitive);
            Assert.Equal(string.Empty, cloudOpts.Id);
            Assert.Equal("/cloudfoundryapplication", cloudOpts.Path);
            Assert.True(cloudOpts.ValidateCertificates);

            Assert.True(opts.Enabled);
            Assert.True(opts.Sensitive);
            Assert.Equal("heapdump", opts.Id);
            Assert.Equal("/cloudfoundryapplication/heapdump", opts.Path);
        }
        public void Constructor_InitializesWithDefaults()
        {
            var opts = new HeapDumpOptions();

            Assert.True(opts.Enabled);
            Assert.True(opts.Sensitive);
            Assert.Equal("heapdump", opts.Id);
        }
Example #3
0
        public static void UseHeapDumpActuator(IConfiguration configuration, IHeapDumper heapDumper = null, ILoggerFactory loggerFactory = null)
        {
            var options = new HeapDumpOptions(configuration);

            heapDumper = heapDumper ?? new HeapDumper(options);
            var ep      = new HeapDumpEndpoint(options, heapDumper, CreateLogger <HeapDumpEndpoint>(loggerFactory));
            var handler = new HeapDumpHandler(ep, SecurityService, CreateLogger <HeapDumpHandler>(loggerFactory));

            ConfiguredHandlers.Add(handler);
        }
Example #4
0
        public void HeapDumpEndpointMiddleware_PathAndVerbMatching_ReturnsExpected()
        {
            var        opts   = new HeapDumpOptions();
            HeapDumper obs    = new HeapDumper(opts);
            var        ep     = new HeapDumpEndpoint(opts, obs);
            var        middle = new HeapDumpEndpointMiddleware(null, ep);

            Assert.True(middle.RequestVerbAndPathMatch("GET", "/heapdump"));
            Assert.False(middle.RequestVerbAndPathMatch("PUT", "/heapdump"));
            Assert.False(middle.RequestVerbAndPathMatch("GET", "/badpath"));
        }
        public void IsHeapDumpRequest_ReturnsExpected()
        {
            var opts = new HeapDumpOptions();

            HeapDumper obs     = new HeapDumper(opts);
            var        ep      = new HeapDumpEndpoint(opts, obs);
            var        middle  = new HeapDumpEndpointMiddleware(null, ep);
            var        context = CreateRequest("GET", "/heapdump");

            Assert.True(middle.IsHeapDumpRequest(context));
            var context2 = CreateRequest("PUT", "/heapdump");

            Assert.False(middle.IsHeapDumpRequest(context2));
            var context3 = CreateRequest("GET", "/badpath");

            Assert.False(middle.IsHeapDumpRequest(context3));
        }
        /// <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));
            }

            var options    = new HeapDumpOptions(config);
            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 HeapDumpOptions();
                LoggerFactory loggerFactory = new LoggerFactory();
                loggerFactory.AddConsole(minLevel: LogLevel.Debug);
                var logger1 = loggerFactory.CreateLogger <HeapDumper>();
                var logger2 = loggerFactory.CreateLogger <HeapDumpEndpoint>();
                var logger3 = loggerFactory.CreateLogger <HeapDumpEndpointMiddleware>();

                HeapDumper obs     = new HeapDumper(opts, logger1);
                var        ep      = new HeapDumpEndpoint(opts, obs, logger2);
                var        middle  = new HeapDumpEndpointMiddleware(null, ep, logger3);
                var        context = CreateRequest("GET", "/heapdump");
                await middle.HandleHeapDumpRequestAsync(context);

                context.Response.Body.Seek(0, SeekOrigin.Begin);
                byte[] buffer = new byte[1024];
                await context.Response.Body.ReadAsync(buffer, 0, 1024);

                Assert.NotEqual(0, buffer[0]);
            }
        }