open-telemetry / open-telemetry/opentelemetry-cpp
Segmentation fault during exit in "opentelemetry::v1::context::RuntimeContext::GetCurrent ()" in multithread log export
Open
@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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.