可观测之调用链Skywalking

2023-08-19 09:49:05 浏览数 (1)

简介

分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。 提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

  • 多种监控手段。可以通过语言探针和 service mesh 获得监控是数据。
  • 多个语言自动探针。包括 Java,.NET Core 和 Node.JS。
  • 轻量高效。无需大数据平台,和大量的服务器资源。
  • 模块化。UI、存储、集群管理都有多种机制可选。
  • 支持告警。
  • 优秀的可视化解决方案。

官方中文文档:https://skyapm.github.io/document-cn-translation-of-skywalking/zh/8.0.0/

下面我们简单来使用下

部署

这里采用docker- composet进行部署

代码语言:javascript复制
version: '3.3'
services:
  skywalking-oap:
    image: apache/skywalking-oap-server:8.0.1-es7
    container_name: skywalking-oap
    restart: always
    ports:
      - 11800:11800
      - 12800:12800
    environment:
      SW_STORAGE: h2
  skywalking-ui:
    image: apache/skywalking-ui:8.0.1
    container_name: skywalking-ui
    depends_on:
      - skywalking-oap
    links:
      - skywalking-oap
    restart: always
    ports:
      - 8080:8080
    environment:
      SW_OAP_ADDRESS: skywalking-oap:12800

上面安装了server端和ui控制台

go2sky

skywalking是业界比较常用的一款APM监控工具,采用java开发,对java应用适配比较好,应用不需要埋点上报,只需要在启动时加上 -javaagent: 参数即可。 而对于go应用想要上报指标到skywalking,则需要通过埋点的方式注入。skywalking官方提供了golang版的库github.com/SkyAPM/go2sky

demo代码:https://github.com/SkyAPM/go2sky/blob/38c3b84741dd6c0609965e9df0fcc633915d3ea5/test/e2e/example-server/main.go

和所有的链路监控工具一样,skywalking也遵循Open Tracing协议,首先需要创建一个Trace,表示一个调用链,然后再调用链上创建span和子span,每个span表示一次调用,因为span和子span是有关联关系的,所以通过span和子span可以了解链路的上下游调用情况。

在go-sky里,可以创建三种类型的span

LocalSpan:可以用来表示本程序内的一次调用。

代码语言:javascript复制
span, ctx, err := tracer.CreateLocalSpan(context.Background())

EntrySpan:用来从下游服务提取context信息。

代码语言:javascript复制
span, ctx, err := h.tracer.CreateEntrySpan(r.Context(), getOperationName(h.name, r), func() (string, error) {
    return r.Header.Get(propagation.Header), nil
})

ExitSpan:用来向上游服务注入context信息。

代码语言:javascript复制
span, err := t.tracer.CreateExitSpan(req.Context(), getOperationName(t.name, req), req.Host, func(header string) error {
    req.Header.Set(propagation.Header, header)
    return nil
})

其实在发起http请求时,也是注入式地上报skywalking,只不过通过github.com/SkyAPM/go2sky/plugins/http这个包进行了封装而已,其核心逻辑是创建span,并将span信息写入到header里来传递到上游服务。 Server端在处理请求时,其核心逻辑是从header里解析出下游的span信息,并基于此构造自己的span,并将span上报到skywalking。

0 人点赞