暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Skywalking Tracing 的接入和使用 —— Trace 之 OpenTelemetry 系列第三弹

腾讯云中间件 2021-04-20
2653

导读

然后我们就进入标准的实操阶段,市面上有3个非常受欢迎的包含tracing的项目,skywalking,zipkin和jaeger。这篇文章希望通过解释skywalking的接入流程,让读者了解产品的设计,交互体验和提出一些自己的想法。如果有什么想法和建议,欢迎在评论区告诉我们。



作者介绍


徐为


腾讯云微服务团队高级解决方案构架师

毕业于欧盟 Erasmus Mundus IMMIT,获得经济和IT管理硕士学位

自2006年以来,曾就职于SonyEricsson、SAP等多家公司,历任软件开发工程师,数据开发工程师,解决方案架构师



背景介绍


首先还是最基础的介绍,Skywalking 是 apache foundation(https://www.apache.org/foundation/)专注于可观测性(Observability)的项目,在这之中非常重要的组成部分是全链路追踪,也是很多开发者对 Skywalking(http://skywalking.apache.org/)产品最初的印象。Skywalking 这个项目是吴晟2014年发起的,他曾经说:


在2014年,国内的开源市场可谓一片空白,顶级项目绝大多数来自国外,国内除了几个大厂背书的项目,很少有人涉足开源。项目从起步到发展,完全是摸着石头过河,全靠我们自己一步步的探索。从SkyWalking到CNCF基金会的OpenTracing项目,再到大名鼎鼎的Zipkin社区,最后深深根植于Apache基金会。


有兴趣的可以关注这个项目的贡献团队:

http://skywalking.apache.org/team/


我们今天就来谈谈Skywalking,其中重点是当中tracing的部分和如何接入腾讯微服务观测平台TSW(Tencent Service Watcher)关于skywalking metrics的logging的部分,会被转存到云监控和CLS里,所以不涉及到今天关于全链路追踪的话题。



基础功能介绍


Skywalking在针对tracing能力上本身是比较直观的:


接入方式:


Skywalking 针对不同语言提供了不同的支持方案。一种是基于“agent”的接入,一种是基于SDK的接入。


具体可以看下面的列表,针对每个语言/框架,有agent或者SDK支持。


链接:

https://github.com/apache/skywalking

https://github.com/apache/skywalking-nodejs

https://github.com/apache/skywalking-python

https://github.com/apache/skywalking-nginx-lua

https://github.com/SkyAPM/cpp2sky

https://github.com/SkyAPM/go2sky

https://github.com/SkyAPM/go2sky-plugins

https://github.com/SkyAPM/SkyAPM-php-sdk

https://github.com/SkyAPM/SkyAPM-dotnet


目前接触到的客户中,大部分是node.js。但是无论是具体什么语言,使用agent或者SDK都可以轻松的接入。


我们目前支持zipkin和jaeger的http接入,Skywalking的grpc接入。



几个标准的接入案例


关于实际接入的案例,我就不花过多的时间介绍agent的部分,毕竟agent能接入就意味着对业务代码没有入侵,也是最容易搞定的部分,我会在接下来的几个案例里面重点介绍Golang, C++和Php语言的接入流程和具体代码。


首先拿到腾讯云TSW界面的接入token和接入内网地址(如下图所示):



1. Java Agent


  • 配置参数



    # agent/config/agent.config


    collector.backend_service=<endpoint e.g. ap-guangzhou.tencentservicewatcher.com:11800>
    agent.authentication=<auth-token e.g. 1gYjz6podfltuafgklagkf7kI0U=>
    agent.service_name=<ServiceName e.g. myService>


    • 启动java 程序,同时加载agent



      // 在启动命令里添加agent
      java -jar path/to/your/app.jar -javaagent:/path/to/skywalking-package/agent/skywalking-agent.jar


      2. Golang


      ref to:

      https://github.com/SkyAPM/go2sky/blob/master/example_trace_test.go


      准备接入的config部分


        func init() {
        // this is the format for skywalking configurations
        flag.BoolVar(&grpc, "grpc", false, "use grpc reporter")
        flag.StringVar(&oapServer, "oap-server", "ap-guangzhou.tencentservicewatcher.com:11800", "oap server address")
        //169.254.0.143:11800 需替换为 TSW 的私网接入点
        flag.StringVar(&upstreamURL, "upstream-url", "upstream-service", "upstream service url")
        flag.StringVar(&listenAddr, "listen-addr", ":8080", "listen address")
        flag.StringVar(&serviceName, "service-name", "yagr-demo-srv-a", "service name")
        }


        创建Reporter和Tracer


          // create  reporter
          reporter, err := reporter.NewGRPCReporter(oapServer, reporter.WithAuthentication(os.Getenv("tsw_token")))


          if err != nil {
          log.Fatalf("new reporter error %v \n", err)
          }
          defer reporter.Close()


          // create tracer
          tracer, err := go2sky.NewTracer(serviceName, go2sky.WithReporter(reporter))


          创建Span


            // 创建Span
            span, ctx, err := tracer.CreateLocalSpan(context.Background())
            span.SetOperationName("invoke data")
            span.Tag("kind", "outer")


            // 创建childSpan
            subSpan, _, err := tracer.CreateLocalSpan(ctx)
            if err != nil {
            log.Fatalf("create new sub local span error %v \n", err)
            }
            subSpan.SetOperationName("invoke inner")
            subSpan.Log(time.Now(), "inner", "this is right")
            subSpan.End()


            span.End()


            利用plugins的框架部分实现Span的自动创建


            在 https://github.com/SkyAPM/go2sky-plugins  中可以找到很多贡献了Skywalking的plugins


            用gin v3来说明,代码如下(缺省了config 部分,和上面没有任何区别)


              import (
              "flag"
              "fmt"
              "log"
              "net/http"
              "os"
              "time"


              "github.com/SkyAPM/go2sky"
              gg "github.com/SkyAPM/go2sky-plugins/gin/v3"
              "github.com/SkyAPM/go2sky/reporter"
              "github.com/gin-contrib/timeout"
              "github.com/gin-gonic/gin"
              )


              reporter, err := reporter.NewGRPCReporter(oapServer, reporter.WithAuthentication(os.Getenv("tsw_token")))
              if err != nil {
              log.Fatalf("new reporter error %v \n", err)
              }
              defer reporter.Close()


              tracer, err := go2sky.NewTracer(serviceName, go2sky.WithReporter(reporter))
              if err != nil {
              log.Fatalf("create tracer error %v \n", err)
              }


              gin.SetMode(gin.ReleaseMode)
              r := gin.New()


              r.Use(gg.Middleware(r, tracer))


              r.GET("/health", func(c *gin.Context) {
              c.String(http.StatusOK, "I am fine - srv-a")
              })
              r.Run(":8081")


              3. C++


              可以参考demo

              https://github.com/SkyAPM/cpp2sky/tree/main/example


                // 创建tracer 并提供配置项 - server_name/instance_name/addr/token
                // 目前cpp2sky只支持gRPC reporter和http tracer - 上报到TSW gRPC是ok的,用户的服务协议层需要是HTTP
                // 详细信息可以看 https://github.com/SkyAPM/cpp2sky
                #include <cpp2sky/config.pb.h>


                int main() {
                using namespace cpp2sky;


                static const std::string service_name = "service_name";
                static const std::string instance_name = "instance_name";
                static const std::string oap_addr = "oap:12800";
                static const std::string token = "token";


                TracerConfig tracer_config;



                config.set_instance_name(instance_name);
                config.set_service_name(service_name);
                config.set_address(oap_addr);
                config.set_token(token);

                // 目前cpp2sky只支持gRPC reporter和http tracer - 上报到TSW gRPC是ok的,用户的服务协议层需要是HTTP
                TracerPtr tracer = createsecureGrpcTracer(tracer_config);

                TracingContextPtr tracing_context = tracer->newContext();
                TracingSpanPtr tracing_span = tracing_context->createEntrySpan();


                tracing_span->startSpan("sample_workload");
                // DO Sth.
                tracing_span->endSpan();


                tracer->report(std::move(tracing_context));
                }



                高阶功能


                https://skyapm.github.io/document-cn-translation-of-skywalking/zh/6.2.0/setup/service-agent/java-agent/




                往期

                推荐


                《ArchSummit 大会,微服务&云原生重磅出击!》

                《拥抱 Agent,“0” 代码玩转 Trace 之 OpenTelemetry 系列第二弹!》

                《今天我们聊聊 Trace 之 OpenTelemetry And TSW |概览》





                扫描下方二维码关注本公众号,

                了解更多微服务、消息队列的相关信息!

                解锁超多鹅厂周边!


                戳原文,了解更多腾讯微服务观测平台 TSW 的信息

                点亮在看,你最好看
                文章转载自腾讯云中间件,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论