天天看點

SkyWalking系列之skywalking go agent配置使用概述環境搭建代碼內建

概述

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()
	}
}
           

調用效果

SkyWalking系列之skywalking go agent配置使用概述環境搭建代碼內建

追蹤圖:

SkyWalking系列之skywalking go agent配置使用概述環境搭建代碼內建

什麼是Opentracing

Opentracing是分布式鍊路追蹤的一種規範标準,是CNCF(雲原生計算基金會)下的項目之一。和一般的規範标準不同,Opentracing不是傳輸協定,消息格式層面上的規範标準,而是一種語言層面上的API标準。

Trace

Trace 事物在分布式系統中移動時的描述,一個 Trace 代表一個事務、請求或是流程在分布式系統中的執行過程。OpenTracing 中的一條 Trace 被認為是一個由多個 Span 組成的有向無環圖( DAG 圖)。如下圖示,多個span構成的一個Trace:

SkyWalking系列之skywalking go agent配置使用概述環境搭建代碼內建

Span

Span 代表系統中具有開始時間和執行時長的邏輯單元,Span 之間通過嵌套或者順序排列建立邏輯因果關系。

每一個Span封裝以下狀态:

  • 操作名稱
  • 起始時間戳
  • 完成時間戳
  • 一組零個或多個key:value的Span Tags,keys必須是字元串,values可以是strings,bools,numeric類型
  • 一組零個或多個Span Logs,日志自身是與時間戳比對的key:value對。鍵必須是字元串,盡管值可以是任何類型。并非所有的opentracing實作都必須支援每種值類型
  • 一個SpanContext
  • 通過SpanContext引用零個或多個因果相關的Spans
    SkyWalking系列之skywalking go agent配置使用概述環境搭建代碼內建

在一個Trace中span之間的關系:

SkyWalking系列之skywalking go agent配置使用概述環境搭建代碼內建

引用

OpenTracing: https://opentracing.io/specification/