socloz/monitoring-bundle

生产服务器上的性能分析/监控 Symfony2 扩展包 - 异常警报、记录性能数据并发送数据到 statsd/graphite

安装次数: 44 176

依赖项: 0

建议者: 0

安全性: 0

星标: 69

关注者: 18

分支: 6

开放问题: 7

类型:symfony-bundle

1.2.5 2020-03-26 16:50 UTC

This package is not auto-updated.

Last update: 2024-09-20 13:50:01 UTC


README

Build Status

警告

第一个稳定版本已发布并标记,如果您不想进行任何更改,应使用版本 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 = ?";

常见问题解答

  1. 有帮助吗?

    如果您不认为在生产服务器上进行性能分析有帮助,则此模块不适合您。

  2. 我怎么做才能限制开销?

    在大型网站上,建议的设置是

  • 仅在几台服务器上激活 xhprof(或者如果开销真的非常重要,则不激活)。如果不存在 xhprof,模块将禁用性能分析。
  • 启用采样。默认情况下,所有请求都会进行剖析;您可以通过设置 socloz_monitoring.profiler.sampling 来降低剖析请求的数量(值50将剖析50%的请求)。
  1. 能否剖析数据库调用?memcached调用?

    可以(只要调用可以在xprof数据中识别)。欢迎对新解析器(mysql、pgsql等)的贡献。请参阅 Resources/config/profiler.xml 中的示例。

  2. 我不喜欢在错误时接收电子邮件。我能用rollbar/airbrake/sentry代替吗?

    可以。Monolog 已经对这些工具提供了很好的支持。请参阅 monolog 文档

  3. 你们在招聘吗?

    是的。如果您在法国巴黎寻找工作,请发送邮件到 techjobs AT socloz DOT com

设置

  • 安装 xhprofstatsd 和一个图形后端(例如 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)。