博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Erlang 0073] Erlang Event Tracer 图形化展示
阅读量:6526 次
发布时间:2019-06-24

本文共 3235 字,大约阅读时间需要 10 分钟。

 Event Tracer (ET) 是Erlang类库里面比较有趣的一个东西,可以使用它进行事件数据收集并进行图形化展示.它可以收集事件数据并进行图形化展示.我觉得在初学阶段用这种方式获得更为直观的印象.官方文档地址:

 

下面几行代码快速启动了ET,我们看一下:

Eshell V5.9.1  (abort with ^G)1>  {ok, ViewerPid} = et_viewer:start([{title,"Coffee Order"}]),CollectorPid = et_viewer:get_collector_pid(ViewerPid).<0.36.0>2>   et_collector:report_event(CollectorPid,85,from,to,message,extra_stuff).{ok,{table_handle,<0.36.0>,16402,trace_ts,                  #Fun
}}3>

说明一下:

 {ok, ViewerPid} = et_viewer:start([{title,"Coffee Order"}]), %% 启动et_view的UI,并设定窗口的Title显示为Coffe Order

 CollectorPid = et_viewer:get_collector_pid(ViewerPid).        %% 创建采集器(Collector)进程

 
       et_collector:report_event(CollectorPid,85,from,to,message,extra_stuff).
%% et_collector:report_event(采集器Pid,85,from,to,message,extra_stuff).

   上面的85代表信息的详细程度,取值范围是1~100,可以通过这个值做一个简单的消息过滤;

 

下面利用手头的一个模块做一个demo:

-module(kv_view).-behaviour(gen_server).-export([start/0,start_link/0]).-export([init/1, handle_call/3, handle_cast/2, handle_info/2,        terminate/2, code_change/3]).%  exit(whereis(kv),kill).%%%-define(Server, ?MODULE).start() ->    gen_server:start({local,?Server},?MODULE,[],[]).start_link() ->    gen_server:start_link({local, ?Server}, ?MODULE, [], []).%%------callbacksinit([]) ->    process_flag(trap_exit,true),    R=ets:new(ets_kv,[named_table, {keypos ,1} ,set]),    {ok, Viewer} = et_viewer:start([{title,"K-V View"}, {max_actors,10}]),    C = et_viewer:get_collector_pid(Viewer),    et_collector:report_event(C,90,shell,k_v_server,init,[R]),   {ok ,[{collector,C}]}.     handle_call({lookup,Key},From ,[{collector,C}]=S)->     Result =ets:lookup(ets_kv,Key),     et_collector:report_event(C,80,From,k_v_server,lookup,[Result]),     {reply, Result ,S };    handle_call(mc, _From,{collector,C}=S) ->   timer:sleep(8000),     et_collector:report_event(C,80,shell,k_v_server,handle_call_but_late,[{sleep,8000}]),    {reply, {ok,but_late}, S};   handle_call(_Req, _From,[{collector,C}]=S) ->    {reply, ok, S}.handle_cast(stop ,S ) ->  {stop,normal,S};handle_cast({
add,K,V} ,[{collector,C}]=S) -> io:format("~p~n",[S]), ets:insert(ets_kv,{K,V}), et_collector:report_event(C,70,shell,k_v_server,handle_call_but_late,[{key,K},{value,V}]), {noreply ,S};handle_cast(Msg,{collector,C}=S) -> et_collector:report_event(C,60,shell,k_v_server,handle_cast,[{message,Msg}]), {noreply, S}.handle_info(die,S) -> exit(kv_die);% {noreply,S);handle_info(Info, [{collector,C}]=S) -> et_collector:report_event(C,20,shell,k_v_server,handle_info,[{message,Info}]), {noreply, S}.%% 如果进程是在supervisor中,那么如果被supervisor干掉 那么gen_server会调用回调函数terminate(shutdown,State)%%terminate(Reason, _S) -> io:format(" ~p Terminate By Reason: ~p ~n",[ self(),Reason ]), ok.code_change(_Oldvsn, S, _Extra) -> {ok, S}.

 

调用一下:

Eshell V5.9  (abort with ^G)1> kv_view:start().{ok,<0.32.0>}2> gen_server:cast(kv_view,{
add,name,"zen"}).[{collector,<0.37.0>}]ok3> gen_server:call(kv_view,{lookup,name}).[{name,"zen"}]4> gen_server:call(kv_view,{lookup,name}).[{name,"zen"}]5> gen_server:call(kv_view,{lookup,name}).[{name,"zen"}]6> whereis(kv_view)!hello_world.hello_world7> whereis(kv_view)!hello_world.hello_world8> exit(whereis(kv_view)).** exception exit: <0.32.0>9>

这样的调用之后,GUI同步绘制下面的图形:

转载地址:http://bgnbo.baihongyu.com/

你可能感兴趣的文章
微软企业级加解密解决方案MBAM架构
查看>>
没有苦劳,只有功劳!
查看>>
基于ThinkPHP写的一个简单的CMS系统
查看>>
ASA8.42的Windows AD域LDAP认证
查看>>
笔记——搭建简易NFS服务
查看>>
Exchange 2010 DAG local and Site DR/Failover and Fail back
查看>>
LigerUI - 树表格的数据来自Server
查看>>
AIP(Azure 信息保护)之五:添加水印与页眉页脚
查看>>
认证技术概述
查看>>
制作Windows Server 2003/08 image详细步骤与OpenStack介绍
查看>>
2016国赛小结
查看>>
Android Studio 第六十四期 - Android业务组件化之URL Scheme使用
查看>>
Hyper-V 2016 系列教程41 Windows 10 Hyper-V 系统要求
查看>>
EC2 WordPress 移动目录
查看>>
Windows Server 2008 启用公共文件夹共享
查看>>
【运维故事】职场如何领先一步?
查看>>
如何提高SEO优化团队效率
查看>>
做业务与技术之间的桥梁
查看>>
混合云服务哪家强? “天翼混合云”欲挑大梁
查看>>
SFB 项目经验-17-Windows 2012 R2-补丁打到最新-问题-KB2982006
查看>>