跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava

Spring Boot 4 集成 OpenTelemetry 实现可观测性(Metrics/Traces/Logs)

介绍如何在 Spring Boot 4 中通过 OpenTelemetry OTLP 协议集成 Jaeger、Prometheus 和 Loki。配置 pom 依赖后,设置 application.yml 中的 OTLP 导出地址,即可自动采集 JVM 指标、分布式追踪和日志。结合 Grafana 可实现完整的云原生可观测性监控体系。

RedisGeek发布于 2026/3/24更新于 2026/5/614K 浏览
Spring Boot 4 集成 OpenTelemetry 实现可观测性(Metrics/Traces/Logs)

效果展示

效果图

效果图

效果图

概述

在现代云原生架构中,可观测性不再是可选项,而是一项基本要求。你需要通过指标了解应用程序的运行情况,通过跟踪了解请求的流向,并通过日志了解应用程序的运行状态。

什么是 OpenTelemetry

OpenTelemetry(简称 OTel)是一个开源的、厂商中立的 可观测性(Observability)框架和工具集,旨在统一和标准化应用程序的 指标(Metrics)、日志(Logs)和分布式追踪(Traces) 的生成、收集、处理与导出。 它由 Cloud Native Computing Foundation(CNCF)托管,是目前云原生生态中最主流、最推荐的可观测性标准,被广泛用于微服务、Kubernetes、Serverless 等现代架构中。 官方文档:https://opentelemetry.io

为什么使用 Jaeger, Prometheus, Loki

Jaeger 官方描述与安装:https://www.jaegertracing.io/ Prometheus 官方描述与安装:https://prometheus.io/ Loki 官方描述与安装:https://grafana.com/docs/loki/latest/

使用 Jaeger + Prometheus + Loki 的组合,是构建现代云原生应用可观测性体系中一种非常经典且高效的方案。它们分别专注于可观测性的不同维度,互补性强,尤其适合微服务、Kubernetes 等分布式系统环境。

Jaeger, Prometheus, Loki 原生支持 OTLP 协议,大大简化了配置流程,不需要中间转换,减少性能消耗

组件聚焦领域功能
Prometheus指标(Metrics)采集、存储、查询时间序列数据(如 CPU 使用率、请求速率、错误率、延迟分位数等)
Jaeger分布式追踪(Traces)记录单次请求在多个服务间的完整调用链路,分析性能瓶颈与依赖关系
Loki日志聚合(Logs)高效存储和查询日志,但不索引日志内容,而是基于标签(labels)进行索引,节省资源

并且加入 Grafana + Loki,形成'PLGJ'栈(Prometheus + Loki + Grafana + Jaeger),成为 CNCF 推荐的云原生可观测性黄金组合。

使用 Spring 团队提供的 OpenTelemetry Spring Boot Starter

官方描述和文档:https://spring.io/blog/2025/11/18/opentelemetry-with-spring-boot Spring Boot 4.0 通过官方 spring-boot-starter-opentelemetry 提供了开箱即用、协议优先(OTLP)、与 Micrometer 深度集成的 OpenTelemetry 支持。 开发者只需少量配置,即可实现 Metrics、Traces、Logs 三位一体的可观测性,且能灵活对接任意 OTel 兼容后端。 虽然日志集成仍需手动步骤,但整体体验已非常接近'无缝'。

代码实现

1. Maven 依赖

只需要 spring-boot-starter-opentelemetry 就可以实现 Metrics + Traces + Logs 三合一。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-opentelemetry</artifactId>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry.instrumentation</groupId>
        <artifactId>opentelemetry-logback-appender-1.0</artifactId>
        <version>2.21.0-alpha</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
</dependencies>

2. 配置文件

使用 Prometheus + Jaeger otlp 协议来收集数据,可以配置 Loki 用来日志收集。 Prometheus 开启 otlp 协议需要额外配置一个参数。 配置地址:https://prometheus.io/docs/guides/opentelemetry/#enable-the-otlp-receiver

server:
  port: 8090
spring:
  application:
    name: test-service
management:
  otlp:
    metrics:
      export:
        url: http://localhost:9090/api/v1/otlp/v1/metrics #Prometheus otlp 协议 http 地址
        step: 30s
    opentelemetry:
      tracing:
        export:
          otlp:
            endpoint: http://localhost:4317/v1/traces #Jaeger otlp 协议 grpc 地址
            transport: grpc
            # endpoint: http://localhost:4318/v1/traces
            # transport: http
      logging:
        export:
          otlp:
            endpoint: http://localhost:3100/otlp/v1/logs #Loki otlp 协议 http 地址

3. 采集配置

手动配置一个采集的参数。

@Configuration(proxyBeanMethods = false)
public class OpenTelemetryConfiguration {
    @Bean
    public OpenTelemetryServerRequestObservationConvention openTelemetryServerRequestObservationConvention() {
        return new OpenTelemetryServerRequestObservationConvention();
    }

    @Bean
    public OpenTelemetryJvmCpuMeterConventions openTelemetryJvmCpuMeterConventions() {
        return new OpenTelemetryJvmCpuMeterConventions(Tags.empty());
    }

    @Bean
    public ProcessorMetrics processorMetrics() {
        return new ProcessorMetrics(List.of(), new OpenTelemetryJvmCpuMeterConventions(Tags.empty()));
    }

    @Bean
    public JvmMemoryMetrics jvmMemoryMetrics() {
        return new JvmMemoryMetrics(List.of(), new OpenTelemetryJvmMemoryMeterConventions(Tags.empty()));
    }

    @Bean
    public JvmThreadMetrics jvmThreadMetrics() {
        return new JvmThreadMetrics(List.of(), new OpenTelemetryJvmThreadMeterConventions(Tags.empty()));
    }

    @Bean
    public ClassLoaderMetrics classLoaderMetrics() {
        return new ClassLoaderMetrics(new OpenTelemetryJvmClassLoadingMeterConventions());
    }
}

4. 日志配置

  1. 创建 src/main/resources/logback-spring.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <appender name="OTEL" class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender"></appender>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="OTEL"/>
    </root>
</configuration>
  1. 配置 Appender 初始化:
@Component
class InstallOpenTelemetryAppender implements InitializingBean {
    private final OpenTelemetry openTelemetry;

    InstallOpenTelemetryAppender(OpenTelemetry openTelemetry) {
        this.openTelemetry = openTelemetry;
    }

    @Override
    public void afterPropertiesSet() {
        OpenTelemetryAppender.install(this.openTelemetry);
    }
}
  1. 配置 TraceId 过滤器:
@Component
class TraceIdFilter implements WebFilter {
    private final Tracer tracer;

    TraceIdFilter(Tracer tracer) {
        this.tracer = tracer;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        String traceId = getTraceId();
        if (traceId != null) {
            exchange.getRequest().mutate().header("X-Trace-Id", traceId).build();
        }
        return chain.filter(exchange);
    }

    private String getTraceId() {
        TraceContext context = this.tracer.currentTraceContext().context();
        return context != null ? context.traceId() : null;
    }
}

5. 测试接口

@RestController
public class TestController {
    @GetMapping("/test")
    public Mono<String> test() {
        return Mono.just("Hello World!");
    }
}

多运行几次接口查看效果。

效果

效果

效果

目录

  1. 效果展示
  2. 概述
  3. 什么是 OpenTelemetry
  4. 为什么使用 Jaeger, Prometheus, Loki
  5. 使用 Spring 团队提供的 OpenTelemetry Spring Boot Starter
  6. 代码实现
  7. 1. Maven 依赖
  8. 2. 配置文件
  9. 3. 采集配置
  10. 4. 日志配置
  11. 5. 测试接口
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Function Call、MCP 与 Agent:大模型能力扩展的核心机制解析
  • 新手如何从零开始学习漏洞挖掘
  • 智能竞赛小车零基础制作指南:全地形机器人硬件与软件实现
  • Coze 应用开发全流程指南:从工作流到 UI 构建
  • Python 北京地铁票务 APP 小程序售票系统设计
  • Git 版本控制从入门到远程协作实战
  • C++ STL list 容器详解:使用与模拟实现
  • Go 语言演进:泛型与 WebAssembly 实战指南
  • 自然语言处理在医疗领域的应用与实战
  • 循环神经网络(RNN)与序列数据处理实战
  • Spring Cloud 微服务环境与工程搭建指南
  • Django REST Framework 企业级 API 架构设计与实战
  • CPP Summit 2020 学习笔记:系统架构与设计
  • Python 语言中的运算符详解与使用示例
  • JavaSE 网络原理:UDP 与 TCP 协议核心机制
  • VRChat 跨语言交流工具 VRCT 使用指南
  • Vue 与 C++:前端与系统开发差异
  • Ollama v0.17.0 更新:OpenClaw 自动安装、Web 搜索支持与 Tokenizer 性能优化
  • 基于 Hugging Face 与 TRL 微调大语言模型实战
  • 面试官常问:为什么 MySQL 不推荐滥用 JOIN?

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online