标签:github span go2sky Request agent go gin skywalking com
概述
SkyWalking 是一个基于 OpenTracing 规范的、开源的 APM 系统,它是专门为微服务架构以及云原生架构而设计的,支持多种语言的客户端,部署简单,快速,目前在业界使用较为广泛。具体的skywalking安装部署参照上一篇博文:SkyWalking搭建。
由于我司部分底层服务用golang实现,为了做apm分析,需要集成skywalking go agent。
环境搭建
名称 | 链接 | 描述 |
---|---|---|
go2sky | https://github.com/SkyAPM/go2sky | go agent |
go2sky-plugins | https://github.com/SkyAPM/go2sky-plugins | trace接入插件 |
go框架:gin
安装命令:
go get -u github.com/SkyAPM/go2sky
go get -u github.com/SkyAPM/go2sky-plugins/gin/v3
代码集成
包引入:
import (
"github.com/SkyAPM/go2sky"
"github.com/SkyAPM/go2sky/reporter"
"github.com/gin-gonic/gin"
v3 "github.com/SkyAPM/go2sky-plugins/gin/v3"
)
gin中使用:
r := gin.New()
//skywalking
rp, err := reporter.NewGRPCReporter("192.168.99.12:11800", reporter.WithCheckInterval(time.Second))
if err != nil{
logging.Info("create gosky reporter failed!")
}
tracer, err := go2sky.NewTracer("test-demo", go2sky.WithReporter(rp))
#使用go2sky-plugins的middleware,就不用我们自己写span了,插件帮我们完成
r.Use(v3.Middleware(r, tracer))
gin.SetMode(setting.ServerSetting.RunMode)
插件span的处理:
func Middleware(engine *gin.Engine, tracer *go2sky.Tracer) gin.HandlerFunc {
# 需要使用上层创建的tracer
if engine == nil || tracer == nil {
return func(c *gin.Context) {
c.Next()
}
}
return func(c *gin.Context) {
# 创建span,这里使用的是EntrySpan
span, ctx, err := tracer.CreateEntrySpan(c.Request.Context(), getOperationName(c), func(key string) (string, error) {
return c.Request.Header.Get(key), nil
})
if err != nil {
c.Next()
return
}
span.SetComponent(componentIDGINHttpServer)
span.Tag(go2sky.TagHTTPMethod, c.Request.Method)
span.Tag(go2sky.TagURL, c.Request.Host+c.Request.URL.Path)
span.SetSpanLayer(agentv3.SpanLayer_Http)
c.Request = c.Request.WithContext(ctx)
#gin中请求继续执行
c.Next()
if len(c.Errors) > 0 {
span.Error(time.Now(), c.Errors.String())
}
#结束span
span.Tag(go2sky.TagStatusCode, strconv.Itoa(c.Writer.Status()))
span.End()
}
}
调用效果
追踪图:
什么是Opentracing
Opentracing是分布式链路追踪的一种规范标准,是CNCF(云原生计算基金会)下的项目之一。和一般的规范标准不同,Opentracing不是传输协议,消息格式层面上的规范标准,而是一种语言层面上的API标准。
Trace
Trace 事物在分布式系统中移动时的描述,一个 Trace 代表一个事务、请求或是流程在分布式系统中的执行过程。OpenTracing 中的一条 Trace 被认为是一个由多个 Span 组成的有向无环图( DAG 图)。如下图示,多个span构成的一个Trace:
Span
Span 代表系统中具有开始时间和执行时长的逻辑单元,Span 之间通过嵌套或者顺序排列建立逻辑因果关系。
每一个Span封装以下状态:
- 操作名称
- 起始时间戳
- 完成时间戳
- 一组零个或多个key:value的Span Tags,keys必须是字符串,values可以是strings,bools,numeric类型
- 一组零个或多个Span Logs,日志自身是与时间戳匹配的key:value对。键必须是字符串,尽管值可以是任何类型。并非所有的opentracing实现都必须支持每种值类型
- 一个SpanContext
- 通过SpanContext引用零个或多个因果相关的Spans
在一个Trace中span之间的关系:
引用
OpenTracing: https://opentracing.io/specification/
标签:github,span,go2sky,Request,agent,go,gin,skywalking,com 来源: https://blog.csdn.net/joniers/article/details/117416106
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。