分布式链路跟踪系统 Zipkin

简介

官方地址:https://github.com/openzipkin/zipkin

链路追踪 Tracing Analysis 为分布式应用的开发者提供了完整的调用链路还原、调用请求量统计、链路拓扑、应用依赖分析等工具,可以帮助开发者快速分析和诊断分布式应用架构下的性能瓶颈,提高微服务时代下的开发诊断效率。

Zipkin运行架构

分布式链路跟踪系统 Zipkin

产品架构(链路追踪)

分布式链路跟踪系统 Zipkin

链路追踪的主要工作流程如下

  1. 客户侧的应用程序通过集成链路追踪的多语言客户端SDK上报服务调用数据。链路追踪支持多种开源社区的SDK,且支持OpenTracing标准。
  2. 数据上报至链路追踪控制台后,链路追踪组件进行实时聚合计算和持久化,形成链路明细、性能总览、实时拓扑等监控数据。您可以据此进行问题排查与诊断。
  3. 调用链数据可对接下游阿里云产品,例如LogSearch、CloudMonitor、MaxCompute等,用于离线分析、报警等场景。

业务场景

随着业务越来越复杂,系统也随之进行各种拆分,特别是随着微服务架构和容器技术的兴起,看似简单的一个应用,后台可能有几十个甚至几百个服务在支撑;一个前端的请求可能需要多次的服务调用最后才能完成;当请求变慢或者不可用时,我们无法得知是哪个后台服务引起的,这时就需要解决如何快速定位服务故障点,zipkin分布式跟踪系统就能很好的解决这样的问题。

分布式链路跟踪系统 Zipkin

请求&响应

微服务架构下,一次请求后端会经历多个服务调用(所有请求链有相同的traceId和不同的spanId),都会沿着traceText带到每一个服务中。

数据是如何上报的?

直接上报数据

分布式链路跟踪系统 Zipkin

不通过Agent而直接上报数据的原理(传统框架。PHP-FPM + Nginx模式)

  • ThinkPHP6.0
  • Laravel
  • Yii2.0

通过Agent上报数据

分布式链路跟踪系统 Zipkin

通过Agent上报数据的原理(现代化框架。命令行模式)

  • webman

Webman入门实战

开通服务

1. 开通ARMS

开通ARMS地址 https://arms.console.aliyun.com/ (一般有15天试用)

2. 获得数据上报接入点url

进入 https://tracing.console.aliyun.com/#/globalSetting/cn-hangzhou/process 按照图示获得接入点url地址。

分布式链路跟踪系统 Zipkin

如果你的服务器在阿里云上可以用阿里云vpc网络接入点,本示例用的是阿里云公网接入点

安装

通过composer安装:

composer require openzipkin/zipkin

使用

1. 编写中间件

链路监控中间件 appmiddlewareArmsMiddleware.php

<?php
/**
 * @desc 全链路监控中间件
 * @author Tinywan(ShaoBo Wan)
 * @date 2023/09/14 11:06
 */

declare(strict_types=1);

namespace appmiddleware;

use MonologHandlerErrorLogHandler;
use MonologLogger;
use supportLog;
use thinkfacadeDb;
use WebmanMiddlewareInterface;
use WebmanHttpResponse;
use WebmanHttpRequest;
use ZipkinReportersHttp;
use ZipkinTracingBuilder;
use ZipkinSamplersBinarySampler;
use ZipkinEndpoint;
use WorkermanTimer;
use const ZipkinTagsSQL_QUERY;

class ArmsMiddleware implements MiddlewareInterface
{
    /**
     * @desc: 方法描述
     * @param Request $request
     * @param callable $next
     * @return Response
     * @author Tinywan(ShaoBo Wan)
     */

    public function process(Request $request, callable $next) : Response
    
{
        static $tracing = null, $tracer = null;
        if (!$tracing) {
            $endpoint = Endpoint::create('开源技术小栈', $request->getRealIp(), null2555);
            $logger = new Logger('log');
            $logger->pushHandler(new ErrorLogHandler());
            $reporter = new Http(['endpoint_url' => config('security')['endpoint_url']]);
            $sampler = BinarySampler::createAsAlwaysSample();
            $tracing = TracingBuilder::create()
                ->havingLocalEndpoint($endpoint)
                ->havingSampler($sampler)
                ->havingReporter($reporter)
                ->build();
            $tracer = $tracing->getTracer();
            // 55秒上报一次,尽量将上报对业务的影响减少到最低
            Timer::add(55function () use ($tracer) {
                $tracer->flush();
            });
            register_shutdown_function(function () use ($tracer) {
                $tracer->flush();
            });
        }

        $rootSpan = $tracer->newTrace();
        $rootSpan->setName($request->controller."::".$request->action);
        $rootSpan->start();
        $request->rootSpan = $rootSpan;
        $request->tracer = $tracer;
        $result = $next($request);

        // 统计sql(日志在内存)
        if (class_exists(Db::class)) {
            $logs = Db::getDbLog(true);
            if (!empty($logs['sql'])) {
                foreach ($logs['sql'as $sql) {
                    $sqlSpan = $tracer->newChild($rootSpan->getContext());
                    $sqlSpan->setName(SQL_QUERY);
                    $sqlSpan->start();
                    $sqlSpan->tag('db.statement', $sql);
                    $sqlSpan->finish();
                }
            }
        }

        $rootSpan->finish();

        return $result;
    }
}

2. 配置中间件

config/middleware.php 中添加全局中间件如下

return [
    '' => [
        appmiddlewareArmsMiddleware::class,
    ],
    ...
];

3. 查看监控

访问地址 https://tracing.console.aliyun.com/ ,效果类似如下

分布式链路跟踪系统 Zipkin

接口监控

分布式链路跟踪系统 Zipkin

数据库监控

分布式链路跟踪系统 Zipkin


原文始发于微信公众号(开源技术小栈):分布式链路跟踪系统 Zipkin

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/248410.html

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!