Observation API 到底是什么?和直接用 MeterRegistry、Tracer 有什么区别?@Observed 能得到什么?标签应该放指标里还是 span 里?采样会不会影响指标?这篇在 Spring Boot 4.0.8 加 Brave 上,用自己收集的 span 逐项验证。
GET /work → traceId=6ad6de2363b09c4c3a40e9769a75e650
日志行(Boot 默认格式里多了关联 id):INFO 47388 --- [demo] [nio-9602-exec-2] [6ad6de2363b09c4c3a40e9769a75e650-3a40e9769a75e650] demo.Main : 处理 /work
收集到的 span 2 个:
svc-call|trace=…|parent=有|{class=demo.Svc, layer=service, method=call}
http get /work|trace=…|parent=-|{exception=none, http.url=/work, method=GET, outcome=SUCCESS, status=200, uri=/work}
指标 http.server.requests?tag=uri:/work:COUNT 1,标签 {'exception': ['none'], 'method': ['GET'], 'error': ['none'], 'outcome': ['SUCCESS'], 'status': ['200']}HTTP 请求同时得到指标和链路;日志默认格式自动带 traceId 与 spanId。
指标 order.process:COUNT 3,标签 {'type': ['a', 'b'], 'error': ['none']}
span 个数 3,每个 span 的标签:
order.process|trace=…|parent=有|{orderId=30bb2f59, type=a}
order.process|trace=…|parent=有|{orderId=607e3226, type=a}
order.process|trace=…|parent=有|{orderId=bc3483bd, type=b}低基数标签进指标和 span,高基数标签只进 span。
指标 svc.call:COUNT 2,标签 {'method': ['call'], 'error': ['none'], 'class': ['demo.Svc'], 'layer': ['service']}
span svc-call 个数 2,第 1 个:svc-call|trace=…|parent=有|{class=demo.Svc, layer=service, method=call}
全部 span 名字:['http get /actuator/metrics/{requiredMetricName}', 'http get /spans', 'http get /work', 'svc-call']一个注解得到一个 Timer 指标和一个 span,需要 ObservedAspect Bean。
management.tracing.sampling.probability 不设(默认):/plain 的 span 10 个;http.server.requests?uri=/plain 的 COUNT 100 probability=1.0:/plain 的 span 100 个;http.server.requests?uri=/plain 的 COUNT 100 probability=0.0:/plain 的 span 0 个;http.server.requests?uri=/plain 的 COUNT 100 probability=1.0 且 management.observations.enable.svc.call=false:/plain 的 span 100 个;http.server.requests?uri=/plain 的 COUNT 100;5 次 /work 之后 svc.call 指标 没有这个指标,svc-call 的 span 0 个,http get /work 的 span 5 个
默认采样率只留 10% 的 span,指标不受影响;按名字关闭观察时指标与 span 一起消失。