whitemerry/ phpkin
PHP Zipkin 实现
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: ~5.7
This package is not auto-updated.
Last update: 2024-09-13 22:51:30 UTC
README
第一个 生产就绪,简单且完整的 Zipkin 实现,无需依赖。
兼容前后端应用程序,并遵循 B3 传播。
通过 Composer 安装
$ composer require whitemerry/phpkin
文档
简短的实现信息
在此项目中,BinaryAnnotations 是元数据,注解被 AnnotationBlock 替换,这允许您更快、更干净地创建 Span 的注解。所有这些方法都有比这里使用的更多参数,请阅读 PHPDocs 并记住,您可以通过实现接口或扩展类来更改一切。
让我们开始吧
第一步,非常重要的一步是为跟踪器定义您的服务元信息
$endpoint = new Endpoint( 'My application', // Application name '127.0.0.1', // Current application IP address '80' // Current application port (default 80) );
接下来,定义跟踪数据的存储 - 目前支持两种类型:SimpleHttpLogger(自动将跟踪数据发送到 Zipkin 的服务)和 FileLogger(您可以在下面了解更多信息)
$logger = new SimpleHttpLogger([ 'host' => 'http://192.168.33.11:9411' // Zipkin's API host with schema (http://) and without trailing slash ]);
现在您可以初始化 Tracer!
对于前端应用程序(TraceId 的来源、SpanId 和 Sampled 用于其他微服务)
$tracer = new Tracer( 'https:///login', // Trace name $endpoint, // Your application meta-information $logger // Logger used to store/send traces ); $tracer->setProfile(Tracer::FRONTEND);
对于后端应用程序/微服务(现有 TraceId、SpanId 和 Sampled 的消费者)
$traceId = null; if (!empty($_SERVER['HTTP_X_B3_TRACEID'])) { $traceId = new TraceIdentifier($_SERVER['HTTP_X_B3_TRACEID']); } $traceSpanId = null; if (!empty($_SERVER['HTTP_X_B3_SPANID'])) { $traceSpanId = new SpanIdentifier($_SERVER['HTTP_X_B3_SPANID']); } $isSampled = null; if (!empty($_SERVER['HTTP_X_B3_SAMPLED'])) { $isSampled = (bool) $_SERVER['HTTP_X_B3_SAMPLED']; } $tracer = new Tracer( 'https:///login', $endpoint, $logger, $sampled, $traceId, $traceSpanId ); $tracer->setProfile(Tracer::BACKEND);
所有这些行都应尽早初始化,在框架的 bootstrap.php 中是不错的选择。
在 PHPDocs 中有更多参数和描述!例如,如果您是前端应用程序,您可以使用 PercentageSampler,这是切换跟踪日志的工具(您不需要记录所有内容)。
作为最后一步,只需从 $tracer 触发跟踪方法即可,例如在框架的关闭事件中,或在 index.php 的末尾
$tracer->trace();
现在,如您所见,您在 Zipkin 的 UI 中有了新的条目! :)
向跟踪添加跨度
如您所知,在 Zipkin 中,您可以存储和可视化两个服务之间的通信(例如数据库、微服务)。因此,您需要创建 Span(Zipkin 中关于请求的信息块)
// Before request - read current timestamp in zipkin format $requestStartTimestamp = zipkin_timestamp(); $spanIdentifier = new SpanIdentifier(); /* ... Request logic Remember, you need to add B3 headers to your request: X-B3-TraceId = TracerInfo::getTraceId(); X-B3-SpanId = $spanIdentifier; X-B3-Sampled = TracerInfo::isSampled(); */ $endpoint = new Endpoint( 'Accounts microservice', // Name of service you're connecting with '127.0.1.1', // This service Ip '8000' // And port ); $annotationBlock = new AnnotationBlock( $endpoint, $requestStartTimestamp ); $span = new Span( $spanIdentifier, 'Authorize user', $annotationBlock );
并将其添加到跟踪器
$tracer->addSpan($span);
静态调用跟踪器
您可以通过初始化 TracerProxy 在项目的任何地方访问跟踪器
$tracer = new Tracer(...); // Your tracer instance TracerProxy::init($tracer);
现在您有权访问以下方法
TracerProxy::addSpan($span); TracerProxy::trace();
我在哪里可以找到关于此跟踪的信息?
所有元信息都在静态类 TracerInfo 中
TracerInfo::getTraceId(); // TraceId - X-B3-TraceId TracerInfo::getTraceSpanId(); // ParentId - X-B3-ParentId TracerInfo::isSampled(); // Sampled - X-B3-Sampled
向其他服务发送请求
请参阅我们的 示例。您需要自行在您的 rest/api/guzzle 客户端设置 B3 头部。
日志记录器的差异
SimpleHttpLogger - 允许您通过在用户请求结束时上传日志到网站来立即尝试 zipkin。然而,这将延迟对用户的响应。
FileLogger - 允许您设置异步报告到 zipkin。虽然这是同步写入磁盘,但在实践中对调用者的延迟影响最小,但您需要自己编写 上传到 zipkin 工具。
有关更多信息,请参阅 此票据!
日志是否自动上传到 Zipkin?
对于 SimpleHttpLogger,简短的回答是 是
对于 FileLogger,更长的回答是,您需要自己将日志从 zipkin.log 上传到 Zipkin,例如通过在后台运行的 cron 工作在 Zipkin (API) 执行 POST 操作。
单元测试
代码覆盖率(由PHPUnit生成)
- 行数:70.35%(140 / 199)
- 函数和方法:52.08%(25 / 48)
- 类和特性:58.33%(7 / 12)
待办事项
- AsyncHttpLogger(基于CURL)
- 将FileLogger上传到zipkin cron
灵感来源于 Tolerance