Resource detectors for OpenTelemetry (C++).
The library provides the following resource detectors:
- container (
container.id
); - process (
process.command_line
/process.command
andprocess.command_args
,process.group_leader.pid
,process.interactive
,process.owner
,process.parent_pid
,process.pid
,process.real_user.id
,process.real_user.name
,process.saved_user.id
,process.saved_user.name
,process.session_leader.pid
,process.user.id
,process.user.name
); - OS (
os.type
,os.version
) and host (host.arch
,host.name
).
Resource | Supported OSes |
---|---|
container.id |
Linux |
process.command |
Linux, MacOS |
process.command_args |
Linux, MacOS |
process.command_line |
Windows |
process.group_leader.pid |
Linux, MacOS |
process.interactive |
Linux, MacOS, Windows |
process.owner |
Linux, MacOS, Windows |
process.parent_pid |
Linux, MacOS, Windows |
process.pid |
Linux, MacOS, Windows |
process.real_user.id |
Linux, MacOS |
process.real_user.name |
Linux, MacOS, Windows |
process.saved_user.id |
Linux |
process.saved_user.name |
Linux |
process.session_leader.pid |
Linux, MacOS |
process.user.id |
Linux, MacOS |
process.user.name |
Linux, MacOS |
os.type |
Linux, MacOS, Windows |
os.version |
Linux, MacOS, Windows |
host.arch |
Linux, MacOS, Windows |
host.name |
Linux, MacOS, Windows |
cmake -B build
cmake --build build
cmake --install build
Dependencies: opentelemetry-cpp
Development Dependencies: Google Test (required to build and run tests), JSON for Modern C++ (required to build examples)
Option Name | Description | Default Value |
---|---|---|
WITH_TESTING |
Whether to enable tests | ON |
WITH_EXAMPLES |
Whether to build examples | ON |
INSTALL_RESOURCE_DETECTORS |
Whether to install the library | ON |
find_package(opentelemetry_resource_detectors CONFIG REQUIRED)
target_link_libraries(
my_target
PRIVATE
opentelemetry_resource_detectors::opentelemetry_resource_detectors
)
#include <memory>
#include <vector>
#include <opentelemetry/exporters/ostream/span_exporter_factory.h>
#include <opentelemetry/sdk/common/attribute_utils.h>
#include <opentelemetry/sdk/resource/resource.h>
#include <opentelemetry/sdk/resource/resource_detector.h>
#include <opentelemetry/sdk/trace/simple_processor.h>
#include <opentelemetry/sdk/trace/simple_processor_factory.h>
#include <opentelemetry/sdk/trace/tracer_provider.h>
#include <opentelemetry/sdk/trace/tracer_provider_factory.h>
#include <opentelemetry/trace/provider.h>
#include <opentelemetry/resource/wwa/container_resource_detector.h>
#include <opentelemetry/resource/wwa/os_resource_detector.h>
#include <opentelemetry/resource/wwa/process_resource_detector.h>
int main()
{
std::vector<std::unique_ptr<opentelemetry::sdk::resource::ResourceDetector>> detectors;
detectors.emplace_back(std::make_unique<wwa::opentelemetry::resource::container_resource_detector>());
detectors.emplace_back(std::make_unique<wwa::opentelemetry::resource::os_resource_detector>());
detectors.emplace_back(std::make_unique<wwa::opentelemetry::resource::process_resource_detector>());
auto resource = opentelemetry::sdk::resource::Resource::Create({});
for (const auto& detector : detectors) {
auto detected = detector->Detect();
resource = resource.Merge(detected);
}
// Now that the resource is ready, pass it to providers
auto exporter = opentelemetry::exporter::trace::OStreamSpanExporterFactory::Create();
auto processor = opentelemetry::sdk::trace::SimpleSpanProcessorFactory::Create(
std::move(exporter)
);
auto provider =
opentelemetry::sdk::trace::TracerProviderFactory::Create(
std::move(processor),
resource // <===
);
const opentelemetry::nostd::shared_ptr<opentelemetry::trace::TracerProvider> api_provider(
provider.release()
);
opentelemetry::trace::Provider::SetTracerProvider(api_provider);
// Your code goes here
}
Note: unlike the OpenTelemetry JS SDK, the C++ SDK merges resources differently. In the JS SDK, Resource.Merge()
overwrites old attributes. In the C++ SDK, it preserves old attributes.