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

腾讯云中间件

共 5708字,需浏览 12分钟

 ·

2021-04-23 02:05

导读

然后我们就进入标准的实操阶段,市面上有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



// 在启动命令里添加agentjava  -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  reporterreporter, 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 tracertracer, err := go2sky.NewTracer(serviceName, go2sky.WithReporter(reporter))


创建Span


// 创建Spanspan, ctx, err := tracer.CreateLocalSpan(context.Background())span.SetOperationName("invoke data")span.Tag("kind", "outer")
// 创建childSpansubSpan, _, 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 的信息

点亮在看,你最好看
浏览 180
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报