[Erlang 0073] Erlang Event Tracer 图形化展示

简介:

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

 

下面几行代码快速启动了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<et_collector.0.92094374>}}
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, [], []).


%%------callbacks
init([]) ->
    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>}]
ok
3> 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_world
7> whereis(kv_view)!hello_world.
hello_world
8> exit(whereis(kv_view)).
** exception exit: <0.32.0>
9>
复制代码

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

目录
相关文章
|
7月前
|
关系型数据库 MySQL Java
Window环境linux环境安装skywalking
Window环境linux环境安装skywalking
115 0
|
4月前
|
Ubuntu Linux 开发工具
【事件中心 Azure Event Hub】在Linux环境中(Ubuntu)安装Logstash的简易步骤及配置连接到Event Hub
【事件中心 Azure Event Hub】在Linux环境中(Ubuntu)安装Logstash的简易步骤及配置连接到Event Hub
|
4月前
|
消息中间件 开发工具
【Azure Event Hub】原生应用中使用RabbitMQ,是否可以不改动代码的情况下直接转换为使用Event Hub呢?
【Azure Event Hub】原生应用中使用RabbitMQ,是否可以不改动代码的情况下直接转换为使用Event Hub呢?
|
5月前
|
机器人 Shell 开发者
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
|
6月前
|
XML Linux API
探索Linux中的dbus-binding-tool:理解其用途与用法
`dbus-binding-tool`是Linux D-Bus工具集的一部分,用于从XML接口描述生成语言绑定代码,简化D-Bus服务在应用程序中的集成。它支持自动代码生成,多种语言(如C、C++、Python),并提供灵活性以适应特定需求。使用步骤包括获取XML描述文件,运行工具生成代码,然后在应用中使用生成的API。注意版本兼容性、错误处理,并参考官方文档和示例以优化使用。该工具助力开发人员高效实现进程间通信和系统服务集成。
|
机器人 测试技术 数据库
RobotFramework 官方demo Quick Start Guide rst配置文件分析
RobotFramework 官方demo Quick Start Guide rst配置文件分析
151 0
|
监控 Linux Shell
erlang无图形界面的linux下如何使用observer:start(). --- ★firecat推荐★
erlang无图形界面的linux下如何使用observer:start(). --- ★firecat推荐★
255 0
erlang无图形界面的linux下如何使用observer:start(). --- ★firecat推荐★
|
数据采集 中间件 Python
Python爬虫从入门到放弃(二十三)之 Scrapy的中间件Downloader Middleware实现User-Agent随机切换
总架构理解Middleware 通过scrapy官网最新的架构图来理解: 这个图较之前的图顺序更加清晰,从图中我们可以看出,在spiders和ENGINE提及ENGINE和DOWNLOADER之间都可以设置中间件,两者是双向的,并且是可以设置多层. 关于Downloader Middleware我在http://www.cnblogs.com/zhaof/p/7198407.html   这篇博客中已经写了详细的使用介绍。
1665 6
|
开发工具 git