OpenTelemetry filter -- miscellaneous notes
==============================================================================

1  Parsing sample expressions in HAProxy
------------------------------------------------------------------------------

HAProxy provides two entry points for turning a configuration string into an
evaluable sample expression.


1.1  sample_parse_expr()
..............................................................................

Parses a bare sample-fetch name with an optional converter chain.  The input is
the raw expression without any surrounding syntax.

  Declared in:  include/haproxy/sample.h
  Defined in:   src/sample.c

  struct sample_expr *sample_parse_expr(char **str, int *idx, const char *file, int line, char **err_msg, struct arg_list *al, char **endptr);

The function reads from str[*idx] and advances *idx past the consumed tokens.

Configuration example (otel-scope instrument keyword):

  instrument my_counter "name" desc req.hdr(host),lower ...

Here "req.hdr(host),lower" is a single configuration token that
sample_parse_expr() receives directly.  It recognises the fetch "req.hdr(host)"
and the converter "lower" separated by a comma.


1.2  parse_logformat_string()
..............................................................................

Parses a log-format string that may contain literal text mixed with sample
expressions wrapped in %[...] delimiters.

  Declared in:  include/haproxy/log.h
  Defined in:   src/log.c

  int parse_logformat_string(const char *fmt, struct proxy *curproxy, struct lf_expr *lf_expr, int options, int cap, char **err);

Configuration example (HAProxy log-format directive):

  log-format "host=%[req.hdr(host),lower] status=%[status]"

The %[...] wrapper tells parse_logformat_string() where each embedded sample
expression begins and ends.  The text outside the brackets ("host=", " status=")
is emitted as-is.


1.3  Which one to use
..............................................................................

Use sample_parse_expr() when the configuration token is a single, standalone
sample expression (no surrounding text).  This is the case for the otel filter
keywords such as "attribute", "event", "baggage", "status", "value", and
similar.

Use parse_logformat_string() when the value is a free-form string that may mix
literal text with zero or more embedded expressions.


2  Signal keywords
------------------------------------------------------------------------------

The OTel filter configuration uses one keyword per signal to create or update
signal-specific objects.  The keyword names follow the OpenTelemetry
specification's own terminology rather than using informal synonyms.

  Signal      Keyword        Creates / updates
  --------    -----------    ------------------------------------------
  Tracing     span           A trace span.
  Metrics     instrument     A metric instrument (counter, gauge, ...).
  Logging     log-record     A log record.

The tracing keyword follows the same logic.  A "trace" is the complete
end-to-end path of a request through a distributed system, composed of one or
more "spans".  Each span represents a single unit of work within that trace.
The configuration operates at the span level: it creates individual spans, sets
their parent-child relationships, and attaches attributes and events.  Using
"trace" as the keyword would be imprecise because one does not configure a trace
directly; one configures the spans that collectively form a trace.

The metrics keyword is analogous.  In the OpenTelemetry data model the
terminology is layered: a "metric" is the aggregated output that the SDK
produces after processing recorded measurements, while an "instrument" is the
concrete object through which those measurements are recorded -- a counter,
histogram, gauge, or up-down counter.  The configuration operates at the
instrument level: it creates an instrument of a specific type and records values
through it.  Using "metric" as the keyword would be imprecise because one does
not configure a metric directly; one configures an instrument that yields
metrics.

The logging keyword follows the same pattern.  A "log" is the broad signal
category, while a "log record" is a single discrete entry within that signal.
The configuration operates at the log-record level: it creates individual log
records with a severity, a body, and optional attributes and span context.
Using "log" as the keyword would be imprecise because one does not configure a
log stream directly; one configures the individual log records that comprise it.
