7.4.4 创建自定义跟踪仓库
默认情况下,/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 服务器正常运行。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论