open-telemetry / open-telemetry/opentelemetry-cpp

Segmentation fault during exit in "opentelemetry::v1::context::RuntimeContext::GetCurrent ()" in multithread log export

Open
#3,766 6 comments 0 reactions 1 assignee View on GitHub

@marcalff is already working on this.

Since Dec 1, 2025.

bug Stale triage/accepted
Dominant language
C++
Stars
1.4k
Forks
632
Avg merge
1d 13h
Merged PRs (30d)
75

Description

Describe your environment
linux, ubuntu 22.04, all builds, main branch

Steps to reproduce

Create 2 threads, both are exporting logs in a loop, when program exits, we hit crash with this stack trace:

Thread 4 "struct" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff6741640 (LWP 865935)]
0x000055555590e308 in opentelemetry::v1::context::RuntimeContext::GetCurrent () at /tmp/third-party/opentelemetry-cpp/api/include/opentelemetry/context/runtime_context.h:93
93        static Context GetCurrent() noexcept { return GetRuntimeContextStorage()->GetCurrent(); }
(gdb) bt
#0  0x000055555590e308 in opentelemetry::v1::context::RuntimeContext::GetCurrent ()
    at /tmp/third-party/opentelemetry-cpp/api/include/opentelemetry/context/runtime_context.h:93
#1  0x000055555590d744 in opentelemetry::v1::sdk::logs::Logger::CreateLogRecord (this=0x555556924830)
    at /tmp/third-party/opentelemetry-cpp/sdk/src/logs/logger.cc:70

What is the expected behavior?
Should have clear shutdown

What is the actual behavior?
Segmentation fault

Additional context
I use OTLP http exporter, but I don't think this is the problem, attached the code example here:

  otlp::OtlpHttpLogRecordExporterOptions expOptions;
  expOptions.url = geturl();
  expOptions.content_type = otlp::HttpRequestContentType::kBinary;
  expOptions.ssl_insecure_skip_verify = true;
  auto exporter = otlp::OtlpHttpLogRecordExporterFactory::Create(expOptions);
  auto processor = logs_sdk::SimpleLogRecordProcessorFactory::Create(std::move(exporter));

  std::shared_ptr<logs_sdk::LoggerProvider> loggerProvider(
      logs_sdk::LoggerProviderFactory::Create(std::move(processor)));

  const std::shared_ptr<logs::LoggerProvider> &apiProvider = loggerProvider;
  logs::Provider::SetLoggerProvider(apiProvider);

Both Thread 1 and Thread 2:

  auto loggerProvider = logs::Provider::GetLoggerProvider();
  logger_ = loggerProvider->GetLogger(
        "log",
        "log",
        "1.0.0",
        schema_url);

  for (int i =0; i < 1000; i++) {
    auto sample = logger_->CreateLogRecord();
    logger_->EmitLogRecord(std::move(sample));
    std::this_thread::sleep_for(std::chrono::milliseconds(10));
  }

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.