using Microsoft.Diagnostics.Tools.Counters.Exporters;
using Microsoft.Diagnostics.Tracing;
using Microsoft.Internal.Common.Utils;
+using Microsoft.Tools.Common;
using System;
using System.Collections.Generic;
using System.CommandLine;
using System.CommandLine.IO;
+using System.CommandLine.Binding;
+using System.CommandLine.Rendering;
using System.Diagnostics;
using System.Diagnostics.Tracing;
using System.IO;
DiagnosticsClientBuilder builder = new DiagnosticsClientBuilder("dotnet-counters", 10);
using (DiagnosticsClientHolder holder = await builder.Build(ct, _processId, diagnosticPort, showChildIO: false, printLaunchCommand: false))
+ using (VirtualTerminalMode vTerm = VirtualTerminalMode.TryEnable())
{
+ bool useAnsi = vTerm.IsEnabled;
if (holder == null)
{
return ReturnCode.Ok;
_interval = refreshInterval;
_maxHistograms = maxHistograms;
_maxTimeSeries = maxTimeSeries;
- _renderer = new ConsoleWriter();
+ _renderer = new ConsoleWriter(useAnsi);
_diagnosticsClient = holder.Client;
_resumeRuntime = resumeRuntime;
int ret = await Start();
private string _errorText = null;
private int maxRow = -1;
+ private bool useAnsi = false;
+
+ public ConsoleWriter(bool useAnsi)
+ {
+ this.useAnsi = useAnsi;
+ }
public void Initialize()
{
AssignRowsAndInitializeDisplay();
}
+ private void SetCursorPosition(int col, int row)
+ {
+ if (this.useAnsi)
+ {
+ Console.Write($"\u001b[{row + 1};{col + 1}H");
+ }
+ else
+ {
+ Console.SetCursorPosition(col, row);
+ }
+ }
+
+ private void Clear()
+ {
+ if (this.useAnsi)
+ {
+ Console.Write($"\u001b[H\u001b[J");
+ }
+ else
+ {
+ Console.Clear();
+ }
+ }
private void UpdateStatus()
{
- Console.SetCursorPosition(0, STATUS_ROW);
+ SetCursorPosition(0, STATUS_ROW);
Console.Write($" Status: {GetStatus()}{new string(' ', 40)}"); // Write enough blanks to clear previous status.
}
/// <summary>Clears display and writes out category and counter name layout.</summary>
public void AssignRowsAndInitializeDisplay()
{
- Console.Clear();
+ Clear();
+
int row = Console.CursorTop;
Console.WriteLine("Press p to pause, r to resume, q to quit."); row++;
Console.WriteLine($" Status: {GetStatus()}"); STATUS_ROW = row++;
}
int row = counter.RenderValueInline ? counter.Row : tagSet.Row;
- Console.SetCursorPosition(Indent + maxNameLength + 1, row);
+ SetCursorPosition(Indent + maxNameLength + 1, row);
Console.Write(FormatValue(payload.Value));
}
}
if (row > -1)
{
- Console.SetCursorPosition(0, row);
+ SetCursorPosition(0, row);
Console.WriteLine();
}
}