PHP分布式链路追踪技术实现
PHP分布式链路追踪技术实现在微服务架构中一个请求可能经过多个服务。链路追踪可以追踪请求的完整路径帮助我们定位性能瓶颈和错误。今天说说PHP中的分布式链路追踪实现。链路追踪的核心概念包括Trace、Span和SpanContext。一个Trace由多个Span组成每个Span代表一个操作。phpclass Span{public string $traceId;public string $spanId;public string $parentSpanId ;public string $name;public float $startTime;public float $endTime 0;public array $tags [];public array $logs [];public string $status ok;public function __construct(string $name, string $traceId , string $parentSpanId ){$this-name $name;$this-traceId $traceId ?: bin2hex(random_bytes(16));$this-spanId bin2hex(random_bytes(8));$this-parentSpanId $parentSpanId;$this-startTime microtime(true);}public function addTag(string $key, string $value): void{$this-tags[$key] $value;}public function log(string $event, array $fields []): void{$this-logs[] [time microtime(true),event $event,fields $fields,];}public function finish(): void{$this-endTime microtime(true);}public function getDuration(): float{$end $this-endTime ?: microtime(true);return ($end - $this-startTime) * 1000;}public function toArray(): array{return [trace_id $this-traceId,span_id $this-spanId,parent_span_id $this-parentSpanId,name $this-name,start_time $this-startTime,end_time $this-endTime,duration_ms $this-getDuration(),tags $this-tags,logs $this-logs,status $this-status,];}}class Tracer{private array $spans [];private static ?Tracer $instance null;public static function getInstance(): self{if (self::$instance null) {self::$instance new self();}return self::$instance;}public function startSpan(string $name, array $options []): Span{$traceId $options[trace_id] ?? $this-extractTraceId();$parentSpanId $options[parent_span_id] ?? $this-getCurrentSpanId();$span new Span($name, $traceId, $parentSpanId);if (isset($options[tags])) {foreach ($options[tags] as $key $value) {$span-addTag($key, $value);}}$this-spans[] $span;return $span;}public function finishSpan(Span $span, array $tags []): void{foreach ($tags as $key $value) {$span-addTag($key, $value);}$span-finish();$this-reportSpan($span);}public function inject(Span $span): array{return [x-trace-id $span-traceId,x-span-id $span-spanId,];}public function extractTraceId(): string{return $_SERVER[HTTP_X_TRACE_ID] ?? bin2hex(random_bytes(16));}private function getCurrentSpanId(): string{return $_SERVER[HTTP_X_SPAN_ID] ?? ;}private function reportSpan(Span $span): void{$log json_encode($span-toArray()) . \n;file_put_contents(/var/log/traces.log, $log, FILE_APPEND);}public function getSpans(): array{return $this-spans;}}?// 使用示例class UserServiceMiddleware{public function handle(): void{$tracer Tracer::getInstance();$span $tracer-startSpan(user_service.request, [tags [http.method $_SERVER[REQUEST_METHOD],http.url $_SERVER[REQUEST_URI],component user-service,],]);try {// 业务处理$result $this-processRequest();$tracer-finishSpan($span, [http.status_code 200]);} catch (Exception $e) {$span-status error;$tracer-finishSpan($span, [error $e-getMessage(),http.status_code 500,]);}}private function processRequest(): string{$tracer Tracer::getInstance();$dbSpan $tracer-startSpan(db.query, [tags [db.statement SELECT * FROM users],]);usleep(50000);$tracer-finishSpan($dbSpan, [db.rows 10]);return json_encode([status ok]);}}?链路追踪是微服务架构的重要基础设施。通过追踪请求的完整路径可以快速定位慢调用和错误。完整的链路追踪系统还包括数据采集、存储、分析和可视化。生产环境建议使用Jaeger、Zipkin或SkyWalking等成熟的链路追踪系统。