단기 실행 CLI 스크립트
단기 실행 스크립트는 보통 몇 초나 몇 분간 실행됩니다. 예상되는 동작은 스크립트가 한번 실행되는 동안 트레이스 하나를 수신하는 것입니다.
기본적으로 명령줄에서 실행되는 PHP 스크립트에는 추적이 비활성화되어 있습니다. DD_TRACE_CLI_ENABLED를 1로 설정하면 활성화할 수 있습니다.
$ 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);
다음 스크립트를 실행합니다.
스크립트가 실행되면 트레이스가 생성되고, 스크립트가 종료되면 Datadog 백엔드로 전송됩니다.
장기 CLI 스크립트
장기 스크립트는 몇 시간 또는 며칠간 실행됩니다. 이 같은 스크립트는 보통 새 수신 메시지나 데이터베이스에 새롭게 추가된 줄을 처리하는 것과 같이 특정 태스크를 반복적으로 실행합니다. 예상 동작은 각 “작업 유닛”(예: 메시지 처리)별로 트레이스 하나가 생성되는 것입니다.
기본적으로 명령줄에서 실행되는 PHP 스크립트에는 추적이 비활성화되어 있습니다. DD_TRACE_CLI_ENABLED를 1로 설정하면 활성화할 수 있습니다.
$ 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); } }
다음 스크립트를 실행합니다.
스크립트가 실행되면 트레이스 하나가 생성되고, 새 메시지를 처리할 때마다 Datadog 백엔드로 전송됩니다.
참고 자료