public ProcessInfoStatsCollector(IMetrics metrics)
        {
            var cpuUsage = new ProcessTotalCpuTimer();

            _scheduler = new AppMetricsTaskScheduler(
                TimeSpan.FromMilliseconds(500),
                () =>
                Task.Run(
                    () =>
            {
                var process = Process.GetCurrentProcess();
                cpuUsage.Calculate();
                metrics.Provider.Timer.Instance(ProcessMetricsRegistry.Timers.CpuUsedMilliseconds).Record(
                    cpuUsage.ProcessTimeUsed.Ticks * 100, TimeUnit.Nanoseconds);
                metrics.Measure.Gauge.SetValue(ProcessMetricsRegistry.Gauges.CpuUsageRatio, () =>
                {
                    return(cpuUsage.ProcessCpuUsedRatio);
                });
                metrics.Measure.Gauge.SetValue(ProcessMetricsRegistry.Gauges.ProcessPagedMemorySize, () => process.PagedMemorySize64);
                metrics.Measure.Gauge.SetValue(ProcessMetricsRegistry.Gauges.ProcessPeekPagedMemorySize, () => process.PeakPagedMemorySize64);
                metrics.Measure.Gauge.SetValue(ProcessMetricsRegistry.Gauges.ProcessPeekVirtualMemorySize, () => process.PeakVirtualMemorySize64);
                metrics.Measure.Gauge.SetValue(ProcessMetricsRegistry.Gauges.ProcessWorkingSetSize, () => process.WorkingSet64);
                metrics.Measure.Gauge.SetValue(ProcessMetricsRegistry.Gauges.ProcessPeekWorkingSetSize, () => process.PeakWorkingSet64);
                metrics.Measure.Gauge.SetValue(ProcessMetricsRegistry.Gauges.ProcessPrivateMemorySize, () => process.PrivateMemorySize64);
                metrics.Measure.Gauge.SetValue(ProcessMetricsRegistry.Gauges.ProcessVirtualMemorySize, () => process.VirtualMemorySize64);
                metrics.Measure.Gauge.SetValue(ProcessMetricsRegistry.Gauges.SystemNonPagedMemory, () => process.NonpagedSystemMemorySize64);
                metrics.Measure.Gauge.SetValue(ProcessMetricsRegistry.Gauges.SystemPagedMemorySize, () => process.PagedSystemMemorySize64);
                metrics.Measure.Gauge.SetValue(ProcessMetricsRegistry.Gauges.ThreadCount, () => process.Threads.Count);
                metrics.Measure.Gauge.SetValue(ProcessMetricsRegistry.Gauges.HandlesCount, () => process.HandleCount);
            }));
            _scheduler.Start();
        }
예제 #2
0
        public void ProcessEvent(EventWrittenEventArgs e)
        {
            if (_eventPairTimer.TryGetDuration(e, out var duration) == DurationResult.FinalWithDuration)
            {
                // dynamic methods are of special interest to us- only a certain number of JIT'd dynamic methods
                // will be cached. Frequent use of dynamic can cause methods to be evicted from the cache and re-JIT'd
                var methodFlags       = (uint)e.Payload[5];
                var dynamicLabelValue = (methodFlags & 0x1) == 0x1 ? LabelValueTrue : LabelValueFalse;

                _metrics.Provider.Timer.Instance(DotNetRuntimeMetricsRegistry.Timers.MethodsJittedMilliSecondsTotal,
                                                 new MetricTags(DynamicLabel, dynamicLabelValue)).Record(duration.Ticks * 100, TimeUnit.Nanoseconds);
                _metrics.Provider.Timer.Instance(DotNetRuntimeMetricsRegistry.Timers.MethodsJittedMilliSecondsTotal)
                .Record(duration.Ticks * 100, TimeUnit.Nanoseconds);

                var methodsJittedMsTotalCounter = _metrics.Provider.Timer.Instance(DotNetRuntimeMetricsRegistry.Timers.MethodsJittedMilliSecondsTotal);
                _jitCpuProcessTotalCpuTimer.Calculate();
                _metrics.Measure.Gauge.SetValue(DotNetRuntimeMetricsRegistry.Gauges.CpuRatio,
                                                () => new RatioGauge(
                                                    () => methodsJittedMsTotalCounter.GetValueOrDefault().Histogram.LastValue,
                                                    () => _jitCpuProcessTotalCpuTimer.ProcessTimeUsed.Ticks * 100.0));
            }
        }