Я собираю показатели из одного .net-приложения в другое, используя DiagnosticsClient:
var providers = new List<EventPipeProvider>()
{
new EventPipeProvider("System.Diagnostics.Metrics", EventLevel.Verbose, keywords: -1, arguments: new Dictionary<string, string>
{
["Metrics"] = "SomeApi",
["Metrics"] = "MyApp",
}),
};
client = new DiagnosticsClient(pid);
session = client.StartEventPipeSession(providers, requestRundown: false);
source = new EventPipeEventSource(session.EventStream);
source.Dynamic.All += (TraceEvent obj) =>
{
if (obj.PayloadNames.Length < 7) return;
var n = obj.PayloadValue(3) as string;
var v = obj.PayloadValue(6) as string;
//[0]: "sessionId"
//[1]: "meterName"
//[2]: "meterVersion"
//[3]: "instrumentName"
//[4]: "unit"
//[5]: "tags"
//[6]: "lastValue"
};
Итак, я решил, что индекс полезной нагрузки 6 — это значение для «плоской» метрики, такой как счетчик. Но если это гистограмма или наблюдаемый датчик, тогда это не имеет значения.
Я хочу напечатать значения так же, как это делают счетчики dotnet:
Обновлено: мой код основан на двух источниках:
https://learn.microsoft.com/en-us/dotnet/core/diagnostics/diagnostics-client-library
Я предлагаю проверить простой пример .NET Aspire, чтобы убедиться, что вам не нужно добавлять какой-либо собственный код в проекты Blazor и Web API для создания трассировок и метрик. Трассировки, метрики и журналы пересылаются на информационную панель, где они сопоставляются и отображаются.
Кажется, вы создаете веб-API. В этом случае проверьте встроенные метрики ASP.NET Core.
Это отличный способ отпугнуть людей, которые хотят помочь. Особенно, когда кажется, что вы смешиваете новый API Metrics со старыми EventCounters. Вы уверены, что вообще можете читать метрики с помощью старого API? Если вы хотите выдавать выходные данные, подобные счетчикам dotnet, вы можете проверить исходный код
Об этом говорится в документах по сравнению показателей .
Я думаю, что источник, который вам нужен, здесь: dotnet-counters использует другой код для обработки метрик и старых диагностических событий. Вам придется сделать то же самое
ХОРОШО. Укороченная версия. Вы используете неправильный API. Используйте правильный.





Мне пришлось «взломать» его, для гистограмм значения указаны в «квантили»:
if (obj.PayloadNames.Length == 9)
v = obj.PayloadByName("quantiles") as string;
Вместо создания собственной библиотеки лучше использовать отраслевой стандарт OpenTelemetry, который поддерживается «из коробки» (и действительно работает, даже если вы этого не осознаете). Что касается метрик, они собираются через пространство имен Metrics и могут быть перенаправлены в Prometheus или любую службу, совместимую с OpenTelemetry, просто посредством настройки. Ваш код уже собирает такие метрики