skywalking08 - 链路追踪tag查找配置(上)

简介: skywalking08 - 链路追踪tag查找配置(上)

skywalking08 - 链路追踪tag查找配置(上)

在上一篇文章中,我们提到了**“skywalking收集链路时,使用的URL都是通配符,在链路中,无法针对某个pageId,或者其他通配符的具体的值进行查找。或许skywalking出于性能考虑,但是对于这种不定的通用大接口,的确无法用于针对性的性能分析了。”**

那么在skywalking 8.2版本中引入的对tag搜索的支持,就能够解决这个问题,我们可以根据tag对链路进行一次过滤,得到一类的链路。让我们来看看如何配置的。

效果图

如上图所示,我们根据一个叫biz.id的标签,查找过滤其值为"bbbc"的链路。那么这种自定义标签biz.id,如何配置呢?(skywalking 默认支持http.method等标签的搜索)

配置oap端application.yml

skywalking分析端是一个java进程,使用application.yml作为配置文件,其位置位于“apache-skywalking-apm-bin/config”文件夹中。

core:
  selector: ${SW_CORE:default}
  default:
    # Mixed: Receive agent data, Level 1 aggregate, Level 2 aggregate
    # Receiver: Receive agent data, Level 1 aggregate
    # Aggregator: Level 2 aggregate
    # Define the set of span tag keys, which should be searchable through the GraphQL.
    # searchableTracesTags: ${SW_SEARCHABLE_TAG_KEYS:http.method,status_code,db.type,db.instance,mq.queue,mq.topic,mq.broker}
    searchableTracesTags: biz.id,biz.type,http.method,status_code,db.type
    # Define the set of log tag keys, which should be searchable through the GraphQL.
    searchableLogsTags: ${SW_SEARCHABLE_LOGS_TAG_KEYS:level}
  • core.default.searchableTracesTags 配置项为可搜索标签的配置项,其默认为:“${SW_SEARCHABLE_TAG_KEYS:http.method,status_code,db.type,db.instance,mq.queue,mq.topic,mq.broker}”。如果没有配置环境变量SW_SEARCHABLE_TAG_KEYS,那么其默认就支持这几个在skywalking 中有使用到的几个tag。 那么我在里面修改了配置,加上了我们用到的“biz.id”、“biz.type”。

修改配置后,重启skywalking oap端即可支持。

代码进行打标签

在第四篇博客“skywalking04 - skywalking自定义链路追踪@Trace”中记录了使用@Tag进行打标签的方式。但是这样的方式,也会有一定问题。

@Trace(operationName = "customTraceFunction")
    @Tags({@Tag(key = "plaintext", value = "arg[0]"), @Tag(key = "ciphertext", value = "returnedObj"),@Tag(key = "biz.id", value = "arg[0]")})
    private String trace2(String plaintext) {
        log.info("traceId", TraceContext.traceId());
        return new Base64().encodeToString(plaintext.getBytes(StandardCharsets.UTF_8));
    }

我们只是想要在controller入口打上这么一个标签,这样就活生生多了一个LocalSpan展示了。

如果我们只是想要在进入controller中加上该信息,该如何做?

我尝试了在Controller的方法上加@Trace以及@Tag

@RequestMapping("foo2")
    @Trace
    @Tags({@Tag(key = "plaintext", value = "arg[0]"), @Tag(key = "ciphertext", value = "returnedObj"),@Tag(key = "biz.id", value = "arg[0]")})
    public String foo2(@RequestParam("p") String s) {
        jdbc.execute("select 1");
        return trace2(s);
    }

但是效果很差,如果不加@Trace,则无效。如果加上@Trace,则会如下图,又多一个LocalSpan,层级被加深一层,很别扭:

无新增LocalSpan的形式打标签

如果看官了解过skywalking,就知道@Trace就会在当前链路中,新增一个LocalSpan。那么如果我们能获取到当前的Span,并追加Tag信息,不就能够解决问题了?

private final Tracer tracer = new SkywalkingTracer();
//    @Trace(operationName = "customTraceFunction")
//    @Tags({@Tag(key = "plaintext", value = "arg[0]"), @Tag(key = "ciphertext", value = "returnedObj"),@Tag(key = "biz.id", value = "arg[0]")})
    private String trace(String plaintext) {
        log.info("traceId", TraceContext.traceId());
        ActiveSpan span = tracer.activeSpan();
        span.setTag("biz.id", plaintext);
//        span.close();
        return new Base64().encodeToString(plaintext.getBytes(StandardCharsets.UTF_8));
    }

tracer#activeSpan()方法将会将自身作为构造去生成Span,最终仍是同一个Span。

public ActiveSpan activeSpan() {
        return new SkywalkingActiveSpan(new SkywalkingSpan(this));
    }

那这样就得到了这篇博客顶上的效果图,在“/foo”这个入口的EntrySpan上增加了Tag信息,无多余Span。

配置注意点

在skywalking的官方配置文档中,对该配置说明比较粗放,也没有提及一些不生效的情况。我想小伙伴如果仅仅是学习,反而会踩到这样一个坑:为了减少部署复杂度,skywalking的存储选择了H2内存数据库。

使用H2数据库的时候,通过tag进行查询就会失效,会查不出链路,通过debug是可以看到对应的sql并无问题,拼出了biz.id的查询条件,具体原因还未查找,通过切换存储为es6解决了问题。(猜测普通的关系型数据库不支持,需要列式存储的数据库才可以)

在切es6作为存储时,除了配置es6的连接信息,选择存储改为elasticsearch以外,还需要将h2的配置注释掉,不然oap端启动将会报错:

storage:
  selector: ${SW_STORAGE:elasticsearch}
  elasticsearch:
    nameSpace: ${SW_NAMESPACE:""}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
    user: ${SW_ES_USER:""}
    password: ${SW_ES_PASSWORD:""}
    trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
    trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""}
#  h2:
#    driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource}
#    url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db;DB_CLOSE_DELAY=-1}
#    user: ${SW_STORAGE_H2_USER:sa}
#    metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
#    maxSizeOfArrayColumn: ${SW_STORAGE_MAX_SIZE_OF_ARRAY_COLUMN:20}
#    numOfSearchableValuesPerTag: ${SW_STORAGE_NUM_OF_SEARCHABLE_VALUES_PER_TAG:2}


相关实践学习
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
目录
相关文章
|
11月前
|
设计模式 关系型数据库 MySQL
skywalking08 - 链路追踪tag查找配置(下)
skywalking08 - 链路追踪tag查找配置(下)
182 0
|
监控 网络协议 Java
分布式链路追踪- SkyWalking使用手册
分布式链路追踪- SkyWalking使用手册
938 0
分布式链路追踪- SkyWalking使用手册
|
2月前
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
786 0
|
6月前
|
存储 监控 数据可视化
Golang链路追踪:实现高效可靠的分布式系统监控
Golang链路追踪:实现高效可靠的分布式系统监控
|
6月前
|
消息中间件 监控 安全
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践(3)
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践
66 0
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践(3)
|
6月前
|
消息中间件 Java Kafka
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践(2)
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践(2)
61 0
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践(2)
|
6月前
|
消息中间件 Cloud Native Apache
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践(1)
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践
46 0
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践(1)
|
10月前
|
SpringCloudAlibaba 算法 Java
Spring Boot项目如何实现分布式日志链路追踪
作为一名后端开发工程师,排查系统问题用得最多的手段之一就是查看系统日志,在当下主要的分布式集群环境中一般使用ELK(Elasticsearch , Logstash, Kibana)来统一收集日志,以便后续查看日志定位追踪相关问题。但是在并发情况下,大量的系统用户即多线程并发访问后端服务导致同一个请求的日志记录不再是连续相邻的,此时多个请求的日志是一起串行输出到文件中,所以我们筛选出指定请求的全部相关日志还是比较麻烦的,同时当后端异步处理功能逻辑以及微服务的下游服务调用日志追踪也有着相同的问题。
|
消息中间件 数据可视化 JavaScript
什么是链路追踪?分布式系统如何实现链路追踪?
什么是链路追踪?分布式系统如何实现链路追踪?
|
消息中间件 存储 监控
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践