系统运行在QA或产品环境上才是真正考虑我们程序员的时候。QA和OP看到任何异常时会求助于我们,然后我们经常的动作可能是:询问QA和OP问题出现的症状,登录到服务器上,查看日志和环境,分析问题。长此以往,发现自己的时间一天天浪费在回复QA:build是老的,网络中断,配置不是最新的,系统初始化失败,。。。
从我自己的经验来看,绝大部分报上来的问题是环境和依赖所导致。我们也不能依靠QAs来检查这些异常吧(他们会认为我们的代码是一头“怪物”)。
自力更生!让自己的程序来告诉我们,为什么现在出错了?
程序运行时,对大家来说,都是黑盒子。如果没有web监控方式,那么日志就是系统最好的“脸面”了,察言观色就从日志开始。
如果要追踪问题,我们希望看到哪些信息呢?我大概列出来:
- build version
- 初始化的配置信息(用来检查配置是不是最新)
- 重要的参数 (如请求地址,名称等等,它们只在内存中,平时是看不到的)
- 依赖的状态 (网络是否正常,依赖的其它组件初始化是否正常,等)
这些信息足够关键,如果QA和OP看到这些信息而不是原始的异常,那么他们也能基本定位问题,是吧?
另外一个问题,什么时候需要这些状态信息显示呢?在我看来,有这几个时间:
- 系统启动后,提供服务之前 (用来判断启动是否正常)
- 出现严重异常时 (不是NPE这些基本异常,和业务有关)
- 外部监控请求系统状态时
一般来说,外部监控只能得到系统进程的运行状态,它不能获取到有价值的内部状态。内部状态只有程序员才知道是否重要,是否有必要让外部
监控起来。对于这个问题,这里来分享一个简单的例子。
首先,每个需要监控起来的重要组件都要实现这样的一个接口,StateReporter。系统里面的重要组件一般是系统型的类,如xxxManager等触角
广泛的类。这些类一般可以提供足够多,足够广的状态信息。StateReporter很简单,除了收集所有想展现的状态信息外,还能起标识作用。
/**
* Implementation of this interface should collect/re-check state of
* primary in-memory parameters and
* system dependencies(DB, network or other 'heavy' components).
* <br>
* System could report state information when fatal or
* specified exception occurred, checking periodically ...
* <br>
* To reduce the invocation frequently.
*
* @author dennyy99@gmail.com
* @since 2012-5-15
* @version 1.0
*/
public interface StateReporter {
public String LF = "\n";
public String CR = "\r";
public String SPLIT_MSG = "========Additional State========" + LF;
/**
* Obtains state information from implementation
*
* @return state collection for troubleshooting and system monitoring
*/
public String obtainStateReport();
}
我的Manager类需要实现这个接口
public class TargetManager implements StateReporter
外部调用TargetManager
TargetManager manager = new TargetManager("Baidu");
try {
manager.requestRemote("http://www.baidu.com/");
} catch (Exception e) {
e.printStackTrace();
if (manager != null && manager instanceof StateReporter) {
System.out.println("Error occurs. Additional msg:");
System.out.println(manager.obtainStateReport());
}
}
就会出现这样的异常信息
引用
========Additional State========
Build : build_231
Target : Baidu
Network : connection failed
========Additional State========
java.lang.IllegalStateException: HTTP status code : 501
at lang.envchecking.TargetManager.requestRemote(TargetManager.java:58)
at lang.envchecking.EnvCheckingDemo.main(EnvCheckingDemo.java:19)
不管是开发还是其它有关人员,如果能从日志中看到这样的信息,就能基本明确问题的类型,避免对开发人员无谓的骚扰。当然,正常情况下,环境和状态检查对业务有一定影响,最好能避免频繁检查。
从这个例子可以看出,有时候我们只是把代码写好就算工作完成,当运行时出现异常情况时,只能疲于奔走,替以前的“懒惰”还债。如果能多做
一点力所能及的事情,不管对自己还是对别人,都会有好的收获。你觉着呢?
分享到:
相关推荐
它激励我做更多的程序) 此程序适用于 Windows 10(我尚未在 mac 中测试过) 我创建了一个程序,它告诉用户何时电池已满,何时电池电量低。 此外,当您插入充电器时,它会说一些有趣的事情。 例如... 当电池电量...
您可以在查看该应用程序使用的技术栈JavaScript Bootstrap(只是为了节省时间)当前用户界面新的功能添加标签给你的笔记赋予不同的颜色给一个按钮一次删除所有笔记注释的时间戳根据时间、标签或颜色对笔记进行排序...
任何经常醒来的人都可以告诉你,这并不有趣。 松弛未读 Slack渠道缺乏组织和上下文,这意味着大量使用Slack的人每天都必须手动浏览数百条消息以查找与其相关的内容。 松弛的渠道对于经理和参与多个项目的其他人来...
需要更新... HTML5 Java Web 应用程序原型,具有最新和最好的组件。... 如果你做一些简单的事情,它不会告诉你三层,也不会告诉你使用哪个持久层,而是尽量节省你启动和设置新 web 项目的时间,而不是
避免在浏览模因时无休止地滚动,并在大笑的同时节省时间! 长描述 坦白地说,我们所有人都有不断滚动我们最喜欢的米姆网站Reddit的趋势,同时告诉我们的同事我们要休息了。 直到您意识到,鱼,一个小时过去了,所有...
C:少走弯路,节省时间 不知不觉开始做广告了,请原谅,处其位谋其事,总得为尚学堂说点什么:) 言归正传,如何查搜索引擎? 先精后粗,首先先进行尽量精确的查找,比如一个错误,SocketException,你怀疑它...
为我生成的所有东西节省了很多时间,而且自从它们的自述文件告诉我以来:这是我的简介得以实现的地方: 首先,我想谈谈API。 我认为最大的麻烦和浪费时间是我最消耗Echonest API的时间。 我发现了一个附加项,当然...
创建旋转实例AMI和卷备份 与无服务器! 在以下找到: : 作者 ...目的 开始在整个AWS帐户中为实例和... 这个lambda的作用有限,只允许它做自己需要做的事情,没有有趣的事情 这还告诉CloudWatch Events每天自动运行一次
简化缓存策略并节省时间 没有适当的抽象层,实现高可用性和并发缓存策略可能是一项复杂且耗时的任务。 Laravel Model Repository使用人类可读的链接方法为您现有的Eloquent模型简化了缓存策略:) 节省缓存存储空间...
- **创建非交互式响应文件**:通过创建一个响应文件来自动化整个补丁安装流程,避免在安装过程中出现的交互式提示,从而节省时间。 - **使用特定选项应用补丁**:在应用补丁时使用 nocompiledb、nomaintainmrc 和 ...
(Torvalds@kruuna.helsinki.fi)写了 Linux核心程序的 0.02 版开始的,但其后的发展却几乎都 是由互联网上的 Linux社团(Linux Community)互通交流而完成的。Linux 不属于任何一 家公司或个人,任何人都可以免费取得...
让你自己减少重复性的编程工作),这无疑是成为一个优秀 程序员的必备条件. 整个设计模式贯穿一个原理:面对接口编程,而不是面对实现.目标原则是:降低耦合,增强灵活性. 建筑和软件中模式之异同 CSDN 的透明特别推崇...
现代科技,如智能家居设备和智能烹饪工具,使人们的生活更加便利,能够随时随地享受美食,同时节省时间和精力,这是人类智慧的体现。 5. **社交与交流**:“饭菜可能对语言的产生也有影响,至少它对语言的精密化起...
- **指定数据源**:告诉SAS程序从何处读取原始数据是数据导入的基础。 - **处理分隔符数据**:无论是以空格还是特定字符分隔的数据,SAS都有相应的方法进行读取。 - **非标准格式数据**:对于不遵循标准格式的数据...
本书既不是一本关于设计模式的书,也不是一本关于软件工程的书,它告诉你的不仅仅是一些正确的方式或者错误的方式。它让你站在那些优秀软件设计师的肩膀上,从他们的角度来看待问题。 本书给出了38位大师级程序员在...
通过查看列表和图片,无需单击即可节省时间。 新版v3.2! 了解为什么超过35000的人喜欢商店中的NUMBER 1 craigslist应用! 将鼠标悬停在Craigslist帖子上,即可立即查看它们,而无需离开搜索结果。 节省浏览...