PHP CLI 스크립트 추적

단기 실행 CLI 스크립트

단기 실행 스크립트는 보통 몇 초나 몇 분간 실행됩니다. 예상되는 동작은 스크립트가 한번 실행되는 동안 트레이스 하나를 수신하는 것입니다.

기본적으로 명령줄에서 실행되는 PHP 스크립트에는 추적이 비활성화되어 있습니다. DD_TRACE_CLI_ENABLED1로 설정하면 활성화할 수 있습니다.

$ export DD_TRACE_CLI_ENABLED=1
# Optionally, set the agent host and port if different from localhost and 8126, respectively
$ export DD_AGENT_HOST=agent
$ export DD_TRACE_AGENT_PORT=8126

예를 들어 다음 script.php가 cURL 요청을 실행한다고 가정해봅니다.

<?php
sleep(1);
$ch = curl_init('https://httpbin.org/delay/1');
curl_exec($ch);
sleep(1);

다음 스크립트를 실행합니다.

$ php script.php

스크립트가 실행되면 트레이스가 생성되고, 스크립트가 종료되면 Datadog 백엔드로 전송됩니다.

단기 실행 PH CLI 스크립트 트레이스

장기 CLI 스크립트

장기 스크립트는 몇 시간 또는 며칠간 실행됩니다. 이 같은 스크립트는 보통 새 수신 메시지나 데이터베이스에 새롭게 추가된 줄을 처리하는 것과 같이 특정 태스크를 반복적으로 실행합니다. 예상 동작은 각 “작업 유닛”(예: 메시지 처리)별로 트레이스 하나가 생성되는 것입니다.

기본적으로 명령줄에서 실행되는 PHP 스크립트에는 추적이 비활성화되어 있습니다. DD_TRACE_CLI_ENABLED1로 설정하면 활성화할 수 있습니다.

$ export DD_TRACE_CLI_ENABLED=1
# With this pair of settings, traces for each "unit of work" is sent as soon as the method execution terminates.
$ export DD_TRACE_GENERATE_ROOT_SPAN=0
$ export DD_TRACE_AUTO_FLUSH_ENABLED=1
# Optionally, set service name, env, etc...
$ export DD_SERVICE=my_service
# Optionally, set the agent host and port if different from localhost and 8126, respectively
$ export DD_AGENT_HOST=agent
$ export DD_TRACE_AGENT_PORT=8126

다음 long_running.php 스크립트 예를 참고하세요.

<?php
/* Datadog 특정 코드. 별도 파일일 수 있으며 이 스크립트에 필수 */
use function DDTrace\trace_method;
use function DDTrace\trace_function;
use DDTrace\SpanData;
trace_function('processMessage', function(SpanData $span, $args) {
    // 액세스 방법 인수 및 리소스 이름 변경
    $span->resource =  'message:' . $args[0]->id;
    $span->meta['message.content'] = $args[0]->content;
    $span->service = 'my_service';
});
trace_method('ProcessingStage1', 'process', function (SpanData $span, $args) {
    $span->service = 'my_service';
    // 리소스 이름이 인증된 방법 이름으로 기본 설정됨.
});
trace_method('ProcessingStage2', 'process', function (SpanData $span, $args) {
    $span->service = 'my_service';
    $span->resource = 'message:' . $args[0]->id;
});
/* Datadog 코드 종료 */
/** 수신하고 처리할 메시지를 의미 */
class Message
{
    public $id;
    public $content;
    public function __construct($id, $content)
    {
        $this->id   = $id;
        $this->content = $content;
    }
}
/** 여러 처리 단계 중 하나, 각 단계에는 Span이 있어야 함 */
class ProcessingStage1
{
    public function process(Message $message)
    {
        sleep(1);
        $ch = curl_init('https://httpbin.org/delay/1');
        curl_exec($ch);
    }
}
/** 여러 처리 단계 중 하나, 각 단계에는 Span이 있어야 함 */
class ProcessingStage2
{
    public function process(Message $message)
    {
        sleep(1);
    }
}
/** 실제 적용 시에는 소스에서 새 메시지를 읽음(예: 대기열) */
function waitForNewMessages()
{
    return [
        new Message($id = (time() + rand(1, 1000)), 'content of a message: ' . $id),
        new Message($id = (time() + rand(1, 1000)), 'content of a message: ' . $id),
        new Message($id = (time() + rand(1, 1000)), 'content of a message: ' . $id),
    ];
}
/** 이 함수는 "작업 단위"임, 한번 실행할 때마다 단일 트레이스를 생성함 */
function processMessage(Message $m, array $processors)
{
    foreach ($processors as $processor) {
        $processor->process($m);
        usleep(100000);
    }
}
$processors = [new ProcessingStage1(), new ProcessingStage2()];
/** 새 메시지를 기다리며 영구적으로 실행되는 루프 */
while (true) {
    $messages = waitForNewMessages();
    foreach ($messages as $message) {
        processMessage($message, $processors);
    }
}

다음 스크립트를 실행합니다.

$ php long_running.php

스크립트가 실행되면 트레이스 하나가 생성되고, 새 메시지를 처리할 때마다 Datadog 백엔드로 전송됩니다.

장기 실행 PHP CLI 스크립트 트레이스

참고 자료

추가 유용한 문서, 링크 및 기사: