背景:Sentinel实现监控数据持久化的功能

Sentinel 控制台可以通过Sentinel 客户端预留的 API 从秒级监控日志中拉取监控数据,并进行聚合。

目前 Sentinel 控制台Dashboard中监控数据聚合后直接存在内存中,未进行持久化,且仅保留最近 5 分钟的监控数据。若需要监控数据持久化的功能,可以自行扩展实现 MetricsRepository 接口(0.2.0 版本),然后注册成 Spring Bean 并在相应位置通过 @Qualifier 注解指定对应的 bean name 即可。MetricsRepository 接口定义了以下功能:

  • save 与 saveAll:存储对应的监控数据
  • queryByAppAndResourceBetween:查询某段时间内的某个应用的某个资源的监控数据
  • listResourcesOfApp:查询某个应用下的所有资源

其中默认的监控数据类型为 MetricEntity,包含应用名称、时间戳、资源名称、异常数、请求通过数、请求 block 数、平均响应时间等信息。

同时用户可以自行进行扩展,适配 Grafana 等可视化平台,以便将监控数据更好地进行可视化。

对于监控数据的存储,用户需要根据自己的存储精度,来考虑如何存储这些监控数据。

持久化改造:

引入kafka-log4j-appender.jar 

       <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-log4j-appender</artifactId>
            <version>1.0.1</version>
        </dependency>
log4j.rootLogger=info,stdout,kafka0

# stdout配置
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%p]-[%c] %m%n


# kafka0配置
#定义一个名为kafka 为Appender
log4j.appender.kafka0=org.apache.kafka.log4jappender.KafkaLog4jAppender
#指定日志写入到Kafka的主题
log4j.appender.kafka0.topic=sentinel-metric
#制定连接kafka的地址
log4j.appender.kafka0.brokerList=xxx.0.1:9092
#压缩方式,默认为none
log4j.appender.kafka0.compressionType=none
#指定Producer发送消息的方式,默认是false,即异步发送
log4j.appender.kafka0.syncSend=true
#指定日志级别
log4j.appender.kafka0.Threshold=info
log4j.appender.kafka0.layout=org.apache.log4j.PatternLayout
log4j.appender.kafka0.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%p]-[%c] %m%n

在com.taobao.csp.sentinel.dashboard.repository.metric包下的InMemoryMetricsRepository类

public synchronized void save(MetricEntity entity) 方法中添加log4j日志:
 private Logger logger= Logger.getLogger(InMemoryMetricsRepository.class);
 
 logger.info(entity.toString());//打印日志

这种使用log4j会存在阻塞,可以参考下篇:Sentinel实现监控数据持久化:Log4j2日志异步输出到Kafka

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐