开源PHP监控扩展:witness简介

jopen 11年前

1. 问题的由来

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

  1. 多进程+多机器+用户请求随机分发,导致不知道某个用户的请求会在哪台机器的哪个进程执行;
  2. 如果在所有机器和进程都加入调试语句,会导致大量的无关日志输出,或可能影响无关的用户;
  3. 由于同一用户的两个请求是被随机分散的,导致难以获取具体某个用户出错时的点击流;
  4. 在大型系统中,由于组件多,关联复杂,不容易直接定位问题源头出自哪个模块以增加输出信息;
  5. 通过输出日志等方式,往往需要多次尝试后才能逐步逼近问题的源头,对提高查错速度不利;
  6. 这种即时在线上增加调试或者写日志的代码,可能引入意外的bug,带来额外风险。

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

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

witness系统的主要特点如下:

  1. 非嵌入式监控,无需修改运行的PHP代码
  2. 可以通过cookie监控特定的请求
  3. 轻量级,灵活度高
  4. 高性能

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

2. 系统架构

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

总体架构如下图:

开源PHP监控扩展:witness简介

2.1. witness扩展

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

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

方式

功能

备注

trace

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

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

dump

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

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

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

2.2. 数据传输

主要功能有三点:

  1. 收集本地各进程的witness扩展传出的信息,并整理成独立的数据文件;
  2. 收集位于各台机器上的数据文件,汇总到MQ中;
  3. 从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


项目主页:http://www.open-open.com/lib/view/home/1372932209097