Skip to content

Commit 083cf02

Browse files
authored
Fix for resource deletion after tracer provider shutdown (#911)
1 parent afcb08e commit 083cf02

File tree

6 files changed

+16
-9
lines changed

6 files changed

+16
-9
lines changed

examples/batch/main.cc

+5-1
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,15 @@ void initTracer()
3131
// We export `kNumSpans` after every `schedule_delay_millis` milliseconds.
3232
options.max_export_batch_size = kNumSpans;
3333

34+
opentelemetry::sdk::resource::ResourceAttributes attributes = {{"service", "test_service"},
35+
{"version", (uint32_t)1}};
36+
auto resource = opentelemetry::sdk::resource::Resource::Create(attributes);
37+
3438
auto processor = std::unique_ptr<sdktrace::SpanProcessor>(
3539
new sdktrace::BatchSpanProcessor(std::move(exporter), options));
3640

3741
auto provider = nostd::shared_ptr<opentelemetry::trace::TracerProvider>(
38-
new sdktrace::TracerProvider(std::move(processor)));
42+
new sdktrace::TracerProvider(std::move(processor), resource));
3943
// Set the global trace provider.
4044
opentelemetry::trace::Provider::SetTracerProvider(provider);
4145
}

sdk/include/opentelemetry/sdk/trace/tracer.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,10 @@ class Tracer final : public trace_api::Tracer, public std::enable_shared_from_th
6060
Sampler &GetSampler() { return context_->GetSampler(); }
6161

6262
private:
63-
std::shared_ptr<sdk::trace::TracerContext> context_;
63+
// order of declaration is important here - instrumentation library should destroy after
64+
// tracer-context.
6465
std::shared_ptr<InstrumentationLibrary> instrumentation_library_;
66+
std::shared_ptr<sdk::trace::TracerContext> context_;
6567
};
6668
} // namespace trace
6769
} // namespace sdk

sdk/include/opentelemetry/sdk/trace/tracer_context.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,11 @@ class TracerContext
8888
bool Shutdown() noexcept;
8989

9090
private:
91-
// This is an atomic pointer so we can adapt the processor pipeline dynamically.
92-
std::unique_ptr<SpanProcessor> processor_;
91+
// order of declaration is important here - resource object should be destroyed after processor.
9392
opentelemetry::sdk::resource::Resource resource_;
9493
std::unique_ptr<Sampler> sampler_;
9594
std::unique_ptr<IdGenerator> id_generator_;
95+
std::unique_ptr<SpanProcessor> processor_;
9696
};
9797

9898
} // namespace trace

sdk/include/opentelemetry/sdk/trace/tracer_provider.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,9 @@ class TracerProvider final : public opentelemetry::trace::TracerProvider
9696
bool ForceFlush(std::chrono::microseconds timeout = (std::chrono::microseconds::max)()) noexcept;
9797

9898
private:
99-
std::shared_ptr<sdk::trace::TracerContext> context_;
99+
// order of declaration is important here - tracers should destroy only after context.
100100
std::vector<std::shared_ptr<opentelemetry::sdk::trace::Tracer>> tracers_;
101+
std::shared_ptr<sdk::trace::TracerContext> context_;
101102
std::mutex lock_;
102103
};
103104
} // namespace trace

sdk/src/trace/tracer.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace trace
1818

1919
Tracer::Tracer(std::shared_ptr<sdk::trace::TracerContext> context,
2020
std::unique_ptr<InstrumentationLibrary> instrumentation_library) noexcept
21-
: context_{context}, instrumentation_library_{std::move(instrumentation_library)}
21+
: instrumentation_library_{std::move(instrumentation_library)}, context_{context}
2222
{}
2323

2424
nostd::shared_ptr<trace_api::Span> Tracer::StartSpan(

sdk/src/trace/tracer_context.cc

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ TracerContext::TracerContext(std::vector<std::unique_ptr<SpanProcessor>> &&proce
1414
opentelemetry::sdk::resource::Resource resource,
1515
std::unique_ptr<Sampler> sampler,
1616
std::unique_ptr<IdGenerator> id_generator) noexcept
17-
: processor_(std::unique_ptr<SpanProcessor>(new MultiSpanProcessor(std::move(processors)))),
18-
resource_(resource),
17+
: resource_(resource),
1918
sampler_(std::move(sampler)),
20-
id_generator_(std::move(id_generator))
19+
id_generator_(std::move(id_generator)),
20+
processor_(std::unique_ptr<SpanProcessor>(new MultiSpanProcessor(std::move(processors))))
2121
{}
2222

2323
Sampler &TracerContext::GetSampler() const noexcept

0 commit comments

Comments
 (0)