|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Globalization;
using Aspire.Dashboard.Otlp.Model;
using Aspire.Dashboard.Resources;
using Humanizer;
using Microsoft.Extensions.Localization;
namespace Aspire.Dashboard.Model;
public sealed class DefaultInstrumentUnitResolver(IStringLocalizer<ControlsStrings> loc) : IInstrumentUnitResolver
{
public string ResolveDisplayedUnit(OtlpInstrumentSummary instrument, bool titleCase, bool pluralize)
{
if (!string.IsNullOrEmpty(instrument.Unit))
{
var (unit, isRateUnit) = OtlpUnits.GetUnit(instrument.Unit.TrimStart('{').TrimEnd('}'));
// Don't pluralize rate units, e.g. We want "Bytes per second", not "Bytes per seconds".
if (pluralize && !isRateUnit)
{
unit = unit.Pluralize();
}
if (titleCase)
{
unit = unit.Titleize();
}
return unit;
}
// Hard code for instrument names that don't have units
// but have a descriptive name that lets us infer the unit.
if (instrument.Name.EndsWith(".count"))
{
return UntitleCase(loc[nameof(ControlsStrings.PlotlyChartCount)], titleCase);
}
else if (instrument.Name.EndsWith(".length"))
{
return UntitleCase(loc[nameof(ControlsStrings.PlotlyChartLength)], titleCase);
}
else
{
return UntitleCase(loc[nameof(ControlsStrings.PlotlyChartValue)], titleCase);
}
static string UntitleCase(string value, bool titleCase)
{
if (!titleCase)
{
value = value.ToLower(CultureInfo.CurrentCulture);
}
return value;
}
}
}
|