-
Notifications
You must be signed in to change notification settings - Fork 78
phpmyadmin에서 pinpoint c agent 사용 방법
왜 이 글을 작성했나요?
PHP 프로젝트를 모니터링하는 경험을 공유하기 위해서입니다.
이 글에서 무엇을 얻을 수 있나요?
- pnphpmyadmin과 같은 PHP 프로젝트를 pinpoint로 모니터링하는 방법
- 플러그인을 커스터마이징하는 방법
시작하기
https://www.phpmyadmin.net/
에 접근하여 phpmyadmin 프로젝트 설치
-
pinpoint_php 확장 설치
i.
pecl install pinpoint_php
orcurl -sL https://github.com/pinpoint-apm/pinpoint-c-agent/releases/latest/download/install_pinpoint_php.sh | sh
> 설치에 실패한 경우, 환경 정보를 issue에 공유해 주세요. ii. windows에서는https://pecl.php.net/package/pinpoint_php
에 접근하여 pinpoint.dll을 직접 다운로드-
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:
이제 클라이언트가 성공적으로 설치되었습니다.
phpmyadmin 페이지를 열면 다음과 같은 오류를 로그에서 볼 수 있습니다.
이 오류는 collector-agent가 설치되지 않았기 때문에 발생합니다.
collector-agent란? https://github.com/pinpoint-apm/pinpoint-c-agent/tree/dev/DOC/collector-agent
collector-agent를 설치하기 전에, pinpoint가 이미 설치되었는지 확인하세요.
By docker-compose
https://github.com/pinpoint-apm/pinpoint-docker
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
앞에서 중요한 부분 하나를 넘어갔는데 그 것이 바로 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
-
사용자 정의 클래스나 다른 내장 함수를 가로채기 추가
i. 내장 함수 - 함수가 호출되기 전에 플러그인 로드 - 플러그인 코드 템플릿
php 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/ 를 참고하세요.ii. 사용자 정의 클래스 (클래스 로더를 통해 로드되는 클래스 load by auto_loader 지원) -
\Pinpoint\Plugins\DefaultRequestPlugin
을 상속하고joinedClassSet
을 재정의 -AspectClassHandle
클래스를 등록php 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 를 참고하세요.