报价服务

此服务负责根据要发货的商品数量来计算运费。Quote Service 通过 HTTP 从 Shipping Service 调用。

Quote Service 使用 Slim 框架和 php-di 来管理依赖注入。

使用不同的框架时,PHP 仪器化可能会有所不同。

Quote Service 源码

追踪

初始化追踪

在此演示中,OpenTelemetry SDK 已作为 SDK 自动加载的一部分自动创建,这发生在 composer 自动加载过程中。

这通过设置环境变量 OTEL_PHP_AUTOLOAD_ENABLED=true 来启用。

require __DIR__ . '/../vendor/autoload.php';

有多种方法可以创建或获取 Tracer,在此示例中,我们从全局 Tracer Provider 获取一个,该 Provider 已在 SDK 自动加载过程中初始化。

$tracer = Globals::tracerProvider()->getTracer('manual-instrumentation');

手动创建 Span

可以通过 Tracer 手动创建 Span。默认情况下,Span 将是当前执行上下文中活动 Span 的子 Span。

$span = Globals::tracerProvider()
    ->getTracer('manual-instrumentation')
    ->spanBuilder('calculate-quote')
    ->setSpanKind(SpanKind::KIND_INTERNAL)
    ->startSpan();
/* calculate quote */
$span->end();

添加 Span 属性

您可以使用 OpenTelemetry\API\Trace\Span 获取当前 Span。

$span = Span::getCurrent();

通过 Span 对象上的 setAttribute 来添加 Span 属性。在 calculateQuote 函数中,向 childSpan 添加了 2 个属性。

$childSpan->setAttribute('app.quote.items.count', $numberOfItems);
$childSpan->setAttribute('app.quote.cost.total', $quote);

添加跨度事件

通过 Span 对象上的 addEvent 来添加 Span 事件。在 getquote 路由中添加了 Span 事件。有些事件带有附加属性,有些则不带。

添加不带属性的 Span 事件

$span->addEvent('Received get quote request, processing it');

添加带有附加属性的 Span 事件

$span->addEvent('Quote processed, response sent back', [
    'app.quote.cost.total' => $payload
]);

指标

在此演示中,指标由批处理跟踪和日志处理器发出。指标描述了处理器的内部状态,例如导出的 Span 或日志的数量、队列限制和队列使用情况。

您可以通过设置环境变量 OTEL_PHP_INTERNAL_METRICS_ENABLEDtrue 来启用指标。

还会发出一个手动指标,该指标计算生成的引用数量,并包含一个关于商品数量的属性。

计数器是从全局配置的 Meter Provider 创建的,并且每次生成引用时都会递增。

static $counter;
$counter ??= Globals::meterProvider()
    ->getMeter('quotes')
    ->createCounter('quotes', 'quotes', 'number of quotes calculated');
$counter->add(1, ['number_of_items' => $numberOfItems]);

指标会累积,并根据 OTEL_METRIC_EXPORT_INTERVAL 中配置的值定期导出。

日志

Quote Service 在计算完引用后会发出日志消息。Monolog 日志包配置了 Logs Bridge,该 Bridge 将 Monolog 日志转换为 OpenTelemetry 格式。发送到此日志记录器的日志将通过全局配置的 OpenTelemetry 日志记录器导出。