socloz / monitoring-bundle
生产服务器上的性能分析/监控 Symfony2 扩展包 - 异常警报、记录性能数据并发送数据到 statsd/graphite
Requires
- php: >=5.3.2
- guzzle/guzzle: @stable
- sensio/framework-extra-bundle: ~2.0|~3.0
- swiftmailer/swiftmailer: @stable
- symfony/browser-kit: ~2.3|~3.0
- symfony/framework-bundle: ~2.3|~3.0
- symfony/twig-bundle: ~2.3|~3.0
Requires (Dev)
- phpunit/phpunit: ^5.7.27
README
警告
第一个稳定版本已发布并标记,如果您不想进行任何更改,应使用版本 1.0.0,否则请查看 CHANGELOG.md 以了解发生了哪些更改
简介
生产服务器上的监控 Symfony2 扩展包,
- 在未处理的异常上发送电子邮件,
- 分析 PHP 代码并将性能信息发送到 statsd,
- 记录请求性能信息,
- 新功能 将请求 ID/pid 添加到日志文件/HTTP 标头,以便调试错误。
依赖项
异常捕获:无。
性能分析
性能分析数据
- 请求:HTTP 请求次数(由 Symfony 处理)/请求持续时间
- mongodb:mongodb 调用次数(插入/批量插入/更新/保存/删除/计数/查找/findOne)/总持续时间(需要 xhprof)
- redis:redis 调用次数/总持续时间(仅跟踪 phpredis 调用 - http://github.com/nicolasff/phpredis)(需要 xhprof)
- sphinx:sphinx 调用次数(查询/runQueries/updateAttributes/buildExcerpts/buildKeywords)/总持续时间(需要 xhprof)
- curl:curl 调用次数(curl_exec/curl_multi_exec)/总持续时间(需要 xhprof)
对于每条数据,您将获得
- 全局图表,
- 按路由的图表。
我得到了什么?
感谢 graphite,您可以获得一些漂亮的图表:[待办事项]
您还会收到以下日志消息
[2013-06-10 10:38:31] app.INFO: /page/page_slug : 2041 ms mongodb : 6 calls/108 ms redis : 9 calls/2 ms [] {"request_id":"785317517bccd92b4da08d88b4c09fe5","pid":5503}
使用请求 ID 进行调试
对于每个 HTTP 请求(或脚本),都会计算一个请求 ID。它使您能够关联来自各种服务的日志(Web 服务、数据库请求等)。
此请求 ID 通过使用 Guzzle 调用的外部 Web 服务(使用 X-RequestID HTTP 标头)进行转发。
请求 ID 将自动
- 添加到 HTTP 响应作为 X-RequestID 标头,
- 添加到所有日志行(只要 pid),
- 添加到所有 Guzzle 出发请求作为 X-RequestID 标头。
如果发现 X-RequestID HTTP 标头,则其值将用于请求 ID。如果您使用 Guzzle 调用一个由 SoclozMonitoringBundle 驱动的 Web 服务,则 Web 服务的日志将使用与主请求相同的 request_id。
您应将请求 ID 转发到所有使用的第三方服务。例如,您可以将请求 ID 添加到所有数据库查询作为 SQL 注释
$requestId = $this->get("socloz_monitoring.request_id")->getRequestId(); $sql = "SELECT /* {"request_id":"$requestId"} */ * FROM my_table WHERE col = ?";
常见问题解答
-
有帮助吗?
如果您不认为在生产服务器上进行性能分析有帮助,则此模块不适合您。
-
我怎么做才能限制开销?
在大型网站上,建议的设置是
- 仅在几台服务器上激活 xhprof(或者如果开销真的非常重要,则不激活)。如果不存在 xhprof,模块将禁用性能分析。
- 启用采样。默认情况下,所有请求都会进行剖析;您可以通过设置
socloz_monitoring.profiler.sampling
来降低剖析请求的数量(值50将剖析50%的请求)。
-
能否剖析数据库调用?memcached调用?
可以(只要调用可以在xprof数据中识别)。欢迎对新解析器(mysql、pgsql等)的贡献。请参阅
Resources/config/profiler.xml
中的示例。 -
我不喜欢在错误时接收电子邮件。我能用rollbar/airbrake/sentry代替吗?
可以。Monolog 已经对这些工具提供了很好的支持。请参阅 monolog 文档。
-
你们在招聘吗?
是的。如果您在法国巴黎寻找工作,请发送邮件到 techjobs AT socloz DOT com
设置
-
安装
xhprof
、statsd
和一个图形后端(例如graphite
) -
安装并激活模块
-
配置模块:
socloz_monitoring.mailer.from
(异常警报邮件的源电子邮件),socloz_monitoring.mailer.to
(异常警报邮件的接收电子邮件),socloz_monitoring.statsd.host
(statsd服务器的IP地址/主机名),socloz_monitoring.statsd.port
(statsd服务器的端口),socloz_monitoring.statsd.prefix
(statsd键的前缀) -
决定您想剖析什么:
socloz_monitoring.profiling.request
(HTTP请求),socloz_monitoring.profiling.mongodb
(MongoDB调用)
如果您正在使用statsd版本0.4或更高版本
- 将
socloz_monitoring.statsd.merge_packets
设置为true
- 如果statsd服务器不在与您的服务器相同的LAN上,将
socloz_monitoring.statsd.packet_size
设置为512
,否则保持默认值
默认配置是
socloz_monitoring: exceptions: enable: true ignore: ['Symfony\Component\HttpKernel\Exception\NotFoundHttpException','Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException'] profiler: enable: true sampling: 100 mongodb: false request: false redis: false sphinx: false mailer: enable: true from: to: statsd: enable: false host: port: prefix: socloz_monitoring always_flush: false merge_packets: false packet_size: 1432 request_id: enable: true add_pid: true logger: enable: false
图形应用数据
可以发送一些应用数据到statsd
计数器
$container->get('socloz_monitoring.statsd')->updateStats("counter_name", $number);
仪表
$container->get('socloz_monitoring.statsd')->gauge("gauge_name", $number);
计时器
$start = microtime(true); // do some stuff $end = microtime(true); $container->get('socloz_monitoring.statsd')->timing("timer_name", ($end-$start)*1000);
只需确保您的计数器/计时器与标准计数器/计时器之间没有名称冲突。
统计信息被缓冲,并在脚本/请求结束时发送。在长时间运行的脚本中,您应该定期刷新statsd。
$container->get('socloz_monitoring.statsd')->flush();
您还可以配置statsd,使其始终立即发送数据。
socloz_monitoring: statsd: always_flush: true
在graphite中查找数据
statsd数据(在不修改配置的情况下)
stats.timers.prefix.{mongodb,request, ...}.{lower,mean_90,upper,upper_90}
- 计时信息stats.prefix.{mongodb,request, ...} / stats_counts.prefix.{mongodb,request, ...}
- 计数器stats.timers.prefix.per_route.{mongodb,request, ...}.{route}.{lower,mean_90,upper,upper_90}
- 每个路由的计时信息stats.prefix.per_route.{mongodb,request, ...}.{route}
- 每个路由的计数器
提示
Graphite提示
- 每个请求的mongodb调用次数:
divideSeries(stats_counts.socloz_monitoring.mongodb, stats_counts.socloz_monitoring.request)
路线图
- 解析器:mysql、memcached
- 集成graphite模板
- 事件跟踪(代码发布等)
- 邮件速率限制
感谢
异常处理灵感来源于 RoxWayErrorNotifyBundle
StatsD客户端取自 Etsy StatsD
Xhprof监听器灵感来源于 JnsXhprofBundle
许可
此软件包在MIT许可下发布(请参阅LICENSE)。