Esempio n. 1
0
        public void HandleThreadsEvent_RecordsValues()
        {
            var options  = new MetricsEndpointOptions();
            var stats    = new OpenCensusStats();
            var tags     = new OpenCensusTags();
            var observer = new CLRRuntimeObserver(options, stats, tags, null);

            CLRRuntimeSource.ThreadMetrics metrics = new CLRRuntimeSource.ThreadMetrics(100, 100, 200, 200);
            observer.HandleThreadsEvent(metrics);

            var live    = stats.ViewManager.GetView(ViewName.Create("clr.threadpool.active"));
            var aggData = MetricsHelpers.SumWithTags(live) as IMeanData;

            Assert.Equal(100, aggData.Mean);
            Assert.Equal(100, aggData.Min);
            Assert.Equal(100, aggData.Max);

            aggData = MetricsHelpers.SumWithTags(live, new List <ITagValue>()
            {
                TagValue.Create("worker")
            }) as IMeanData;
            Assert.Equal(100, aggData.Mean);
            Assert.Equal(100, aggData.Min);
            Assert.Equal(100, aggData.Max);

            aggData = MetricsHelpers.SumWithTags(live, new List <ITagValue>()
            {
                TagValue.Create("completionPort")
            }) as IMeanData;
            Assert.Equal(100, aggData.Mean);
            Assert.Equal(100, aggData.Min);
            Assert.Equal(100, aggData.Max);

            var avail = stats.ViewManager.GetView(ViewName.Create("clr.threadpool.avail"));

            aggData = MetricsHelpers.SumWithTags(avail) as IMeanData;
            Assert.Equal(100, aggData.Mean);
            Assert.Equal(100, aggData.Min);
            Assert.Equal(100, aggData.Max);

            aggData = MetricsHelpers.SumWithTags(avail, new List <ITagValue>()
            {
                TagValue.Create("worker")
            }) as IMeanData;
            Assert.Equal(100, aggData.Mean);
            Assert.Equal(100, aggData.Min);
            Assert.Equal(100, aggData.Max);

            aggData = MetricsHelpers.SumWithTags(avail, new List <ITagValue>()
            {
                TagValue.Create("completionPort")
            }) as IMeanData;
            Assert.Equal(100, aggData.Mean);
            Assert.Equal(100, aggData.Min);
            Assert.Equal(100, aggData.Max);
        }
        public void ProcessEvent_IgnoresNulls()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new CLRRuntimeObserver(options, stats, null);

            observer.ProcessEvent("foobar", null);
            observer.ProcessEvent(CLRRuntimeObserver.HEAP_EVENT, null);
            observer.ProcessEvent(CLRRuntimeObserver.THREADS_EVENT, null);
        }
Esempio n. 3
0
        public void ProcessEvent_IgnoresNulls()
        {
            var options  = new MetricsEndpointOptions();
            var stats    = new OpenCensusStats();
            var tags     = new OpenCensusTags();
            var observer = new CLRRuntimeObserver(options, stats, tags, null);

            observer.ProcessEvent("foobar", null);
            observer.ProcessEvent(CLRRuntimeObserver.HEAP_EVENT, null);
            observer.ProcessEvent(CLRRuntimeObserver.THREADS_EVENT, null);
        }
Esempio n. 4
0
        public void Constructor_RegistersExpectedViews()
        {
            var options  = new MetricsEndpointOptions();
            var stats    = new OpenCensusStats();
            var tags     = new OpenCensusTags();
            var observer = new CLRRuntimeObserver(options, stats, tags, null);

            Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("clr.memory.used")));
            Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("clr.gc.collections")));
            Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("clr.threadpool.active")));
            Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("clr.threadpool.avail")));
        }
Esempio n. 5
0
        /// <summary>
        /// Add Metrics actuator endpoint to OWIN Pipeline
        /// </summary>
        /// <param name="builder">OWIN <see cref="IAppBuilder" /></param>
        /// <param name="config"><see cref="IConfiguration"/> of application for configuring metrics endpoint</param>
        /// <param name="stats">Class for recording statistics - See also: <seealso cref="OpenCensusStats"/></param>
        /// <param name="tags">Class using for recording statistics</param>
        /// <param name="loggerFactory">For logging within the middleware</param>
        /// <returns>OWIN <see cref="IAppBuilder" /> with Metrics Endpoint added</returns>
        public static IAppBuilder UseMetricsActuator(this IAppBuilder builder, IConfiguration config, IStats stats, ITags tags, ILoggerFactory loggerFactory = null)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            if (config == null)
            {
                throw new ArgumentNullException(nameof(config));
            }

            if (stats == null)
            {
                throw new ArgumentNullException(nameof(stats));
            }

            if (tags == null)
            {
                throw new ArgumentNullException(nameof(tags));
            }

            IMetricsOptions options     = new MetricsEndpointOptions(config);
            var             mgmtOptions = ManagementOptions.Get(config);

            foreach (var mgmt in mgmtOptions)
            {
                mgmt.EndpointOptions.Add(options);
            }

            var hostObserver = new OwinHostingObserver(options, stats, tags, loggerFactory?.CreateLogger <OwinHostingObserver>());
            var clrObserver  = new CLRRuntimeObserver(options, stats, tags, loggerFactory?.CreateLogger <CLRRuntimeObserver>());

            DiagnosticsManager.Instance.Observers.Add(hostObserver);
            DiagnosticsManager.Instance.Observers.Add(clrObserver);

            var clrSource = new CLRRuntimeSource();

            DiagnosticsManager.Instance.Sources.Add(clrSource);

            var endpoint = new MetricsEndpoint(options, stats, loggerFactory?.CreateLogger <MetricsEndpoint>());
            var logger   = loggerFactory?.CreateLogger <MetricsEndpointOwinMiddleware>();

            return(builder.Use <MetricsEndpointOwinMiddleware>(endpoint, mgmtOptions, logger));
        }
Esempio n. 6
0
        public static void UseMetricsActuator(IConfiguration configuration, ILoggerFactory loggerFactory)
        {
            var options = new MetricsOptions(configuration);

            var hostObserver = new AspNetHostingObserver(options, OpenCensusStats.Instance, OpenCensusTags.Instance, CreateLogger <AspNetHostingObserver>(loggerFactory));
            var clrObserver  = new CLRRuntimeObserver(options, OpenCensusStats.Instance, OpenCensusTags.Instance, CreateLogger <CLRRuntimeObserver>(loggerFactory));

            DiagnosticsManager.Instance.Observers.Add((IDiagnosticObserver)hostObserver);
            DiagnosticsManager.Instance.Observers.Add((IDiagnosticObserver)clrObserver);

            var clrSource = new CLRRuntimeSource();

            DiagnosticsManager.Instance.Sources.Add(clrSource);
            var ep      = new MetricsEndpoint(options, OpenCensusStats.Instance, CreateLogger <MetricsEndpoint>(loggerFactory));
            var handler = new MetricsHandler(ep, SecurityService, CreateLogger <MetricsHandler>(loggerFactory));

            ConfiguredHandlers.Add(handler);
        }
        public void HandleHeapEvent_RecordsValues()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new CLRRuntimeObserver(options, stats, null);
            var factory  = stats.Factory;

            var metrics = new CLRRuntimeSource.HeapMetrics(1000, new List <long>()
            {
                10, 20, 30
            });

            observer.HandleHeapEvent(metrics);
            factory.CollectAllMetrics();

            var processor = stats.Processor;

            var metricName = "clr.memory.used";
            var summary    = processor.GetMetricByName <long>(metricName);

            Assert.NotNull(summary);
            var mean = summary.Sum / summary.Count;

            Assert.Equal(1000, mean);
            Assert.Equal(1000, summary.Min);
            Assert.Equal(1000, summary.Max);

            metricName = "clr.gc.collections";
            var gen0Label = new Dictionary <string, string>()
            {
                { "generation", "gen0" }
            }.ToList();

            summary = processor.GetMetricByName <long>(metricName, gen0Label);
            Assert.NotNull(summary);
            Assert.Equal(10, summary.Sum);

            var gen1Label = new Dictionary <string, string>()
            {
                { "generation", "gen1" }
            }.ToList();

            summary = processor.GetMetricByName <long>(metricName, gen1Label);
            Assert.NotNull(summary);
            Assert.Equal(20, summary.Sum);

            var gen2Label = new Dictionary <string, string>()
            {
                { "generation", "gen2" }
            }.ToList();

            summary = processor.GetMetricByName <long>(metricName, gen2Label);
            Assert.NotNull(summary);
            Assert.Equal(30, summary.Sum);

            processor.Clear();
            observer = new CLRRuntimeObserver(options, stats, null);

            metrics = new CLRRuntimeSource.HeapMetrics(1000, new List <long>()
            {
                10, 20, 30
            });
            observer.HandleHeapEvent(metrics);
            metrics = new CLRRuntimeSource.HeapMetrics(5000, new List <long>()
            {
                15, 25, 30
            });
            observer.HandleHeapEvent(metrics);
            factory.CollectAllMetrics();

            metricName = "clr.memory.used";
            summary    = processor.GetMetricByName <long>(metricName);
            Assert.Equal(5000 + 1000, summary.Sum);
            Assert.Equal(5000, summary.Max);
            Assert.Equal(1000, summary.Min);

            metricName = "clr.gc.collections";
            summary    = processor.GetMetricByName <long>(metricName, gen0Label);
            Assert.Equal(15, summary.Sum);

            summary = processor.GetMetricByName <long>(metricName, gen1Label);
            Assert.NotNull(summary);
            Assert.Equal(25, summary.Sum);

            summary = processor.GetMetricByName <long>(metricName, gen2Label);
            Assert.NotNull(summary);
            Assert.Equal(30, summary.Sum);
        }
        public void HandleThreadsEvent_RecordsValues()
        {
            var options   = new MetricsObserverOptions();
            var stats     = new TestOpenTelemetryMetrics();
            var factory   = stats.Factory;
            var processor = stats.Processor;
            var observer  = new CLRRuntimeObserver(options, stats, null);

            var metrics = new CLRRuntimeSource.ThreadMetrics(100, 100, 200, 200);

            observer.HandleThreadsEvent(metrics);

            factory.CollectAllMetrics();

            var metricName = "clr.threadpool.active";
            var summary    = processor.GetMetricByName <long>(metricName);

            Assert.NotNull(summary);
            var mean = summary.Sum / summary.Count;

            Assert.Equal(100, mean);
            Assert.Equal(100, summary.Min);
            Assert.Equal(100, summary.Max);

            var workerLabel = new Dictionary <string, string>()
            {
                { "kind", "worker" }
            }.ToList();

            summary = processor.GetMetricByName <long>(metricName, workerLabel);
            Assert.NotNull(summary);
            mean = summary.Sum / summary.Count;
            Assert.Equal(100, mean);
            Assert.Equal(100, summary.Min);
            Assert.Equal(100, summary.Max);

            var comportLabel = new Dictionary <string, string>()
            {
                { "kind", "completionPort" }
            }.ToList();

            summary = processor.GetMetricByName <long>(metricName, comportLabel);
            Assert.NotNull(summary);
            mean = summary.Sum / summary.Count;
            Assert.Equal(100, mean);
            Assert.Equal(100, summary.Min);
            Assert.Equal(100, summary.Max);

            metricName = "clr.threadpool.avail";
            summary    = processor.GetMetricByName <long>(metricName);
            Assert.NotNull(summary);
            mean = summary.Sum / summary.Count;
            Assert.Equal(100, mean);
            Assert.Equal(100, summary.Min);
            Assert.Equal(100, summary.Max);

            summary = processor.GetMetricByName <long>(metricName, workerLabel);
            Assert.NotNull(summary);
            mean = summary.Sum / summary.Count;
            Assert.Equal(100, mean);
            Assert.Equal(100, summary.Min);
            Assert.Equal(100, summary.Max);

            summary = processor.GetMetricByName <long>(metricName, comportLabel);
            Assert.NotNull(summary);
            mean = summary.Sum / summary.Count;
            Assert.Equal(100, mean);
            Assert.Equal(100, summary.Min);
            Assert.Equal(100, summary.Max);
        }
Esempio n. 9
0
        public void HandleHeapEvent_RecordsValues()
        {
            var options  = new MetricsEndpointOptions();
            var stats    = new OpenCensusStats();
            var tags     = new OpenCensusTags();
            var observer = new CLRRuntimeObserver(options, stats, tags, null);

            CLRRuntimeSource.HeapMetrics metrics = new CLRRuntimeSource.HeapMetrics(1000, new List <long>()
            {
                10, 20, 30
            });
            observer.HandleHeapEvent(metrics);

            var memUsedViewData = stats.ViewManager.GetView(ViewName.Create("clr.memory.used"));
            var aggData         = MetricsHelpers.SumWithTags(memUsedViewData) as IMeanData;

            Assert.Equal(1000, aggData.Mean);
            Assert.Equal(1000, aggData.Max);
            Assert.Equal(1000, aggData.Min);

            var gcViewData = stats.ViewManager.GetView(ViewName.Create("clr.gc.collections"));
            var aggData2   = MetricsHelpers.SumWithTags(gcViewData) as ISumDataLong;

            Assert.Equal(60, aggData2.Sum);

            aggData2 = MetricsHelpers.SumWithTags(gcViewData, new List <ITagValue>()
            {
                TagValue.Create("gen0")
            }) as ISumDataLong;
            Assert.Equal(10, aggData2.Sum);

            aggData2 = MetricsHelpers.SumWithTags(gcViewData, new List <ITagValue>()
            {
                TagValue.Create("gen1")
            }) as ISumDataLong;
            Assert.Equal(20, aggData2.Sum);

            aggData2 = MetricsHelpers.SumWithTags(gcViewData, new List <ITagValue>()
            {
                TagValue.Create("gen2")
            }) as ISumDataLong;
            Assert.Equal(30, aggData2.Sum);

            metrics = new CLRRuntimeSource.HeapMetrics(5000, new List <long>()
            {
                15, 25, 30
            });
            observer.HandleHeapEvent(metrics);

            memUsedViewData = stats.ViewManager.GetView(ViewName.Create("clr.memory.used"));
            aggData         = MetricsHelpers.SumWithTags(memUsedViewData) as IMeanData;
            Assert.Equal((5000 + 1000) / 2, aggData.Mean);
            Assert.Equal(5000, aggData.Max);
            Assert.Equal(1000, aggData.Min);

            gcViewData = stats.ViewManager.GetView(ViewName.Create("clr.gc.collections"));
            aggData2   = MetricsHelpers.SumWithTags(gcViewData) as ISumDataLong;
            Assert.Equal(70, aggData2.Sum);

            aggData2 = MetricsHelpers.SumWithTags(gcViewData, new List <ITagValue>()
            {
                TagValue.Create("gen0")
            }) as ISumDataLong;
            Assert.Equal(15, aggData2.Sum);

            aggData2 = MetricsHelpers.SumWithTags(gcViewData, new List <ITagValue>()
            {
                TagValue.Create("gen1")
            }) as ISumDataLong;
            Assert.Equal(25, aggData2.Sum);

            aggData2 = MetricsHelpers.SumWithTags(gcViewData, new List <ITagValue>()
            {
                TagValue.Create("gen2")
            }) as ISumDataLong;
            Assert.Equal(30, aggData2.Sum);
        }