1414
1515#include " opencensus/trace/internal/span_exporter_impl.h"
1616
17+ #include < algorithm>
1718#include < utility>
1819
1920#include " absl/synchronization/mutex.h"
@@ -24,17 +25,20 @@ namespace opencensus {
2425namespace trace {
2526namespace exporter {
2627
27- SpanExporterImpl* SpanExporterImpl::span_exporter_ = nullptr ;
28-
2928SpanExporterImpl* SpanExporterImpl::Get () {
30- static SpanExporterImpl* global_span_exporter_impl = new SpanExporterImpl (
31- kDefaultBufferSize , absl::Milliseconds (kIntervalWaitTimeInMillis ));
29+ static SpanExporterImpl* global_span_exporter_impl = new SpanExporterImpl;
3230 return global_span_exporter_impl;
3331}
3432
35- SpanExporterImpl::SpanExporterImpl (uint32_t buffer_size,
36- absl::Duration interval)
37- : buffer_size_(buffer_size), interval_(interval) {}
33+ void SpanExporterImpl::SetBatchSize (int size) {
34+ absl::MutexLock l (&handler_mu_);
35+ batch_size_ = std::max (1 , size);
36+ }
37+
38+ void SpanExporterImpl::SetInterval (absl::Duration interval) {
39+ absl::MutexLock l (&handler_mu_);
40+ interval_ = std::max (absl::Seconds (1 ), interval);
41+ }
3842
3943void SpanExporterImpl::RegisterHandler (
4044 std::unique_ptr<SpanExporter::Handler> handler) {
@@ -59,36 +63,43 @@ void SpanExporterImpl::StartExportThread() {
5963 collect_spans_ = true ;
6064}
6165
62- bool SpanExporterImpl::IsBufferFull () const {
66+ bool SpanExporterImpl::IsBatchFull () const {
6367 span_mu_.AssertHeld ();
64- return spans_.size () >= buffer_size_ ;
68+ return spans_.size () >= cached_batch_size_ ;
6569}
6670
6771void SpanExporterImpl::RunWorkerLoop () {
68- std::vector<opencensus::trace::exporter::SpanData> span_data_ ;
69- std::vector<std::shared_ptr<opencensus::trace::SpanImpl>> batch_ ;
72+ std::vector<opencensus::trace::exporter::SpanData> span_data ;
73+ std::vector<std::shared_ptr<opencensus::trace::SpanImpl>> batch ;
7074 // Thread loops forever.
7175 // TODO: Add in shutdown mechanism.
72- absl::Time next_forced_export_time = absl::Now () + interval_;
7376 while (true ) {
77+ int size;
78+ absl::Time next_forced_export_time;
79+ {
80+ // Start of loop, update batch size and interval.
81+ absl::MutexLock l (&handler_mu_);
82+ size = batch_size_;
83+ next_forced_export_time = absl::Now () + interval_;
84+ }
7485 {
7586 absl::MutexLock l (&span_mu_);
87+ cached_batch_size_ = size;
7688 // Wait until batch is full or interval time has been exceeded.
7789 span_mu_.AwaitWithDeadline (
78- absl::Condition (this , &SpanExporterImpl::IsBufferFull ),
90+ absl::Condition (this , &SpanExporterImpl::IsBatchFull ),
7991 next_forced_export_time);
80- next_forced_export_time = absl::Now () + interval_;
8192 if (spans_.empty ()) {
8293 continue ;
8394 }
84- std::swap (batch_ , spans_);
95+ std::swap (batch , spans_);
8596 }
86- for (const auto & span : batch_ ) {
87- span_data_ .emplace_back (span->ToSpanData ());
97+ for (const auto & span : batch ) {
98+ span_data .emplace_back (span->ToSpanData ());
8899 }
89- batch_ .clear ();
90- Export (span_data_ );
91- span_data_ .clear ();
100+ batch .clear ();
101+ Export (span_data );
102+ span_data .clear ();
92103 }
93104}
94105
0 commit comments