TracePoint浅析

原创 2014年01月21日 16:39:17

TracePoint是一款跟踪Ruby代码的工具,可以细粒度的监控Ruby程序,但是只支持2.0.

基础知识

一个简单的例子

非tracepoint的例子

tracer = lambda do |event, file, line, id, binding, klass| 
  to_display = [event, File.basename(file), line, klass, id]
  puts "%10s in %s at line %-2d %s:%s" % to_display
end

set_trace_func tracer


klass 是 类名 id 是方法名

TracePoint的例子

trace = TracePoint.new(:raise) do |tp|
  p [tp.lineno, tp.event, tp.raised_exception]
end

trace.enable # or trace.disable

0/0


基本范式

TracePoint.new(Event) do |tp|
   # tp 是一个 TracePoint 对象,有此刻正在运行的程序的所有的信息,包括事件等
end


Events

class level

TracePoint.new(:module)
TracePoint.new(:class)
TracePoint.new(:end)

method level

:call
:return
:c_call
:c_return


block level

:b_call
:b_return
thread level
:thread_begin
:thread_end


other level


TracePoint的实例方法

控制方法

disable
enable
disable?
enable?

inspect # 返回关于tracepoint status字符串



获取调用类和方法

defined_class # 类名称
meethod_id # 方法名称
raise_exception # 抛出的异常
return_value # 方法的返回值


其他

event # 当前trigger的事件
lineno # 运行的行数
path: 该运行的文件的位置


结合Rails

使用rack middleware 整合如 Rails

# update application.rb 
# config.middleware.insert_before(ActionDispatch::Static, TracePoint::Middleware)
class TracePoint
  class Middleware

    def initialize(app)
      @app = app
    end

    def call(env)
      stats = {}
      trace = TracePoint.new(:call) do |tp|
        stats[tp.defined_class] ||= {}
        stats[tp.defined_class][tp.method_id] ||= 0
        stats[tp.defined_class][tp.method_id] += 1
      end
      trace.enable
      response = @app.call(env)
      trace.disable

      puts env['PATH_INFO']
      puts "#{stats.keys.size} classes used"
      puts "#{stats.map{|k,v| v.keys}.flatten.size} methods used"
      puts "#{stats.map{|k,v| v.values}.flatten.sum} methods dispatched"
      #File.open("tmp/#{env['PATH_INFO'].gsub('/', '_')}_req_stats.json", "w"){|f| f << stats.to_json }
      puts ""
      response
    end

  end
end


https://gist.github.com/chucai/8037079

参考资料

http://www.slideshare.net/markykang/mangling-ruby-withtracepoint https://www.youtube.com/watch?v=V_dZQ6AeZDE http://www.ruby-doc.org/core-2.0.0/TracePoint.html http://matt.aimonetti.net/posts/2013/03/05/inspecting-rails-4-request-dispatch-using-ruby-2-dot-0/

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C++虚函数机制(Linux版)

通过ELF、汇编分析C++虚函数的实现机制,及写代码时需要的注意事项

Linux内核tracepoints

内核中的每个tracepoint提供一个钩子来调用probe函数。一个tracepoint可以打开或关闭。打开时,probe函数关联到tracepoint;关闭时,probe函数不关联到tracepo...

利用ftrace跟踪内核static tracepoint——实例writeback event

和很多linux内核子系统一样,static tracepoint有很多层次,其中某个层次都展示给不同层次的开发者来满足他们的不同需求。关于linux tracepoint的详细信息,我们可以在lin...

[内核文档]使用Linux内核的追踪点[Tracepoint]

本文档介绍了Linux内核中的追踪点及其使用方法。文档中提供的例子详细说明了如何在内核中插入追踪点,如何将探测函数与追踪点联系起来。同时也提供了一些探测函数的例子。 Ø  追踪点的目的代码中的追踪点提...
  • arethe
  • arethe
  • 2011年04月01日 10:11
  • 8195

Ceph RBD请求过程的分析

Ceph RBD请求过程的分析 RBD是ceph中提供块存储的客户端服务,只所以说是客户端服务是相对于RADOS而言,RBD是基于librados API开发的一个块存储服务。 本文会通过rbd的...

Ceph源码目录架构

1 简介 该代码架构基于版本10.0.5整理,先整理根目录里的代码,再整理出src目录的架构。 2 代码架构 2.1 Ceph源码根目录 Ceph的根目录下包含了一些文件夹和若干编译、代码格式...

LTTng 简介&使用实战

LTTng,它是用于跟踪 Linux 内核、应用程序以及库的系统软件包。LTTng 主要由内核模块和动态链接库(用于应用程序和动态链接库的跟踪)组成。它由一个会话守护进程控制,该守护进程接受来自命令行...

linux tracepoint用法

在kernel中经常会看到trace_XX形式的函数,但是又找不到它的定义。 这个其实是kernel的tracepoint,定义在include/linux/tracepoint.h中。 ...

机器人操作系统(ROS)浅析

  • 2017年11月12日 15:34
  • 1.48MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TracePoint浅析
举报原因:
原因补充:

(最多只允许输入30个字)