PHP脚本实时统计和监控。 ClickHouse 和 Grafana 来帮助 Pinba

在本文中,我将告诉您如何将 pinba 与 clickhouse 和 grafana 一起使用,而不是 pinba_engine 和 pinboard。

在 PHP 项目中,pinba 可能是了解性能变化的唯一可靠方法。 确实,拼巴通常只有在已经观察到问题并且不清楚“在哪里挖掘”的情况下才会实施。

通常没有人知道这个或那个脚本每秒/分钟被调用多少次,他们开始“通过触摸”进行优化,从那些看起来更合乎逻辑的地方开始。

有些分析 nginx 日志,而另一些分析缓慢的数据库查询。

当然,拼巴不会是多余的,但有几个原因导致并不是每个项目都有它。

PHP脚本实时统计和监控。 ClickHouse 和 Grafana 来帮助 Pinba

第一个原因是安装。

为了或多或少地从 Pinba 的实施中获得某种“排气”,非常希望不仅能看到最后几分钟的指标,而且还能看到很长一段时间(从几天到几个月)的指标。

要做到这一点:

  • 安装 php 扩展(并且您可能需要 nginx 模块)
  • 编译mysql扩展
  • 安装 pinboard 并配置 cron

由于Pinba的信息量很少,很多人的印象是它只适用于PHP5并且早已成为过去,但正如我们稍后会看到的,事实并非如此。

第一步是最简单的,您所需要做的就是运行命令:

apt install php-pinba

此扩展在 php 7.3 及之前版本的存储库中可用,您无需编译任何内容。

执行安装命令后,我们立即收到一个工作扩展,它以以下格式收集和发送每个脚本的指标(运行时间、内存等) protobuf的 通过 udp 到 127.0.0.1:30002。

到目前为止,还没有人捕获或处理这些 UDP 数据包,但这不会以任何方式对 PHP 脚本的速度或稳定性产生负面影响。

直到最近,唯一能够捕获和处理这些 UDP 数据包的应用程序是 拼巴引擎。 描述 ”简单明了“安装阻碍了再次阅读和深入研究的欲望。 长达一公里的依赖项列表包含包的名称和程序的名称以及其安装的各个页面的链接,并且这些依赖项有自己的其他依赖项的链接。 没有人有时间或意愿去处理这些垃圾。

安装过程 拼霸2 没有 特别容易.

也许有一天,我们可以用一两个命令来安装 pinba10,而不必阅读一堆材料来了解如何做到这一点,但目前情况并非如此。

如果您确实安装了 pinba_engine,那么这只是成功的一半。 毕竟,没有 通知板 您必须将自己限制在最近几分钟的数据范围内,或者您必须自己聚合、存储和可视化数据。 很好,pinboard 使用起来很简单 安装.

看起来,如果 php 的所有指标都已经以 protobuf 格式发送到 udp 端口​​,而您所需要的只是编写一个应用程序来捕获它们并将它们放入某种存储中,那么为什么还要遭受这样的痛苦呢? 显然,那些提出这个想法的开发人员立即坐下来写下自己的想法,其中一些最终发布在 GitHub 上。

以下是四个开源项目的概述,这些项目将指标保存在存储中,可以轻松地检索和可视化这些数据,例如使用 grafana。

olegfedoseev/pinba-服务器 (2017年XNUMX月)

将指标保存到 OpenTSDB 的 udp 服务器。 也许如果您已经在项目中使用 OpenTSDB,那么这个解决方案会适合您,否则我建议跳过它。

奥列格费多谢耶夫/pinba-influxdb (2018年XNUMX月)

udp 服务器在运行,来自同一个 哈浏览器,这次将指标存储在 InfluxDB 中。 许多项目已经在使用 InfluxDB 进行监控,因此这个解决方案可能非常适合他们。

优点:

  • 数据库 它允许 聚合收到的指标,并在指定时间后删除原始指标。

缺点:

  • 该解决方案不保存有关计时器的信息。
  • InfluxDB 会将站点页面地址存储为标签,如果您有许多唯一的页面地址,这将导致 消费增加 随机存取存储器。 从某个时刻起他“会开始疯狂地吞噬记忆«。 ()

ClickHouse-Ninja/Proton (2019年XNUMX月)

udp 服务器运行,将指标保存在 ClickHouse 中。 这是我朋友的解决方案。 在熟悉了它之后,我决定是时候与 Pinbu 和 Clickhouse 较量了。

优点:

  • Clickhouse 是此类任务的理想选择;它允许您压缩数据,以便即使没有聚合也可以存储所有原始数据
  • 如果需要,您可以轻松聚合结果指标
  • grafana 的现成模板
  • 保存定时器信息

缺点:

  • 致命缺陷
  • 没有配置可以配置数据库和表的名称、服务器的地址和端口。
  • 存储原始数据时,使用辅助字典表来存储页地址和域地址,这使得后续查询变得复杂
  • 第一个减号之后的其他小事情

pinba 服务器/pinba 服务器 (2019 年 XNUMX 月)

php 中的 udp 服务器,将指标保存在 ClickHouse 中。 这是我的解决方案,是了解pinba、ClickHouse和protobuf的结果。 当我整理这整堆东西时,我写了一个“概念验证”,出乎我意料的是,它并没有消耗大量资源(30 MB RAM 和八个处理器核心之一的不到 1%),所以我决定与公众分享。

优点与之前的解决方案相同,我也使用了原始 pinba_engine 中的常用名称。 我还添加了一个配置,允许您一次启动多个 pinbase 服务器实例,以便将指标保存在不同的表中 - 如果您不仅想从 php 收集数据,还想从 nginx 收集数据,这非常有用。
缺点 - “致命缺陷”和那些不适合你个人的小事情,但我的解决方案“像拖鞋一样简单”,仅包含大约 100 行代码,因此任何 PHP 开发人员都可以更改他不喜欢的内容几分钟后。

的操作原理

监听UDP端口30002,所有传入的数据包根据protobuf方案进行解码并聚合。 每隔一分钟,就会将一个数据包插入到 clickhouse 的 pinba.requests 表中。 (所有参数都配置在 配置)

关于 Clickhouse 的一些知识

Clickhouse支持不同的数据存储引擎。 最常用的是MergeTree。

如果在某个时刻您决定存储所有时间的聚合数据,而仅存储最后一个数据,那么您可以创建一个带有分组的物化视图,并定期清理主 pinba.requests 表,而所有数据将保留在物化视图。 而且,在创建pinba.requests表时,可以指定“engine = Null”,那么原始数据根本不会保存到磁盘,同时仍然会出现在物化视图中,并被聚合保存。 我将这个方案用于 nginx 指标,因为在 nginx 上我的请求比 php 多 50 倍。

所以,你已经走了很长的路,我不想让你半途而废,所以下面是我的解决方案的安装和配置以及你需要的一切的详细描述,以及导致不止一艘船的陷阱坠毁。 整个安装过程针对 Ubuntu 18.04 LTS 和 Centos 7 进行描述;该过程在其他发行版和版本上可能略有不同。

安装

我将所有必要的命令放入 Dockerfile 以促进指令的可重复性。 下面仅描述陷阱。

php拼巴

安装后,确保在 /etc/php/7.2/fpm/conf.d/20-pinba.ini 文件中取消注释所有选项。 在某些发行版(例如 centos)上,它们可能会被注释掉。

extension=pinba.so
pinba.enabled=1
pinba.server=127.0.0.1:30002

点击之家

在安装过程中,clickhouse会要求您为默认用户设置密码。 默认情况下,可以从所有 IP 访问该用户,因此如果您的服务器上没有防火墙,请务必为其设置密码。 这也可以在安装后在 /etc/clickhouse-server/users.xml 文件中完成。

还值得注意的是,clickhouse 使用多个端口,包括 9000。该端口在某些发行版(例如 centos)中也用于 php-fpm。 如果您已使用此端口,可以在 /etc/clickhouse-server/config.xml 文件中将其更改为另一个端口。

带有 clickhouse 插件的 grafana

安装Grafana后,使用登录名admin和密码admin。 当您第一次登录时,Grafana 会要求您设置新密码。

接下来,转到“+”->导入菜单并指定要导入的仪表板编号 10011。 我准备并上传了这个仪表板,这样您就不必再次自己做。

Grafana 支持通过第三方插件与 clickhouse 合作,但 Grafana 没有针对第三方插件的警报(多年来一直有此问题)。

拼巴服务器

安装 protobuf 和 libevent 是可选的,但可以提高 pinba-server 的性能。 如果您将 pinba-server 安装在 /opt 以外的文件夹中,那么您还需要更正 系统脚本 文件。

nginx 的 pinba 模块

编译模块时,需要与服务器上已安装的nginx版本相同的源码,以及相同的编译选项,否则构建成功,但连接模块时会抛出错误“该模块不兼容二进制。” 可以使用 nginx -V 命令查看编译选项

生活技巧

我的所有网站都只能在 https 上运行。 schema 字段变得毫无意义,所以我用它来分隔 Web/控制台。

在可从网络访问的脚本中,我使用:

if (ini_get('pinba.enabled')) {
    pinba_schema_set('web');
}

在控制台脚本(例如 cron 脚本)中:

if (ini_get('pinba.enabled')) {
    pinba_schema_set('console');
}

在我的 Grafana 仪表板中,有一个 Web/控制台开关,用于单独查看统计信息。

您还可以将您的标签发送到 Pinba,例如:

pinba_tag_set('country', $countryCode);

就这样。

请回答文章下方的民意调查。

像往常一样,我警告您,我不会通过 Habr 和社交网络上的个人消息提供建议或帮助。

在 Github 上创建票证。

还请大家点赞支持 英文版 这篇文章 在 Reddit 上.

只有注册用户才能参与调查。 登录拜托

您在服务器上使用什么操作系统?

  • Ubuntu

  • CentOS的

  • Debian

  • Gentoo的

  • 红帽

  • Fedora

  • openSUSE的

  • 苏斯

  • Unix的

  • Windows

  • 其他

114 位用户投票。 11 名用户弃权。

您在服务器上使用什么版本的 php?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • 其他

105 位用户投票。 17 名用户弃权。

你用过pinba吗?

  • 是的

  • 不,但我愿意

  • 不,我不想

  • 不,没听说过她

100 位用户投票。 14 名用户弃权。

您想尝试哪个版本的 Pinba 服务器?

  • pinba_engine(mysql引擎)

  • pinba2(mysql引擎)

  • 记事板(php + mysql)

  • olegfedoseev/pinba-server (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (go + influxdb)

  • pinba-服务器/pinba-服务器(go + clickhouse)

  • pinba-服务器/pinba-服务器(php + clickhouse)

  • 我自己来写

  • 其他

39 位用户投票。 47 名用户弃权。

来源: habr.com

添加评论