public PiSystemHub(IMetricStream metricStream) { this.metricStream = metricStream; this.container = new HashSet <string>(); }
public void CaptureMetrics(IMetricStream stream) { var retVal = new List <MetricBase>(); _processedPids.Clear(); var processes = Process.GetProcesses(); foreach (var proc in processes) { _processinfo pinfo; if (!_counters.TryGetValue(proc.Id, out pinfo)) { pinfo = new _processinfo(); pinfo.CpuPerc = new PerformanceCounter("Process", "% Processor Time", proc.ProcessName); pinfo.MemoryUsage = new PerformanceCounter("Process", "Working Set - Private", proc.ProcessName); //pinfo.DiscUsage = new PerformanceCounter("PhysicalDisk", "% Disk Time", "_Total"); //pinfo.NetworkUsage = new PerformanceCounter("Network Interface", "% Processor Time", proc.ProcessName); } var metric = new ProcessDescriptorMetric(); try { metric.TimeStamp = DateTime.UtcNow; metric.Name = proc.ProcessName; metric.Pid = proc.Id; metric.SessionId = proc.SessionId; metric.CpuPerc = pinfo.CpuPerc.NextValue(); metric.MemoryUsage = pinfo.MemoryUsage.NextValue() / 1024 / 1024; //metric.DiscUsage = pinfo.DiscUsage.NextValue(); } catch { //todo: ??? metric = null; } if (metric != null) { stream.Append(metric); } _processedPids.Add(proc.Id); } foreach (var counters in _counters) { if (!_processedPids.Contains(counters.Key)) { var info = counters.Value; info.CpuPerc.Dispose(); info.MemoryUsage.Dispose(); info.DiscUsage.Dispose(); _counters.Remove(counters.Key); stream.Append(new ProcessDescriptorMetric { TimeStamp = DateTime.UtcNow, Pid = counters.Key }); } } }