mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2026-05-04 12:41:00 +02:00
Added the "otel-group" action keyword that allows executing a named group of OTel scopes from HAProxy TCP and HTTP action rule contexts. The new group.c module registers the "otel-group" keyword for all four action contexts (tcp-request, tcp-response, http-request, http-response) and implements the action lifecycle callbacks. The parser flt_otel_group_parse() accepts a filter ID and group ID as arguments, duplicates them into the action rule's argument slots, and wires up the check, action, and release callbacks. The post-parse validator flt_otel_group_check() resolves the filter ID and group ID string references into direct configuration pointers by searching the proxy's filter list for a matching OTel filter and then looking up the named group within that filter's configuration. The action handler flt_otel_group_action() retrieves the filter and group configuration from the resolved rule arguments, verifies the filter is attached to the stream and not disabled, then iterates through all scopes in the group and executes each via flt_otel_scope_run() with a shared timestamp pair. This allows operators to trigger OTel instrumentation conditionally from HAProxy rules, for example applying different tracing scopes based on ACL conditions or request properties.
81 lines
2.4 KiB
Makefile
81 lines
2.4 KiB
Makefile
# USE_OTEL : enable the OpenTelemetry filter
|
|
# OTEL_DEBUG : compile the OpenTelemetry filter in debug mode
|
|
# OTEL_INC : force the include path to libopentelemetry-c-wrapper
|
|
# OTEL_LIB : force the lib path to libopentelemetry-c-wrapper
|
|
# OTEL_RUNPATH : add libopentelemetry-c-wrapper RUNPATH to haproxy executable
|
|
# OTEL_USE_VARS : allows the use of variables for the OpenTelemetry context
|
|
|
|
OTEL_DEFINE =
|
|
OTEL_CFLAGS =
|
|
OTEL_LDFLAGS =
|
|
OTEL_DEBUG_EXT =
|
|
OTEL_PKGSTAT =
|
|
OTELC_WRAPPER = opentelemetry-c-wrapper
|
|
|
|
ifneq ($(OTEL_DEBUG:0=),)
|
|
OTEL_DEBUG_EXT = _dbg
|
|
OTEL_DEFINE = -DDEBUG_OTEL
|
|
endif
|
|
|
|
ifeq ($(OTEL_INC),)
|
|
OTEL_PKGSTAT = $(shell pkg-config --exists $(OTELC_WRAPPER)$(OTEL_DEBUG_EXT); echo $$?)
|
|
OTEL_CFLAGS = $(shell pkg-config --silence-errors --cflags $(OTELC_WRAPPER)$(OTEL_DEBUG_EXT))
|
|
else
|
|
ifneq ($(wildcard $(OTEL_INC)/$(OTELC_WRAPPER)/.*),)
|
|
OTEL_CFLAGS = -I$(OTEL_INC) $(if $(OTEL_DEBUG),-DOTELC_DBG_MEM)
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(OTEL_PKGSTAT),)
|
|
ifeq ($(OTEL_CFLAGS),)
|
|
$(error OpenTelemetry C wrapper : can't find headers)
|
|
endif
|
|
else
|
|
ifneq ($(OTEL_PKGSTAT),0)
|
|
$(error OpenTelemetry C wrapper : can't find package)
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(OTEL_LIB),)
|
|
OTEL_LDFLAGS = $(shell pkg-config --silence-errors --libs $(OTELC_WRAPPER)$(OTEL_DEBUG_EXT))
|
|
else
|
|
ifneq ($(wildcard $(OTEL_LIB)/lib$(OTELC_WRAPPER).*),)
|
|
OTEL_LDFLAGS = -L$(OTEL_LIB) -l$(OTELC_WRAPPER)$(OTEL_DEBUG_EXT)
|
|
ifneq ($(OTEL_RUNPATH),)
|
|
OTEL_LDFLAGS += -Wl,--rpath,$(OTEL_LIB)
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(OTEL_LDFLAGS),)
|
|
$(error OpenTelemetry C wrapper : can't find library)
|
|
endif
|
|
|
|
OPTIONS_OBJS += \
|
|
addons/otel/src/cli.o \
|
|
addons/otel/src/conf.o \
|
|
addons/otel/src/event.o \
|
|
addons/otel/src/filter.o \
|
|
addons/otel/src/group.o \
|
|
addons/otel/src/http.o \
|
|
addons/otel/src/otelc.o \
|
|
addons/otel/src/parser.o \
|
|
addons/otel/src/pool.o \
|
|
addons/otel/src/scope.o \
|
|
addons/otel/src/util.o
|
|
|
|
ifneq ($(OTEL_USE_VARS:0=),)
|
|
OTEL_DEFINE += -DUSE_OTEL_VARS
|
|
OPTIONS_OBJS += addons/otel/src/vars.o
|
|
|
|
# Auto-detect whether struct var has a 'name' member. When present,
|
|
# prefix-based variable scanning can be used instead of the tracking
|
|
# buffer approach.
|
|
OTEL_VAR_HAS_NAME := $(shell awk '/^struct var \{/,/^\}/' include/haproxy/vars-t.h 2>/dev/null | grep -q '[*]name;' && echo 1)
|
|
ifneq ($(OTEL_VAR_HAS_NAME),)
|
|
OTEL_DEFINE += -DUSE_OTEL_VARS_NAME
|
|
endif
|
|
endif
|
|
|
|
OTEL_CFLAGS := $(OTEL_CFLAGS) -Iaddons/otel/include $(OTEL_DEFINE)
|