栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

SkyWalking系列之skywalking go agent配置使用

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SkyWalking系列之skywalking go agent配置使用

概述

SkyWalking 是一个基于 OpenTracing 规范的、开源的 APM 系统,它是专门为微服务架构以及云原生架构而设计的,支持多种语言的客户端,部署简单,快速,目前在业界使用较为广泛。具体的skywalking安装部署参照上一篇博文:SkyWalking搭建。
由于我司部分底层服务用golang实现,为了做apm分析,需要集成skywalking go agent。

环境搭建
名称链接描述
go2skyhttps://github.com/SkyAPM/go2skygo agent
go2sky-pluginshttps://github.com/SkyAPM/go2sky-pluginstrace接入插件

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/

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/908334.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号