Використання екземплярів
«Екземпляри» — це приклади точок даних для агрегованих даних. Вони надають конкретний контекст для загальних агрегацій. Одним із поширених випадків використання є можливість кореляції метрик із трейсами (та логами). У цьому посібнику показано, як використовувати екземпляри з OpenTelemetry .NET для зв’язування метрик і трейсів за допомогою Prometheus, Jaeger та Grafana.
Що таке екземпляри?
Екземпляри представляють собою окремі вимірювання, які є частиною агрегованої метрики. Вони дозволяють вам:
- Звʼязувати метрики з трейсами, які були активні під час зняття вимірювання
- Визначати викиди або цікаві точки даних у межах агрегованих метрик
- Краще розуміти причини змін метрик, досліджуючи асоційовані трейс
Компоненти, що використовуються в цьому посібнику
- OpenTelemetry .NET SDK: Інструментування для вашого застосунку
- Prometheus: Система зберігання метрик, яка підтримує екземпляри
- Jaeger: Система розподіленого трейсингу
- Grafana: Інтерфейс для запитів до метрик і трейсів, а також для навігації між ними за допомогою екземплярів
Налаштування
Встановлення та запуск Jaeger
- Завантажте останній бінарний дистрибутив Jaeger
- Розпакуйте його в локальну теку
- Запустіть виконуваний файл
jaeger-all-in-one(.exe):
./jaeger-all-in-one --collector.otlp.enabled
Встановлення та запуск Prometheus
- Завантажте останній реліз Prometheus
- Розпакуйте його в локальну теку
- Запустіть Prometheus з необхідними параметрами:
./prometheus --enable-feature=exemplar-storage --web.enable-otlp-receiver
Встановлення та налаштування Grafana
- Дотримуйтесь інструкцій, специфічних для операційної системи для встановлення Grafana
- Запустіть сервер Grafana
- Відкрийте http://localhost:3000/ у вашому вебоглядачі
- Увійдіть за допомогою облікових типових даних (admin/admin)
- Налаштуйте джерела даних:
Джерело даних Jaeger
- Перейдіть до Налаштування > Джерела даних
- Додайте джерело даних Jaeger
- Встановіть “URL” на
http://localhost:16686/ - Натисніть “Зберегти та протестувати”
Джерело даних Prometheus
- Перейдіть до Налаштування > Джерела даних
- Додайте джерело даних Prometheus
- Встановіть “URL” на
http://localhost:9090 - У розділі “Екземпляри” увімкніть “Внутрішнє посилання”
- Встановіть “Джерело даних” на
Jaegerі “Імʼя мітки” наtrace_id - Натисніть “Зберегти та протестувати”
Інструментуйте свій застосунок
Ось приклад того, як інструментувати .NET застосунок за допомогою OpenTelemetry, увімкнувши екземпляри:
using System;
using System.Diagnostics;
using System.Threading;
using OpenTelemetry;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
// Створити ресурс з інформацією про сервіс
var resource = ResourceBuilder.CreateDefault()
.AddService(serviceName: "exemplars-demo", serviceVersion: "1.0.0");
// Створити постачальника трасувальника
var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(resource)
.AddSource("MyCompany.MyProduct.MyLibrary")
.AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:4317"))
.Build();
// Створити постачальника метричних даних з підтримкою екземплярів
var meterProvider = Sdk.CreateMeterProviderBuilder()
.SetResourceBuilder(resource)
.AddMeter("MyCompany.MyProduct.MyLibrary")
.SetExemplarFilter(ExemplarFilterType.TraceBased) // Увімкнути екземпляри на основі трейсів
.AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:9090/api/v1/otlp"))
.Build();
// Створити джерело активності та вимірювач
var activitySource = new ActivitySource("MyCompany.MyProduct.MyLibrary");
var meter = new Meter("MyCompany.MyProduct.MyLibrary");
// Створити інструмент гістограми для запису вимірювань
var histogram = meter.CreateHistogram<double>("MyHistogram", unit: "ms", description: "Example histogram");
var random = new Random();
// Створити зразкові дані
for (int i = 0; i < 100; i++)
{
// Почати діяльність (відрізок)
using (var activity = activitySource.StartActivity("ProcessData"))
{
// Додати деякі атрибути до діяльності
activity?.SetTag("iteration", i);
// Симуляція роботи
var value = random.NextDouble() * 100;
Thread.Sleep((int)value);
// Записати вимірювання - це включатиме екземпляр з контекстом трейсування
// тому що ми встановили ExemplarFilterType.TraceBased і маємо активну діяльність
histogram.Record(value);
}
// Очікування між ітераціями
Thread.Sleep(100);
}
Console.WriteLine("Application running and sending data. Press any key to exit.");
Console.ReadKey();
// Звільнити провайдери до завершення роботи програми.
// Це призведе до очищення залишків телеметричних даних та закриття конвеєрів.
meterProvider.Dispose();
tracerProvider.Dispose();
Перегляд екземплярів в Grafana
- Відкрийте Grafana та перейдіть до розділу “Explore”
- Виберіть Prometheus як джерело даних
- Запросіть метрику
MyHistogram_bucket - Увімкніть опцію “Exemplars” та оновіть запит
Екземпляри будуть показані у вигляді ромбоподібних точок на графіку метрики. При натисканні на екземпляр ви побачите такі деталі:
- Часовий відбиток, коли було записано вимірювання
- Необроблене значення
- Контекст трасування (trace_id)
Ви можете натиснути на «Query with Jaeger» поруч із trace_id, щоб переглянути повʼязане трасування, яке дасть вам уявлення про те, що відбувалося під час конкретного вимірювання.
Як працюють екземпляри в OpenTelemetry .NET
Коли ви налаштовуєте SDK за допомогою SetExemplarFilter(ExemplarFilterType.TraceBased), SDK прикріплює інформацію про трасування (trace ID, span ID) до вимірювань метрик, які відбуваються в контексті активного відрізка. Це дозволяє бекенду метрик зберігати ці екземпляри та повʼязувати їх з відповідними трасуваннями.
Стандартно не всі вимірювання зберігаються як екземпляри (це було б неефективно). Бекенд зазвичай використовує стратегії вибірки, щоб вирішити, які вимірювання зберігати як екземпляри.
Екземпляри не потребують окремого API для інструментування. Продовжуйте використовувати звичайні API інструментів System.Diagnostics.Metrics; коли фільтрація екземплярів увімкнена і підтримка бекенду існує, SDK та шлях експорту автоматично прикріплюють екземпляри. Для звичайного використання API дивіться Metrics API.
Екземпляри та фільтрація атрибутів на основі View
Обмеження TagKeys (або інше видалення атрибутів через View) видаляє їх з потоку агрегованих метрик, але не видаляє їх з будь-яких екземплярів, записаних для того ж інструмента. Видалені атрибути зберігаються в екземплярах як фільтровані теги.
Якщо метою видалення атрибута є редагування даних (наприклад, видалення атрибута, що містить конфіденційні дані), одного лише View недостатньо, коли екземпляри увімкнені. Або залиште значення за замовчуванням ExemplarFilterType.AlwaysOff, щоб повністю вимкнути екземпляри, або налаштуйте власний ExemplarFilter / ExemplarReservoir, щоб контролювати, які вимірювання вибірково зберігати. Див. opentelemetry-specification#5073 для відповідного уточнення специфікації.
Дізнатись більше
- Специфікація OpenTelemetry Exemplar
- Prometheus Exemplars
- Jaeger Tracing
- Grafana Exemplars Documentation
Зворотний зв’язок
Чи була ця сторінка корисною?
Дякуємо. Ми цінуємо ваші відгуки!
Будь ласка, дайте нам знати як ми можемо покращити цю сторінку. Ми цінуємо ваші відгуки!