依赖管理器 / lumenzipkin
使用 Zipkin 为 Lumen 实现分布式追踪
v1.0
2020-12-02 09:25 UTC
Requires
- illuminate/support: ~5.3|~5.4|~5.5|~5.6|^6.0|^7.0
- openzipkin/zipkin: ^1.3.6|^2.0
README
对 Guzzle HTTP 客户端(微服务内部调用)的分布式追踪以及在 Lumen 中的动态分析
内容
先决条件
安装
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
参考
感谢以下贡献者
- 此库使用 Zipkin PHP 库,更多详情请参考
- 详细了解 Zipkin in detail
- Zipkin PHP 示例