public void Print(MetricsCollection metricsCollection, SortKind sortKind, int top) { lock (sync) { PrintInternal(metricsCollection, sortKind, top); } }
private unsafe void Collect(TimeSpan period) { var processes = new List <ProcessMetrics>(); var newTimes = new Dictionary <int, long>(); NtUtility.VisitProcesses(info => Visit(info, newTimes, processes, period)); times = newTimes; var metricsCollection = new MetricsCollection { ProcessMetricsCollection = processes.ToArray(), Timestamp = DateTime.UtcNow, MachineName = Environment.MachineName }; Task.Run(() => MetricsAvailable(this, metricsCollection)); }
private unsafe void Collect(TimeSpan period) { var processes = new List <ProcessMetrics>(); var newTimes = new Dictionary <int, long>(); NtUtility.VisitProcesses(info => { var pid = (int)info->UniqueProcessId; var currentTimes = info->KernelTime + info->UserTime; var prevTimes = times.TryGetValue(pid, out var t) ? t : currentTimes; newTimes[pid] = currentTimes; processes.Add(new ProcessMetrics { BasePriority = info->BasePriority, HandlesCount = (int)info->HandleCount, Name = GetProcessName(info->NamePtr), PeakPrivateBytes = (long)info->PeakPagefileUsage, WorkingSet = (long)info->WorkingSetSize, PrivateBytes = (long)info->PrivatePageCount, ProcessId = (int)info->UniqueProcessId, SessionId = (int)info->SessionId, PeakWorkingSet = (long)info->PeakWorkingSetSize, ThreadsCount = (int)info->NumberOfThreads, Cpu = (currentTimes - prevTimes) / (double)period.Ticks / Environment.ProcessorCount }); }); times = newTimes; var metricsCollection = new MetricsCollection { ProcessMetricsCollection = processes.ToArray(), Timestamp = DateTime.UtcNow, MachineName = Environment.MachineName }; Task.Run(() => MetricsAvailable(this, metricsCollection)); }
private void PrintInternal(MetricsCollection collection, SortKind sortKind, int top) { stringBuilder.Clear(); stringBuilder.AppendLine($"Machine: {collection.MachineName}, Timestamp: {collection.Timestamp}"); var table = ConsoleTable.From( Sort(collection .ProcessMetricsCollection, sortKind) .Take(top) .Select(x => new ProcessMetricsModel(x))) .ToMarkDownString(); var lines = stringBuilder.Append(table).ToString().Split(NewLine, StringSplitOptions.RemoveEmptyEntries); stringBuilder.Clear(); var width = GetConsoleWidth(); if (consoleWidth != width) { Console.Clear(); consoleWidth = width; } foreach (var line in lines) { stringBuilder.Append(line, 0, Math.Min(width, line.Length)); if (line.Length < width) { stringBuilder.Append(' ', width - line.Length); } stringBuilder.AppendLine(); } Console.SetCursorPosition(0, 0); Console.WriteLine(stringBuilder.ToString()); }