Archive

Posts Tagged ‘et’

seq_trace集群消息链跟踪利器

October 3rd, 2011 No comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: seq_trace集群消息链跟踪利器

做过网络集群服务器的的同学都知道,集群服务通常由不同的服务器组成,这些不同角色的服务器组合在一起共同完成了特定的服务。一个服务通常需要一个协调者,和不同的工作者。 协调者负责派发任务,接收工作者的完成情况,最终回馈给用户。举个例子来讲,拨打电话:首先需要确认你的号码是在有效的,同时还要看下你的帐号里面有钱不,还要看下你拨打的电话号码是不是由权限,电话打的时候需要扣钱,等等。 这些服务中间的任何一个环节出问题了,服务就不正常了。那么我们在服务出问题的时候,如何定位问题呢?通常的办法是打日志,在所有的参与服务的节点上打开日志记录,之后到所有的节点上收集日志,集中分析日志,相当的麻烦。

这时候seq_trace来救助了,seq_trace的目标就是能够跟踪一条消息经过的所有环节,最终把路径展现给用户。
铺垫材料:
seq_trace工作原理,请参考这里
ttb对seq_trace的支持参考这里
tdbg对seq_trace的支持参考这里
Read more…

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Erlang探索 Tags: , , ,

从Megaco学如何写诊断代码

April 1st, 2010 3 comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: 从Megaco学如何写诊断代码

Megaco/H.248 is a protocol for control of elements in a physically decomposed multimedia gateway, enabling separation of call control from media conversion. A Media Gateway Controller (MGC) controls one or more Media Gateways (MG).

Megaco有非常清晰的日志和诊断供我们参考, 精细到几行代码一个诊断信息, 非常好的风格. 有了这些信息对系统的运行完全了如指掌.

有3种方式:
1. 大量的调试日志, 在DEBUG方式下, 会有大量的系统允许期间的轨迹和消息

%%%----------------------------------------------------------------------                                                                                                                         %%% Debug                                                                                                                                                                                                      
%%%----------------------------------------------------------------------  
-ifdef(megaco_debug).                                                                               
-define(d(F,A), io:format("~w: " ++ F ++ "~n",[?MODULE|A])). 
-else.
-define(d(F,A), ok).
-endif.

用起来很方便, 摘抄一段如下

?d("encode(~p) -> entry with"
"~n   PackageItem: ~p"
"~n   SubItem:     ~p", [Scope, PackageItem, SubItem]),

2. 异常日志, 用于记录程序允许中间产生的各种各样的异常, 便于事后调查.

%%%----------------------------------------------------------------------                                                                                                                         %%% Error/warning/info message macro(s)                                                                                                                                                                        
%%%----------------------------------------------------------------------                                                                                                                         -define(megaco_info(F, A),                                                                                                                                                                                     
        (catch error_logger:info_msg("[ ~w : ~w : ~p ] ~n" ++ F ++ "~n", [?APPLICATION, ?MODULE, self()|A]))).
                                                                                                                                                                                                               
-define(megaco_warning(F, A),                                                                                                                                                                                  
        (catch error_logger:warning_msg("[ ~w : ~w : ~p ] ~n" ++ F ++ "~n", [?APPLICATION, ?MODULE, self()|A]))).
                                                                                                                                                                                                               
-define(megaco_error(F, A),                                                                                                                                                                                    
        (catch error_logger:error_msg("[ ~w : ~w : ~p ] ~n" ++ F ++ "~n",[?APPLICATION, ?MODULE, self()|A]))). 

使用, 摘抄一段如下

warning_msg(F, A) ->                                                                                
   ?megaco_warning("Transaction sender: " ++ F, A). 
error_msg(F, A) ->                                       
   ?megaco_error("Transaction sender: " ++ F, A).

3. Event Trace机制
先进的trace能够让系统的消息交互,运行轨迹以可视的方式体现在用户面前.

%%%----------------------------------------------------------------------                                                                                                                         
%%% Event Trace                                                                                                                                                                                                
%%%----------------------------------------------------------------------                                                                                                                         -ifdef(megaco_trace_io).
-define(report(Level, C, Label, Contents),
        io:format("*** [~s] ~p ~p *** "
                  "~n   ~p[~p] " ++ Label ++
                  "~n   ~p"
                  "~n   ~p"
                  "~n",
                  [megaco:format_timestamp(now()),
                   self(), Level, ?MODULE, ?LINE, C, Contents])).
-else.
-define(report(Level, C, Label, Contents),
        megaco:report_event(Level, ?APPLICATION, Label,
                            [{line, ?MODULE, ?LINE}, C | Contents])).
-endif.

-define(report_important(C, Label, Contents), ?report(20, C, Label, Contents)).
-define(report_verbose(  C, Label, Contents), ?report(40, C, Label, Contents)).
-define(report_debug(    C, Label, Contents), ?report(60, C, Label, Contents)).
-define(report_trace(    C, Label, Contents), ?report(80, C, Label, Contents)).

使用, 摘抄一段如下

?report_trace(ReceiveHandle, "callback: syntax error", [ErrorDesc, Error]), 

实际效果图(点击放大):

总结: ET很强大, 而且是专门为Megaco开发的, 目的就是能够可视化看到Megaco系统组件见的消息流程交互.

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Erlang探索 Tags: , ,