技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 系统运维 --> 开源PHP监控扩展:witness简介

开源PHP监控扩展:witness简介

浏览:2773次  出处信息

1. 问题的由来    

   PHP作为流行的服务器端脚本语言,广泛地用于各种服务器前端及应用的开发。虽然PHP作为脚本语言,天然具有良好的入门简单、容错性强、性能较高(在脚本语言中)的特点,但是,由于其多进程的执行模式,和前端Web系统通常采用多机器并行的运行模式,导致在线上出现的某些和特定用户相关的问题时,很难收集全面的信息。

  • 多进程+多机器+用户请求随机分发,导致不知道某个用户的请求会在哪台机器的哪个进程执行;

  • 如果在所有机器和进程都加入调试语句,会导致大量的无关日志输出,或可能影响无关的用户;

  • 由于同一用户的两个请求是被随机分散的,导致难以获取具体某个用户出错时的点击流;

  • 在大型系统中,由于组件多,关联复杂,不容易直接定位问题源头出自哪个模块以增加输出信息;

  • 通过输出日志等方式,往往需要多次尝试后才能逐步逼近问题的源头,对提高查错速度不利;

  • 这种即时在线上增加调试或者写日志的代码,可能引入意外的bug,带来额外风险。

  •    另外,作为一种轻便的快速开发脚本,加上现在流行的敏捷等快速开发模式,不管它们吹嘘得如何天花乱坠,对于测试的完备性、代码的健壮性,其实质效果是大大降低的。所以,在上线后发现问题再快速打补丁或者快速迭代,是业内一种常见的模式。而在这个环节中,快速定位问题是打补丁或者后续迭代的前提。

       于是,针对这种情况,我们开发了witness系统(witness--证人,它的证词可以帮助我们还原“犯罪”现场)。该系统能让我们在处理上述问题时,更简便,更有效率,更全面的得到所有相关数据,从而加快分析问题和处理问题的过程。

       witness系统的主要特点如下:

  • 非嵌入式监控,无需修改运行的PHP代码

  • 可以通过cookie监控特定的请求

  • 轻量级,灵活度高

  • 高性能

  •    项目已开源:https://github.com/ucweb/witness

    2. 系统架构    

       PHP分析调试系统主要分为三部分:witness扩展、数据传输,数据展示。

       总体架构如下图:

       witness_framework

       

    2.1. witness扩展    

       witness扩展主要的功能是嵌入PHP引擎底层,监控和收集一切可用的信息,并通过数据传输系统,反馈到后端,以便于分析处理这些数据。

       witness扩展目前可以有两种监控模式,如下表:

       方式

       功能

       备注

       trace

       记录从开始到结束期间,所有函数调用的次序,以及这些调用参数、返回值等。同时也会记录当前一些关键的环境参数和请求参数。

       适用于监控整个逻辑处理流程

       dump

       记录当前的调用栈的静态信息,包括每层函数执行的当前行号、每层调用的参数、局部变量,全局变量、静态变量等

       适用于监控当前某个点的整体状态

       简单的对这两种模式做个对比:trace模式就好比拍视频,dump模式就相当于拍照片--视频能展现连续变化,而照片则会保留更多细节,清晰度也更高。

    2.2. 数据传输    

       主要功能有三点:

  • 收集本地各进程的witness扩展传出的信息,并整理成独立的数据文件;

  • 收集位于各台机器上的数据文件,汇总到MQ中;

  • 从MQ上获取相关的数据导入到后端的展示系统中。

  • 2.3. 数据展示    

       由于witness后端的数据采用SQLite存储文件,所以它并不适合直接阅读和分析(可以通过SQLite的cli接口可以直接阅读这些db文件,但是很不直观)。因此,一般情况下都建议使用脚本,将其中信息提取加工后,进行可视化展示。

       目前我们附带有基于本地源代码展开的示例脚本,位于:

    scripts/genhtml.php

       如果现有项目有自己的控制平台,可以根据实际情况,将其根据实际情况和需求,做具体的适配。

    3. 使用witness    

    3.1. 系统依赖    

       以下是witness扩展的一些依赖和限制,包括目前已经测试通过并上线运行的配置:

       项目

       依赖

       已测试

       操作系统

       仅支持linux兼容系统,不支持Windows系统

       RHEL 5.4

       内核

       2.6或以上

       2.6.18-164.el5

       位宽

       x86/x86_64/amd64

       一般而言不推荐x86,因为可能会遇到内存瓶颈

       x86_64

       gcc

       gcc 4.1.2或以上

       gcc version 4.1.2 20080704

       Red Hat 4.1.2-48

       PHP

       5.3.X或以上(参见注意事项)

       5.3.4/5.3.8

       SQLite

       3.3.6或以上

       SQLite version 3.3.6

       注意:目前,我们并未在PHP的5.4.X5.5.X版本上测试过witness扩展。因为witness扩展直接从Zend引擎获取信息,因此,当PHP内核出现较大的优化和修改时(一般表现为大版本的升级),无法确保兼容性

       如有需要在5.4.X或5.5.X版本上使用witness扩展的朋友,请确保经过测试并且一切正常。如果可能的话,无论是否测试通过,都欢迎向我们反馈信息,我们都将第一时间跟进,并及时更新兼容版本情况。

    3.2. 安装    

       witness扩展以基本的PHP扩展安装方式进行:

    $ cd witness/witness && phpize && ./configure && make clean && make && make install

       安装完成后,需要修改php.ini:

    $ echo "extension=witness.so" >> php.ini

       最后,用以下命令检查安装是否成功:

    $ php -m | grep witness

       witness

    3.3. 配置witness扩展    

       witness扩展提供了多项配置以控制其行为,在php.ini中增加或修改以下的项:

       [witness]

       ; 最大监控的调用栈深度,如果超出此深度,会停止监控行为(并报错)

       ; 此限制的目的是防止代码中出现无限递归,一般情况下不会有那么深的调用

       ; 如果确实有需要,可以调大此值,会增加少许内存消耗

       witness.max_stack = 16384

       ; 是否记录内置函数的行为(包括PHP的require/include等和各种扩展提供的函数等)

       ; 一般情况下不建议打开,因为这些数据会很多,而且往往对排除故障没有什么帮助

       witness.record_internal = false

       ; 自动启动监控的cookie项

       ; 如果在某个请求的cookie中找到此项所配置的名字,则会自动启动监控

       ; 而该项对应的值中按照格式解析出的token会作为这次请求的标识(具体见后文)

       ; 如果此项留空,则不启用自动监控功能

       witness.auto_start_token = ""

       ; 结果上传的URL

       ; 结果以文件的方式,通过HTTP POST上传到服务器中

       ; 该服务器可能是HTTP文件服务器,也可能是MQ等服务器

       ; 有效的url配置类似于:http://127.0.0.1:1218/?name=witness_$token$&opt=put

       ; 特别的,此url中$token$串会被实际的token值替换

       ; 如果此项留空,则表示不需要进行上传操作

       witness.post_url = ""

       ; 临时文件夹路径

       ; 如果数据文件根据post_url配置,成功的上传到服务器中,则会删除相关的临时文件

       ; 如果post_url项为空,临时数据文件会保留在该路径中

       witness.temp_path = "/dev/shm"

       ; 如果开启了上传操作,并且上传失败,是否保留记录数据在临时文件夹

       witness.keep_record = false

       ; 是否开启dump功能

       witness.enable_dump = false

       ; 是否开启assert功能

       witness.enable_assert = false

       以上各项中红色部分为其默认值,如果不提供该项,则会以该值处理。

    3.4. 使用trace模式监控    

    3.4.1. cookie格式    

       如上一节所述:

    ; 自动启动监控的cookie项

       ; 如果在某个请求的cookie中找到此项所配置的名字,则会自动启动监控

       ; 而该项对应的值中按照格式解析出的token会作为这次请求的标识(具体见后文)

       ; 如果此项留空,则不启用自动监控功能

       witness.auto_start_token = ""

       例如当前的auto_start_token配置信息如下:

    witness.auto_start_token = "my_token"

       则如果某HTTP请求携带了以下的cookie,会自动启动监控:

    my_token=10:my_project

       其中的字段及内容如下:

       内容

       功能

       备注

       my_token

       即为auto_start_token的值。

       

       10

       ttl,每一次成功启动监控,会把此ttl值减一后设置给浏览器,当ttl为0时会删除此整条cookie。

       可以通过ttl,控制对每个用户的监控次数

       my_project

       自定义的token名

       

    3.4.2. 启动方式    

       witness扩展启动trace模式监控的方法有两种:

  • 根据请求中检查是否带有特定的cookie信息,如是,则启动监控

  • 调用witness_start接口手动启动监控

  •    witness扩展结束监控的方式也有两种:

  • 在一次请求处理结束后会自动停止监控

  • 调用witness_stop接口手动停止监控

  •    trace模式监控手动接口信息如下:

       接口

       功能

       参数/返回值

       作用

       witness_set_token

       设置默认的token

       token

       新的token默认值,在有需要token而又没提供token的时候以此值覆盖。

       如果之前已设有默认值,则以此值覆盖。

       witness_start

       手动启动监控

       token(可选)

       此次dump的token

       如不提供,则使用set_token设置的默认值

       true/false

       返回值。如果成功启动,则为true。如果之前已经启动,则无操作,返回成功。

       witness_stop

       手动停止监控

       true/false

       返回值。如果当前并无启动监控,则无操作,返回失败。

       无论以何种方式,在witness扩展启动监控时,都会带有一个token标识。这个token标识会带入展示系统中,作为区分不同的监控项目的标志。

       在系统运行时,除非监控被启动,否则witness扩展都不会进行任何操作,也不会对运行造成任何影响。当监控启动后,witness扩展在后台记录所有的运行状态和信息,不会对前台代码造成任何影响--包括性能和运行速度,实际测试中,开启监控的请求,其运行性能下降不到5%。

    3.5. 使用dump操作    

       如果我们希望使用witness来记录程序执行中某个时刻的所有信息及状态,可以使用dump操作。Dump操作无法自动启动,必须在代码中手动调用witness_dump或者witness_assert接口来启动。

       其中:

       接口

       功能

       参数/返回值

       作用

       witness_dump

       无条件启动dump操作

       token(可选)

       此次dump的token

       如不提供,则使用set_token设置的默认值

       true/false

       返回值。如果成功dump,则true

       witness_assert

       有条件启动dump操作

       expression

       布尔值的条件表达式。

       如果表达式为false,则启动dump操作

       token(可选)

       此次dump的token

       如不提供,则使用set_token设置的默认值

       true/false

       返回值。为传入的expression的值。

       witness_dump和witness_assert都在配置中提供了单独的开关,当开关关闭(false)时,调用对应的接口不会启动dump操作,也不会报错--witness_assert会按正常方式返回expression的值。这有助于在开发、测试、线上使用同一份代码的前提下,区别线上运行环境和本地测试环境,并减少(删代码或屏蔽代码)带来不必要的麻烦--推荐线上关闭这两个开关,测试环境打开。

       dump操作不会对请求的执行产生持续性的性能损耗,仅会在每次启动时产生极轻微的性能干扰(消耗时间小于1ms)。但是,如果同时出现大量的dump操作,可能会导致操作系统的CPU和内存出现资源紧张,故同样不宜滥用。

    3.6. 本地展示    

       项目内带有本地展示脚本,可以把生成的数据文件通过代码,直观的转换为嵌入源码的页面,方便调试。

    3.6.1. 生成页面    

       通过本地展示脚本生成页面的方式如下:

    $ php genhtml.php

       Usage: php genhtml [记录文件全路径] [生成的html路径]

       生成的html文件的结构大致如下:

    $ tree -L 1

       .

       |- glass.png

       |- index.html            //首页

       |- src                    //代码页面

       |- var                    //变量页面

       `- witness.css

       注意,运行该脚本的机器中,源码路径及结构必须和收集该信息的机器一致(绝对路径)。

    3.6.2. 示例    

       以下URL就是example目录下的展示脚本转换出来的结果:http://ucweb.github.io/witness_report/

建议继续学习:

  1. Mysql监控指南    (阅读:19518)
  2. 批量添加主机到cacti+nagios的监控报警系统中    (阅读:13094)
  3. 我常用的主机监控shell脚本    (阅读:11310)
  4. 7 天打造前端性能监控系统    (阅读:9846)
  5. 如何监控HP服务器硬件状态    (阅读:8926)
  6. Cacti 添加 Nginx 监控    (阅读:8724)
  7. Linux下三种常用的流量监控软件对比    (阅读:8502)
  8. Cacti 添加 Memcached 监控    (阅读:7948)
  9. Cacti 添加 Apache 监控    (阅读:7396)
  10. 你应该知道的16个Linux服务器监控命令    (阅读:6696)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1