Інструментування
Інструментування — це процес додавання коду спостереження до вашого застосунку.
Якщо ви інструментуєте застосунок, вам потрібно використовувати OpenTelemetry SDK для вашої мови програмування. Потім ви будете використовувати SDK для ініціалізації OpenTelemetry та API для інструментування вашого коду. Це буде генерувати телеметрію з вашого застосунку та будь-якої бібліотеки, яку ви встановили, що також містить інструментування.
Якщо ви інструментуєте бібліотеку, встановіть лише пакет OpenTelemetry API для вашої мови програмування. Ваша бібліотека не буде генерувати телеметрію самостійно. Вона буде генерувати телеметрію лише тоді, коли буде частиною застосунку, що використовує OpenTelemetry SDK. Для отримання додаткової інформації про інструментування бібліотек дивіться Бібліотеки.
Для отримання додаткової інформації про OpenTelemetry API та SDK дивіться специфікацію.
Примітка
OpenTelemetry C++ не підтримує автоматичне інструментування, коли вихідний код бібліотеки, яку ви хочете інструментувати, недоступний.Налаштування
Дотримуйтесь інструкцій у Посібнику з початку роботи, щоб зібрати OpenTelemetry C++.
Трейси
Ініціалізація трасування
auto provider = opentelemetry::trace::Provider::GetTracerProvider();
auto tracer = provider->GetTracer("foo_library", "1.0.0");
TracerProvider
, отриманий на першому кроці, є singleton-обʼєктом, який зазвичай надається OpenTelemetry C++ SDK. Він використовується для надання конкретних реалізацій для API інтерфейсів. У разі відсутності SDK, API надає стандартну реалізацію TracerProvider
, яка нічого не робить.
Tracer
, отриманий на другому кроці, потрібен для створення та запуску Відрізків.
Запуск відрізка
auto span = tracer->StartSpan("HandleRequest");
Це створює відрізок, встановлює його імʼя як "HandleRequest"
і встановлює час початку на поточний час. Зверніться до документації API для інших операцій, які доступні для збагачення відрізків додатковими даними.
Позначення відрізка як активного
auto scope = tracer->WithActiveSpan(span);
Це позначає відрізок як активний і повертає обʼєкт Scope
. Обʼєкт scope контролює, як довго відрізок залишається активним. Відрізок залишається активним протягом життєвого циклу обʼєкта scope.
Концепція активного відрізка важлива, оскільки будь-який відрізок, створений без явного зазначення батька, буде мати батьком поточний активний відрізок. Відрізок без батька називається кореневим відрізком.
Створення вкладених відрізків
auto outer_span = tracer->StartSpan("Outer operation");
auto outer_scope = tracer->WithActiveSpan(outer_span);
{
auto inner_span = tracer->StartSpan("Inner operation");
auto inner_scope = tracer->WithActiveSpan(inner_span);
// ... виконання внутрішньої операції
inner_span->End();
}
// ... виконання зовнішньої операції
outer_span->End();
Відрізки можуть бути вкладеними та мати відношення пращур-нащадок з іншими відрізками. Коли даний відрізок активний, новостворений відрізок успадковує ідентифікатор трасування активного відрізка та інші атрибути контексту.
Поширення контексту
// встановлення глобального пропагатора
opentelemetry::context::propagation::GlobalTextMapPropagator::SetGlobalPropagator(
nostd::shared_ptr<opentelemetry::context::propagation::TextMapPropagator>(
new opentelemetry::trace::propagation::HttpTraceContext()));
// отримання глобального пропагатора
HttpTextMapCarrier<opentelemetry::ext::http::client::Headers> carrier;
auto propagator =
opentelemetry::context::propagation::GlobalTextMapPropagator::GetGlobalPropagator();
// ін'єкція контексту в заголовки
auto current_ctx = opentelemetry::context::RuntimeContext::GetCurrent();
propagator->Inject(carrier, current_ctx);
// вилучення заголовків у контекст
auto current_ctx = opentelemetry::context::RuntimeContext::GetCurrent();
auto new_context = propagator->Extract(carrier, current_ctx);
auto remote_span = opentelemetry::trace::propagation::GetSpan(new_context);
Context
містить метадані поточного активного відрізка, включаючи ідентифікатор відрізка, ідентифікатор трасування та прапорці. Поширення контексту є важливим механізмом у розподіленому трасуванні для передачі цього контексту через межі сервісів, часто через HTTP заголовки. OpenTelemetry надає підхід на основі тексту для поширення контексту до віддалених сервісів за допомогою HTTP заголовків W3C Trace Context.
Додатково
Метрики
Ініціалізація експортера та читача
Ініціалізуйте експортера та читача. У цьому випадку ви ініціалізуєте OStream Exporter, який робить вивід у stdout. Читач періодично збирає метрики з Aggregation Store та експортує їх.
std::unique_ptr<opentelemetry::sdk::metrics::MetricExporter> exporter{new opentelemetry::exporters::OStreamMetricExporter};
std::unique_ptr<opentelemetry::sdk::metrics::MetricReader> reader{
new opentelemetry::sdk::metrics::PeriodicExportingMetricReader(std::move(exporter), options)};
Ініціалізація постачальника метрик
Ініціалізуйте MeterProvider та додайте читача. Використовуйте це для отримання обʼєктів Meter у майбутньому.
auto provider = std::shared_ptr<opentelemetry::metrics::MeterProvider>(new opentelemetry::sdk::metrics::MeterProvider());
auto p = std::static_pointer_cast<opentelemetry::sdk::metrics::MeterProvider>(provider);
p->AddMetricReader(std::move(reader));
Створення лічильника
Створіть інструмент лічильника з Meter та запишіть вимірювання. Кожен вказівник Meter, повернутий MeterProvider, вказує на той самий Meter. Це означає, що Meter може обʼєднувати метрики, захоплені з різних функцій, без необхідності постійно передавати Meter по бібліотеці.
auto meter = provider->GetMeter(name, "1.2.0");
auto double_counter = meter->CreateDoubleCounter(counter_name);
// Створення набору міток, який анотує значення метрик
std::map<std::string, std::string> labels = {{"key", "value"}};
auto labelkv = common::KeyValueIterableView<decltype(labels)>{labels};
double_counter->Add(val, labelkv);
Створення гістограми
Створіть інструмент гістограми з Meter та запишіть вимірювання.
auto meter = provider->GetMeter(name, "1.2.0");
auto histogram_counter = meter->CreateDoubleHistogram("histogram_name");
histogram_counter->Record(val, labelkv);
Створення спостережуваного лічильника
Створіть інструмент спостережуваного лічильника з Meter та додайте зворотний виклик. Зворотний виклик використовується для запису вимірювання під час збору метрик. Переконайтеся, що обʼєкт Instrument активний протягом усього часу збору.
auto meter = provider->GetMeter(name, "1.2.0");
auto counter = meter->CreateDoubleObservableCounter(counter_name);
counter->AddCallback(MeasurementFetcher::Fetcher, nullptr);
Створення представлень
Зіставлення інструмента лічильника з агрегацією суми
Створіть представлення для відображення інструменту лічильника з агрегацією суми. Додайте це представлення до постачальника. Створення представлення необовʼязкове, якщо ви не хочете додати налаштування агрегації та обробника атрибутів. SDK метрик створює відсутнє представлення з типовим відображенням між інструментом та агрегацією.
std::unique_ptr<opentelemetry::sdk::metrics::InstrumentSelector> instrument_selector{
new opentelemetry::sdk::metrics::InstrumentSelector(opentelemetry::sdk::metrics::InstrumentType::kCounter, "counter_name")};
std::unique_ptr<opentelemetry::sdk::metrics::MeterSelector> meter_selector{
new opentelemetry::sdk::metrics::MeterSelector(name, version, schema)};
std::unique_ptr<opentelemetry::sdk::metrics::View> sum_view{
new opentelemetry::sdk::metrics::View{name, "description", opentelemetry::sdk::metrics::AggregationType::kSum}};
p->AddView(std::move(instrument_selector), std::move(meter_selector), std::move(sum_view));
Зіставлення інструменту гістограми з агрегацією гістограми
std::unique_ptr<opentelemetry::sdk::metrics::InstrumentSelector> histogram_instrument_selector{
new opentelemetry::sdk::metrics::InstrumentSelector(opentelemetry::sdk::metrics::InstrumentType::kHistogram, "histogram_name")};
std::unique_ptr<opentelemetry::sdk::metrics::MeterSelector> histogram_meter_selector{
new opentelemetry::sdk::metrics::MeterSelector(name, version, schema)};
std::unique_ptr<opentelemetry::sdk::metrics::View> histogram_view{
new opentelemetry::sdk::metrics::View{name, "description", opentelemetry::sdk::metrics::AggregationType::kHistogram}};
p->AddView(std::move(histogram_instrument_selector), std::move(histogram_meter_selector),
std::move(histogram_view));
Зіставлення інструменту спостережуваного лічильника з агрегацією суми
std::unique_ptr<opentelemetry::sdk::metrics::InstrumentSelector> observable_instrument_selector{
new opentelemetry::sdk::metrics::InstrumentSelector(opentelemetry::sdk::metrics::InstrumentType::kObservableCounter,
"observable_counter_name")};
std::unique_ptr<opentelemetry::sdk::metrics::MeterSelector> observable_meter_selector{
new opentelemetry::sdk::metrics::MeterSelector(name, version, schema)};
std::unique_ptr<opentelemetry::sdk::metrics::View> observable_sum_view{
new opentelemetry::sdk::metrics::View{name, "description", opentelemetry::sdk::metrics::AggregationType::kSum}};
p->AddView(std::move(observable_instrument_selector), std::move(observable_meter_selector),
std::move(observable_sum_view));
Додатково
Логи
Документація для API та SDK логів відсутня, ви можете допомогти зробити її доступною, редагуючи цю сторінку.
Наступні кроки
Вам також потрібно буде налаштувати відповідний експортер для експорту ваших даних телеметрії до одного або кількох бекендів телеметрії.
Відгук
Чи це було корисним?
Дякуємо. Ми цінуємо ваші відгуки!
Будь ласка, дайте нам знати як ми можемо покращити цю сторінку. Ми цінуємо ваші відгуки!