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(); }
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)); } }