无论是异常监控还是业务监控,统统搞定
共 2943字,需浏览 6分钟
·
2022-03-16 06:15
点击上方蓝字“设为星标”
大家好,我是【架构摆渡人】,一只十年的程序猿。这是实践经验系列的第十二篇文章,这个系列会给大家分享很多在实际工作中有用的经验,如果有收获,还请分享给更多的朋友。
监控三板斧
在监控领域,最常用的三种方式就是Metrics, Tracing,Logging,可以称之为三板斧。
Metrics
Tracing
Logging
日志埋点
硬编码埋点
请求时间 请求用户 请求的接口 请求的RT 请求是否成功 请求的错误码 是否压测请求 等等。。。。
工具类伪代码如下:
public class BizLogUtils {
public static
T run(Supplier supplier, BizLogContent content, BiConsumer {callbackResult) long start = System.currentTimeMillis();
try {
T result = supplier.get();
if (result instanceof ResponseData) {
ResponseData resp = (ResponseData)result;
content.setBizCode(resp.getCode());
}
callbackResult.accept(result, content);
return result;
} catch (Exception e) {
if (e instanceof BizException) {
BizException he = (BizException)e;
content.setBizCode(he.getCode());
} else {
content.setBizCode(ErrorCode.SERVER_ERROR_CODE.getCode());
}
content.setErrorMessage(e.getMessage());
throw e;
} finally {
content.setExecTime(System.currentTimeMillis() - start);
content.setEnv(EnvConfig.getEnv());
BizLogger.info(content);
}
}
}
ResponseData 是接口层的统一响应类,所以这边可以直接强制装换。
BizLogContent 就是你要输出的日志内容。
在这里把异常给转换成错误码进行打印,如果有特殊的需求,也可以定义一个callback让使用自行进行异常到异常码的转换操作,更灵活。
使用方式:
BizLogContent bizLogContent = new BizLogContent(xx,xx,xx);
return BizLogUtils.run(() -> {
// 业务逻辑
}, bizLogContent, (resp, content)-> {
// resp 上面业务逻辑的响应结果,有的场景需要获取结果中的内容埋点
// content 也就是bizLogContent,拿到结果set进去
});
调整logback的配置,将日志要单独输出到一个文件,方便采集。格式可以是Json,也就是文本,如果是文本,可以用一个特殊的分隔符进行分隔,比如 2022-01-01|makeOrder|1001|success 。
自定义注解埋点
当硬编码的工具类有了,让使用更方便的做法就是自定义注解。通过定义注解,配置要采集的字段信息,通过注解加切面的方式来统一进行处理,这样就减少了代码的侵入性。
这边就不贴代码了,无非就是自定义注解,然后进行数据的提取。这里可以用SPEL表达式进行提取。
比如:
@BizLog(domain = BizLogConstant.SYNC, biz = BizLogConstant.SYNC_ORDER,
bizId = @BizLogField(key = "bizId", value = "#response.data.orderId",
addition = {
@BizLogField(key = "userId", value = "#request.userId"),
@BizLogField(key = "count", value = "#request.count")
}))
public ResponseData syncOrder(SyncOrderRequest request) {
}
总结
大家可以看到,通过日志埋点成本是非常低的。只需要开发一套日志卖点的工具类即可。然后将埋点的数据进行日志输出,然后进行日志收集就可以实现告警,和图表大盘的构建之类的,非常方便。
同样,本文的思路还可以应用到其他场景,比如操作日志的输出,也可以采用类似的方式去实现埋点,日志收集,数据展示。
原创:架构摆渡人(公众号ID:jiagoubaiduren),欢迎分享,转载请保留出处。