.Net – как анализировать показатели гистограммы с помощью TraceEvent?

Я собираю показатели из одного .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

https://www.meziantou.net/getting-telemetry-data-from-inside-or-outside-a-dotnet-application.htm#diagnostic-event-pip

Вместо создания собственной библиотеки лучше использовать отраслевой стандарт OpenTelemetry, который поддерживается «из коробки» (и действительно работает, даже если вы этого не осознаете). Что касается метрик, они собираются через пространство имен Metrics и могут быть перенаправлены в Prometheus или любую службу, совместимую с OpenTelemetry, просто посредством настройки. Ваш код уже собирает такие метрики

Panagiotis Kanavos 10.06.2024 13:24

Я предлагаю проверить простой пример .NET Aspire, чтобы убедиться, что вам не нужно добавлять какой-либо собственный код в проекты Blazor и Web API для создания трассировок и метрик. Трассировки, метрики и журналы пересылаются на информационную панель, где они сопоставляются и отображаются.

Panagiotis Kanavos 10.06.2024 13:26

Кажется, вы создаете веб-API. В этом случае проверьте встроенные метрики ASP.NET Core.

Panagiotis Kanavos 10.06.2024 13:31

Это отличный способ отпугнуть людей, которые хотят помочь. Особенно, когда кажется, что вы смешиваете новый API Metrics со старыми EventCounters. Вы уверены, что вообще можете читать метрики с помощью старого API? Если вы хотите выдавать выходные данные, подобные счетчикам dotnet, вы можете проверить исходный код

Panagiotis Kanavos 10.06.2024 14:15

Об этом говорится в документах по сравнению показателей .

Panagiotis Kanavos 10.06.2024 14:18

Я думаю, что источник, который вам нужен, здесь: dotnet-counters использует другой код для обработки метрик и старых диагностических событий. Вам придется сделать то же самое

Panagiotis Kanavos 10.06.2024 14:29

ХОРОШО. Укороченная версия. Вы используете неправильный API. Используйте правильный.

Panagiotis Kanavos 10.06.2024 14:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне пришлось «взломать» его, для гистограмм значения указаны в «квантили»:

if (obj.PayloadNames.Length == 9)
    v = obj.PayloadByName("quantiles") as string;

Другие вопросы по теме