程序告诉你的事情(节省自己的时间)

[size=medium]
系统运行在QA或产品环境上才是真正考虑我们程序员的时候。QA和OP看到任何异常时会求助于我们,然后我们经常的动作可能是:询问QA和OP问题出现的症状,登录到服务器上,查看日志和环境,分析问题。长此以往,发现自己的时间一天天浪费在回复QA:build是老的,网络中断,配置不是最新的,系统初始化失败,。。。
从我自己的经验来看,绝大部分报上来的问题是环境和依赖所导致。我们也不能依靠QAs来检查这些异常吧(他们会认为我们的代码是一头“怪物”)。

自力更生!让自己的程序来告诉我们,为什么现在出错了?
程序运行时,对大家来说,都是黑盒子。如果没有web监控方式,那么日志就是系统最好的“脸面”了,察言观色就从日志开始。
如果要追踪问题,我们希望看到哪些信息呢?我大概列出来:
[list]
[*]build version
[*]初始化的配置信息(用来检查配置是不是最新)
[*]重要的参数 (如请求地址,名称等等,它们只在内存中,平时是看不到的)
[*]依赖的状态 (网络是否正常,依赖的其它组件初始化是否正常,等)
[/list]

这些信息足够关键,如果QA和OP看到这些信息而不是原始的异常,那么他们也能基本定位问题,是吧?
另外一个问题,什么时候需要这些状态信息显示呢?在我看来,有这几个时间:
[list]
[*]系统启动后,提供服务之前 (用来判断启动是否正常)
[*]出现严重异常时 (不是NPE这些基本异常,和业务有关)
[*]外部监控请求系统状态时
[/list]

一般来说,外部监控只能得到系统进程的运行状态,它不能获取到有价值的内部状态。内部状态只有程序员才知道是否重要,是否有必要让外部
监控起来。对于这个问题,这里来分享一个简单的例子。

首先,每个需要监控起来的重要组件都要实现这样的一个接口,StateReporter。系统里面的重要组件一般是系统型的类,如xxxManager等触角
广泛的类。这些类一般可以提供足够多,足够广的状态信息。StateReporter很简单,除了收集所有想展现的状态信息外,还能起标识作用。[/size]

/**
* 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();

}


[size=medium]我的Manager类需要实现这个接口[/size]

public class TargetManager implements StateReporter


[size=medium]外部调用TargetManager[/size]

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());
}
}


[size=medium]就会出现这样的异常信息[/size]
[quote]
========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)
[/quote]

[size=medium]不管是开发还是其它有关人员,如果能从日志中看到这样的信息,就能基本明确问题的类型,避免对开发人员无谓的骚扰。当然,正常情况下,环境和状态检查对业务有一定影响,最好能避免频繁检查。

从这个例子可以看出,有时候我们只是把代码写好就算工作完成,当运行时出现异常情况时,只能疲于奔走,替以前的“懒惰”还债。如果能多做
一点力所能及的事情,不管对自己还是对别人,都会有好的收获。你觉着呢?[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值