阿里云ACE共创空间——链路追踪产品测试

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
日志服务 SLS,月写入数据量 50GB 1个月
简介: 链路追踪产品测试,并根据JAVA和Python代码来分析其SDK的实现原理

一、文档解读
image
1、分布式调用链查询和诊断:追踪分布式架构中的所有微服务用户请求,并将它们汇总成分布式调用链。
2、应用性能实时汇总:通过追踪整个应用程序的用户请求,来实时汇总组成应用程序的单个服务和资源。
3、分布式拓扑动态发现:用户的所有分布式微服务应用和相关 PaaS 产品可以通过链路追踪收集到的分布式调用信息。
4、多语言开发程序接入:基于 OpenTracing 标准,全面兼容开源社区,例如 Jaeger 和 Zipkin。
5、丰富的下游对接场景:收集的链路可直接用于日志分析,且可对接到 MaxCompute 等下游分析平台。

特点及作用分析:链路追踪工具是提供给开发者的一个记录应用调用过程和信息的一个工具,其上游支持不同编程语言SDK的接入,能够将开发者需要的分布式调用信息(包括微服务的和中间件产品)对接到下游平台进行分析。这些信息的作用是帮助用户对于应用在调用期间的问题进行收集,帮助开发者快速分析和诊断分布式应用架构下的性能瓶颈,提高微服务时代下的开发诊断效率。

二、产品测试
开通链路追踪后需要注意两个事项,因为链路追踪服务的下游牵涉到LOG SERVICE日志服务,因此需要授权链路追踪读写日志服务,主要通过三个步骤:
1、开通日志服务
2、开通访问控制RAM
3、授权链路追踪读写日志服务

之后会出现各种语言SDK的接入信息,从免费版来看支持JAVA、C++、Python、GO,这里我们以最常见的JAVA语言和Python语言的接入通过代码来分析整个链路追踪的配置,采用的是spring cloud方式来进行埋点:

JAVA语言SDK:

<dependency>
   <groupId>io.opentracing.contrib</groupId>
  <artifactId>opentracing-spring-cloud-starter</artifactId>
  <version>0.2.0</version>
</dependency>
<dependency>
  <groupId>io.jaegertracing</groupId>
  <artifactId>jaeger-client</artifactId>
  <version>0.31.0</version>
</dependency>

代码分析:以上是通过spring cloud方式进行埋点,所以代码分为两部分,引入 Jar 包依赖和添加组件依赖。

@Bean
public io.opentracing.Tracer tracer() {
    io.jaegertracing.Configuration config = new io.jaegertracing.Configuration("springFrontend");
    io.jaegertracing.Configuration.SenderConfiguration sender = new io.jaegertracing.Configuration.SenderConfiguration();
    /**
     *  从链路追踪控制台获取网关(Endpoint)、用户名、密码(userkey)
     *  第一次运行时,请设置当前用户的网关、用户名、密码(userkey)
     */
    sender.withEndpoint("http://tracing-analysis-dc-hz.aliyuncs.com/api/traces");
    // 设置用户名
    sender.withAuthUsername("abcdefg@123456");
    // 设置密码(userkey)
    sender.withAuthPassword("abcdefg@123456");
    config.withSampler(new io.jaegertracing.Configuration.SamplerConfiguration().withType("const").withParam(1));
    config.withReporter(new io.jaegertracing.Configuration.ReporterConfiguration().withSender(sender).withMaxQueueSize(10000));

代码分析:配置用户的网关、用户名和密码,这些信息在控制台里的region信息中可以看到,根据需要对不同的地域的用户名密码在SDK中进行设置。

如果是对于手动埋点的话,则代码为以下结构:

<dependency>
    <groupId>io.jaegertracing</groupId>
    <artifactId>jaeger-client</artifactId>
    <version>0.31.0</version>
</dependency>

代码分析:同spring cloud不同的地方是,只需要添加组件的依赖即Jaeger组建,而没用Jar包,因为埋点的方式在这种情况下是手动的。

io.jaegertracing.Configuration config = new io.jaegertracing.Configuration("manalDemo");
io.jaegertracing.Configuration.SenderConfiguration sender = new io.jaegertracing.Configuration.SenderConfiguration();
/**
   *  从链路追踪控制台获取网关(Endpoint)、用户名、密码(userkey)
   *  第一次运行时,请设置当前用户的网关、用户名、密码(userkey)
*/
sender.withEndpoint("http://tracing-analysis-dc-hz.aliyuncs.com/api/traces");
// 设置用户名
sender.withAuthUsername("abcdefg@123456");
// 设置密码(userkey)
sender.withAuthPassword("abcdefg@123456");
config.withSampler(new io.jaegertracing.Configuration.SamplerConfiguration().withType("const").withParam(1));
config.withReporter(new io.jaegertracing.Configuration.ReporterConfiguration().withSender(sender).withMaxQueueSize(10000));
GlobalTracer.register(config.getTracer());
记录请求数据。

代码分析:同之前的方式一样,配置用户的网关、用户名和密码。

Tracer tracer = GlobalTracer.get();
// 创建 Span
Span span = tracer.buildSpan("parentSpan").withTag("myTag", "spanFrist").start();
tracer.scopeManager().activate(span, false);
tracer.activeSpan().setTag("methodName", "testTracing");
// 业务逻辑
testCall();
span.finish();

代码分析:添加Tracer 对象,创建 Span 对象(记录分布式操作时间)、跨机器透传数据(Extract/Inject 方法),或设置当前 Span(activeSpan)。

Tracer tracer = GlobalTracer.get();
Span parentspan = tracer.activeSpan();
Tracer.SpanBuilder spanBuilder = tracer.buildSpan("childSpan").withTag("myTag", "spanSecond");
if (parentspan !=null) {
    spanBuilder.asChildOf(parentspan).start();
}
Span childSpan = spanBuilder.start();
tracer.scopeManager().activate(childSpan, false);
//.业务逻辑
childSpan.finish();

代码分析:用于记录应用的上一步请求操作和下一步请求操作,可以看到,创建了一个child span,当前的span即active span为parent span,如果当前的span不为空即有信息的话,执行spanBuilder函数对于下一步请求操作进行记录。这些记录的信息是可以自定义的,也就是在tracer.buildSpan之后可以根据需要创建标签来进行信息的采集。

Python语言SDK:

pip install jaeger-client
import logging
import time
from jaeger_client import Config
if __name__ == "__main__":
    log_level = logging.DEBUG
    logging.getLogger('').handlers = []
    logging.basicConfig(format='%(asctime)s %(message)s', level=log_level)
    config = Config(
        config={ # usually read from some yaml config
            'sampler': {
                'type': 'const',
                'param': 1,
            },
            'logging': True,
        },  
        service_name='your-app-name',
    )
    # this call also sets opentracing.tracer
    tracer = config.initialize_tracer()
    with tracer.start_span('TestSpan') as span:
        span.log_kv({'event': 'test message', 'life': 42})
        with tracer.start_span('ChildSpan', child_of=span) as child_span:
            span.log_kv({'event': 'down below'})
    time.sleep(2)   # yield to IOLoop to flush the spans - https://github.com/jaegertracing/jaeger-client-python/issues/50
    tracer.close()  # flush any buffered spans

代码分析:同JAVA需要配置Jaeger组建一样,Python需要安装Jaeger组件包,同样通过创建span来对需要采集的信息来设置标签。这里的span是一个没有parent的span,但实际的span设置可以根据需要自由设置(包括记录前后步操作的child span),和JAVA相同的地方是创建tracer的对象并通过在tracer创建span来实现对信息的追踪服务。

三、测试总结:

对于不同语言的链路追踪服务采用的接入方式其实是同一个,就是进行埋点,不管是JAVA还是Python的SDK中都是采用创建tracer对象来实现追踪服务,tracer创建完毕后通过tracer创建span来实现采集的标签,这种标签可以是自定义的,也可以根据需要通过parent span和child span的方式来实现对应用上一步和下一步操作的记录。

相关实践学习
基于OpenTelemetry构建全链路追踪与监控
本实验将带领您快速上手可观测链路OpenTelemetry版,包括部署并接入多语言应用、体验TraceId自动注入至日志以实现调用链与日志的关联查询、以及切换调用链透传协议以满足全链路打通的需求。
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
目录
相关文章
|
1月前
|
安全 Linux 虚拟化
|
2月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
1月前
|
数据采集 自然语言处理 数据库
深入体验阿里云通义灵码:测试与实例展示
阿里云通义灵码是一款强大的代码生成工具,支持自然语言描述需求,快速生成高质量代码。它在测试、代码质量和用户体验方面表现出色,能够高效地生成 Python 和 Java 等语言的代码,助力开发者提升开发效率和代码质量。无论是新手还是资深开发者,都能从中受益匪浅。
深入体验阿里云通义灵码:测试与实例展示
|
1月前
|
编解码 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(10-2):保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali——Liinux-Debian:就怕你学成黑客啦!)作者——LJS
保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali以及常见的报错及对应解决方案、常用Kali功能简便化以及详解如何具体实现
|
2月前
|
测试技术
产品测试
【10月更文挑战第10天】产品测试
30 2
|
2月前
|
弹性计算 安全 Linux
阿里云国际版使用ping命令测试ECS云服务器不通的排查方法
阿里云国际版使用ping命令测试ECS云服务器不通的排查方法
|
1月前
|
人工智能 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(4-2):渗透测试行业术语扫盲完结:就怕你学成黑客啦!)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(4-2):渗透测试行业术语扫盲完结:就怕你学成黑客啦!)作者——LJS
|
1月前
|
安全 大数据 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(3-2):渗透测试行业术语扫盲)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(3-2):渗透测试行业术语扫盲)作者——LJS
|
1月前
|
SQL 安全 网络协议
网络空间安全之一个WH的超前沿全栈技术深入学习之路(1-2):渗透测试行业术语扫盲)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(1-2):渗透测试行业术语扫盲)作者——LJS
|
2月前
|
监控 测试技术 数据安全/隐私保护
新产品测试流程如何?
新产品测试流程如何?【10月更文挑战第10天】
120 0