New in the 0.4.0-SNAPSHOT development line — everything listed here landed after the 0.3.0 release and is not part of it. Every entry links to the section that documents it, and those sections carry the NEW badge. Each brick of the suite keeps its own page of this kind; the ecosystem index gathers them. When the next release train ships, this page is frozen with it and restarts empty on the dev line.

MicroProfile Telemetry 2.2 and OpenTelemetry 1.66

  • MicroProfile Telemetry 2.2 — Humboldt implements Telemetry 2.2 and passes the official TCK 2.2-RC3, 85/85 across tracing, metrics and logs (humboldt#17). The 2.2 final TCK is not on Maven Central yet. TCK — current status.

  • OpenTelemetry 1.66.0 — the repackaged API and context move from 1.39 to 1.66.0, opentelemetry-instrumentation-annotations from 2.7.0 to 2.31.1, and the semantic conventions of the TCK harness from 1.27.0-alpha to 1.44.0. OpenTelemetry SDK, autoconfigure SPI or exporter jars you add next to humboldt-otel-interop belong to the 1.66 line. Compatibility, Upgrading from 0.3.0.

  • code.function.name on @WithSpan spans — every span the interceptor opens carries <binary class name>.<method>, which Telemetry 2.2 makes mandatory. Instrument a method with @WithSpan.

  • @WithSpan(inheritContext = false) — the span starts a new trace with Context.root() as its parent, and the method runs in that root context: the caller’s context and baggage are not visible inside it. The default, inheritContext = true, is unchanged. Instrument a method with @WithSpan.

Logs and exceptions

  • Exceptions and event names on log records — LogRecordBuilder.setException(Throwable) and setEventName(String) used to be dropped silently (the API’s no-op defaults). The exception now gives exception.type, exception.message and exception.stacktrace; the event name goes to the OTLP eventName field and the logging exporter’s output. The JUL bridge passes a JUL record’s exception too. What a log record carries.

  • Structured log bodies — setBody(Value) keeps a map or an array as a structured OTLP AnyValue, where it used to be flattened into a JSON string. LogRecordData gains the bodyValue and eventName components; the earlier constructors are kept. What a log record carries.

  • An empty log body is kept — setBody("") exports "body":{"stringValue":""}, as the OpenTelemetry SDK does, where it used to export no body. What a log record carries, Upgrading from 0.3.0.

  • exception.type is the canonical class name on spans too — Span.recordException writes com.acme.Outer.Nested, not com.acme.Outer$Nested, like the new log-side setException and the OpenTelemetry SDK; additional attributes passed to recordException now override the derived ones. A backend query on the binary name of a nested exception class needs updating. Exception attributes.

OTLP/JSON exporter

  • Double points and synchronous gauges — double counters, double up-down counters and double gauges used to be exported with an empty dataPoints array, and a synchronous gauge with no data at all; both are now encoded. OTLP/JSON encoding.

  • Non-finite doubles — NaN and infinities are written as the JSON strings "NaN", "Infinity", "-Infinity" instead of making the payload invalid. OTLP/JSON encoding.

  • Complex attributes — a Value attribute (setAttribute(String, Value)) is encoded as a full AnyValue, where it used to be exported as {}. OTLP/JSON encoding.

  • A metric batch that cannot be encoded fails — a data point that does not match its metric used to vanish from the export. The batch now fails: nothing is sent, the exporter returns a failed result and logs the first such batch at WARNING. OTLP/JSON encoding.

Java modules

  • OpenTelemetry SDK and exporter jars on the module path — the OTLP exporters failed on the module path with an IllegalAccessError or a ServiceConfigurationError. The repackaged io.opentelemetry.api and io.opentelemetry.context now export the internal packages the 1.66 stable jars use, qualified to exactly those modules; humboldt-otel-interop extends these exports to the layer of each OpenTelemetry provider it discovers, and the default ComponentLoader declares the uses of a service before loading it, so an exporter finds its sender and its compressor. One limit remains: when humboldt-otel-interop sits in a child layer of the two API modules, the exports cannot be extended; keep it in the same layer, as the Vidocq runtime does, or add --add-exports by hand. Incubating (-alpha) artifacts still need --add-exports. Java modules — OpenTelemetry jars on the module path.

  • humboldt-rest reads Cyrano’s Rest Client API module — the descriptor now requires io.vidocq.cyrano.mp.rest.client.api (statically) instead of the automatic module microprofile.rest.client.api, which Vidocq never ships, so the Rest Client listener works on a strict module path and in a jlink image (humboldt#18). Java modules, Upgrading from 0.3.0.

Other CDI containers

  • humboldt-cdi and humboldt-rest are explicit bean archives — both now ship a META-INF/beans.xml (annotated) (humboldt#23). In 0.3.0 they were implicit archives, which Weld SE does not scan by default: there, @WithSpan did nothing, the telemetry producers were missing and the server filters were not registered, with no error. Bean archives.

  • Proven on Weld and Open Liberty — two new test modules run the Humboldt jars, unchanged, without Vauban: humboldt-it-weld on Weld SE 6.0 (class path), humboldt-it-openliberty as a WAR on Open Liberty 26.0.0.10 (MicroProfile 7, CDI 4.0) with Liberty’s own mpTelemetry off. Neither is published (humboldt#23). Outside Vidocq, the application installs the SDK itself. Other CDI containers.

  • vauban-api is now a runtime dependency of humboldt-cdi — it was provided, so outside Vauban the telemetry producers, which carry a constructor taking io.vidocq.vauban.api.ProxyLink, could not be loaded, and the first injected Tracer or Span failed the deployment (BUG-20261010-01). The module descriptor now requires io.vidocq.vauban.api. Other CDI containers.

  • The Jakarta APIs are provided — humboldt-cdi no longer ships jakarta.enterprise.cdi-api and jakarta.annotation-api, humboldt-rest no longer ships jakarta.ws.rs-api and jakarta.annotation-api: the container brings them, so a WAR carries no second copy (vidocq-workspace#17). This is a behaviour change for an application that compiled against those APIs through Humboldt alone: it now declares them itself. The Vidocq runtime is not affected; its Telemetry extension brings Jakarta REST. Other CDI containers.

  • Exceptions keep their status, and are recorded on every runtime — HumboldtSpanFinalizer turned every exception escaping a resource into a 500, a NotFoundException included, and failed outright on RESTEasy (Open Liberty, WildFly), where it could not get the request context. It now leaves a `WebApplicationException’s response alone, records other exceptions on the current SERVER span, and lets the response filter end the span (BUG-20261010-02). Other CDI containers.