阿里云服务网格ASM之扩展能力(4):在ASM中实现分布式跟踪

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 服务网格ASM集成了阿里云链路追踪服务,为分布式应用的开发者提供了完整的调用链路还原、调用请求量统计、链路拓扑、应用依赖分析等能力,可以帮助开发者快速分析和诊断分布式应用架构下的性能瓶颈,提升开发诊断效率。

本系列文章讲讲述阿里云服务网格ASM的一些扩展能力:

欢迎扫码入群进一步交流:
image

服务网格与分布式跟踪

根据Open Tracing网站的介绍,分布式跟踪(也称为分布式请求跟踪)是一种用于对应用程序进行概要分析和监视的方法,尤其是针对使用微服务架构构建的应用程序。分布式跟踪有助于查明哪里发生故障以及什么原因导致性能下降。
常见的误解是在使用服务网格进行服务跟踪实现时,不需要任何代码的更改。实际上,根据Istio的官方介绍,尽管Istio代理能够自动发送Span,但是应用程序仍然需要传播适当的HTTP标头,以便在代理发送Span信息时,可以将Span正确地关联到单个跟踪中。为此,应用程序需要收集以下标头并将其从传入请求传播到任何传出请求。

  • x-request-id
  • x-b3-traceid
  • x-b3-spanid
  • x-b3-parentspanid
  • x-b3-sampled
  • x-b3-flags
  • x-ot-span-context

x-b3头起源于Zipkin项目,标头的B3部分是以Zipkin的原始名称BigBrotherBird命名。在服务调用之间传递这些标头称之为B3传播。根据Zipkin的原理,这些属性通常通过HTTP标头进行传播,并最终传播到下游,以确保将源自同一根的所有活动收集在一起。

阿里云链路追踪服务

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

使用链路追踪之前,首先需要开通链路追踪服务。由于链路追踪依赖日志服务 LOG 和访问控制 RAM 服务,所以也需要开通这两项服务,并授权链路追踪读写您的日志服务数据。
关于开通相关服务和授权的方法,请参见开通相关服务并授权

image.png

为ASM实例启用链路追踪

服务网格ASM集成了阿里云链路追踪服务,为分布式应用的开发者提供了完整的调用链路还原、调用请求量统计、链路拓扑、应用依赖分析等能力,可以帮助开发者快速分析和诊断分布式应用架构下的性能瓶颈,提升开发诊断效率。

在创建ASM实例时启用链路追踪

用户在创建网格时,可以通过勾选“启用链路追踪”来启用ASM的链路追踪能力,在勾选后,还用户还可以设置追踪流量的百分比,设置范围为0.01 - 100.00。

说明:启用该配置时,用户需要提前开通阿里云链路追踪服务

image.png

为已有ASM实例启用链路追踪或调整追踪比例

用户可以随时开启ASM实例的追踪能力或调整链路追踪的百分比。

如果在创建服务网格ASM实例时没有勾选启用OPA插件,可以通过如下方式重启开启。

登录服务网格控制台,在ASM实例详情页的右上角,点击功能设置按钮。

image.png

  • 在弹出的窗口中,可以重新勾选启用或者禁用链路追踪(当然,如果启用的话,仍然是需要确保已经开通了链路服务)。

部署示例

按照文档部署应用到一个ASM服务网格中。查看示例中的以Python 语言实现的productpage服务,则会发现该应用程序使用了OpenTracing库从HTTP请求中提取了所需的标头:

def getForwardHeaders(request):
    headers = {}

    # x-b3-*** headers can be populated using the opentracing span
    span = get_current_span()
    carrier = {}
    tracer.inject(
        span_context=span.context,
        format=Format.HTTP_HEADERS,
        carrier=carrier)

    headers.update(carrier)

    # ...

    incoming_headers = ['x-request-id']

    # ...

    for ihdr in incoming_headers:
        val = request.headers.get(ihdr)
        if val is not None:
            headers[ihdr] = val

    return headers

同样地,查看以Java语言实现的reviews服务:

@GET
@Path("/reviews/{productId}")
public Response bookReviewsById(@PathParam("productId") int productId,
                            @HeaderParam("end-user") String user,
                            @HeaderParam("x-request-id") String xreq,
                            @HeaderParam("x-b3-traceid") String xtraceid,
                            @HeaderParam("x-b3-spanid") String xspanid,
                            @HeaderParam("x-b3-parentspanid") String xparentspanid,
                            @HeaderParam("x-b3-sampled") String xsampled,
                            @HeaderParam("x-b3-flags") String xflags,
                            @HeaderParam("x-ot-span-context") String xotspan) {

  if (ratings_enabled) {
    JsonObject ratingsResponse = getRatings(Integer.toString(productId), user, xreq, xtraceid, xspanid, xparentspanid, xsampled, xflags, xotspan);

访问示例

在浏览器地址栏输入_http://{__入口网关服务的IP地址__}/__productpage_,可以看到如下类似页面,刷新页面以实现多次访问效果。

image.png

查看应用列表

应用列表页面展示了所有被监控应用的健康度得分、本日请求数、本日错误数等关键指标。您还可以为应用设置自定义标签并使用标签来筛选。

请按照以下步骤进入应用列表页面。

image.png

查看应用详情

应用详情页面可展示应用在所部属的每一台机器上的关键性能指标、调用拓扑图和调用链路。

  • 登录链路追踪 Tracing Analysis 控制台
  • 在左侧导航栏中单击应用列表,并在应用列表页面顶部选择地域,然后单击应用名称。
  • 在左侧导航栏中单击应用详情,在左侧的机器列表中单击全部或一台机器,然后在概览页签上查看调用拓扑图和关键性能指标。应用详情页面的调用链路页签列出了该应用在所选机器上耗时最长的 100 个调用链路。
    image.png

查看调用链瀑布图

  • 调用链路页签上单击 TraceID,即可在新窗口中打开调用链路页面,并查看该调用链路的瀑布图。
  • 在新窗口中的调用链路页面上,您可以看到调用链路的日志产生时间、状态、IP 地址/机器名称、服务名、时间轴等信息。
  • 注意: IP 地址字段显示的是 IP 地址还是机器名称,取决于应用设置页面上的显示配置。详情请参见管理应用和标签

image.png

将鼠标悬浮于服务名上,还可以查看该服务的时长、开始时间、Tag 和日志事件等信息。

其他具体操作可以参考链路跟踪文档

image.png

相关文章
|
1月前
|
人工智能 自然语言处理 安全
使用阿里云服务网格高效管理LLM流量:(一)流量路由
ASM支持通过LLMProvider和LLMRoute资源管理大型语言模型流量。LLMProvider负责注册LLM服务,LLMRoute负责设定流量规则,应用可灵活切换模型,满足不同场景需求。
|
2月前
|
负载均衡 测试技术 网络安全
阿里云服务网格ASM多集群实践(一)多集群管理概述
服务网格多集群管理网络打通和部署模式的多种最佳实践
|
1月前
|
Cloud Native 测试技术 开发者
阿里云服务网格ASM多集群实践(二):高效按需的应用多环境部署与全链路灰度发布
介绍服务网格ASM提出的一种多集群部署下的多环境部署与全链路灰度发布解决方案。
|
2月前
|
人工智能 安全 Go
使用阿里云服务网格 ASM LLMProxy 插件保障大模型用户数据安全
本文介绍如何使用ASM LLMProxy动态为LLM请求添加API_KEY、使用模式匹配以及私有大模型判别请求敏感信息并根据判别结果拒绝请求等功能,帮助用户提升LLM场景下的安全水位。
|
2月前
|
负载均衡 Kubernetes 算法
服务网格 ASM 负载均衡算法全面解析
在本文中,笔者将解析服务网格的多种负载均衡算法的实现原理和使用场景,为服务网格负载均衡算法的选择提供参考。
|
27天前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
30天前
|
NoSQL Java Redis
分布式锁实现原理问题之使用Redis的setNx命令来实现分布式锁问题如何解决
分布式锁实现原理问题之使用Redis的setNx命令来实现分布式锁问题如何解决
|
1天前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
这篇文章介绍了如何在SpringBoot项目中整合Redis,并探讨了缓存穿透、缓存雪崩和缓存击穿的问题以及解决方法。文章还提供了解决缓存击穿问题的加锁示例代码,包括存在问题和问题解决后的版本,并指出了本地锁在分布式情况下的局限性,引出了分布式锁的概念。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
|
1天前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
这篇文章是关于如何在SpringBoot应用中整合Redis并处理分布式场景下的缓存问题,包括缓存穿透、缓存雪崩和缓存击穿。文章详细讨论了在分布式情况下如何添加分布式锁来解决缓存击穿问题,提供了加锁和解锁的实现过程,并展示了使用JMeter进行压力测试来验证锁机制有效性的方法。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
|
1天前
|
NoSQL 安全 Java
nicelock--一个注解即可使用Redis分布式锁!
Nicelock的引入为分布式系统中的资源同步访问提供了一个简单高效和可靠的解决方案。通过注解的方式,简化了锁的实现和使用,使开发人员可以将更多精力专注于业务逻辑的实现,而不是锁的管理。此外,Nicelock在保持简单易用的同时,也提供了足够的灵活性和可靠性,满足了不同应用场景下对分布式锁的需求。
8 1