Skip to content
31 changes: 29 additions & 2 deletions src/Tools/dotnet-counters/Exporters/ConsoleWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,9 @@ public ObservedTagSet(string tags)
private readonly object _lock = new object();
private readonly Dictionary<string, ObservedProvider> _providers = new Dictionary<string, ObservedProvider>(); // Tracks observed providers and counters.
private const int Indent = 4; // Counter name indent size.
private int _maxNameLength = 40; // Allow room for 40 character counter names by default.
private const int CounterValueLength = 15;

private int _maxNameLength = 0;
private int _statusRow; // Row # of where we print the status of dotnet-counters
private int _topRow;
private bool _paused = false;
Expand All @@ -69,6 +70,9 @@ public ObservedTagSet(string tags)
private int _maxRow = -1;
private bool _useAnsi = false;

private int _consoleHeight = -1;
private int _consoleWidth = -1;

public ConsoleWriter(bool useAnsi)
{
this._useAnsi = useAnsi;
Expand Down Expand Up @@ -126,9 +130,16 @@ public void AssignRowsAndInitializeDisplay()
{
Clear();

_consoleWidth = Console.WindowWidth;
_consoleHeight = Console.WindowHeight;
_maxNameLength = Math.Max(Math.Min(80, _consoleWidth) - (CounterValueLength + Indent + 1), 0); // Truncate the name to prevent line wrapping as long as the console width is >= CounterValueLength + Indent + 1 characters


int row = Console.CursorTop;
_topRow = row;
Console.WriteLine("Press p to pause, r to resume, q to quit."); row++;

string instructions = "Press p to pause, r to resume, q to quit.";
Console.WriteLine((instructions.Length < _consoleWidth) ? instructions : instructions.Substring(0, _consoleWidth)); row++;
Console.WriteLine($" Status: {GetStatus()}"); _statusRow = row++;
if (_errorText != null)
{
Expand All @@ -140,19 +151,30 @@ public void AssignRowsAndInitializeDisplay()
foreach (ObservedProvider provider in _providers.Values.OrderBy(p => p.KnownProvider == null).ThenBy(p => p.Name)) // Known providers first.
{
Console.WriteLine($"[{provider.Name}]"); row++;

foreach (ObservedCounter counter in provider.Counters.Values.OrderBy(c => c.DisplayName))
{

string name = MakeFixedWidth($"{new string(' ', Indent)}{counter.DisplayName}", Indent + _maxNameLength);
counter.Row = row++;
if (counter.RenderValueInline)
{
if(row >= _consoleHeight) // prevents from displaying more counters than vertical space available
{
break;
}
Console.WriteLine($"{name} {FormatValue(counter.LastValue)}");
}
else
{
Console.WriteLine(name);
foreach (ObservedTagSet tagSet in counter.TagSets.Values.OrderBy(t => t.Tags))
{
if(row >= _consoleHeight)
{
break;
}

string tagName = MakeFixedWidth($"{new string(' ', 2 * Indent)}{tagSet.Tags}", Indent + _maxNameLength);
Console.WriteLine($"{tagName} {FormatValue(tagSet.LastValue)}");
tagSet.Row = row++;
Expand Down Expand Up @@ -222,6 +244,11 @@ public void CounterPayloadReceived(CounterPayload payload, bool pauseCmdSet)
redraw = true;
}

if(Console.WindowWidth != _consoleWidth || Console.WindowHeight != _consoleHeight)
{
redraw=true;
}

if (redraw)
{
AssignRowsAndInitializeDisplay();
Expand Down