Fixed certain scenario that could break the event viewer
This commit is contained in:
@@ -26,12 +26,12 @@ public sealed class PerformanceCollectorService : IHostedService
|
|||||||
{
|
{
|
||||||
if (!_lightlessConfigService.Current.LogPerformance) return func.Invoke();
|
if (!_lightlessConfigService.Current.LogPerformance) return func.Invoke();
|
||||||
|
|
||||||
string cn = sender.GetType().Name + _counterSplit + counterName.BuildMessage();
|
var owner = sender.GetType().Name;
|
||||||
|
var counter = counterName.BuildMessage();
|
||||||
|
var cn = string.Concat(owner, _counterSplit, counter);
|
||||||
|
|
||||||
if (!PerformanceCounters.TryGetValue(cn, out var list))
|
if (!PerformanceCounters.TryGetValue(cn, out var list))
|
||||||
{
|
|
||||||
list = PerformanceCounters[cn] = new(maxEntries);
|
list = PerformanceCounters[cn] = new(maxEntries);
|
||||||
}
|
|
||||||
|
|
||||||
var dt = DateTime.UtcNow.Ticks;
|
var dt = DateTime.UtcNow.Ticks;
|
||||||
try
|
try
|
||||||
@@ -53,12 +53,12 @@ public sealed class PerformanceCollectorService : IHostedService
|
|||||||
{
|
{
|
||||||
if (!_lightlessConfigService.Current.LogPerformance) { act.Invoke(); return; }
|
if (!_lightlessConfigService.Current.LogPerformance) { act.Invoke(); return; }
|
||||||
|
|
||||||
var cn = sender.GetType().Name + _counterSplit + counterName.BuildMessage();
|
var owner = sender.GetType().Name;
|
||||||
|
var counter = counterName.BuildMessage();
|
||||||
|
var cn = string.Concat(owner, _counterSplit, counter);
|
||||||
|
|
||||||
if (!PerformanceCounters.TryGetValue(cn, out var list))
|
if (!PerformanceCounters.TryGetValue(cn, out var list))
|
||||||
{
|
|
||||||
list = PerformanceCounters[cn] = new(maxEntries);
|
list = PerformanceCounters[cn] = new(maxEntries);
|
||||||
}
|
|
||||||
|
|
||||||
var dt = DateTime.UtcNow.Ticks;
|
var dt = DateTime.UtcNow.Ticks;
|
||||||
try
|
try
|
||||||
@@ -72,7 +72,7 @@ public sealed class PerformanceCollectorService : IHostedService
|
|||||||
if (TimeSpan.FromTicks(elapsed) > TimeSpan.FromMilliseconds(10))
|
if (TimeSpan.FromTicks(elapsed) > TimeSpan.FromMilliseconds(10))
|
||||||
_logger.LogWarning(">10ms spike on {counterName}: {time}", cn, TimeSpan.FromTicks(elapsed));
|
_logger.LogWarning(">10ms spike on {counterName}: {time}", cn, TimeSpan.FromTicks(elapsed));
|
||||||
#endif
|
#endif
|
||||||
list.Add(new(TimeOnly.FromDateTime(DateTime.Now), elapsed));
|
list.Add((TimeOnly.FromDateTime(DateTime.Now), elapsed));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,10 +122,10 @@ public sealed class PerformanceCollectorService : IHostedService
|
|||||||
sb.Append("-Counter Name".PadRight(longestCounterName, '-'));
|
sb.Append("-Counter Name".PadRight(longestCounterName, '-'));
|
||||||
sb.AppendLine();
|
sb.AppendLine();
|
||||||
var orderedData = data.OrderBy(k => k.Key, StringComparer.OrdinalIgnoreCase).ToList();
|
var orderedData = data.OrderBy(k => k.Key, StringComparer.OrdinalIgnoreCase).ToList();
|
||||||
var previousCaller = orderedData[0].Key.Split(_counterSplit, StringSplitOptions.RemoveEmptyEntries)[0];
|
var previousCaller = SplitCounterKey(orderedData[0].Key).Owner;
|
||||||
foreach (var entry in orderedData)
|
foreach (var entry in orderedData)
|
||||||
{
|
{
|
||||||
var newCaller = entry.Key.Split(_counterSplit, StringSplitOptions.RemoveEmptyEntries)[0];
|
var newCaller = SplitCounterKey(entry.Key).Owner;
|
||||||
if (!string.Equals(previousCaller, newCaller, StringComparison.Ordinal))
|
if (!string.Equals(previousCaller, newCaller, StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
DrawSeparator(sb, longestCounterName);
|
DrawSeparator(sb, longestCounterName);
|
||||||
@@ -157,6 +157,12 @@ public sealed class PerformanceCollectorService : IHostedService
|
|||||||
_logger.LogInformation("{perf}", sb.ToString());
|
_logger.LogInformation("{perf}", sb.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static (string Owner, string Counter) SplitCounterKey(string cn)
|
||||||
|
{
|
||||||
|
var parts = cn.Split(_counterSplit, 2, StringSplitOptions.None);
|
||||||
|
return (parts[0], parts.Length > 1 ? parts[1] : string.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
private static void DrawSeparator(StringBuilder sb, int longestCounterName)
|
private static void DrawSeparator(StringBuilder sb, int longestCounterName)
|
||||||
{
|
{
|
||||||
sb.Append("".PadRight(15, '-'));
|
sb.Append("".PadRight(15, '-'));
|
||||||
|
|||||||
@@ -205,18 +205,38 @@ internal class EventViewerUI : WindowMediatorSubscriberBase
|
|||||||
var posX = ImGui.GetCursorPosX();
|
var posX = ImGui.GetCursorPosX();
|
||||||
var maxTextLength = ImGui.GetWindowContentRegionMax().X - posX;
|
var maxTextLength = ImGui.GetWindowContentRegionMax().X - posX;
|
||||||
var textSize = ImGui.CalcTextSize(ev.Message).X;
|
var textSize = ImGui.CalcTextSize(ev.Message).X;
|
||||||
var msg = ev.Message;
|
var msg = ev.Message ?? string.Empty;
|
||||||
while (textSize > maxTextLength)
|
|
||||||
|
var maxEventTextLength = ImGui.GetContentRegionAvail().X;
|
||||||
|
|
||||||
|
if (maxEventTextLength <= 0f)
|
||||||
{
|
{
|
||||||
msg = msg[..^5] + "...";
|
ImGui.TextUnformatted(string.Empty);
|
||||||
textSize = ImGui.CalcTextSize(msg).X;
|
return;
|
||||||
}
|
}
|
||||||
ImGui.TextUnformatted(msg);
|
|
||||||
if (!string.Equals(msg, ev.Message, StringComparison.Ordinal))
|
var eventTextSize = ImGui.CalcTextSize(msg).X;
|
||||||
|
|
||||||
|
if (eventTextSize > maxEventTextLength)
|
||||||
{
|
{
|
||||||
|
const string ellipsis = "...";
|
||||||
|
|
||||||
|
while (eventTextSize > maxTextLength && msg.Length > ellipsis.Length)
|
||||||
|
{
|
||||||
|
var cut = Math.Min(5, msg.Length - ellipsis.Length);
|
||||||
|
msg = msg[..^cut] + ellipsis;
|
||||||
|
eventTextSize = ImGui.CalcTextSize(msg).X;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (textSize > maxEventTextLength)
|
||||||
|
msg = ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui.TextUnformatted(msg);
|
||||||
|
|
||||||
|
if (!string.Equals(msg, ev.Message, StringComparison.Ordinal))
|
||||||
UiSharedService.AttachToolTip(ev.Message);
|
UiSharedService.AttachToolTip(ev.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user