Beacon C++ SDK¶
Beacon C++ 提供 OpenTelemetry C++ API、SDK 和导出器的源码发行包。应用必须显式初始化 SDK 并修改源码埋点;不提供零代码探针或预编译二进制。
环境要求与范围¶
已验收 Linux x86_64、Debian 13、GCC 14.2、CMake 3.31、C++17、静态库及 ABI v1,通过 OTLP/HTTP Protobuf 向 Collector 上报 Trace。需要 g++、cmake、make、libprotobuf-dev、protobuf-compiler、libcurl4-openssl-dev 和 nlohmann-json3-dev。
安装 SDK¶
从 latest 发布页下载同一发布的源码资产、清单和校验文件。使用手动附加的源码资产,GitHub 自动生成的源码压缩包不包含配套协议子模块。在新目录执行下列命令;校验失败时停止。此步骤只构建并安装 SDK,尚未运行应用或发送数据。
release_url=$(curl -fsSL -o /dev/null -w '%{url_effective}' \
https://github.com/beacon-observability/beacon-cpp/releases/latest)
release_tag=${release_url##*/}
release_version=${release_tag#v}
release_base="https://github.com/beacon-observability/beacon-cpp/releases/download/$release_tag"
archive="beacon-cpp-$release_version-source.tar.gz"
curl -fLO "$release_base/$archive"
curl -fLO "$release_base/release-manifest.json"
curl -fLO "$release_base/SHA256SUMS"
sha256sum --check SHA256SUMS
tar -xzf "$archive"
cd "beacon-cpp-$release_version"
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=17 \
-DOTELCPP_WITH_STL=CXX17 -DOTELCPP_BUILD_TESTING=OFF \
-DOTELCPP_WITH_BENCHMARK=OFF -DOTELCPP_WITH_EXAMPLES=OFF \
-DOTELCPP_WITH_FUNC_TESTS=OFF -DOTELCPP_WITH_OTLP_HTTP=ON \
-DOTELCPP_WITH_HTTP_CLIENT_CURL=ON \
-DOTELCPP_PROTO_PATH="$PWD/third_party/opentelemetry-proto"
cmake --build build --parallel 3
cmake --install build --prefix "$PWD/install"
export BEACON_CPP_INSTALL="$PWD/install"
最小应用 Demo¶
下面新建一个独立的 C++ 应用,模拟处理一次请求。应用通过 SDK 创建链路,经 OTLP/HTTP Protobuf 发送给 DataKit:
先按公共配置开启 DataKit OpenTelemetry HTTP 接收端。示例假设应用与 DataKit 部署在同一主机,Trace 专用地址为 http://127.0.0.1:9529/otel/v1/traces,必须包含 /v1/traces。跨主机或容器部署时,替换为应用可访问的 DataKit 地址。
1. 创建项目¶
在完成 SDK 安装的同一个终端执行,保留上一步设置的 BEACON_CPP_INSTALL:
在此目录新建以下两个文件:
将下列内容保存为 CMakeLists.txt。find_package 查找上一步安装的 SDK;两个链接目标分别提供 Trace SDK 和 OTLP/HTTP 导出器。
cmake_minimum_required(VERSION 3.16)
project(beacon_cpp_demo LANGUAGES CXX)
find_package(opentelemetry-cpp CONFIG REQUIRED)
add_executable(beacon_cpp_demo main.cc)
target_compile_features(beacon_cpp_demo PRIVATE cxx_std_17)
target_link_libraries(beacon_cpp_demo PRIVATE
opentelemetry-cpp::trace
opentelemetry-cpp::otlp_http_exporter)
2. 编写埋点代码¶
将下列内容保存为 main.cc。示例创建服务 beacon-cpp-demo,其中 request 是根 Span,work 是它的子 Span。
#include <array>
#include <chrono>
#include <iostream>
#include <string>
#include <thread>
#include <utility>
#include "opentelemetry/exporters/otlp/otlp_http_exporter_factory.h"
#include "opentelemetry/exporters/otlp/otlp_http_exporter_options.h"
#include "opentelemetry/sdk/resource/resource.h"
#include "opentelemetry/sdk/trace/batch_span_processor_factory.h"
#include "opentelemetry/sdk/trace/tracer_provider.h"
#include "opentelemetry/sdk/trace/tracer_provider_factory.h"
namespace otlp = opentelemetry::exporter::otlp;
namespace sdk = opentelemetry::sdk::trace;
int main(int argc, char **argv) {
// 1. 指定接收端;使用命令行参数可覆盖默认的 DataKit 地址。
otlp::OtlpHttpExporterOptions options;
options.url = argc > 1 ? argv[1] : "http://127.0.0.1:9529/otel/v1/traces";
options.content_type = otlp::HttpRequestContentType::kBinary;
options.timeout = std::chrono::seconds(5);
auto exporter = otlp::OtlpHttpExporterFactory::Create(options);
// 2. 配置批量导出和服务名。整个应用复用同一个 provider。
sdk::BatchSpanProcessorOptions batch_options;
auto processor = sdk::BatchSpanProcessorFactory::Create(
std::move(exporter), batch_options);
auto resource = opentelemetry::sdk::resource::Resource::Create(
{{"service.name", "beacon-cpp-demo"}});
auto provider = sdk::TracerProviderFactory::Create(std::move(processor), resource);
auto tracer = provider->GetTracer("beacon-cpp-demo");
// 3. 用根 Span 包住一次请求,再明确指定子 Span 的父级。
auto request = tracer->StartSpan("request");
opentelemetry::trace::StartSpanOptions child_options;
child_options.parent = request->GetContext();
auto work = tracer->StartSpan("work", child_options);
work->SetAttribute("demo.operation", "calculate");
std::this_thread::sleep_for(std::chrono::milliseconds(20)); // 模拟业务处理
work->End();
std::array<char, 32> trace_id{};
request->GetContext().trace_id().ToLowerBase16(trace_id);
request->End();
// 4. 先结束所有 Span,再关闭 provider,提交仍在批处理队列中的数据。
const bool shutdown_ok = provider->Shutdown(std::chrono::seconds(5));
std::cout << "trace_id=" << std::string(trace_id.data(), trace_id.size()) << "\n"
<< "shutdown_ok=" << (shutdown_ok ? "true" : "false") << "\n";
return shutdown_ok ? 0 : 1;
}
这段代码中的几个关键点:
| 代码 | 作用 |
|---|---|
options.url |
实际发送 Trace 的完整地址,本例通过代码设置,不依赖服务端探针的环境变量。 |
service.name |
在链路查看器中用来查找应用的服务名。 |
StartSpan("request") |
开始记录一次请求,Span 的持续时间从创建计算到 End()。 |
child_options.parent |
将 work 关联到 request,使两者共享 Trace ID 并形成父子关系。 |
Shutdown() |
在程序退出前关闭批处理导出器;进程成功退出不等于后端已经入库。 |
接入真实应用时,在启动阶段初始化一次 SDK,在需要观测的业务操作前后创建和结束 Span,并在应用关闭时调用 Shutdown(),不要为每个请求重新创建 provider。本例通过显式指定父级演示同进程关联,跨服务的 HTTP/RPC 请求仍需另外注入和提取上下文。
3. 编译并运行¶
在 beacon-cpp-demo 目录执行:
cmake -S . -B build -DCMAKE_PREFIX_PATH="$BEACON_CPP_INSTALL"
cmake --build build --parallel 3
./build/beacon_cpp_demo http://127.0.0.1:9529/otel/v1/traces
若在新终端操作,请先将 BEACON_CPP_INSTALL 设为 SDK 的实际安装绝对路径。cmake 提示找不到 opentelemetry-cpp 时,检查该变量是否指向前面执行 cmake --install 的目录,而非 SDK 源码目录。
运行后会输出类似结果,Trace ID 以本次实际输出为准:
验证接收¶
进入观测云「应用性能监测 > 链路」,选择覆盖运行时间的时间范围,按服务名 beacon-cpp-demo 筛选,并使用终端输出的 Trace ID 查找本次链路。预期看到:
核对两个 Span 共享 Trace ID、work 的父 Span 为 request,并确认 work 具有 demo.operation=calculate 属性。每次运行会生成新的 Trace ID;本例只有两段手动埋点,不会自动产生 HTTP 客户端、数据库等其他 Span。
若无数据,先检查 DataKit 采集器是否开启、接收地址能否从应用访问、URL 是否包含 /otel/v1/traces,再检查应用标准错误与 DataKit 导出日志。容器内的 127.0.0.1 指应用容器自身,不能直接作为宿主机 DataKit 的地址。shutdown_ok=true 仅表示 SDK 关闭流程返回成功,不能替代接收端与实际入库验证。
正式发行验收采用本地 Collector。若要复现发行包自带的三 Span 验收程序,按源码包中的 beacon/acceptance/README.md 执行;它与本页的两 Span Demo 是不同应用。现有 Collector 验收不代表 DataKit 兼容性或后端入库已经获得发行验收,本页的 DataKit 路径仍需在实际部署中单独验证。
升级与回滚¶
保留所选标签、归档、清单和校验文件。各版本使用独立安装前缀,重新链接应用并验证数据,回滚时同时恢复 SDK、应用产物和配置。不得混用不同构建的头文件、库及 ABI。
Metrics、Logs、OTLP/gRPC、TLS/认证、Profile、Security、自动埋点及其他平台均不在已验证范围内。跨服务上下文需要应用显式注入和提取;服务端探针的环境变量不能替代 SDK 初始化。安装与接口说明以下载包内同版文档为准。