Skip to content

phpmyadmin에서 pinpoint c agent 사용 방법

Evelyn0927 edited this page Aug 12, 2024 · 2 revisions

English | 中文 | 한국어

phpmyadmin에서 pinpoint-c-agent 사용 방법

왜 이 글을 작성했나요?

PHP 프로젝트를 모니터링하는 경험을 공유하기 위해서입니다.

이 글에서 무엇을 얻을 수 있나요?

  1. pnphpmyadmin과 같은 PHP 프로젝트를 pinpoint로 모니터링하는 방법
  2. 플러그인을 커스터마이징하는 방법

시작하기

pinpoint php 클라이언트 설치

https://www.phpmyadmin.net/에 접근하여 phpmyadmin 프로젝트 설치

  1. pinpoint_php 확장 설치

    i. pecl install pinpoint_php or curl -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을 직접 다운로드  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. 사용자 정의 클래스나 다른 내장 함수를 가로채기 추가

    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 를 참고하세요.