Skip to content

Memory leaks / Global registry not being cleaned up properly #3781

@Zakriya

Description

@Zakriya

I have install opentelemetry-cpp and using it in my project. Everything seems to work fine as long as I don't include the headers below:
#include "opentelemetry/exporters/otlp/otlp_http_exporter_factory.h"
#include "opentelemetry/exporters/otlp/otlp_http_exporter_options.h"
#include "opentelemetry/exporters/otlp/otlp_http_log_record_exporter_factory.h"
#include "opentelemetry/exporters/otlp/otlp_http_log_record_exporter_options.h"

The moment I do that, anytime I close my application by stopping VS2022, it is all good. However, when I close my application via the close button, I get memory leaks

My init method:
//For export to OTLP exporter
opentelemetry::exporter::otlp::OtlpHttpExporterOptions opts;
opts.url = endpoint;

auto otlpExporter = opentelemetry::exporter::otlp::OtlpHttpExporterFactory::Create( opts );
auto otlpProcessor = trace_sdk::SimpleSpanProcessorFactory::Create( std::move( otlpExporter ) );
m_tracerProvider = trace_sdk::TracerProviderFactory::Create( std::move( otlpProcessor ) );

// Set the global trace provider
std::shared_ptropentelemetry::trace::TracerProvider api_provider = m_tracerProvider;
trace_api::Provider::SetTracerProvider( api_provider );

My instance and get tracer method:
OpenTelemetryClient& OpenTelemetryClient::getInstance()
{
static OpenTelemetryClient instance;
return instance;
}

opentelemetry::nostd::shared_ptropentelemetry::trace::Tracer OpenTelemetryClient::get_tracer()
{
return trace_api::Provider::GetTracerProvider()->GetTracer( "client-tracer: " + GetPcUserName() );
}

My cleanup method:
void OpenTelemetryClient::CleanupTracer()
{
if( m_tracerProvider )
{
// ADDED: Flush any pending spans before shutdown
m_tracerProvider->ForceFlush();

	// ADDED: Properly shutdown the provider
	m_tracerProvider->Shutdown();
}

// Clear the global API provider
std::shared_ptr<opentelemetry::trace::TracerProvider> none;
trace_api::Provider::SetTracerProvider( none );

// ADDED: Release our SDK provider reference
m_tracerProvider.reset();

}

What is the expected behavior?
No memory leaks

What is the actual behavior?
Detected memory leaks!
Dumping objects ->
{7532} normal block at 0x0000017E6E0C99E0, 16 bytes long.
Data: <à n~ ÍÍÍÍ> E0 99 0C 6E 7E 01 00 00 00 00 00 01 CD CD CD CD
{7530} normal block at 0x0000017E6E0CA1B0, 16 bytes long.
Data: <°¡ n~ ÍÍÍÍ> B0 A1 0C 6E 7E 01 00 00 00 00 00 01 CD CD CD CD
{7528} normal block at 0x0000017E6E0CA0C0, 16 bytes long.
Data: <À  n~ ÍÍÍÍ> C0 A0 0C 6E 7E 01 00 00 00 00 00 01 CD CD CD CD
Object dump complete.

I tried searching everywhere for a solution but can't seem to find any until now.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds-triageIndicates an issue or PR lacks a `triage/foo` label and requires one.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions