extraswoft/prometheus-exporter 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

extraswoft/prometheus-exporter

Composer 安装命令:

composer require extraswoft/prometheus-exporter

包简介

prometheusExporter for swoft

README 文档

README

简介

本项目基于github上的swoft开源项目进行组件开发,扩展了一个prometheusExporter sdk组件, prometheus 是一个开源的系统监控和告警平台,通过Exporter即可快速地生成prometheus需要的记录信息, 通过中间件和注解来对监控数据非侵入式注入。

目前新增prometheus 是否持久化的选项

环境强制要求

  1. 根据swoft官方要求即可

配置步骤

1.加载包

   composer require extraswoft/prometheus-exporter

2.在base.php文件的middlewares里加入middleware

注意:加入该中间件是对所有请求进行的基本监控,包括持久化。

        'middlewares' => [
            InitPrometheusExporterMiddleware::class,
            ContextMiddleware::class,
            DevToolMiddleware::class,//http://127.0.0.1:20009/__devtool  php bin/swoft dev:publish swoft/devtool -f
            
        ]

3.在app.php文件的bootScan和beanScan加入bean需要扫描的命名空间

    'bootScan' => [
            'ExtraSwoft\PrometheusExporter\Boot'
        ],
        
    'beanScan' => [
            "ExtraSwoft\\PrometheusExporter\\"
        ],    

4.在.env配置文件中添加以下配置

PROMETHEUSEXPORTER_REDIS_PREFIX,持久化到redis的命名前缀
PROMETHEUSEXPORTER_PUSHGATEWAY_HOST, 若采用pushGateway,它的地址
PROMETHEUSEXPORTER_INSTANCE, 实例名,可以配置,也可以用主机名,适合多实例
PROMETHEUSEXPORTER_COUNTER_LINE,swoole table 申请的行数,下两个同理,若为0则不创建table
PROMETHEUSEXPORTER_GAUGE_LINE,
PROMETHEUSEXPORTER_HISTOGRAM_LINE,histogram需要的行数要较其他的较多,建议配置多点
PROMETHEUSEXPORTER_PERSISTENCE,prometheus 是否从redis获取持久化数据
    PROMETHEUSEXPORTER_REDIS_PREFIX=www:www-api:cache:
    PROMETHEUSEXPORTER_PUSHGATEWAY_HOST=http://localhost:9091
    PROMETHEUSEXPORTER_INSTANCE=local
    PROMETHEUSEXPORTER_COUNTER_LINE=1024
    PROMETHEUSEXPORTER_GAUGE_LINE=1024
    PROMETHEUSEXPORTER_HISTOGRAM_LINE=4096
    PROMETHEUSEXPORTER_PERSISTENCE=false

日常使用

1.注解使用(只支持方法)

注意,若想在Controller里的方法使用(普通的bean可以不关心),需要同时给Controller添加注解,比如:

        /**
         * @Controller(prefix="/test")
         * @PECounter()
         * @PEHistogram()
         * @PEGaugeAfter()
         * @PEGauge()
         */
         class TestController
         {
                /**
                 * @PECounter()
                 * @PEHistogram()
                 * @PEGaugeAfter()
                 * @PEGauge()
                 * @RequestMapping()
                 * @return string
                 */
                public function demo()
                {}
         }
         @PECounter(namespace="test", name="demo", value=1, labels={"test":"ok"}, help="123")
         value是 调用改方法会增加或者减少的值
         @PEHistogram(namespace="test", name="demo", labels={"test":"ok"}, help="123")
         该注解的作用是记录调用该方法的整个执行时间再进行Histogram
         @PEGauge(namespace="test", name="demo", value=1, labels={"test":"ok"}, help="123")
         @PEGaugeAfter(namespace="test", name="demo", returnKey="data,aa", labels={"test":"ok"}, help="123")
         两者区别在于一个依赖默认值,一个依赖返回值
         After注解的方法返回值必须是个数组,逗号代表着层级
         

2.方法调用

       /**
        * @Inject()
        * @var PECollectorRegistry
        */
       private $pECollectorRegistry;
       
       
        /**
         * @Inject()
         * @var PrometheusExporterTable
         */
       private $prometheusExporterTable;
       
       
         public function demo()
           {
               $this->collectorRegistry->counterIncr('test', 'demo', 1);
               $this->collectorRegistry->counterIncr('test', 'demo', 1);
               $this->collectorRegistry->counterIncr('test', 'demo', 1);
               $this->collectorRegistry->counterIncr('test', 'demo2', 1);
               $this->collectorRegistry->counterIncr('test', 'demo2', 1);
               $this->collectorRegistry->counterDecr('test', 'demo2', 1);
               $this->collectorRegistry->counterIncr('test', 'demo21', 1, ['test' => 'ok']);
               $this->collectorRegistry->counterIncr('test', 'demo22', 1, ['test' => 'ok', 'test2' => 'ok3'], 'this is good');
       
               $this->collectorRegistry->gaugeSet('test', 'demo3', "123", ['test' => 'ok']);
               $this->collectorRegistry->gaugeSet('test', 'demo4', "123", ['test' => 'ok']);
               $this->collectorRegistry->gaugeSet('test', 'demo3', "1234", ['test' => 'ok']);
       
               $this->collectorRegistry->histogramIncr('test', 'demo5', 0.03, ['test' => 'ok', 'kk' => 1]);
               $this->collectorRegistry->histogramIncr('test', 'demo5', 0.1, ['test' => 'ok', 'kk' => 1]);
               $this->collectorRegistry->histogramIncr('test', 'demo5', 8, ['test' => 'ok', 'kk' => 1]);
               $this->collectorRegistry->histogramIncr('test', 'demo5', 11, ['test' => 'ok', 'kk' => 1]);
               $this->collectorRegistry->histogramIncr('test', 'demo5', 0.03, ['test' => 'ok', 'kk' => 1]);
               $this->collectorRegistry->histogramIncr('test', 'demo5', 0.1, ['test' => 'ok', 'kk' => 1]);
               $this->collectorRegistry->histogramIncr('test', 'demo5', 8, ['test' => 'ok', 'kk' => 1]);
               $this->collectorRegistry->histogramIncr('test', 'demo5', 11, ['test' => 'ok', 'kk' => 1]);
       
       
       //        foreach($this->collectorRegistry->getCounters() as $key => $value)
       //        {
       //            $res = $this->prometheusExporterTable->getCounterTable()->get($key);
       //            var_dump($res);
       //        }
       //
       //        foreach($this->collectorRegistry->getGauges() as $key => $value)
       //        {
       //            $res = $this->prometheusExporterTable->getGaugeTable()->get($key);
       //            var_dump($res);
       //        }
       //
       //        foreach($this->collectorRegistry->getHistograms() as $key => $value)
       //        {
       //            $res = $this->prometheusExporterTable->getHistogramTable()->get($key);
       //            var_dump($res);
       //        }
           }

持久化

1.注解,给某个方法或接口加上缓存注解,调用即可,灵活方便(推荐)

   @PECacheTable() 

2.自行使用方法

   $this->collectorRegistry->cacheTable();

使用pushGateway

   /**
    * @Inject()
    * @var PushGateway
    */
    private $pushGateway;

   $this->pushGateway->push($this->collectorRegistry, 'swoft', array('instance'=>env('PROMETHEUSEXPORTER_INSTANCE')));
   $this->pushGateway->push($this->collectorRegistry, 'swoft', array('instance'=>gethostname()));

获取prometheus文本

具体可参照下面例子

    $this->collectorRegistry->getRender();

效果图

image

注意事项

  • namespace 和 name加上的大小最好不要超过40字节,可能会被截断
  • help参数限制的字符串为30字节以下
  • 一开始配置的line大小可能随着业务发展不够了,需要及时扩大

问题

####1.prometheus怎么用,好用不,搭配grafana怎么用?

答:好用,看完这本你都会了,prometheus实战

extraswoft/prometheus-exporter 适用场景与选型建议

extraswoft/prometheus-exporter 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 3.41k 次下载、GitHub Stars 达 5, 最近一次更新时间为 2018 年 08 月 03 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「php」 「swoole」 「prometheus」 「swoft」 「prometheusExporter」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 extraswoft/prometheus-exporter 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 extraswoft/prometheus-exporter 我们能提供哪些服务?
定制开发 / 二次开发

基于 extraswoft/prometheus-exporter 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 3.41k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 5
  • 点击次数: 6
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 5
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: Apache-2.0
  • 更新时间: 2018-08-03