依赖管理器/lumenzipkin

使用 Zipkin 为 Lumen 实现分布式追踪

v1.0 2020-12-02 09:25 UTC

This package is auto-updated.

Last update: 2024-09-29 05:49:43 UTC


README

Latest Stable Version Total Downloads License

对 Guzzle HTTP 客户端(微服务内部调用)的分布式追踪以及在 Lumen 中的动态分析

内容

先决条件

  • Composer
  • Docker(可选,如果你有 zipkin 端点,则不需要此步骤)

安装

composer require dipenduroy/lumenzipkin

注册 LumenZipkinServiceProvider

要启用 Lumen Zipkin 库,请将以下代码添加到 bootstrap/app.php 中

$app->register(DipenduRoy\LumenZipkin\LumenZipkinServiceProvider::class);

注册 ZipkinTraceMiddleware

在脚本结束时自动将所有追踪信息发送到 zipkin 服务器。这是将追踪信息推送到 zipkin 服务器的必要条件。

如果还没有中间件,请将 DipenduRoy\LumenZipkin\ZipkinTraceMiddleware::class 添加到 bootstrap/app.php 中中间件的列表中

$app->middleware([
    DipenduRoy\LumenZipkin\ZipkinTraceMiddleware::class
]);

启动 Zipkin 服务器

使用 Docker 启动 Zipkin 服务器

composer run-zipkin

用法

以下示例追踪了微服务之间的所有 Guzzle 调用。有关更多自定义追踪,请参考 zipkin-php

	//Set your application variables below
	$baseUri='http://local.app/';
	$method='POST';
	$requestUrl='example/url';
	$queryString='?filter=category';
	$formParams=[];
	
	//Get Zipkin Trace Object
	$ZipkinTrace=app('Trace\ZipkinTrace');
	
	/* Creates the span for getting the guzzle client call */
    $childSpan = $ZipkinTrace->createChildClientSpan($baseUri);
    
    //Tags can be configured as per your requirement for filtering the requests from zipkin dashboard
    $childSpan->tag(\Zipkin\Tags\HTTP_HOST, $baseUri);
    $childSpan->tag(\Zipkin\Tags\HTTP_URL, $baseUri.$requestUrl);
    $childSpan->tag(\Zipkin\Tags\HTTP_PATH, $requestUrl);
    $childSpan->tag(\Zipkin\Tags\HTTP_METHOD, strtoupper($method));
    
	$childSpan->annotate('request_started', \Zipkin\Timestamp\now());
    $client = new \GuzzleHttp\Client([
            'base_uri'  =>  $baseUri,
        ]);
    $headers['accept'] = "application/json";
    $headers=array_merge($headers,$ZipkinTrace->getHeaders());
    $params=[
            'form_params' => $formParams,
            'headers'     => $headers,
            'query' => $queryString,
        ];
    try {
        $response = $client->request($method, $requestUrl, $params);
    } catch (\GuzzleHttp\Exception\TransferException $e) {
        $response = $e->getResponse();
        if ($e->hasResponse()) {
            $responseString = $e->getResponse()->getBody(true);
        } else {
            $childSpan->tag(\Zipkin\Tags\HTTP_STATUS_CODE, 503);
            $childSpan->tag(\Zipkin\Tags\ERROR, 'Guzzle Transfer Exception');
            $childSpan->annotate('request_failed', \Zipkin\Timestamp\now());
        }
    }
    $childSpan->tag(\Zipkin\Tags\HTTP_STATUS_CODE, $response->getStatusCode());
    $childSpan->annotate('request_finished', \Zipkin\Timestamp\now());

配置

根据需要设置以下环境变量

APP_NAME 环境变量用于根追踪名称

LUMEN_ZIPKIN_ENABLE_SERVER_ADDRESS 环境变量用于启用服务器地址(如果可用)

使用自定义的 Zipkin 位置运行

如果你需要传递 zipkin 端点,只需将报告器 URL 作为 HTTP_REPORTER_URL 环境变量传递。默认的 zipkin 位置是 - https://:9411/api/v2/spans

HTTP_REPORTER_URL=http://myzipkin:9411/api/v2/span composer run-frontend

参考

感谢以下贡献者

  1. 此库使用 Zipkin PHP 库,更多详情请参考
  2. 详细了解 Zipkin in detail
  3. Zipkin PHP 示例