Sentinel实现监控数据持久化(2):Log4j2日志异步输出到Kafka
背景:Sentinel实现监控数据持久化的功能Sentinel 控制台可以通过Sentinel 客户端预留的 API从秒级监控日志中拉取监控数据,并进行聚合。目前 Sentinel 控制台中监控数据聚合后直接存在内存中,未进行持久化,且仅保留最近 5 分钟的监控数据。若需要监控数据持久化的功能,可以自行扩展实现MetricsRepository接口(0.2.0 版本),然后注册成 S...
背景:Sentinel实现监控数据持久化的功能
Sentinel 控制台可以通过Sentinel 客户端预留的 API 从秒级监控日志中拉取监控数据,并进行聚合。
目前 Sentinel 控制台中监控数据聚合后直接存在内存中,未进行持久化,且仅保留最近 5 分钟的监控数据。若需要监控数据持久化的功能,可以自行扩展实现 MetricsRepository
接口(0.2.0 版本),然后注册成 Spring Bean 并在相应位置通过 @Qualifier
注解指定对应的 bean name 即可。MetricsRepository
接口定义了以下功能:
save
与saveAll
:存储对应的监控数据queryByAppAndResourceBetween
:查询某段时间内的某个应用的某个资源的监控数据listResourcesOfApp
:查询某个应用下的所有资源
其中默认的监控数据类型为 MetricEntity
,包含应用名称、时间戳、资源名称、异常数、请求通过数、请求 block 数、平均响应时间等信息。
同时用户可以自行进行扩展,适配 Grafana 等可视化平台,以便将监控数据更好地进行可视化。
对于监控数据的存储,用户需要根据自己的存储精度,来考虑如何存储这些监控数据。
持久化改造:
采用log4j2 KafkaAppender接入Kafka消息队列的模式
POM配置文件,一定要排除log4j,引入log4j2
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.1.1</version>
<!--<version>0.10.0.0</version>-->
<exclusions> <!-- exclude掉过时的log4j依赖 -->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- log4j2 async -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
</dependency>
<!--log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
</dependency>
在log4j-core的jar包里有KafkaAppender
@Plugin(name = "Kafka", category = Node.CATEGORY, elementType = Appender.ELEMENT_TYPE, printObject = true)
public final class KafkaAppender extends AbstractAppender {}
其中 @Plugin 的name属性对应的log4j2.xml配置文件里面Kafka标签,当然这个也可以自定义。与此同时,也需要将 @Plugin 的name属性改为MyKafka。如下配置:
<MyKafka name="KafkaAppender" topic="sentinel-metric" syncSend="false">
在springboot配置文件中: logging.config= classpath:log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出
monitorInterval : Log4j能够自动检测修改配置文件和重新配置本身, 设置间隔秒数。
-->
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT" ignoreExceptions="false">
<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] (%F:%L) - %m%n" />
</Console>
<Kafka name="KafkaAppender" topic="sentinel-metric" syncSend="false">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] (%F:%L) - %m%n" />
<Property name="bootstrap.servers">192.168.0.1:9092</Property>
<Property name="timeout.ms">10000</Property>
</Kafka>
</Appenders>
<Loggers>
<!-- 配置日志的根节点 -->
<Root>
<AppenderRef ref="Console" level="INFO"/>
</Root>
<Logger name="org.apache.kafka" level="INFO" /> <!-- avoid recursive logging name:指定包名类-->
<!-- 日志继承root,但是root将日志输出控制台,而将日志输出到文件,通过属性'additivity="false"'日志不再输出到控制台 -->
<AsyncLogger name="com.taobao.csp.sentinel.dashboard.repository.metric.InMemoryMetricsRepository"
additivity="true" level="INFO" >
<AppenderRef ref="KafkaAppender" />
</AsyncLogger>
</Loggers>
</Configuration>
更多推荐
所有评论(0)