Skip to content

sjinks/opentelemetry-resource-detectors-cpp

Repository files navigation

opentelemetry-resource-detectors-cpp

Build and Test CodeQL Quality Gate Status

Resource detectors for OpenTelemetry (C++).

The library provides the following resource detectors:

  • container (container.id);
  • process (process.command_line/process.command and process.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

Installation

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)

CMake Options

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

Usage

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.