在phpmyadmin中使用pinpoint

eeliu發表於2024-08-29

> from https://github.com/pinpoint-apm/pinpoint-c-agent/wiki/%E5%9C%A8phpmyadmin%E4%B8%AD%E4%BD%BF%E7%94%A8pinpoint

怎樣在phpmyadmin 中使用pinpoint-c-agent

為什麼我們要釋出這篇文章 ?

分享一些監控PHP專案的經驗

您能從裡面獲取到啥 ?

  1. 怎樣使用pinpoint監控PHP專案,比如phpmyadmin
  2. 怎樣自定義外掛

開始

安裝pinpoint php 客戶端

安裝phpmyadmin 專案 https://www.phpmyadmin.net/

  1. 安裝 pinpoint_php 擴充套件

    1. pecl install pinpoint_php or curl -sL https://github.com/pinpoint-apm/pinpoint-c-agent/releases/latest/download/install_pinpoint_php.sh | sh

      假如安裝失敗了,請在issue上面共享你的環境資訊給我們。

    2. 如果是 windows 直接下載 pinpoint.dll https://pecl.php.net/package/pinpoint_php  windows_dll
      • 如果不能訪問 pecl.php.net, 試著從GitHub release 頁面下載. github release
  2. 不要忘了在php.ini 啟用 pinpoint_php

    detail setting https://github.com/pinpoint-apm/pinpoint-c-agent/blob/dev/DOC/PHP/Readme.md#steps

    [pinpoint_php]
    extension=pinpoint_php.so
    pinpoint_php.CollectorHost=tcp:collector-agent-host:10000
    pinpoint_php.DebugReport=true
    ...
  3. 加入 pinpoint-php-aop 依賴

    composer require -w pinpoint-apm/pinpoint-php-aop

  4. 恭喜你,這是最後一步了。在專案裡面的入口檔案,啟用pinpoint。

    • phpmyadmin:
      <?php
      // www/html/index.php
      ...
      require AUTOLOAD_FILE;
      
      class MyAdminRequestPlugin extends Pinpoint\Plugins\DefaultRequestPlugin
      {
          public function __construct()
          {
              $blackUri = ['/favicon.ico'];
              // if uri in blackUri, skips it 
              if (!in_array($_SERVER['REQUEST_URI'], $blackUri)) {
                  parent::__construct();
              }
          }
          public function __destruct()
          {
              // do nothing
          }
      }
      define('APPLICATION_NAME', 'cd.dev.test.php'); // your application name
      define('APPLICATION_ID', 'cd.dev.phpmyadmin');  // your application id
      define('PP_REQ_PLUGINS', MyAdminRequestPlugin::class);
      require_once __DIR__ . '/vendor/pinpoint-apm/pinpoint-php-aop/auto_pinpointed.php';
      
      ...

到此為止,客戶端已經安裝成功了。

安裝 collector-agent(pinpoint 協議的代理模組)

開啟你的phpmyadmin 頁面,你可能在日誌裡面看到如下錯誤 collector-agent

這就是由於collector-agent 沒有安裝

什麼是collector-agent: https://github.com/pinpoint-apm/pinpoint-c-agent/tree/dev/DOC/collector-agent

在你安裝collector-agent 之前,請保證pinpoint 已經安裝成功了

安裝 pinpoint

By docker-compose

https://github.com/pinpoint-apm/pinpoint-docker

安裝 collector-agent

docker run -itd -p 10000:10000 --env-file ./env.list ghcr.io/pinpoint-apm/pinpoint-c-agent/collector-agent:latest

## env.list dev-pinpoint 就是pinpoint collector 的地址
PP_COLLECTOR_AGENT_SPAN_IP=dev-pinpoint
PP_COLLECTOR_AGENT_SPAN_PORT=9993
PP_COLLECTOR_AGENT_AGENT_IP=dev-pinpoint
PP_COLLECTOR_AGENT_AGENT_PORT=9991
PP_COLLECTOR_AGENT_STAT_IP=dev-pinpoint
PP_COLLECTOR_AGENT_STAT_PORT=9992
...

詳細文件: https://github.com/pinpoint-apm/pinpoint-c-agent/blob/dev/DOC/collector-agent/readme.md

檢查PHP專案的請求是否在pinpoint-web 上顯示

服務呼叫圖

service call

呼叫棧圖

call stack

怎樣自定義外掛

我跳過了一個重要的部分,pinpoint 入口檔案。我在這裡專門介紹它。

什麼是入口檔案 ? 就是下面的程式碼塊

require_once __DIR__ . '/vendor/autoload.php'; // !!! must insert right behind system/framework autoload

define('APPLICATION_NAME', 'cd.dev.test.php'); // your application name
define('APPLICATION_ID', 'cd.dev.phpmyadmin');  // your application id
define('PP_REQ_PLUGINS', \Pinpoint\Plugins\DefaultRequestPlugin::class); //
require_once __DIR__ . '/vendor/pinpoint-apm/pinpoint-php-aop/auto_pinpointed.php';

這個變數用來配置一些特殊的需求

  1. 忽略頁面
    public function __construct()
    {
        $blackUri = ['/favicon.ico']; // 這裡忽略的頁面
        // if uri in blackUri, skips it 
        if (!in_array($_SERVER['REQUEST_URI'], $blackUri)) {
            parent::__construct();
        }
    }

完整的例子參考 : https://github.com/pinpoint-apm/pinpoint-c-agent/blob/dev/testapps/php_phpmyadmin/index.php#L38-L44

  1. 新增攔截自己定義的類或者其他內建函式

    1. 內建函式
      • 在監控函式被呼叫前,載入外掛
      • 外掛程式碼模板
      pinpoint_join_cut(
          "built-in-function/method",$on_before_callback,$on_end_callback,$on_exception_callback
      )

      這裡也有很多例子,請參考 https://github.com/pinpoint-apm/pinpoint-php-aop/blob/dev/lib/Pinpoint/Plugins/SysV2/

    2. 使用者自定義類 (支援透過類載入器載入的類 load by auto_loader)
      • 繼承 \Pinpoint\Plugins\DefaultRequestPlugin 並重寫 joinedClassSet
      • 註冊 AspectClassHandle
          public function joinedClassSet(): array
          {
              // don't forget passing the parent AspectClassHandle
              $cls = parent::joinedClassSet();
              $classHandler = new Pinpoint\Common\AspectClassHandle(\User\ABC::class);
              $classHandler->addJoinPoint('foo_method', \Pinpoint\Plugins\Common\CommonPlugin::class);
              $cls[] = $classHandler; //完成註冊
              return $cls;
          }

      這裡也有很多例子,請參考 https://github.com/pinpoint-apm/pinpoint-php-aop/blob/dev/lib/Pinpoint/Plugins/Yii2PerRequestPlugins.php,https://github.com/pinpoint-apm/pinpoint-php-aop/blob/dev/lib/Pinpoint/Plugins/DefaultRequestPlugin.php

相關文章