实时统计和监视PHP脚本。 ClickHouse和Grafana向Pinba寻求帮助

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

在php项目上,pinba可能是了解性能正在发生变化的唯一可靠方法。 但是通常人们只有在已经发现问题并且不清楚去哪里看时才开始使用pinba。

通常,开发人员不知道每个脚本有多少RPS。 因此,他们从似乎有问题的地方开始进行优化。

有人正在分析Nginx日志,有人正在数据库中查询缓慢。

当然,pinba并不是多余的,但是有几个原因导致它不是在每个项目中都存在。



第一个原因是安装。

为了或多或少地从pinba使用中获得某种利润,非常希望不仅在最后几分钟,而且还要在很长一段时间(从几天到几个月)中查看指标。

为此,您需要:

  • 为php安装扩展名(您可能想为nginx提供一个模块)
  • 编译mysql扩展
  • 安装硬纸板并配置cron

因为我们最近有少量关于pinba的信息,所以许多人认为它仅在php5上有效,并且已经消失了,但是正如我们稍后将看到的那样,事实并非如此。

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

apt install php-pinba 

在存储库中,此扩展存在到php 7.3(含php)以下,您无需编译任何内容。

执行安装命令后,我们立即获得一个已经正常工作的扩展程序,该扩展程序通过udp以127.0.0.1:370002的格式收集并发送每个脚本的度量标准(持续时间,内存等),格式为protobuf

我们还没有用于捕获和处理这些udp软件包的应用程序,但这不会严重影响php脚本的速度或稳定性。

直到最近,只有pinba_engine才能捕获和处理这些udp软件包。 对“ 简单 ”安装的描述再一次不鼓励阅读。 在长的依赖关系列表中,有程序包名称和程序名称,以及指向具有其他依赖关系的另一个页面的链接。 没有人有时间或渴望处理这种废话。

pinba2的安装过程并不是特别容易

也许在功能pinba10中可以使用一个或两个命令进行安装,而无需阅读大量内容来弄清楚该怎么做,但是现在不是那样。

安装pinba_engine只是故事的一半。 毕竟,没有插板式广告,您只能在最后几分钟内获得有限的数据。 插板在安装中非常简单是一件好事。

但是来自php的所有度量标准已经以protobuf格式进入udp端口,而所需要做的只是编写一个可以捕获udp软件包并将其放入某种存储方式的应用程序? 显然,那些认为如此的开发人员创建了自己的应用程序,并且其中一些人在githab上发布了该应用程序。

下面是对四个将指标存储在存储中的开源项目的回顾,这些数据可以很容易地由grafana获取和可视化。

olegfedoseev / pinba-influxdb (2017年11月)


Golang上的udp服务器,可将指标保存在OpenTSDB中。 也许如果您已经在项目上使用OpenTSDB,那么这样的解决方案将很适合您。

olegfedoseev / pinba-influxdb (2018年6月)


来自同一个github用户的 golang上的udp服务器,这次将指标保存在InfluxDB中。 许多项目已经使用InfluxDB进行监视,因此该解决方案可能对他们来说是一个好选择。

优点:

  • Influx 允许汇总结果度量并在指定时间后删除原始度量。

缺点:

  • 此解决方案不保存计时器信息。
  • InfluxDB会将页面的地址另存为标签,如果您有很多唯一的页面地址,则会增加RAM的消耗。 从某个角度来看,它将“ 开始使用大量内存 ”。 ( 来源

ClickHouse-Ninja / Proton (2019年1月)


Golang上的udp服务器,可将指标保存在ClickHouse中。 这是我朋友的申请。 使用完后,我开始使用Clickhouse开发自己的pinba应用程序。

优点:

  • Clickhouse是执行此类任务的理想选择,它允许您压缩数据,以便即使没有聚合也可以存储所有原始数据
  • 如果需要,您可以轻松汇总结果指标
  • 准备好了格拉纳那的模板
  • 保存计时器信息

缺点:

  • 此处未发明
  • 数据库和表的名称,地址和端口没有配置
    服务器。
  • 从第一负开始的其他小事情

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


php上的udp服务器,可将指标保存在ClickHouse中。 这是我的应用程序,是我对pinba,ClickHouse和protobuf进行RND的结果。 我写了“概念证明”,这对我来说出乎意料的是没有消耗大量资源(30 MB RAM和少于八个处理器内核之一的1%),所以我决定与人们共享。

优点与先前的解决方案相同,我还使用了原始pinba_engine中的常用名称。 我还添加了一个配置,该配置允许您运行多个pinbasver实例以将度量标准保存到不同的表中-如果您不仅要从php还要从nginx收集度量,这将非常有用。

缺点-“不是在这里发明的”和那些不适合您的小东西,但是我的解决方案非常简单,仅包含约100行代码,因此任何php开发人员都可以在几分钟内更改任何内容不喜欢。

运作方式

它正在监听udp端口30002。所有传入的数据包均根据protobuf方案进行解码并进行汇总。 每分钟将一批软件包插入pinba.requests表中的clickhouse。 (所有设置都在config中配置

关于ClickHouse

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

如果某个时候您决定存储所有时间的聚合数据,而只为后者存储原始数据,则可以通过分组创建一个物化视图并定期清理主表pinba.request,而所有数据仍保留在物化视图中。 此外,您可以为pinba.requests表指定“ engine = Null”,这样原始数据将根本不会保存到磁盘,同时仍将包含在实例化视图中。 我将这种方案用于nginx指标,因为在nginx上,我的请求比在php上多50倍。

您已经走了很长一段路,所以将对我的解决方案的安装和配置以及您需要的所有内容进行详细说明。 对于Ubuntu 18.04 LTS和Centos 7的完整安装过程进行了介绍,在其他发行版和版本中,该过程可能会略有不同。

安装方式


我已将所有必需的命令都放入Dockerfile中 ,以确保指令的可重复性。 下面仅描述问题。

PHP Pinba

安装后,请确保已取消注释/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

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

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

带有Clickhouse插件的grafana

安装grafana后,请使用用户名“ admin”和密码“ admin”。 首次登录时,grafana会要求您设置一个新密码。

接下来,转到菜单“ +”-> import并指定要导入的仪表板数量10011 。 我已准备好该仪表板,因此您无需自己再次进行操作。

Grafana通过第三方插件支持ClickHouse,但是grafana不支持针对第三方插件的警报(该罚单已经存在数年了)。

Pinba服务器

安装protobuf和libevent是可选的,但它可以提高pinba服务器的性能。 如果将pinba服务器安装在/ opt以外的文件夹中,则还需要更改systemd脚本文件。

Nginx下的pinba模块

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

生命黑客

我所有的网站只能在https上运行。 因此,我使用字段“模式”来分隔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); 

仅此而已。

您还可以阅读俄语版本

请回答文章下的调查,并在Reddit上为我提供支持

Source: https://habr.com/ru/post/zh-CN449818/


All Articles