NVIDIA DeepStream SDK API Reference

9.2 Release
includes/opentelemetry/sdk/trace/multi_span_processor.h
Go to the documentation of this file.
1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
3 
4 #pragma once
5 
6 #include <chrono>
7 #include <memory>
8 #include <mutex>
9 #include <vector>
10 
11 #include "opentelemetry/sdk/trace/multi_recordable.h"
12 #include "opentelemetry/sdk/trace/processor.h"
13 #include "opentelemetry/version.h"
14 
16 namespace sdk
17 {
18 namespace trace
19 {
20 
23 {};
24 
32 {
33 public:
34  MultiSpanProcessor(std::vector<std::unique_ptr<SpanProcessor>> &&processors)
35  : head_(nullptr), tail_(nullptr), count_(0)
36  {
37  for (auto &processor : processors)
38  {
39  AddProcessor(std::move(processor));
40  }
41  }
42 
43  void AddProcessor(std::unique_ptr<SpanProcessor> &&processor)
44  {
45  // Add preocessor to end of the list.
46  if (processor)
47  {
48  ProcessorNode *pNode = new ProcessorNode(std::move(processor), tail_);
49  if (count_ > 0)
50  {
51  tail_->next_ = pNode;
52  tail_ = pNode;
53  }
54  else
55  {
56  head_ = tail_ = pNode;
57  }
58  count_++;
59  }
60  }
61 
62  std::unique_ptr<Recordable> MakeRecordable() noexcept override
63  {
64  auto recordable = std::unique_ptr<Recordable>(new MultiRecordable);
65  auto multi_recordable = static_cast<MultiRecordable *>(recordable.get());
66  ProcessorNode *node = head_;
67  while (node != nullptr)
68  {
69  auto processor = node->value_.get();
70  multi_recordable->AddRecordable(*processor, processor->MakeRecordable());
71  node = node->next_;
72  }
73  return recordable;
74  }
75 
76  virtual void OnStart(Recordable &span,
77  const opentelemetry::trace::SpanContext &parent_context) noexcept override
78  {
79  auto multi_recordable = static_cast<MultiRecordable *>(&span);
80  ProcessorNode *node = head_;
81  while (node != nullptr)
82  {
83  auto processor = node->value_.get();
84  auto &recordable = multi_recordable->GetRecordable(*processor);
85  if (recordable != nullptr)
86  {
87  processor->OnStart(*recordable, parent_context);
88  }
89  node = node->next_;
90  }
91  }
92 
93  virtual void OnEnd(std::unique_ptr<Recordable> &&span) noexcept override
94  {
95  auto multi_recordable = static_cast<MultiRecordable *>(span.release());
96  ProcessorNode *node = head_;
97  while (node != nullptr)
98  {
99  auto processor = node->value_.get();
100  auto recordable = multi_recordable->ReleaseRecordable(*processor);
101  if (recordable != nullptr)
102  {
103  processor->OnEnd(std::move(recordable));
104  }
105  node = node->next_;
106  }
107  delete multi_recordable;
108  }
109 
111  std::chrono::microseconds timeout = (std::chrono::microseconds::max)()) noexcept override
112  {
113  bool result = true;
114  ProcessorNode *node = head_;
115  while (node != nullptr)
116  {
117  auto processor = node->value_.get();
118  result |= processor->ForceFlush(timeout);
119  node = node->next_;
120  }
121  return result;
122  }
123 
124  bool Shutdown(
125  std::chrono::microseconds timeout = (std::chrono::microseconds::max)()) noexcept override
126  {
127  return InternalShutdown(timeout);
128  }
129 
131  {
133  Cleanup();
134  }
135 
136 protected:
138  std::chrono::microseconds timeout = (std::chrono::microseconds::max)()) noexcept
139  {
140  bool result = true;
141  ProcessorNode *node = head_;
142  while (node != nullptr)
143  {
144  auto processor = node->value_.get();
145  result |= processor->Shutdown(timeout);
146  node = node->next_;
147  }
148  return result;
149  }
150 
151 private:
152  struct ProcessorNode
153  {
154  std::unique_ptr<SpanProcessor> value_;
155  ProcessorNode *next_, *prev_;
156  ProcessorNode(std::unique_ptr<SpanProcessor> &&value,
157  ProcessorNode *prev = nullptr,
158  ProcessorNode *next = nullptr)
159  : value_(std::move(value)), next_(next), prev_(prev)
160  {}
161  };
162 
163  void Cleanup()
164  {
165  if (count_)
166  {
167  ProcessorNode *node = tail_;
168  while (node != nullptr)
169  {
170  if (node->next_ != nullptr)
171  {
172  delete node->next_;
173  node->next_ = nullptr;
174  }
175  if (node->prev_ != nullptr)
176  {
177  node = node->prev_;
178  }
179  else
180  {
181  delete node;
182  node = nullptr;
183  }
184  }
185  head_ = tail_ = nullptr;
186  count_ = 0;
187  }
188  }
189 
190  ProcessorNode *head_, *tail_;
191  size_t count_;
192 };
193 } // namespace trace
194 } // namespace sdk
trace
Definition: includes/opentelemetry/context/context_value.h:18
sdk::trace::MultiSpanProcessor::MultiSpanProcessor
MultiSpanProcessor(std::vector< std::unique_ptr< SpanProcessor >> &&processors)
Definition: includes/opentelemetry/sdk/trace/multi_span_processor.h:34
sdk::trace::MultiSpanProcessor::OnStart
virtual void OnStart(Recordable &span, const opentelemetry::trace::SpanContext &parent_context) noexcept override
Definition: includes/opentelemetry/sdk/trace/multi_span_processor.h:76
sdk::trace::Recordable
Maintains a representation of a span in a format that can be processed by a recorder.
Definition: includes/opentelemetry/sdk/trace/recordable.h:44
sdk::trace::MultiSpanProcessor::Shutdown
bool Shutdown(std::chrono::microseconds timeout=(std::chrono::microseconds::max)()) noexcept override
Definition: includes/opentelemetry/sdk/trace/multi_span_processor.h:124
sdk::trace::MultiSpanProcessor::AddProcessor
void AddProcessor(std::unique_ptr< SpanProcessor > &&processor)
Definition: includes/opentelemetry/sdk/trace/multi_span_processor.h:43
sdk::trace::MultiSpanProcessor::~MultiSpanProcessor
~MultiSpanProcessor() override
Definition: includes/opentelemetry/sdk/trace/multi_span_processor.h:130
OPENTELEMETRY_BEGIN_NAMESPACE
#define OPENTELEMETRY_BEGIN_NAMESPACE
Definition: includes/opentelemetry/version.h:21
max
int max(int a, int b)
Compute the component-wise maximum.
Definition: sources/libs/nvmultiobjecttracker/include/modules/cuDCFv2/helper_math.h:60
sdk::trace::MultiSpanProcessor::InternalShutdown
bool InternalShutdown(std::chrono::microseconds timeout=(std::chrono::microseconds::max)()) noexcept
Definition: includes/opentelemetry/sdk/trace/multi_span_processor.h:137
sdk::trace::MultiSpanProcessor::ForceFlush
bool ForceFlush(std::chrono::microseconds timeout=(std::chrono::microseconds::max)()) noexcept override
Definition: includes/opentelemetry/sdk/trace/multi_span_processor.h:110
OPENTELEMETRY_END_NAMESPACE
#define OPENTELEMETRY_END_NAMESPACE
Definition: includes/opentelemetry/version.h:24
absl::move
constexpr absl::OTABSL_OPTION_NAMESPACE_NAME::remove_reference_t< T > && move(T &&t) noexcept
Definition: includes/opentelemetry/nostd/internal/absl/utility/utility.h:199
sdk::trace::MultiSpanProcessor
Span processor allow hooks for span start and end method invocations.
Definition: includes/opentelemetry/sdk/trace/multi_span_processor.h:31
sdk::trace::MultiSpanProcessor::OnEnd
virtual void OnEnd(std::unique_ptr< Recordable > &&span) noexcept override
Definition: includes/opentelemetry/sdk/trace/multi_span_processor.h:93
sdk::trace::MultiSpanProcessor::MakeRecordable
std::unique_ptr< Recordable > MakeRecordable() noexcept override
Definition: includes/opentelemetry/sdk/trace/multi_span_processor.h:62
std
Extensions to the C++ standard library.
Definition: includes/opentelemetry/nostd/string_view.h:212
sdk
Definition: includes/opentelemetry/sdk/common/atomic_shared_ptr.h:13
sdk::trace::SpanProcessor
Span processor allow hooks for span start and end method invocations.
Definition: includes/opentelemetry/sdk/trace/processor.h:29
sdk::trace::MultiRecordable
Definition: includes/opentelemetry/sdk/trace/multi_recordable.h:27
sdk::trace::MultiSpanProcessorOptions
Instantiation options.
Definition: includes/opentelemetry/sdk/trace/multi_span_processor.h:22