> 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專案的經驗
您能從裡面獲取到啥 ?
- 怎樣使用pinpoint監控PHP專案,比如phpmyadmin
- 怎樣自定義外掛
開始
安裝pinpoint php 客戶端
安裝phpmyadmin 專案
https://www.phpmyadmin.net/
。
-
安裝 pinpoint_php 擴充套件
pecl install pinpoint_php
orcurl -sL https://github.com/pinpoint-apm/pinpoint-c-agent/releases/latest/download/install_pinpoint_php.sh | sh
假如安裝失敗了,請在issue上面共享你的環境資訊給我們。
- 如果是
windows
直接下載 pinpoint.dllhttps://pecl.php.net/package/pinpoint_php
- 如果不能訪問
pecl.php.net
, 試著從GitHub release 頁面下載.
- 如果不能訪問
-
不要忘了在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 ...
-
加入
pinpoint-php-aop
依賴composer require -w pinpoint-apm/pinpoint-php-aop
-
恭喜你,這是最後一步了。在專案裡面的入口檔案,啟用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'; ...
- phpmyadmin:
到此為止,客戶端已經安裝成功了。
安裝 collector-agent(pinpoint 協議的代理模組)
開啟你的phpmyadmin 頁面,你可能在日誌裡面看到如下錯誤
這就是由於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 上顯示
服務呼叫圖
呼叫棧圖
怎樣自定義外掛
我跳過了一個重要的部分,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';
這個變數用來配置一些特殊的需求
- 忽略頁面
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
-
新增攔截自己定義的類或者其他內建函式
- 內建函式
- 在監控函式被呼叫前,載入外掛
- 外掛程式碼模板
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/
- 使用者自定義類 (支援透過類載入器載入的類 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
- 繼承
- 內建函式