]> git.kaiwu.me - haproxy.git/commit
MEDIUM: otel: added HAProxy variable storage for context propagation
authorMiroslav Zagorac <mzagorac@haproxy.com>
Sun, 12 Apr 2026 09:25:14 +0000 (11:25 +0200)
committerWilliam Lallemand <wlallemand@haproxy.com>
Mon, 13 Apr 2026 07:23:26 +0000 (09:23 +0200)
commit2d6a15ac00186714714a195acf7232d700f914db
tree26192142389af805a4d03a6387d6f1e7cb880536
parent8effcac6f5beec73feb20ee55603a84dc5a7e5a5
MEDIUM: otel: added HAProxy variable storage for context propagation

Added support for storing OTel span context in HAProxy transaction
variables as an alternative to HTTP headers, enabled by the OTEL_USE_VARS
compile flag.

The new vars.c module implements variable-based context propagation
through the HAProxy variable subsystem.  Variable names are constructed
from a configurable prefix and the OTel propagation key, with dots
normalized to underscores for HAProxy variable name compatibility
and denormalized back during retrieval.  The module provides
flt_otel_var_register() to pre-register variables at parse time,
flt_otel_var_set() and flt_otel_vars_unset() to store and clear context
key-value pairs in the txn scope, flt_otel_vars_get() to collect all
variables matching a prefix into an otelc_text_map for context extraction,
and flt_otel_vars_dump() for debug logging of all OTel variables.

The inject/extract keywords in the scope parser now accept an optional
"use-vars" argument alongside "use-headers", controlled by the new
FLT_OTEL_CTX_USE_VARS flag.  Both storage types can be used simultaneously
on the same span context, allowing context to be propagated through both
HTTP headers and variables.

The scope runner in event.c was extended to handle variable-based
context in parallel with headers: during extraction, it reads matching
variables via flt_otel_vars_get() when FLT_OTEL_CTX_USE_VARS is set;
during injection, it stores each propagation key as a variable via
flt_otel_var_set().  The unused resource cleanup now also unsets context
variables when removing failed extraction contexts.

The filter attach callback registers and sets the sess.otel.uuid variable
with the generated session UUID, making the trace identifier available to
HAProxy log formats and ACL expressions.

The feature is conditionally compiled: the OTEL_USE_VARS flag controls
whether vars.c is included in the build and whether the "use-vars" keyword
is available in the configuration parser.
Makefile
addons/otel/Makefile
addons/otel/include/filter.h
addons/otel/include/include.h
addons/otel/include/parser.h
addons/otel/include/vars.h [new file with mode: 0644]
addons/otel/src/event.c
addons/otel/src/filter.c
addons/otel/src/parser.c
addons/otel/src/scope.c
addons/otel/src/vars.c [new file with mode: 0644]