本文分享一些在线问题诊断的经验,主要是业务层面,服务层面的在线问题诊断一般需要依赖服务监控系统和报警系统来辅助定位问题。
在服务端的开发中,我觉得有这几类问题的诊断。
今天主要围绕第1类诊断来展开谈谈这类系统的设计与实现。
在线诊断架构图
如上图,该诊断系统需要具备以下几个能力。
诊断日志最重要的功能是:需要知道系统中每一步关键逻辑发生了什么。同时又不能够给在线系统带来相应的时间和空间的开销。所以需要给流量打上标记,标记这个流量是debug的模拟流量。
request:
{
"deviceId": "xxx",
"timeStamp":"1533101903000",
...
"debug":"on"; //线上实际流量没有这个标记.
}
返回结果:
response:
{
"status": "0",
"timeStamp":"1533101903000",
...
//线上实际流量没有这个标记.
"debugOnlineInfo": {
step1:{"", ""},
step2:{"", ""},
step3:{"", ""},
...
};
}
数据结构定好之后,如果很粗糙的在需要在日志埋点的地方都需要工程师去判断是不是debug=on,那工程师会崩溃的。所以功能上要做成无侵入业务的。我想没有人会愿意付出额外成本不断的去写如下代码:
...//业务逻辑A
if (debugOn == true) {
//工程师内心OS: 干嘛要让我判断啊,这种操作不应该封装好吗? fuck...
debugOnlineInfo.putLog("after loggic A, the result is xxx");
}
...//业务逻辑B
List<CommonBean> commonBeans = xxx.
if (debugOn == true) {
//工程师内心OS: 干嘛要让我遍历啊,这种操作不应该封装好吗? fuck...
debugOnlineInfo.putLog("after loggic B, the result is ", commonBeans.stream().map(e => e.getId()).collect(collectors.joining(",")));
}
4.实现 基于以上的分析,我们实现的时候需要考虑以下几个点:
image
DebuggerOnlineImpl用作在线诊断时候的实现,DebuggerOnlineNoOp作为线上实际流量的实现,线上的真实流量DebugOnline实现为空。
DebuggerOnlineImpl实现的时候有一些细节需要注意。
1.为了只打印关键信息,重载appendLog方法:
public <T> void appendLog(String key, Collection<T> collection, IdExtractor<T> idExtractor) {
if (StringUtils.isBlank(key)) {
return;
}
String value = collection.stream().map(idExtractor::get).collect(Collectors.joining(","));
debugMessage.put(key, value);
}
这里IdExtractor为一个解析类关键信息的接口,如果不这么做,直接toString()的话,那么会导致日志信息特别多,日志过多不利于我们定位问题。所以提供一个解析的类,可以供常用的遍历Collection,实现的时候用单例即可。
public void putLog(String key, Supplier<String> stringSupplier) {
if (StringUtils.isBlank(key) || stringSupplier == null) {
return;
}
String value = stringSupplier.get();
debugMessage.put(key, value);
}
比如想埋点某个map的所有Key,工程师埋点的时候一行代码即可搞定:
debugOnline.putLog("after logic A ",
() -> map.keySet().stream().collect(Collectors.joining(",")));
3.线程安全,有序
Map<String, StringBuilder> debugMessage = Collections.synchronizedMap(new LinkedHashMap<>());
要保证最后输出有序,所以我们最后用的是LinkedHashMap,保证线程安全,用的是Collections.synchronizedMap。
祝:搬砖愉快:)
本文分享自 Leetcode名企之路 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!