SigNoz
Docs
PricingCustomers
Get Started - Free
Docs
IntroductionContributingMigrate from DatadogSigNoz API
OpenTelemetry
What is OpenTelemetryOpenTelemetry Collector GuideOpenTelemetry Demo
Community
Support
Slack
X
Launch Week
Changelog
Dashboard Templates
DevOps Wordle
Newsletter
KubeCon, Atlanta 2025
More
SigNoz vs DatadogSigNoz vs New RelicSigNoz vs GrafanaSigNoz vs Dynatrace
Careers
AboutTermsPrivacySecurity & Compliance
SigNoz - Open Source Datadog Alternative
SigNoz
All systems operational
HIPAASOC-2
  1. ...
  2. Docs
  3. APM & Distributed Tracing
  4. Send Traces and APM Data
  5. C++ OpenTelemetry Instrumentation Guide

C++ OpenTelemetry Instrumentation Guide

SigNoz Cloud - This page applies to SigNoz Cloud editions.
Self-Host - This page applies to self-hosted SigNoz editions.

This document contains instructions on how to set up OpenTelemetry instrumentation in your C++ applications and view your application traces in SigNoz.

Requirements

  • Bazel

Send Traces to SigNoz

Based on your application environment, you can choose the setup below to send traces to SigNoz.

Send traces to SigNoz Cloud via OTel Collector binary

Step 1 : Install OTel Collector

OTel Collector binary helps to collect logs, hostmetrics, resource and infra attributes. You can find instructions to install OTel Collector binary here in your VM.

Step 2 : Build opentelemetry-cpp locally

To configure your C++ application to send traces to OpenTelemetry you need to install opentelemetry-cpp and add it as dependency in your project.

Build opentelemetry-cpp locally using Bezel, following these steps:

  • Clone the opentelemetry-cpp source code.
git clone https://github.com/open-telemetry/opentelemetry-cpp.git
  • Navigate to the repository cloned above, download the dependencies and build the source code:
cd opentelemetry-cpp
bazel build //...
  • Once Bazel tests are built, run them with bazel test //... command
bazel test //...

Step 3 : Instrument your application with OpenTelemetry

Add the following to BUILD file:

cc_binary(
    name = "<name>",
    srcs = [
        "<file_name>.cc",
    ],
    tags = [
        "examples",
        "otlp",
        "otlp_http",
    ],
    deps = [
        "//api",
        "//exporters/otlp:otlp_http_exporter",
        "//sdk/src/trace",
    ],
)

Add the following content to main.cpp:

#include <memory>
#include <string>
#include <utility>

#include "opentelemetry/exporters/otlp/otlp_environment.h"
#include "opentelemetry/exporters/otlp/otlp_http.h"
#include "opentelemetry/exporters/otlp/otlp_http_exporter_factory.h"
#include "opentelemetry/exporters/otlp/otlp_http_exporter_options.h"
#include "opentelemetry/sdk/common/global_log_handler.h"
#include "opentelemetry/sdk/resource/resource.h"
#include "opentelemetry/sdk/trace/processor.h"
#include "opentelemetry/sdk/trace/recordable.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/trace/span_id.h"
#include "opentelemetry/trace/tracer_provider.h"

namespace trace        = opentelemetry::trace;
namespace trace_sdk    = opentelemetry::sdk::trace;
namespace otlp         = opentelemetry::exporter::otlp;
namespace resource_sdk = opentelemetry::sdk::resource;

namespace internal_log = opentelemetry::sdk::common::internal_log;

namespace
{
opentelemetry::exporter::otlp::OtlpHttpExporterOptions opts;

std::shared_ptr<opentelemetry::sdk::trace::TracerProvider> provider;

void InitTracer()
{
  auto exporter  = otlp::OtlpHttpExporterFactory::Create(opts);
  auto processor = trace_sdk::SimpleSpanProcessorFactory::Create(std::move(exporter));
  // Resource::Create reads OTEL_SERVICE_NAME and OTEL_RESOURCE_ATTRIBUTES from the environment
  auto resource  = resource_sdk::Resource::Create({});
  provider       = trace_sdk::TracerProviderFactory::Create(std::move(processor), resource);
  std::shared_ptr<opentelemetry::trace::TracerProvider> api_provider = provider;
  trace::Provider::SetTracerProvider(api_provider);
}

void CleanupTracer()
{
  // We call ForceFlush to prevent to cancel running exportings, It's optional.
  if (provider)
  {
    provider->ForceFlush();
  }

  provider.reset();
  std::shared_ptr<opentelemetry::trace::TracerProvider> none;
  trace::Provider::SetTracerProvider(none);
}
}  // namespace

int main()
{
  InitTracer();

  foo_library();

  CleanupTracer();
}

This code sets up OpenTelemetry tracing in your C++ application, initializes a tracer with an OTLP HTTP exporter, processes spans, and sends trace data to a SigNoz.

Step 4: Set environment variables

Set service identity before running your application:

export OTEL_SERVICE_NAME="<service-name>"
export OTEL_RESOURCE_ATTRIBUTES="service.version=<service-version>"

Verify these values:

  • <service-name>: A descriptive name for your service (e.g., my-cpp-app).
  • <service-version> (optional): Your release version, image tag, or git SHA (e.g., 1.4.2, a01dbef8).

Set service.version to a per-build value, not a static string. SigNoz detects a deployment each time this value changes. Common sources:

  • Bash / shell: service.version=$(git rev-parse --short HEAD)
  • GitHub Actions: service.version=${{ github.sha }}
  • GitLab CI: service.version=$CI_COMMIT_SHORT_SHA
  • Kubernetes: inject from your Helm chart image tag or CI variable

Step 5: Run app

Execute your application by issuing the run command:

bazel run <name>

<name> refers to the name of the binary target for your application, which you define in the BUILD file.

Send Traces to Self-Hosted SigNoz via Otel Collector

Step 1 : Install OTel Collector

OTel Collector binary helps to collect logs, hostmetrics, resource and infra attributes. You can find instructions to install OTel Collector binary here in your VM.

Step 2 : Build opentelemetry-cpp locally

To configure your C++ application to send traces to OpenTelemetry you need to install opentelemetry-cpp and add it as dependency in your project.

Build opentelemetry-cpp locally using Bezel, following these steps:

  • Clone the opentelemetry-cpp source code.
git clone https://github.com/open-telemetry/opentelemetry-cpp.git
  • Navigate to the repository cloned above, download the dependencies and build the source code:
cd opentelemetry-cpp
bazel build //...
  • Once Bazel tests are built, run them with bazel test //... command
bazel test //...

Step 3 : Instrument your application with OpenTelemetry

Add the following to BUILD file:

cc_binary(
    name = "<name>",
    srcs = [
        "<file_name>.cc",
    ],
    tags = [
        "examples",
        "otlp",
        "otlp_http",
    ],
    deps = [
        "//api",
        "//exporters/otlp:otlp_http_exporter",
        "//sdk/src/trace",
    ],
)

Add the following content to main.cpp:

#include <memory>
#include <string>
#include <utility>

#include "opentelemetry/exporters/otlp/otlp_environment.h"
#include "opentelemetry/exporters/otlp/otlp_http.h"
#include "opentelemetry/exporters/otlp/otlp_http_exporter_factory.h"
#include "opentelemetry/exporters/otlp/otlp_http_exporter_options.h"
#include "opentelemetry/sdk/common/global_log_handler.h"
#include "opentelemetry/sdk/resource/resource.h"
#include "opentelemetry/sdk/trace/processor.h"
#include "opentelemetry/sdk/trace/recordable.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/trace/span_id.h"
#include "opentelemetry/trace/tracer_provider.h"

namespace trace        = opentelemetry::trace;
namespace trace_sdk    = opentelemetry::sdk::trace;
namespace otlp         = opentelemetry::exporter::otlp;
namespace resource_sdk = opentelemetry::sdk::resource;

namespace internal_log = opentelemetry::sdk::common::internal_log;

namespace
{
opentelemetry::exporter::otlp::OtlpHttpExporterOptions opts;

std::shared_ptr<opentelemetry::sdk::trace::TracerProvider> provider;

void InitTracer()
{
  auto exporter  = otlp::OtlpHttpExporterFactory::Create(opts);
  auto processor = trace_sdk::SimpleSpanProcessorFactory::Create(std::move(exporter));
  // Resource::Create reads OTEL_SERVICE_NAME and OTEL_RESOURCE_ATTRIBUTES from the environment
  auto resource  = resource_sdk::Resource::Create({});
  provider       = trace_sdk::TracerProviderFactory::Create(std::move(processor), resource);
  std::shared_ptr<opentelemetry::trace::TracerProvider> api_provider = provider;
  trace::Provider::SetTracerProvider(api_provider);
}

void CleanupTracer()
{
  // We call ForceFlush to prevent to cancel running exportings, It's optional.
  if (provider)
  {
    provider->ForceFlush();
  }

  provider.reset();
  std::shared_ptr<opentelemetry::trace::TracerProvider> none;
  trace::Provider::SetTracerProvider(none);
}
}  // namespace

int main()
{
  InitTracer();

  foo_library();

  CleanupTracer();
}

This code sets up OpenTelemetry tracing in your C++ application, initializes a tracer with an OTLP HTTP exporter, processes spans, and sends trace data to a SigNoz.

Step 4: Set environment variables

Set service identity before running your application:

export OTEL_SERVICE_NAME="<service-name>"
export OTEL_RESOURCE_ATTRIBUTES="service.version=<service-version>"

Verify these values:

  • <service-name>: A descriptive name for your service (e.g., my-cpp-app).
  • <service-version> (optional): Your release version, image tag, or git SHA (e.g., 1.4.2, a01dbef8).

Set service.version to a per-build value, not a static string. SigNoz detects a deployment each time this value changes. Common sources:

  • Bash / shell: service.version=$(git rev-parse --short HEAD)
  • GitHub Actions: service.version=${{ github.sha }}
  • GitLab CI: service.version=$CI_COMMIT_SHORT_SHA
  • Kubernetes: inject from your Helm chart image tag or CI variable

Step 5: Run app

Execute your application by issuing the run command:

bazel run <name>

<name> refers to the name of the binary target for your application, which you define in the BUILD file.

Last updated: May 14, 2026

Edit on GitHub

Was this page helpful?

Your response helps us improve this page.

Prev
Elixir
Next
Swift
On this page
Requirements
Send Traces to SigNoz
Send traces to SigNoz Cloud via OTel Collector binary
Send Traces to Self-Hosted SigNoz via Otel Collector

Is this page helpful?

Your response helps us improve this page.