Add boot42-otel module: Spring Boot 4.2.0-RC1 OpenTelemetry conventions, shared OTLP settings and MDC keys vs 4.1.2

This commit is contained in:
2026-10-22 18:37:10 +00:00
parent 917d39fb65
commit 8252cba4c5
29 changed files with 958 additions and 0 deletions
@@ -0,0 +1,37 @@
# 01-conventions-metrics-and-spans (Spring Boot 4.1.2, JDK 25)
== management.observations.conventions=(property not set)
-- meters whose name contains 'http':
http.server.requests [error=none, exception=none, method=GET, outcome=SUCCESS, status=200, uri=/hello/{name}]
http.server.requests.active [exception=none, method=GET, outcome=SUCCESS, status=200, uri=UNKNOWN]
-- span-related strings in the OTLP trace payload (1 request(s)):
/hello/ankurJ
/hello/{name}z
http get /hello/{name}0
== management.observations.conventions=micrometer
-- meters whose name contains 'http':
http.server.requests [error=none, exception=none, method=GET, outcome=SUCCESS, status=200, uri=/hello/{name}]
http.server.requests.active [exception=none, method=GET, outcome=SUCCESS, status=200, uri=UNKNOWN]
-- span-related strings in the OTLP trace payload (1 request(s)):
/hello/ankurJ
/hello/{name}z
http get /hello/{name}0
== management.observations.conventions=open-telemetry
-- meters whose name contains 'http':
http.server.requests [error=none, exception=none, method=GET, outcome=SUCCESS, status=200, uri=/hello/{name}]
http.server.requests.active [exception=none, method=GET, outcome=SUCCESS, status=200, uri=UNKNOWN]
-- span-related strings in the OTLP trace payload (1 request(s)):
/hello/ankurJ
/hello/{name}z
http get /hello/{name}0
== management.observations.conventions=opentelemetry
-- meters whose name contains 'http':
http.server.requests [error=none, exception=none, method=GET, outcome=SUCCESS, status=200, uri=/hello/{name}]
http.server.requests.active [exception=none, method=GET, outcome=SUCCESS, status=200, uri=UNKNOWN]
-- span-related strings in the OTLP trace payload (1 request(s)):
/hello/ankurJ
/hello/{name}z
http get /hello/{name}0
@@ -0,0 +1,29 @@
# 01-conventions-metrics-and-spans (Spring Boot 4.2.0-RC1, JDK 25)
== management.observations.conventions=(property not set)
-- meters whose name contains 'http':
http.server.requests [error=none, exception=none, method=GET, outcome=SUCCESS, status=200, uri=/hello/{name}]
-- span-related strings in the OTLP trace payload (1 request(s)):
/hello/ankurJ
/hello/{name}z
http get /hello/{name}0
== management.observations.conventions=micrometer
-- meters whose name contains 'http':
http.server.requests [error=none, exception=none, method=GET, outcome=SUCCESS, status=200, uri=/hello/{name}]
-- span-related strings in the OTLP trace payload (1 request(s)):
/hello/ankurJ
/hello/{name}z
http get /hello/{name}0
== management.observations.conventions=open-telemetry
-- application FAILED to start
NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.http.server.observation.ServerRequestObservationConvention' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
== management.observations.conventions=opentelemetry
-- meters whose name contains 'http':
http.server.request.duration [error.type=none, error=none, http.request.method=GET, http.response.status_code=200, http.route=/hello/{name}, outcome=SUCCESS, url.scheme=http]
-- span-related strings in the OTLP trace payload (1 request(s)):
/hello/ankurJ
/hello/{name}J
GET /hello/{name}0
@@ -0,0 +1,7 @@
# 02-shared-otlp-endpoint (Spring Boot 4.1.2, JDK 25)
management.opentelemetry.otlp.endpoint = <sink> (one property, no per-signal URLs)
management.opentelemetry.otlp.headers = Authorization: Bearer shared-token
management.opentelemetry.otlp.compression = gzip
requests that reached the sink:
(none: 4.1.2 ignores the shared properties and exports to its default localhost:4318)
@@ -0,0 +1,8 @@
# 02-shared-otlp-endpoint (Spring Boot 4.2.0-RC1, JDK 25)
management.opentelemetry.otlp.endpoint = <sink> (one property, no per-signal URLs)
management.opentelemetry.otlp.headers = Authorization: Bearer shared-token
management.opentelemetry.otlp.compression = gzip
requests that reached the sink:
POST /v1/metrics Authorization=Bearer shared-token Content-Encoding=gzip
POST /v1/traces Authorization=Bearer shared-token Content-Encoding=gzip
@@ -0,0 +1,9 @@
# 03-signal-specific-overrides-shared (Spring Boot 4.1.2, JDK 25)
shared endpoint = <sink>
tracing.export.otlp.endpoint = <sink>/custom/spans
shared header Authorization = Bearer shared-token
shared header X-Shared = shared-only
tracing.export.otlp.headers.Authorization = Bearer traces-token
requests that reached the sink:
POST /custom/spans Authorization=Bearer traces-token X-Shared=null
@@ -0,0 +1,10 @@
# 03-signal-specific-overrides-shared (Spring Boot 4.2.0-RC1, JDK 25)
shared endpoint = <sink>
tracing.export.otlp.endpoint = <sink>/custom/spans
shared header Authorization = Bearer shared-token
shared header X-Shared = shared-only
tracing.export.otlp.headers.Authorization = Bearer traces-token
requests that reached the sink:
POST /custom/spans Authorization=Bearer traces-token X-Shared=shared-only
POST /v1/metrics Authorization=Bearer shared-token X-Shared=shared-only
@@ -0,0 +1,8 @@
# 04-mdc-keys (Spring Boot 4.1.2, JDK 25)
management.tracing.mdc.trace-id-key = trace_id
management.tracing.mdc.span-id-key = span_id
log pattern correlation part reads both MDC keys
log line: INFO 4192 --- [boot42-otel] [o-auto-1-exec-1] default[<32-hex-trace-id>] custom[] c.a.o.OtelApplication$HelloController : handling hello for ankur
default key traceId populated: true
custom key trace_id populated: false
+8
View File
@@ -0,0 +1,8 @@
# 04-mdc-keys (Spring Boot 4.2.0-RC1, JDK 25)
management.tracing.mdc.trace-id-key = trace_id
management.tracing.mdc.span-id-key = span_id
log pattern correlation part reads both MDC keys
log line: INFO 3810 --- [boot42-otel] [o-auto-1-exec-1] default[] custom[<32-hex-trace-id>] c.a.o.OtelApplication$HelloController : handling hello for ankur
default key traceId populated: false
custom key trace_id populated: true
@@ -0,0 +1,11 @@
# 05-active-long-task-timer (Spring Boot 4.1.2, JDK 25)
== (default)
http.server.requests (TIMER)
http.server.requests.active (LONG_TASK_TIMER)
http.server.requests.active present: true
== management.metrics.observations.include-active-long-task-timer=true
http.server.requests (TIMER)
http.server.requests.active (LONG_TASK_TIMER)
http.server.requests.active present: true
@@ -0,0 +1,10 @@
# 05-active-long-task-timer (Spring Boot 4.2.0-RC1, JDK 25)
== (default)
http.server.requests (TIMER)
http.server.requests.active present: false
== management.metrics.observations.include-active-long-task-timer=true
http.server.requests (TIMER)
http.server.requests.active (LONG_TASK_TIMER)
http.server.requests.active present: true
@@ -0,0 +1,19 @@
# 06-prometheus-names (Spring Boot 4.1.2, JDK 25)
== management.observations.conventions=micrometer
http_server_requests_active_seconds_count
http_server_requests_active_seconds_max
http_server_requests_active_seconds_sum
http_server_requests_seconds_count
http_server_requests_seconds_max
http_server_requests_seconds_sum
sample: http_server_requests_active_seconds_count{exception="none",method="GET",outcome="SUCCESS",status="200",uri="UNKNOWN"}
== management.observations.conventions=opentelemetry
http_server_requests_active_seconds_count
http_server_requests_active_seconds_max
http_server_requests_active_seconds_sum
http_server_requests_seconds_count
http_server_requests_seconds_max
http_server_requests_seconds_sum
sample: http_server_requests_active_seconds_count{exception="none",method="GET",outcome="SUCCESS",status="200",uri="UNKNOWN"}
@@ -0,0 +1,13 @@
# 06-prometheus-names (Spring Boot 4.2.0-RC1, JDK 25)
== management.observations.conventions=micrometer
http_server_requests_seconds_count
http_server_requests_seconds_max
http_server_requests_seconds_sum
sample: http_server_requests_seconds_count{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/hello/{name}"}
== management.observations.conventions=opentelemetry
http_server_request_duration_seconds_count
http_server_request_duration_seconds_max
http_server_request_duration_seconds_sum
sample: http_server_request_duration_seconds_count{error="none",error_type="none",http_request_method="GET",http_response_status_code="200",http_route="/hello/{name}",outcome="SUCCESS",url_scheme="http"}
@@ -0,0 +1,8 @@
# 07-conventions-spellings (Spring Boot 4.1.2, JDK 25)
open-telemetry -> starts, server meter: [http.server.requests]
open_telemetry -> starts, server meter: [http.server.requests]
OPEN_TELEMETRY -> starts, server meter: [http.server.requests]
opentelemetry -> starts, server meter: [http.server.requests]
openTelemetry -> starts, server meter: [http.server.requests]
micrometer -> starts, server meter: [http.server.requests]
MICROMETER -> starts, server meter: [http.server.requests]
@@ -0,0 +1,8 @@
# 07-conventions-spellings (Spring Boot 4.2.0-RC1, JDK 25)
open-telemetry -> FAILS to start
open_telemetry -> starts, server meter: [http.server.request.duration]
OPEN_TELEMETRY -> starts, server meter: [http.server.request.duration]
opentelemetry -> starts, server meter: [http.server.request.duration]
openTelemetry -> starts, server meter: [http.server.request.duration]
micrometer -> starts, server meter: [http.server.requests]
MICROMETER -> starts, server meter: [http.server.requests]