/* SPDX-License-Identifier: LGPL-2.1-or-later */ #ifndef _OTEL_PARSER_H_ #define _OTEL_PARSER_H_ #define FLT_OTEL_SCOPE "OTEL" /* * filter FLT_OTEL_OPT_NAME FLT_OTEL_OPT_FILTER_ID FLT_OTEL_OPT_CONFIG */ #define FLT_OTEL_OPT_NAME "opentelemetry" #define FLT_OTEL_OPT_FILTER_ID "id" #define FLT_OTEL_OPT_FILTER_ID_DEFAULT "otel-filter" #define FLT_OTEL_OPT_CONFIG "config" #define FLT_OTEL_PARSE_SECTION_INSTR_ID "otel-instrumentation" #define FLT_OTEL_PARSE_SECTION_GROUP_ID "otel-group" #define FLT_OTEL_PARSE_SECTION_SCOPE_ID "otel-scope" #define FLT_OTEL_PARSE_SPAN_ROOT "root" #define FLT_OTEL_PARSE_SPAN_PARENT "parent" #define FLT_OTEL_PARSE_SPAN_LINK "link" #define FLT_OTEL_PARSE_INSTRUMENT_DESC "desc" #define FLT_OTEL_PARSE_INSTRUMENT_VALUE "value" #define FLT_OTEL_PARSE_INSTRUMENT_ATTR "attr" #define FLT_OTEL_PARSE_INSTRUMENT_UNIT "unit" #define FLT_OTEL_PARSE_INSTRUMENT_BOUNDS "bounds" #define FLT_OTEL_PARSE_INSTRUMENT_AGGR "aggr" #define FLT_OTEL_PARSE_LOG_RECORD_ID "id" #define FLT_OTEL_PARSE_LOG_RECORD_EVENT "event" #define FLT_OTEL_PARSE_LOG_RECORD_SPAN "span" #define FLT_OTEL_PARSE_LOG_RECORD_ATTR "attr" #define FLT_OTEL_PARSE_CTX_AUTONAME "-" #define FLT_OTEL_PARSE_CTX_IGNORE_NAME '-' #define FLT_OTEL_PARSE_CTX_USE_HEADERS "use-headers" #define FLT_OTEL_PARSE_CTX_USE_VARS "use-vars" #define FLT_OTEL_PARSE_OPTION_HARDERR "hard-errors" #define FLT_OTEL_PARSE_OPTION_DISABLED "disabled" #define FLT_OTEL_PARSE_OPTION_NOLOGNORM "dontlog-normal" /* * A description of the macro arguments can be found in the structure * flt_otel_parse_data definition */ #define FLT_OTEL_PARSE_INSTR_DEFINES \ FLT_OTEL_PARSE_INSTR_DEF( ID, 0, CHAR, 2, 2, "otel-instrumentation", " ") \ FLT_OTEL_PARSE_INSTR_DEF( ACL, 0, CHAR, 3, 0, "acl", " [flags] [operator] ...") \ FLT_OTEL_PARSE_INSTR_DEF( LOG, 0, CHAR, 2, 0, "log", " { global | [len ] [format ] [ []] }") \ FLT_OTEL_PARSE_INSTR_DEF( CONFIG, 0, NONE, 2, 2, "config", " ") \ FLT_OTEL_PARSE_INSTR_DEF( GROUPS, 0, NONE, 2, 0, "groups", " ...") \ FLT_OTEL_PARSE_INSTR_DEF( SCOPES, 0, NONE, 2, 0, "scopes", " ...") \ FLT_OTEL_PARSE_INSTR_DEF( RATE_LIMIT, 0, NONE, 2, 2, "rate-limit", " ") \ FLT_OTEL_PARSE_INSTR_DEF( OPTION, 0, NONE, 2, 2, "option", " { disabled | dontlog-normal | hard-errors }") \ FLT_OTEL_PARSE_INSTR_DEF(DEBUG_LEVEL, 0, NONE, 2, 2, "debug-level", " ") #define FLT_OTEL_PARSE_GROUP_DEFINES \ FLT_OTEL_PARSE_GROUP_DEF( ID, 0, CHAR, 2, 2, "otel-group", " ") \ FLT_OTEL_PARSE_GROUP_DEF(SCOPES, 0, NONE, 2, 0, "scopes", " ...") #ifdef USE_OTEL_VARS # define FLT_OTEL_PARSE_SCOPE_INJECT_HELP " [use-vars] [use-headers]" # define FLT_OTEL_PARSE_SCOPE_EXTRACT_HELP " [use-vars | use-headers]" #else # define FLT_OTEL_PARSE_SCOPE_INJECT_HELP " [use-headers]" # define FLT_OTEL_PARSE_SCOPE_EXTRACT_HELP " [use-headers]" #endif /* * The first argument of the FLT_OTEL_PARSE_SCOPE_STATUS_DEF() macro is defined * as otelc_span_status_t in . */ #define FLT_OTEL_PARSE_SCOPE_STATUS_DEFINES \ FLT_OTEL_PARSE_SCOPE_STATUS_DEF(IGNORE, "ignore") \ FLT_OTEL_PARSE_SCOPE_STATUS_DEF( UNSET, "unset" ) \ FLT_OTEL_PARSE_SCOPE_STATUS_DEF( OK, "ok" ) \ FLT_OTEL_PARSE_SCOPE_STATUS_DEF( ERROR, "error" ) /* Sentinel: instrument has not been created yet. */ #define OTELC_METRIC_INSTRUMENT_UNSET -1 /* Sentinel: instrument creation is in progress by another thread. */ #define OTELC_METRIC_INSTRUMENT_PENDING -2 /* Sentinel: update-form instrument (re-evaluates an existing one). */ #define OTELC_METRIC_INSTRUMENT_UPDATE 0xff #define OTELC_METRIC_AGGREGATION_UNSET -1 /* * Observable (asynchronous) instruments are not supported. The OTel SDK * invokes their callbacks from an external background thread that is not a * HAProxy thread. HAProxy sample fetches rely on internal per-thread-group * state and return incorrect results when called from a non-HAProxy thread. * * Double-precision instruments are not supported because HAProxy sample fetches * do not return double values. */ #define FLT_OTEL_PARSE_SCOPE_INSTRUMENT_DEFINES \ FLT_OTEL_PARSE_SCOPE_INSTRUMENT_DEF(UPDATE, "update" ) \ FLT_OTEL_PARSE_SCOPE_INSTRUMENT_DEF(COUNTER_UINT64, "cnt_int" ) \ FLT_OTEL_PARSE_SCOPE_INSTRUMENT_DEF(HISTOGRAM_UINT64, "hist_int" ) \ FLT_OTEL_PARSE_SCOPE_INSTRUMENT_DEF(UDCOUNTER_INT64, "udcnt_int") \ FLT_OTEL_PARSE_SCOPE_INSTRUMENT_DEF(GAUGE_INT64, "gauge_int") /* * In case the possibility of working with OpenTelemetry context via HAProxy * variables is not used, args_max member of the structure flt_otel_parse_data * should be reduced for 'inject' keyword. However, this is not critical * because in this case the 'use-vars' argument cannot be entered anyway, * so I will not complicate it here with additional definitions. */ #define FLT_OTEL_PARSE_SCOPE_DEFINES \ FLT_OTEL_PARSE_SCOPE_DEF( ID, 0, CHAR, 2, 2, "otel-scope", " ") \ FLT_OTEL_PARSE_SCOPE_DEF( SPAN, 0, NONE, 2, 7, "span", " [] [] [root]") \ FLT_OTEL_PARSE_SCOPE_DEF( LINK, 1, NONE, 2, 0, "link", " ...") \ FLT_OTEL_PARSE_SCOPE_DEF( ATTRIBUTE, 1, NONE, 3, 0, "attribute", " ...") \ FLT_OTEL_PARSE_SCOPE_DEF( EVENT, 1, NONE, 4, 0, "event", " ...") \ FLT_OTEL_PARSE_SCOPE_DEF( BAGGAGE, 1, VAR, 3, 0, "baggage", " ...") \ FLT_OTEL_PARSE_SCOPE_DEF( INJECT, 1, CTX, 2, 4, "inject", FLT_OTEL_PARSE_SCOPE_INJECT_HELP) \ FLT_OTEL_PARSE_SCOPE_DEF( EXTRACT, 0, CTX, 2, 3, "extract", FLT_OTEL_PARSE_SCOPE_EXTRACT_HELP) \ FLT_OTEL_PARSE_SCOPE_DEF( STATUS, 1, NONE, 2, 0, "status", " [ ...]") \ FLT_OTEL_PARSE_SCOPE_DEF( FINISH, 0, NONE, 2, 0, "finish", " ...") \ FLT_OTEL_PARSE_SCOPE_DEF( INSTRUMENT, 0, NONE, 3, 0, "instrument", " { update [ ...] | [] [] [] [] }") \ FLT_OTEL_PARSE_SCOPE_DEF( LOG_RECORD, 0, NONE, 3, 0, "log-record", " [] [] [] [] ...") \ FLT_OTEL_PARSE_SCOPE_DEF(IDLE_TIMEOUT, 0, NONE, 2, 2, "idle-timeout", "