Skip to content

监控统计功能

xiaolyuh123 edited this page Sep 24, 2020 · 3 revisions

Layering Cache 的监控统计功能默认是开启的

Spring

直接在声明CacheManager Bean的时候将stats设置成true。

/**
 * 多级缓存配置
 *
 * @author yuhao.wang3
 */
@Configuration
@EnableAspectJAutoProxy
public class CacheConfig {

    @Bean
    public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
         LayeringCacheManager layeringCacheManager = new LayeringCacheManager(redisTemplate);
        // 默认开启统计功能
        layeringCacheManager.setStats(true);
        return layeringCacheManager;
    }
   ...
}

Spring Boot

在application.properties文件中添加以下配置即可

layering-cache.stats=true

缓存监控数据上报扩展

去实现CacheStatsReportService接口,然后将实现类注入到CacheManager中,如下是上报到CAT的示例:

/**
 * 多级缓存配置
 *
 * @author yuhao.wang3
 */
@Configuration
@Import({RedisConfig.class})
@EnableAspectJAutoProxy
public class CacheConfig {

    @Bean
    public CacheManager layeringCacheManager(RedisClient layeringCacheRedisClient, CacheStatsReportService cacheStatsReportService, LayeringCacheProperties layeringCacheProperties) {

        LayeringCacheManager layeringCacheManager = new LayeringCacheManager(layeringCacheRedisClient);
        // 默认开启统计功能
        layeringCacheManager.setStats(layeringCacheProperties.isStats());
        // 上报缓存统计信息
        layeringCacheManager.setCacheStatsReportService(cacheStatsReportService);
        // 设置缓存命名空间
        GlobalConfig.setNamespace(StringUtils.isBlank(layeringCacheProperties.getNamespace()) ? applicationName : layeringCacheProperties.getNamespace());
        return layeringCacheManager;
    }

    // 上报CAT示例
    @Bean
    public CacheStatsReportService cacheStatsReportService() {
        return cacheStatsInfos -> {
            for (CacheStatsInfo cacheStatsInfo : cacheStatsInfos) {

                Transaction transaction = Cat.newTransaction("layering-cache", cacheStatsInfo.getCacheName());

                try {
                    // 记录一个事件
                    Cat.logEvent("layering-cache", cacheStatsInfo.getCacheName(), Message.SUCCESS, JSON.toJSONString(cacheStatsInfo));
                    // 记录一个业务指标
                    String name = StringUtils.isBlank(cacheStatsInfo.getDepict()) ? cacheStatsInfo.getCacheName() : cacheStatsInfo.getDepict();
                    Cat.logMetricForSum(name + "-hitRate", cacheStatsInfo.getHitRate(), (int) cacheStatsInfo.getRequestCount());
                    Cat.logMetricForCount(name + "-firstSize", (int) cacheStatsInfo.getFirstCacheSize());
                    Cat.logMetricForCount(name + "-requestCount", (int) cacheStatsInfo.getRequestCount());

                    transaction.setDurationInMillis(cacheStatsInfo.getTotalLoadTime());
                    transaction.setStatus(Message.SUCCESS);
                } catch (Exception e) {
                    transaction.setStatus(e);
                } finally {
                    transaction.complete();
                }
            }
        };
    }

}

监控页面

直接单独部署layering-cache-web服务即可。

日志格式:

Layering Cache 统计信息:{"cacheName":"people1","depict":"查询用户信息1","firstCacheMissCount":3,"firstCacheRequestCount":4575,"hitRate":99.9344262295082,"internalKey":"4000-15000-8000","layeringCacheSetting":{"depict":"查询用户信息1","firstCacheSetting":{"allowNullValues":true,"expireMode":"WRITE","expireTime":4,"initialCapacity":10,"maximumSize":5000,"timeUnit":"SECONDS"},"internalKey":"4000-15000-8000","secondaryCacheSetting":{"allowNullValues":true,"expiration":15,"forceRefresh":true,"preloadTime":8,"timeUnit":"SECONDS","usePrefix":true},"useFirstCache":true},"missCount":3,"requestCount":4575,"secondCacheMissCount":3,"secondCacheRequestCount":100,"totalLoadTime":142}
  • 如果项目集成了ELK之类的日志框架,那我们可以直接基于以上日志做监控和告警。
  • 统计数据每隔一分钟采集一次
  1. 添加redis配置(需要查看缓存统计的redis服务器)

image.png

  1. 查询缓存命中率

image.png

  1. 缓存详细

image.png

Clone this wiki locally