返回介绍

7.4.4 创建自定义跟踪仓库

发布于 2025-04-21 21:10:11 字数 3374 浏览 0 评论 0 收藏

默认情况下,/trace 端点报告的跟踪信息都存储在内存仓库里,100 个条目封顶。一旦仓库满了,就开始移除老的条目,给新的条目腾出空间。在开发阶段这没什么问题,但在生产环境中,大流量会造成跟踪信息还没来得及看就被丢弃。

为了避免这个问题,你可以声明自己的 InMemoryTraceRepository Bean,将它的容量调整至 100 以上。如下配置类可以将容量调整至 1000 个条目:

package readinglist;
import org.springframework.boot.actuate.trace.InMemoryTraceRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ActuatorConfig {

  @Bean
  public InMemoryTraceRepository traceRepository() {
    InMemoryTraceRepository traceRepo = new InMemoryTraceRepository();
    traceRepo.setCapacity(1000);
    return traceRepo;
  }

}

仓库容量翻了 10 倍,跟踪信息的保存时间应该会更久。不过,繁忙到一定程度,应用程序还是可能在你查看这些信息前将其丢弃。这是一个内存存储的仓库,还要避免容量增长太多,影响应用程序的内存使用。

除了上述方法,我们还可以将那些跟踪条目存储在其他地方 - 既不消耗内存,又能长久保存的地方。只需实现 Spring Boot 的 TraceRepository 接口即可:

package org.springframework.boot.actuate.trace;
import java.util.List;
import java.util.Map;

public interface TraceRepository {
  List<Trace> findAll();
  void add(Map<String, Object> traceInfo);
}

如你所见, TraceRepository 只要求我们实现两个方法:一个方法查找所有存储的 Trace 对象,另一个保存了一个 Trace ,包含跟踪信息的 Map 对象。

作为演示,假设我们创建了一个使用 MongoDB 数据库存储跟踪信息的 TraceRepository 实例。代码清单 7-11 演示了如何实现这个 TraceRepository

代码清单 7-11 往 MongoDB 保存跟踪数据

package readinglist;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.trace.Trace;
import org.springframework.boot.actuate.trace.TraceRepository;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.stereotype.Service;

@Service
public class MongoTraceRepository implements TraceRepository {

  private MongoOperations mongoOps;

  @Autowired
  public MongoTraceRepository(MongoOperations mongoOps) {    ←---注入 MongoOperations
    this.mongoOps = mongoOps;
  }

  @Override
  public List<Trace> findAll() {
    return mongoOps.findAll(Trace.class);    ←---获取所有跟踪条目
  }

  @Override
  public void add(Map<String, Object> traceInfo) {
    mongoOps.save(new Trace(new Date(), traceInfo));    ←---保存一个跟踪条目
  }

}

findAll() 方法很直白,用注入的 MongoOperations 来查找全部 Trace 对象。 add() 方法稍微有趣一点,用当前时间和含有跟踪信息的 Map 创建了一个 Trace 对象,然后通过 MongoOperations.save() 将其保存下来。唯一的问题是, MongoOperations 是哪里来的?

为了使用 MongoTraceRepository ,我们需要保证 Spring 应用程序上下文里先有一个 MongoOperations Bean。得益于 Spring Boot 的起步依赖和自动配置,做到这一点只需添加 MongoDB 起步依赖即可。你需要如下 Gradle 依赖:

compile("org.springframework.boot:spring-boot-starter-data-mongodb")

如果你用的是 Maven,则需要如下依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

添加了这个起步依赖后,Spring Data MongoDB 和所依赖的库会添加到应用程序的 Classpath 里。Spring Boot 会自动配置所需的 Bean,以便使用 MongoDB 数据库。这些 Bean 里就包括 MongoOperations 。另外,你需要确保和 MongoOperations 通讯的 MongoDB 服务器正常运行。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。