本源码来自于skywalking-agent 8.9.0版本

文章目录

  • 背景
  • 实现历程
  • 最终报表效果

背景

由于skywalking-agent客户端改为sidecar部署,每次更新skywalking-agent会使所有的项目都更新。 在各个服务中,并且很多业务服务的请求量很大、业务很是复杂,每次更新客户端时我们没办法每个业务流程都测试到位,我们担心某次的客户端更新导致测试环境出现问题,甚至是生产环境出现问题。如果能及时发现还能做对应的补救,如果是我们无法自己发现问题,需要业务方来联系我们那么问题的严重性就要被升级了。所以我们想是否有种机制可以让我们主动发现skywlaking-agent出现问题?如果我们在skywalking-agent的error出现时去报警是否可行?

实现历程

最初我们的想法是直接在AbstractLogger的error方法处进行promethues打点记录。代码案例如下:

@Overridepublic void error(String message, Throwable throwable) {if (this.isErrorEnable()) {Metrics.counter("skywalking-agent_error_log","");this.logger(LogLevel.ERROR, message, throwable);}}

这种实现方式在本地进行测试时还可以正常运行,但是到了容器环境就出现了报错,报错的意思就是说在tomcat容器还未初始化完成就进行了 promethues 的注册。


12/09 14:28:19 {"instant":{"epochSecond":1670567299,"nanoOfSecond":713000000},"thread":"main","level":"ERROR","loggerName":"org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter","message":"\n\n***************************\nAPPLICATION FAILED TO START\n***************************\n\nDescription:\n\nAn attempt was made to call a method that does not exist. The attempt was made from the following location:\n\n    io.micrometer.prometheus.PrometheusMeterRegistry.<init>(PrometheusMeterRegistry.java:67)\n\nThe following method did not exist:\n\n    io.micrometer.prometheus.PrometheusConfig.requireValid()V\n\nThe method's class, io.micrometer.prometheus.PrometheusConfig, is available from the following locations:\n\n    jar:file:/www/root-spring-boot.jar!/BOOT-INF/lib/micrometer-registry-prometheus-1.6.3.jar!/io/micrometer/prometheus/PrometheusConfig.class\n\nThe class hierarchy was loaded from the following locations:\n\n    io.micrometer.prometheus.PrometheusConfig: jar:file:/www/root-spring-boot.jar!/BOOT-INF/lib/micrometer-registry-prometheus-1.6.3.jar!/\n\n\nAction:\n\nCorrect the classpath of your application so that it contains a single, compatible version of io.micrometer.prometheus.PrometheusConfig\n","endOfBatch":false,"loggerFqcn":"org.apache.commons.logging.LogAdapter$Log4jLog","skyWalkingDynamicField":{"traceId":"N/A"},"threadId":1,"threadPriority":5,"requestId":"${ctx:requestId}","traceId":"${ctx:traceId}"}

出现这个问题后想到的就是能否在tomcat实例化后再进行 promethues 注册,其实也是不合理的,因为有的项目可能使用的不是tomcat容器。

最终想到的就是 AbstractLogger的error方法 内不使用 promethues 打点,但是用一个 AtomicLong 记录 error日志的次数,在 promethues 进行注册时拦截,并暴露 error日志的次数 的指标。

代码如下:

下面是 AbstractLogger 的大致代码

public abstract class AbstractLogger implements ILog {public static AtomicLong incr = new AtomicLong(0);@Overridepublic void error(Throwable throwable, String message, Object... objects) {if (this.isErrorEnable()) {incr.incrementAndGet();this.logger(LogLevel.ERROR, replaceParam(message, objects), throwable);}}}

插件定义的代码如下:

public class MetricsInstrumentation extends ClassStaticMethodsEnhancePluginDefine {/*** Enhance class.*/private static final String ENHANCE_CLASS = "io.micrometer.core.instrument.Metrics";/*** The intercept class for "invoke" method in the class "org.apache.catalina.core.StandardWrapperValve"*/private static final String INTERCEPT_CLASS = "org.apache.skywalking.apm.plugin.metrics.v1.MetricsAddRegistryInterceptor";@Overridepublic ConstructorInterceptPoint[] getConstructorsInterceptPoints() {return null;}@Overridepublic StaticMethodsInterceptPoint[] getStaticMethodsInterceptPoints() {return new StaticMethodsInterceptPoint[]{new StaticMethodsInterceptPoint() {@Overridepublic ElementMatcher<MethodDescription> getMethodsMatcher() {return named("addRegistry");}@Overridepublic String getMethodsInterceptor() {return INTERCEPT_CLASS;}@Overridepublic boolean isOverrideArgs() {return false;}}};}@Overrideprotected ClassMatch enhanceClass() {return NameMatch.byName(ENHANCE_CLASS);}
}

增强代码如下:

public class MetricsAddRegistryInterceptor implements StaticMethodsAroundInterceptor {private static ILog LOGGER = LogManager.getLogger(MetricsAddRegistryInterceptor.class);private int init = 0;@Overridepublic void beforeMethod(Class clazz, Method method, Object[] allArguments, Class<?>[] parameterTypes, MethodInterceptResult result) {}@Overridepublic Object afterMethod(Class clazz, Method method, Object[] allArguments, Class<?>[] parameterTypes, Object ret) {return null;}@Overridepublic void handleMethodException(Class clazz, Method method, Object[] allArguments, Class<?>[] parameterTypes, Throwable t) {}@Overridepublic void onAfterMethod(Long startTime, Class clazz, Method method, Object[] allArguments, Class<?>[] parameterTypes, Object ret) {if (init != 0) {return;}MeterRegistry registry = (MeterRegistry) allArguments[0];try {Field field = registry.getClass().getDeclaredField("collectorMap");field.setAccessible(true);Object o = field.get(registry);if (null != o) {ConcurrentHashMap map = (ConcurrentHashMap) o;if (map.size() > 0) {Metrics.gauge(MetricsConfig.SERVICE_ERROR_CODE, AbstractLogger.incr);init = 1;}}} catch (Exception e) {LOGGER.error(e,"MetricsAddRegistryInterceptor error");}}
}

最终报表效果

配合上报警系统就可以在 出现异常时及时报警

有了这个功能在出现skywalking-agent问题是我们可以提早知道问题,并做回退处理,在业务方发现之前把问题覆盖掉。

skywalking实战--agent异常日志监控相关推荐

  1. vue+sentry 前端异常日志监控

    vue+sentry 前端异常日志监控 参考文章: (1)vue+sentry 前端异常日志监控 (2)https://www.cnblogs.com/qiezuimh/p/11440506.html ...

  2. Sentry异常日志监控-Java接入

    Java 使用Sentry监控后台日志 1.0 平时怎么查看异常日志的? 大多时候查看日志都是通过查看日志文件,或者在命令行通过命令查看,这样是不是很不方便?是真的很不方便!!! 那么有没有什么工具可 ...

  3. jvm性能调优实战 - 49OOM异常进行监控以及online处理

    文章目录 Pre 最佳的解决方案 一个比较成熟的系统监控体系的建议 一种比较Low的JVM OOM问题的被动发现方法 系统发生OOM了,应该怎么来处理 初步思路 自动dump内存快照 迄今为止我们可以 ...

  4. Logback异常日志监控告警

    项目源码:https://github.com/sixj0/logback-warning 功能介绍: 配合logback日志使用,通过扩展Appender组件,实现在打印error日志时告警的功能, ...

  5. 如何在12个小时,搞定日志监控?

    日志监控,是每个公司必须解决的一个问题.创业型公司,如何用半天的时间,搞定一个可扩展,通用的日志监控框架,是今天要聊的话题. 什么是日志监控? 关于日志,不同公司,情况不同: (1)A类公司:没有日志 ...

  6. Skywalking应用实战 Agent探针、Rocketbot以及告警

    3 Skywalking应用 相关术语: skywalking-collector:链路数据归集器,数据可以落地ElasticSearch/H2 skywalking-ui:web可视化平台,用来展示 ...

  7. ElasticSearch实战-日志监控平台

    1.概述 在项目业务倍增的情况下,查询效率受到影响,这里我们经过讨论,引进了分布式搜索套件--ElasticSearch,通过分布式搜索来解决当下业务上存在的问题.下面给大家列出今天分析的目录: El ...

  8. django异常日志_5分钟教你学会Django系统错误监控

    话不多说,直入正题. 先上图,看一下监控的效果. 如下是监控我们网站系统错误的邮件.包含了请求的url地址,以及详细的异常信息. 一.监控所有的request请求 如何实现系统监控,自动发送错误日志的 ...

  9. Anemometer MySQL 【慢查询日志监控平台】(实战)

    Anemometer 是一款开源的(慢查询)日志监控平台,当前主要用于 MySQL 的慢查询日志跟踪. Anemometer 演示地址:http://lab.fordba.com/anemometer ...

最新文章

  1. day16 递归函数
  2. 阿里云工业互联网平台开发样例
  3. MyBatis Mapper Demo
  4. Python爬虫学习笔记1:request、selenium、ChromeDrive、GeckoDriver等相关依赖安装
  5. centos 下 mysql 主从库搭建
  6. C# 9.0中引入的新特性init和record的使用思考
  7. docker 启动时指定需要绑定的网卡_Docker容器网络-基础篇
  8. 3从控制台输入三个数,并输出最大值
  9. elasticsearch服务相关脚本
  10. Egret入门学习日记 --- 第十六篇(书中 6.10~7.3节 内容)
  11. Drupal 7.17 发布,专业的 CMS 内容管理系统
  12. mysql 中将汉字(中文)按照拼音首字母排序
  13. 硬件虚拟化检测工具:securable
  14. linux 终止一个前台进程,Linux中前台起动的进程怎么结束?
  15. 华硕路由器远程连接配置指南
  16. win10系统开机启动连不上网
  17. 对选股宝实时信息进行爬虫
  18. nginx 404 not found错误查找
  19. 摄氏度符号英文计算机语言,英语符号
  20. java计算机毕业设计舞蹈网站源码+lw文档+系统+数据库

热门文章

  1. aden -接球游戏 2.0
  2. UCK全球路演走进佛山,跨链技术将加速区块链商业应用
  3. 2018北大暑校acm算法训练课程 海贼王之伟大航路 状压dp
  4. linux ftp主动和被动模式切换命令,Linux iptables配置FTP的主动和被动模式
  5. matlab怎么列向量归一化语句,matlab向量归一化
  6. 阿俊带你用Kotlin刷算法(二)
  7. 中国数学家破解世界百年难题
  8. 程序人生:如果纯做业务测试的话,在测试行业有出路吗?
  9. 第45届ICPC沈阳站部分题解(D、F、G、H、I、J、K)
  10. HANA用户权限设置