.. _program_listing_file_include_opentelemetry_trace_propagation_composite_propagator.h: Program Listing for File composite_propagator.h =============================================== |exhale_lsh| :ref:`Return to documentation for file ` (``include/opentelemetry/trace/propagation/composite_propagator.h``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #include #include #include #include "opentelemetry/trace/propagation/text_map_propagator.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace trace { namespace propagation { template class CompositePropagator : public TextMapPropagator { public: CompositePropagator(std::vector>> propagators) : propagators_(std::move(propagators)) {} // Rules that manages how context will be extracted from carrier. using Getter = nostd::string_view (*)(const T &carrier, nostd::string_view trace_type); // Rules that manages how context will be injected to carrier. using Setter = void (*)(T &carrier, nostd::string_view trace_type, nostd::string_view trace_description); void Inject(Setter setter, T &carrier, const context::Context &context) noexcept override { for (auto &p : propagators_) { p->Inject(setter, carrier, context); } } context::Context Extract(Getter getter, const T &carrier, context::Context &context) noexcept override { auto first = true; context::Context tmp_context; for (auto &p : propagators_) { if (first) { tmp_context = p->Extract(getter, carrier, context); first = false; } else { tmp_context = p->Extract(getter, carrier, tmp_context); } } return propagators_.size() ? tmp_context : context; } private: std::vector>> propagators_; }; } // namespace propagation } // namespace trace OPENTELEMETRY_END_NAMESPACE;