Ruby探针的基本实现原理
李哲 — MAY 13, 2015
语言本身
Ruby语言支持语法级别的系统,框架,甚至语言本身的方法复写,一般叫做元编程(meta programming), 此基础之上还有一些术语为mixin,方法的动态定义,运行时类改写等等,这些技术和机制可以让语言本身就能实 现其他语言需要字节码才能实现的功能,例如探针需要hook HttpRequest中的request方法,就可以通过下面的方式实现:
class HttpRequest
def request_new
puts 'before request'
result = request_old
puts 'after request'
result
end
alias_method :request_old, :request
alias_method :request, :request_new
end
这里只是展示其中一种最简单的方法,还有很多其他方法,比如我们想完全放弃原有的方法的话,那就可以直接覆盖掉这个方法了。
框架
某些框架如Rails提供pub-sub机制,这种情况下探针只需要订阅特定类型的消息,然后进行数据再加工就可以了。对于Rails,这个比较简单:
module ActionController
class PageRequest
def call(name, started, finished, unique_id, payload)
Rails.logger.debug [name, started, finished, unique_id, payload].join(' ')
end
end
end
ActiveSupport::Notifications.subscribe('process_action.action_controller', ActionController::PageRequest.new)
# 每次访问就能够订阅到‘process_action.action_controller’的消息:
#
# process_action.action_controller 2012-04-13 01:08:35 +0300 2012-04-13 01:08:35 +0300 af358ed7fab884532ec7 {
# controller: "Devise::SessionsController",
# action: "new",
# params: {"action"=>"new", "controller"=>"devise/sessions"},
# format: :html,
# method: "GET",
# path: "/login/sign_in",
# status: 200,
# view_runtime: 279.3080806732178,
# db_runtime: 40.053
# }
这样我们就能拿到这个request的数据了,订阅消息类型还请自己查阅相关框架的文档。
RACK
Rack绝对是个好东西,它把几乎所有的web框架和server沟通的接口定义好了,而且是如此的简洁,就是一个call方法。 一个最简单的Rack应用如下:
# configu.ru
class App
def call
[200, {"Content-Type" => "text/html"}, ["hello world"]]
end
end
run app
# rackup
只需要这个call方法就搞定了,而多层的rack middleware也只是嵌套着调用call方法,所有要hook的话,这里就够了, 不过因为这里基本就是根了,需要注意抓取的数据量及堆栈信息,太长的话会影响性能的。
数据库
数据库层基本都是对orm框架的hook,在每个查询的结果输出中都会有执行的时间信息,超过阀值则调用数据库本身的查询 语句优化工具,并保存输出结果。至于hook的方法就是【1】中或者采用【2】中的方法,如果框架支持的话。
外部服务
外部服务就是对访问外部http请求的http_client类似的库进行hook,也就是按照【1】中的方法,对发起request的方法进行hook。
后台任务
后台任务机制同上面几项,只不过是在非http server的进程中运行,数据抓取的机制一样,但分类不同, 需要探针在运行过程中,判断数据抓取的对象状态,即web事务中还是非web事务中,非web事务都统一存 储到后台任务的数据容器中。
Thread Profiler
Thread Profiler就是一个加强版的事务采集器,可以设定采样周期和采样频率,将周期内的事务请求进行数据的聚合处理, 然后统计出在这个周期内的堆栈调用占比信息,然后可以根据此信息找出时间占比或者调用次数最多的方法,然后有针对性的 进行优化。
总结
以上所述,还只是一些最根本的原理性知识,细节的点还有很多,比如如何进行数据的本地存储和处理,以及线程间的数据冲突处理, 还有基于fork的多进程server的进程间的数据传输,在以后的文章中,会针对每一项都做出详细的解释,还请大家持续关注。
本文作者系OneAPM工程师李哲 ,想阅读更多好的技术文章,请访问OneAPM官方技术博客。
Ruby探针的基本实现原理的更多相关文章
- 从后端到页面:如何全方位监控 Ruby 应用?
[编者按]本文参考技术分享 ,由 OneAPM 工程师补充整理,并且已经征得原作者的同意. 为什么选择 OneAPM ? 在性能监控领域,业界比较有名的是 New Relic 还有 Appdynami ...
- Java探针
使用java代理来实现java字节码注入 使用JavaSsist可以对字节码进行修改 使用ASM可以修改字节码 使用Java代理和ASM字节码技术开发java探针工具可以修改字节码 备注:javass ...
- Java探针-Java Agent技术-阿里面试题
Java探针参考:Java探针技术在应用安全领域的新突破 最近面试阿里,面试官先是问我类加载的流程,然后问了个问题,能否在加载类的时候,对字节码进行修改 我懵逼了,答曰不知道,面试官说可以的,使用Ja ...
- HADOOP HDFS的设计
Hadoop提供的对其HDFS上的数据的处理方式,有以下几种, 1 批处理,mapreduce 2 实时处理:apache storm, spark streaming , ibm streams 3 ...
- 使用Rails 4.2+ 测试异步邮件系统
[导读]异步测试总是一个很大的问题,邮件发送测试更是让很多开发同学不知道从哪里入手.在新版的Rails里,这类测试在很大程度上被简化了. 以下为译文 在编写需要发送邮件的应用时,控制器是绝不能被阻塞的 ...
- RednaxelaFX写的文章/回答的导航帖
https://www.zhihu.com/people/rednaxelafx/answers http://hllvm.group.iteye.com/group/topic/44381#post ...
- PentestBox简明使用教程
介绍 PentestBox:渗透测试盒子 顾名思义,这是一个渗透工具包,但是不同于绝大多数国内xx工具包的是,这里集成的大都是Linux下的工具,Kali Linux上面的常用的很多工具这里面也都集成 ...
- JVM插庄之一:JVM字节码增强技术介绍及入门示例
字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修 ...
- Java动态追踪技术探究(动态修改)
Java动态追踪技术探究 Java探针-Java Agent技术-阿里面试题 秒懂Java动态编程(Javassist研究) 可以用于在类加载的时候,修改字节码. Java agent(Java探针) ...
随机推荐
- 一些关于python的小感想
python是一门优秀的语言,但随之而来的是大量的知识,各种模块,相信一个人的大脑是很难记住如此多的内容.这时后的我们就应该想办法避免去记忆这么多的内容. 1.查看官方文档(英语很重要,啥也不说了) ...
- sublimeText OmniMarkupPreviewer 404
这个错误也是出现的莫名奇妙. "Error: 404 Not Found Sorry, the requested URL 'http://127.0.0.1:51004/view/29' ...
- [terry笔记]ArchiveLog归档日志激增解决思路
归档日志激增的危害是巨大的,最严重的结果就是数据库无法正常工作,导致整个系统无法正常工作,其次就算数据库可以正常工作,但激增的归档会对磁盘产生大量消耗,导致性能下降. 归档日志激增一般是因 ...
- Sublime Text 2编译python时出错
[Error 2] The system cannot find the file specified [Finished] 解决方法: 1.环境变量path添加: C:\Python32\Too ...
- SQL Server Analysis Services 数据挖掘
假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多 电商类网站都有,那么,通过SQL Server Analysis Services的数据挖掘功能,你也可以轻松的来构建类似的 ...
- 配置 apt-get cloudera 离线source(Cloudera Manager的源)
配置 apt-get cloudera 离线source(Cloudera Manager的源) 创建/etc/apt/source.list.d/cloudera-manager.list文件,并在 ...
- iOS学习之Object-C语言属性和点语法
一.属性 1.属性的声明:在.h文件中使用@property声明属性. @property NSString *name; 2.属性的作用是生成setter以 ...
- Android实现简单音乐播放器(MediaPlayer)
Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能 ...
- [shell基础]——uniq命令
uniq命令常见选项 去除重复行 -u 显示不重复的行 -d 显示有重复的行 -c 打印每一行重复的次数 测试文本内容如下: # cat 4.txt 11 ...
- 团队开发(NABC)
特点:这是一个手机软件,能通过通讯录录入生日信息 N(Need需求):现在在交际圈中需要记住越来越多朋友的生日信息 A(Approach做法):由一个简单的闹钟为基础,添加与生日相关的功能,最终实现 ...