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
// 在启动命令里添加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
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/
往期
推荐
《拥抱 Agent,“0” 代码玩转 Trace 之 OpenTelemetry 系列第二弹!》
《今天我们聊聊 Trace 之 OpenTelemetry And TSW |概览》
扫描下方二维码关注本公众号,
了解更多微服务、消息队列的相关信息!
解锁超多鹅厂周边!