(二)zipkin实现阿里云的全链路追踪【Swoft】【PHP】

本文介绍了如何在PHP的Swoft框架下利用Zipkin实现全链路监控。首先,前端生成trace_id,遵循特定的生成规则,然后在框架内部进行检查。接着,通过监听DB事件DdEvent::SQL_RAN来捕获数据库操作。同时,设置HttpBeforeListener和HttpAfterRequestListener以跟踪HTTP请求。最终,展示了实现后的效果。
摘要由CSDN通过智能技术生成

1.Trace_id问题

若想实现全链路监控,必须由前端发起,从而实现一体化的监控。实现思路,主要是前端自己生成trace_id及其他必要的上下文参数。

经过摸索,x-b3-traceid生成规则如下,先生成8位随机字符串(0-9a-zA-Z) ,然后再转换成十六进制,如:30d7cab480f9193c 。

在框架中的源码实现方式如下:ctype_xdigit或者isValidTraceId可以用这个去查看是否符合规则

/**
 * @return string
 */
function generateNextId(): string
{
    return \bin2hex(\openssl_random_pseudo_bytes(8));
}
   $nextId = '43766e39446a5254';
   $result = ctype_xdigit($nextId);
   $result2 = isValidTraceId($nextId);
   vdump($result,$result2, $nextId, strlen($nextId));

亦可用如下的代码实现:

$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$length = 8;
echo bin2hex(substr(str_shuffle(str_repeat($pool, 5)), 0, $length));

最后生成的效果是,

2.DBListener问题 

笔者用的是swoft框架,所以只需监听 DdEvent::SQL_RAN 若是其他框架,自行捕捉db事件

废话不多说:上代码

<?php declare(strict_types=1);

namespace App\Listener;

use Swoft\Db\Connection\Connection;
use Swoft\Db\DbEvent;
use Swoft\Event\Annotation\Mapping\Listener;
use Swoft\Event\EventHandlerInterface;
use Swoft\Event\EventInterface;
use Swoft\Http\Server\HttpContext;
use Swoft\Log\Helper\CLog;
use const Zipkin\Kind\CLIENT;
use function Zipkin\Timestamp\now;

/**
 * Class DbListener
 * @package App\Listener
 * @Listener(DbEvent::SQL_RAN)
 */
class DbListener implements EventHandlerInterface
{
    /**
     * SQL ran
     *
     * @param EventInterface $event
     *
     */
    public function handle(EventInterface $event): void
    {
        /** @var Connection $connect
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值