自定义Deployment粒度的链路追踪标签

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 本文将介绍使用[阿里云服务网格(ASM)](http://servicemesh.console.aliyun.com/)和[阿里云链路追踪(Tracing)](https://tracing.console.aliyun.com/),以业务无侵入的方式,实现POD粒度的自定义链路追踪标签。示例代码为[asm-best-practises](https://github.com/feuyeux/asm-best-practises/)

自定义Deployment粒度的链路追踪标签

本文将介绍使用阿里云服务网格(ASM)阿里云链路追踪(Tracing),以业务无侵入的方式,实现Deployment粒度的自定义链路追踪标签。示例代码为asm-best-practises

概述

链路追踪是服务网格可观测性的重要组成部分,通过链路追踪我们可以很容易观察到服务节点之间的调用情况。在此基础上,我们可以通过在EnvoyFilter中配置自定义标签,实现以业务无侵入的方式为每条trace打标,进而实现细粒度、精细化的查询、统计和分析。

如下图所示,ACK集群内有3个串行调用关系的服务(hello1/hello2/hello3),每个服务存在3组Deployment(分别v1英语/v2法语/v3西语版本)。当我们以Deployment粒度打标时,假设某次请求的链路是hello1服务的v1版hello2服务的v2版hello3服务的v3版,那么我们将在阿里云链路追踪服务中看到hello1-v1-hello2-v2- hello3-v3这样自定义标签。

链路追踪数据中有了这样细粒度的标签,我们就可以具备了流量染色按发布版本进行分组统计等能力。

382f683bd1095cfbe5645d070285c7df.png

原理

在envoy的配置tracing.custom_tags中,我们可以为链路追踪定义自定义标签。示意如下:

"tracing": {
 "custom_tags": [
  {
   "tag": "version-tag",
   "request_header": {
    "name": "VERSION",
    "default_value": "hello2-v1"
   }
  }
 ]
}

ServiceMesh的控制平面需要定义一个EnvoyFilter来声明在什么地方哪个阶段添加自定义标签。我们可以通过定义EnvoyFilter的workloadSelector字段,将具体范围缩小的某个具体的POD;通过定义applyTo字段为NETWORK_FILTER、匹配条件match.listener.filterChainfilter定义为名称是envoy.http_connection_manager的过滤器。示意如下:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: hello1-deploy-v1-tag
  namespace: http-hello
spec:
  workloadSelector:
    labels:
      app: hello1-deploy-v1
  configPatches:
  - applyTo: NETWORK_FILTER
    match:
      listener:
        filterChain:
          filter:
            name: envoy.http_connection_manager
    patch:
      operation: MERGE
      value:
        name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          tracing:
            custom_tags:
            - tag: version-tag
              environment:
                name: VERSION
                default_value: v1
              request_header:
                name: VERSION
                default_value: hello1-v1

实战

1 部署容器

执行如下命令,部署上图所示的hello1-3服务和POD:

alias k="kubectl --kubeconfig $USER_CONFIG"

# https://github.com/feuyeux/asm-best-practises/blob/master/tracing_tag/kube
k apply -f kube/

2 部署路由规则和自定义标签EnvoyFilter

执行如下命令,部署上图所示的路由规则和9个POD维度的自定义标签EnvoyFilter:

alias m="kubectl --kubeconfig $MESH_CONFIG"

# https://github.com/feuyeux/asm-best-practises/tree/master/tracing_tag/mesh
m apply -f mesh/

3 配置网格实例

登录ASM管控台,进入服务网格实例,在可观测配置中启用链路追踪。

3b08867106e2a657af9ee799fe106cc6.png

4 请求入口网关

通过执行如下命令请求入口网关,从而生成trace数据:

ingressGatewayIp=$(k -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo "access http://$ingressGatewayIp:8001/hello/eric"
for i in {10..60}; do
  curl -s "http://$ingressGatewayIp:8001/hello/$i"
  echo
done

响应信息如下所示:

access http://8.136.115.99:8001/hello:
Hello 10@hello1:10.20.0.88<Bonjour 10@hello2:10.20.0.87<Hola 10@hello3:10.20.0.151
...
Hello 60@hello1:10.20.0.88<Bonjour 60@hello2:10.20.0.87<Hola 60@hello3:10.20.0.151

5 从链路数据中自定义标签

登录Tracing,选择服务网格所在的地域,然后选择服务网格实例ID对应的标签:

image.png

左侧菜单点击调用链分析然后在调用链列表中选择一条链路追踪数据,可以看到如下图所示的自定义标签数据出现在相应的trace-span行中:

1-tag.png

2-tag.png

3-tag.png

相关实践学习
基于OpenTelemetry构建全链路追踪与监控
本实验将带领您快速上手可观测链路OpenTelemetry版,包括部署并接入多语言应用、体验TraceId自动注入至日志以实现调用链与日志的关联查询、以及切换调用链透传协议以满足全链路打通的需求。
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
目录
相关文章
|
3月前
手动模式配置链路聚合
手动模式配置链路聚合
21 1
|
3月前
|
Kubernetes 算法 NoSQL
动态扩缩容下的全局流水号设计
该文介绍了在动态扩缩容场景下如何使用雪花算法生成全局流水号。雪花算法生成的ID由时间戳、工作机器ID和序列号组成。在K8s环境中,通过Redis存储当前workerId的最大值,每次生成时加1并取模,确保workerId在0-1023范围内。文中提供了实现雪花算法的`SnowflakeIdWorker`类示例,并展示了两种动态获取workerId的方法:一是利用Redis incr操作;二是通过Nacos服务发现获取IP和端口信息计算。此外,还提到了其他获取workId和dataCenterId的策略,如使用本地IP和主机名。
77 1
|
10月前
|
监控 Cloud Native 安全
使用Linkerd实现流量管理:学习如何使用Linkerd的路由规则来实现流量的动态控制
使用Linkerd实现流量管理:学习如何使用Linkerd的路由规则来实现流量的动态控制
60 0
|
10月前
|
存储 监控 数据可视化
使用Jaeger进行分布式跟踪:学习如何在服务网格中使用Jaeger来监控和分析请求的跟踪信息
使用Jaeger进行分布式跟踪:学习如何在服务网格中使用Jaeger来监控和分析请求的跟踪信息
101 0
|
存储 数据处理 Perl
阿里云服务网格ASM的流量标签及路由功能之(1): 流量标签定义
服务网格ASM新增扩展了流量标签TrafficLabel 自定义资源CRD。 通过该CRD定义具体的流量标签逻辑,实现为命名空间、工作负载进行设置流量标签。
540 0
阿里云服务网格ASM的流量标签及路由功能之(1): 流量标签定义
|
Kubernetes 安全 测试技术
阿里云服务网格ASM的流量标签及路由功能之(3): 泳道模式下的流量管理
本文介绍如何在ASM中使用泳道模式下的流量管理功能。具体关于ASM中的全链路灰度相关概念可以参考https://help.aliyun.com/document_detail/375313.html。
517 0
阿里云服务网格ASM的流量标签及路由功能之(3): 泳道模式下的流量管理
|
存储 SQL Java
skywalking08 - 链路追踪tag查找配置(上)
skywalking08 - 链路追踪tag查找配置(上)
483 0
|
设计模式 关系型数据库 MySQL
skywalking08 - 链路追踪tag查找配置(下)
skywalking08 - 链路追踪tag查找配置(下)
217 0
|
Perl
阿里云服务网格ASM的流量标签及路由功能之(2): 基于流量标签的路由规则
通过流量标签CRD(TrafficLabel) 定义了用户自定义的流量标签, 例如asm-labels-test,其取值范围为test1、test2、test3等。为支持基于标签的路由能力, 还需要创建相应的目标规则DestinationRule和虚拟服务VirtualService,才能将流量根据标签路由到对应的工作负载。
252 0
|
运维 监控 微服务
在ASM中为应用服务启用SLO(1):服务等级目标SLO概览
服务等级目标 (SLO) 提供了一种形式化的方式来描述、衡量和监控微服务应用程序的性能、质量和可靠性。SLO 为应用开发和平台团队、运维团队提供了一个共享的质量基准,作为衡量服务水平质量以及持续改进的参考。SLO 由一个或多个服务等级指标 (SLI) 组成。使用 SLI 组合定义的 SLO 允许团队以更精确和相关的方式描述服务健康状况。 阿里云服务网格ASM提供了开箱即用的基于服务等级目标SLO的监控和告警能力,用于监控应用服务之间调用的延迟和错误率特征。
551 1
在ASM中为应用服务启用SLO(1):服务等级目标SLO概览