背景: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>

也可以参考上篇:Sentinel实现监控数据持久化:Log4j日志输出到Kafka 
 

Logo

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

更多推荐