skywalking实战--agent异常日志监控
本源码来自于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异常日志监控相关推荐
- vue+sentry 前端异常日志监控
vue+sentry 前端异常日志监控 参考文章: (1)vue+sentry 前端异常日志监控 (2)https://www.cnblogs.com/qiezuimh/p/11440506.html ...
- Sentry异常日志监控-Java接入
Java 使用Sentry监控后台日志 1.0 平时怎么查看异常日志的? 大多时候查看日志都是通过查看日志文件,或者在命令行通过命令查看,这样是不是很不方便?是真的很不方便!!! 那么有没有什么工具可 ...
- jvm性能调优实战 - 49OOM异常进行监控以及online处理
文章目录 Pre 最佳的解决方案 一个比较成熟的系统监控体系的建议 一种比较Low的JVM OOM问题的被动发现方法 系统发生OOM了,应该怎么来处理 初步思路 自动dump内存快照 迄今为止我们可以 ...
- Logback异常日志监控告警
项目源码:https://github.com/sixj0/logback-warning 功能介绍: 配合logback日志使用,通过扩展Appender组件,实现在打印error日志时告警的功能, ...
- 如何在12个小时,搞定日志监控?
日志监控,是每个公司必须解决的一个问题.创业型公司,如何用半天的时间,搞定一个可扩展,通用的日志监控框架,是今天要聊的话题. 什么是日志监控? 关于日志,不同公司,情况不同: (1)A类公司:没有日志 ...
- Skywalking应用实战 Agent探针、Rocketbot以及告警
3 Skywalking应用 相关术语: skywalking-collector:链路数据归集器,数据可以落地ElasticSearch/H2 skywalking-ui:web可视化平台,用来展示 ...
- ElasticSearch实战-日志监控平台
1.概述 在项目业务倍增的情况下,查询效率受到影响,这里我们经过讨论,引进了分布式搜索套件--ElasticSearch,通过分布式搜索来解决当下业务上存在的问题.下面给大家列出今天分析的目录: El ...
- django异常日志_5分钟教你学会Django系统错误监控
话不多说,直入正题. 先上图,看一下监控的效果. 如下是监控我们网站系统错误的邮件.包含了请求的url地址,以及详细的异常信息. 一.监控所有的request请求 如何实现系统监控,自动发送错误日志的 ...
- Anemometer MySQL 【慢查询日志监控平台】(实战)
Anemometer 是一款开源的(慢查询)日志监控平台,当前主要用于 MySQL 的慢查询日志跟踪. Anemometer 演示地址:http://lab.fordba.com/anemometer ...
最新文章
- day16 递归函数
- 阿里云工业互联网平台开发样例
- MyBatis Mapper Demo
- Python爬虫学习笔记1:request、selenium、ChromeDrive、GeckoDriver等相关依赖安装
- centos 下 mysql 主从库搭建
- C# 9.0中引入的新特性init和record的使用思考
- docker 启动时指定需要绑定的网卡_Docker容器网络-基础篇
- 3从控制台输入三个数,并输出最大值
- elasticsearch服务相关脚本
- Egret入门学习日记 --- 第十六篇(书中 6.10~7.3节 内容)
- Drupal 7.17 发布,专业的 CMS 内容管理系统
- mysql 中将汉字(中文)按照拼音首字母排序
- 硬件虚拟化检测工具:securable
- linux 终止一个前台进程,Linux中前台起动的进程怎么结束?
- 华硕路由器远程连接配置指南
- win10系统开机启动连不上网
- 对选股宝实时信息进行爬虫
- nginx 404 not found错误查找
- 摄氏度符号英文计算机语言,英语符号
- java计算机毕业设计舞蹈网站源码+lw文档+系统+数据库