Початок роботи
Ця сторінка покаже вам, як почати роботу з OpenTelemetry у C++.
Ви дізнаєтесь, як інструментувати простий застосунок на C++, щоб трейси відображалися в терміналі.
Передумови
Переконайтеся, що у вас встановлено наступне:
- Git
- Компілятор C++, що підтримує версію C++ >= 14
- Make
- CMake версії >= 3.25
Приклад застосунку
Наступний приклад використовує базовий застосунок Oat++. Якщо ви не використовуєте Oat++, це не проблема — ви можете використовувати OpenTelemetry C++ з будь-яким іншим веб-фреймворком.
Налаштування
Створіть теку з назвою
otel-cpp-starter.Перейдіть у новостворену теку. Це буде ваша робоча тека.
Після налаштування залежностей ваша структура тек повинна виглядати так:
otel-cpp-starter │ ├── oatpp ├── opentelemetry-cpp └── roll-dice
Залежності
Для початку встановіть Oat++ локально, використовуючи вихідний код та make, виконавши наступні кроки:
Отримайте вихідний код Oat++, клонуючи з oatpp/oatpp репозиторію GitHub.
git clone https://github.com/oatpp/oatpp.gitПерейдіть до директорії
oatppта переключіться на версію 1.3.0:cd oatpp git checkout 1.3.0-latestСтворіть вкладену теку
buildта перейдіть у неї.mkdir build cd buildЗберіть oatpp, використовуючи команди
cmakeтаmake. Ця команда запустить процес збірки, вказаний уCMakeLists.txt, що входить до вихідного коду oatpp.cmake .. makeВстановіть oatpp.
Ця команда встановить зібрану бібліотеку oatpp та заголовки у вашу систему, роблячи їх доступними для розробки у вашому проєкті.
sudo make install
Щоб видалити встановлену бібліотеку oatpp та заголовки з вашої системи.
sudo make uninstall
Далі, встановіть та зберіть OpenTelemetry C++ локально використовуючи CMake, виконавши наступні кроки:
У вашому терміналі поверніться до теки
otel-cpp-starter. Потім, клонуйте репозиторій OpenTelemetry C++ GitHub на ваш локальний компʼютер.git clone https://github.com/open-telemetry/opentelemetry-cpp.gitЗмініть вашу робочу теку на теку SDK OpenTelemetry C++.
cd opentelemetry-cppСтворіть теку збірки та перейдіть у неї.
mkdir build cd buildУ теці
buildзапустіть CMake, щоб налаштувати та згенерувати систему збірки без увімкнення тестів:cmake -DBUILD_TESTING=OFF ..Або, якщо
cmake --buildне вдається, ви також можете спробувати:cmake -DBUILD_TESTING=OFF -DWITH_ABSEIL=ON ..Виконайте процес збірки:
cmake --build .Встановіть OpenTelemetry C++ в otel-cpp-starter/otel-cpp:
cmake --install . --prefix ../../otel-cpp
З Oat++ та OpenTelemetry C++ готовими, ви можете продовжити створення HTTP сервера, який ми хочемо інструментувати згодом.
Створення та запуск HTTP сервера
У вашій теці otel-cpp-starter створіть вкладену теку roll-dice, де бібліотека Oat++ буде використовуватися шляхом посилання на заголовки oatpp та звʼязування їх під час компіляції вашого проєкту.
Створіть файл з назвою CMakeLists.txt всередині roll-dice, щоб визначити теці бібліотеки Oat++, шляхи включення та звʼязати їх під час процесу компіляції.
cmake_minimum_required(VERSION 3.25)
project(RollDiceServer)
# Set C++ standard (e.g., C++17)
set(CMAKE_CXX_STANDARD 17)
set(project_name roll-dice-server)
# Визначте вихідні файли вашого проєкту
set(SOURCES
main.cpp # Додайте ваші вихідні файли тут
)
# Створіть цільовий виконуваний файл
add_executable(dice-server ${SOURCES})
set(OATPP_ROOT ../oatpp)
find_library(OATPP_LIB NAMES liboatpp.a HINTS "${OATPP_ROOT}/build/src/" NO_DEFAULT_PATH)
if (NOT OATPP_LIB)
message(SEND_ERROR "Не знайдено бібліотеку oatpp ${OATPP_ROOT}/build/src")
endif()
# встановіть шлях до теки, що містить файли конфігурації пакунка "oatpp"
include_directories(${OATPP_ROOT}/src)
target_link_libraries(dice-server PRIVATE ${OATPP_LIB})
Далі, потрібен зразок коду HTTP сервера. Він буде виконувати наступне:
- Ініціалізувати HTTP маршрутизатор та налаштувати обробник запитів для генерації випадкового числа як відповідь на GET запит до кінцевої точки
/rolldice. - Далі, створити обробник зʼєднань, постачальника зʼєднань та запустити сервер на localhost:8080.
- Нарешті, ініціалізувати та запустити застосунок у головній функції.
У цій теці roll-dice створіть файл під назвою main.cpp та додайте наступний код до файлу.
#include "oatpp/web/server/HttpConnectionHandler.hpp"
#include "oatpp/network/Server.hpp"
#include "oatpp/network/tcp/server/ConnectionProvider.hpp"
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
class Handler : public oatpp::web::server::HttpRequestHandler {
public:
shared_ptr<OutgoingResponse> handle(const shared_ptr<IncomingRequest>& request) override {
int low = 1;
int high = 7;
int random = rand() % (high - low) + low;
// Перетворити std::string на oatpp::String
const string response = to_string(random);
return ResponseFactory::createResponse(Status::CODE_200, response.c_str());
}
};
void run() {
auto router = oatpp::web::server::HttpRouter::createShared();
router->route("GET", "/rolldice", std::make_shared<Handler>());
auto connectionHandler = oatpp::web::server::HttpConnectionHandler::createShared(router);
auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared({"localhost", 8080, oatpp::network::Address::IP_4});
oatpp::network::Server server(connectionProvider, connectionHandler);
OATPP_LOGI("Dice Server", "Сервер працює на порту %s", static_cast<const char*>(connectionProvider->getProperty("port").getData()));
server.run();
}
int main() {
oatpp::base::Environment::init();
srand((int)time(0));
run();
oatpp::base::Environment::destroy();
return 0;
}
Зберіть та запустіть застосунок за допомогою наступних команд CMake.
mkdir build
cd build
cmake ..
cmake --build .
Після успішної збірки вашого проєкту ви можете запустити згенерований виконуваний файл.
./dice-server
Потім відкрийте http://localhost:8080/rolldice у вашому оглядачі, щоб переконатися, що він працює.
Інструментування
Щоб додати OpenTelemetry до вашого застосунку, оновіть файл CMakeLists.txt з наступними додатковими залежностями.
cmake_minimum_required(VERSION 3.25)
project(RollDiceServer)
# Set C++ standard (e.g., C++17)
set(CMAKE_CXX_STANDARD 17)
set(project_name roll-dice-server)
# Визначте вихідні файли вашого проєкту
set(SOURCES
main.cpp # Додайте ваші вихідні файли тут
)
# Створіть цільовий виконуваний файл
add_executable(dice-server ${SOURCES})
set(OATPP_ROOT ../oatpp)
set(opentelemetry-cpp_DIR ../otel-cpp/lib/cmake/opentelemetry-cpp)
find_library(OATPP_LIB NAMES liboatpp.a HINTS "${OATPP_ROOT}/build/src/" NO_DEFAULT_PATH)
if (NOT OATPP_LIB)
message(SEND_ERROR "Не знайдено бібліотеку oatpp ${OATPP_ROOT}/build/src")
endif()
# встановіть шлях до теки, що містить файли конфігурації пакунка "oatpp"
include_directories(${OATPP_ROOT}/src)
# Використовуйте find_package для включення OpenTelemetry C++
find_package(opentelemetry-cpp CONFIG REQUIRED NO_DEFAULT_PATH)
# Звʼяжіть з кожною бібліотекою OpenTelemetry C++
target_link_libraries(dice-server PRIVATE
${OATPP_LIB}
${OPENTELEMETRY_CPP_LIBRARIES})
Оновіть файл main.cpp з наступним кодом, щоб ініціалізувати трасувальник та генерувати відрізки, коли викликається обробник запитів /rolldice.
#include "oatpp/web/server/HttpConnectionHandler.hpp"
#include "oatpp/network/Server.hpp"
#include "oatpp/network/tcp/server/ConnectionProvider.hpp"
#include "opentelemetry/exporters/ostream/span_exporter_factory.h"
#include "opentelemetry/sdk/trace/exporter.h"
#include "opentelemetry/sdk/trace/processor.h"
#include "opentelemetry/sdk/trace/simple_processor_factory.h"
#include "opentelemetry/sdk/trace/tracer_provider_factory.h"
#include "opentelemetry/trace/provider.h"
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
namespace trace_api = opentelemetry::trace;
namespace trace_sdk = opentelemetry::sdk::trace;
namespace trace_exporter = opentelemetry::exporter::trace;
namespace {
void InitTracer() {
auto exporter = trace_exporter::OStreamSpanExporterFactory::Create();
auto processor = trace_sdk::SimpleSpanProcessorFactory::Create(std::move(exporter));
std::shared_ptr<opentelemetry::trace::TracerProvider> provider =
trace_sdk::TracerProviderFactory::Create(std::move(processor));
//встановити глобального постачальника трасування
trace_api::Provider::SetTracerProvider(provider);
}
void CleanupTracer() {
std::shared_ptr<opentelemetry::trace::TracerProvider> none;
trace_api::Provider::SetTracerProvider(none);
}
}
class Handler : public oatpp::web::server::HttpRequestHandler {
public:
shared_ptr<OutgoingResponse> handle(const shared_ptr<IncomingRequest>& request) override {
auto tracer = opentelemetry::trace::Provider::GetTracerProvider()->GetTracer("my-app-tracer");
auto span = tracer->StartSpan("RollDiceServer");
int low = 1;
int high = 7;
int random = rand() % (high - low) + low;
// Перетворити std::string на oatpp::String
const string response = to_string(random);
span->End();
return ResponseFactory::createResponse(Status::CODE_200, response.c_str());
}
};
void run() {
auto router = oatpp::web::server::HttpRouter::createShared();
router->route("GET", "/rolldice", std::make_shared<Handler>());
auto connectionHandler = oatpp::web::server::HttpConnectionHandler::createShared(router);
auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared({"localhost", 8080, oatpp::network::Address::IP_4});
oatpp::network::Server server(connectionProvider, connectionHandler);
OATPP_LOGI("Dice Server", "Сервер працює на порту %s", static_cast<const char*>(connectionProvider->getProperty("port").getData()));
server.run();
}
int main() {
oatpp::base::Environment::init();
InitTracer();
srand((int)time(0));
run();
oatpp::base::Environment::destroy();
CleanupTracer();
return 0;
}
Зберіть ваш проєкт знову.
cd build
cmake ..
cmake --build .
Після успішної збірки вашого проєкту ви можете запустити згенерований виконуваний файл.
./dice-server
Коли ви надішлете запит на сервер за адресою http://localhost:8080/rolldice, ви побачите, як відрізок передається в термінал.
{
"name" : "RollDiceServer",
"trace_id": "f47bea385dc55e4d17470d51f9d3130b",
"span_id": "deed994b51f970fa",
"tracestate" : ,
"parent_span_id": "0000000000000000",
"start": 1698991818716461000,
"duration": 64697,
"span kind": "Internal",
"status": "Unset",
"service.name": "unknown_service",
"telemetry.sdk.language": "cpp",
"telemetry.sdk.name": "opentelemetry",
"telemetry.sdk.version": "1.11.0",
"instr-lib": "my-app-tracer"
}
Наступні кроки
Для отримання додаткової інформації про інструментування вашого коду, зверніться до документації з інструментування.
Вам також потрібно буде налаштувати відповідний експортер для експорту ваших даних телеметрії до одного або кількох бекендів телеметрії.
Відгук
Чи це було корисним?
Дякуємо. Ми цінуємо ваші відгуки!
Будь ласка, дайте нам знати як ми можемо покращити цю сторінку. Ми цінуємо ваші відгуки!