whitemerry/phpkin

PHP Zipkin 实现

1.2.7 2017-08-06 10:48 UTC

This package is not auto-updated.

Last update: 2024-09-13 22:51:30 UTC


README

Software License Latest Stable Version OpenTracing Badge Maintainability Test Coverage

第一个 生产就绪,简单且完整的 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