@@ -37,24 +37,27 @@ using namespace httpd_otel;
3737const char kOpenTelemetryKeyNote [] = " OTEL" ;
3838const char kOpenTelemetryKeyOutboundNote [] = " OTEL_PROXY" ;
3939
40- static nostd::string_view HttpdGetter ( const apr_table_t &hdrs, nostd::string_view trace_type)
40+ class HttpdCarrier : public opentelemetry ::context::propagation::TextMapCarrier
4141{
42- auto fnd = apr_table_get (&hdrs, std::string (trace_type).c_str ());
43- return fnd ? fnd : " " ;
44- }
45-
46- static void HttpdSetter (apr_table_t &hdrs,
47- nostd::string_view trace_type,
48- nostd::string_view trace_description)
49- {
50- apr_table_set (&hdrs, std::string (trace_type).c_str (),
51- std::string (trace_description).c_str ());
52- }
42+ public:
43+ apr_table_t & hdrs;
44+ HttpdCarrier (apr_table_t & headers):hdrs(headers){}
45+ virtual nostd::string_view Get (nostd::string_view key) const noexcept override
46+ {
47+ auto fnd = apr_table_get (&hdrs, std::string (key).c_str ());
48+ return fnd ? fnd : " " ;
49+ }
50+ virtual void Set (nostd::string_view key, nostd::string_view value) noexcept override
51+ {
52+ apr_table_set (&hdrs, std::string (key).c_str (),
53+ std::string (value).c_str ());
54+ }
55+ };
5356
5457// propagators
55- opentelemetry::trace::propagation::HttpTraceContext< apr_table_t > PropagatorTraceContext;
56- opentelemetry::trace::propagation::B3Propagator< apr_table_t > PropagatorB3SingleHeader;
57- opentelemetry::trace::propagation::B3PropagatorMultiHeader< apr_table_t > PropagatorB3MultiHeader;
58+ opentelemetry::trace::propagation::HttpTraceContext PropagatorTraceContext;
59+ opentelemetry::trace::propagation::B3Propagator PropagatorB3SingleHeader;
60+ opentelemetry::trace::propagation::B3PropagatorMultiHeader PropagatorB3MultiHeader;
5861
5962// from:
6063// https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/semantic_conventions/http.md#http-server-semantic-conventions
@@ -123,16 +126,17 @@ static int opentel_handler(request_rec *r, int /* lookup_uri */ )
123126
124127 if (!config.ignore_inbound && config.propagation != OtelPropagation::NONE)
125128 {
129+ HttpdCarrier car (*req->headers_in );
126130 opentelemetry::v0::context::Context ctx_new,
127131 ctx_cur = opentelemetry::context::RuntimeContext::GetCurrent ();
128132 switch (config.propagation )
129133 {
130134 default :
131- ctx_new = PropagatorTraceContext.Extract (HttpdGetter, *req-> headers_in , ctx_cur);
135+ ctx_new = PropagatorTraceContext.Extract (car , ctx_cur);
132136 break ;
133137 case OtelPropagation::B3_SINGLE_HEADER:
134138 case OtelPropagation::B3_MULTI_HEADER:
135- ctx_new = PropagatorB3SingleHeader.Extract (HttpdGetter, *req-> headers_in , ctx_cur);
139+ ctx_new = PropagatorB3SingleHeader.Extract (car , ctx_cur);
136140 }
137141 req_data->token = opentelemetry::context::RuntimeContext::Attach (ctx_new);
138142 }
@@ -221,16 +225,17 @@ static int proxy_fixup_handler(request_rec *r)
221225
222226 // mod_proxy simply copies request headers from client therefore inject is into headers_in
223227 // instead of headers_out
228+ HttpdCarrier car (*req->headers_in );
224229 switch (config.propagation )
225230 {
226231 case OtelPropagation::TRACE_CONTEXT:
227- PropagatorTraceContext.Inject (HttpdSetter, *req-> headers_in , opentelemetry::context::RuntimeContext::GetCurrent ());
232+ PropagatorTraceContext.Inject (car , opentelemetry::context::RuntimeContext::GetCurrent ());
228233 break ;
229234 case OtelPropagation::B3_SINGLE_HEADER:
230- PropagatorB3SingleHeader.Inject (HttpdSetter, *req-> headers_in , opentelemetry::context::RuntimeContext::GetCurrent ());
235+ PropagatorB3SingleHeader.Inject (car , opentelemetry::context::RuntimeContext::GetCurrent ());
231236 break ;
232237 case OtelPropagation::B3_MULTI_HEADER:
233- PropagatorB3MultiHeader.Inject (HttpdSetter, *req-> headers_in , opentelemetry::context::RuntimeContext::GetCurrent ());
238+ PropagatorB3MultiHeader.Inject (car , opentelemetry::context::RuntimeContext::GetCurrent ());
234239 break ;
235240 default : // suppress warning
236241 break ;
0 commit comments