通過SkyWalking為應用埋點并上報鏈路數據至可觀測鏈路 OpenTelemetry 版后,可觀測鏈路 OpenTelemetry 版即可開始監控應用,您可以查看應用拓撲、調用鏈路、異常事務、慢事務和SQL分析等一系列監控數據。本文介紹如何使用SkyWalking Go Agent進行自動埋點并上報應用數據。
ARMS應用監控針對Golang語言提供了商業化版本的自研探針,提供了無侵入的埋點能力,擁有更加豐富的功能和更高的穩定性。詳細信息,請參見開始監控Golang應用。
前提條件
新版控制臺
登錄可觀測鏈路 OpenTelemetry 版控制臺,在左側導航欄單擊接入中心。
在開源框架區域單擊SkyWalking卡片。
在彈出的SkyWalking面板中選擇數據需要上報的地域。
說明初次接入的地域將會自動進行資源初始化。
選擇連接方式,然后復制接入點信息。
若您的服務部署在阿里云上,且所屬地域與選擇的接入地域一致,推薦使用阿里云內網方式,否則選擇公網方式。
舊版控制臺
在左側導航欄單擊集群配置,然后在右側頁面單擊接入點信息頁簽。
在頁面頂部選擇需要接入的地域,然后在集群信息區域打開顯示Token開關。
在客戶端采集工具區域單擊SkyWalking。
在相關信息列中,獲取接入點信息。
說明如果應用部署于阿里云生產環境,則選擇阿里云VPC網絡接入點,否則選擇公網接入點。
Agent選擇
Go2Sky是SkyWalking官方舊版的SkyWalking Go探針,使用人數較多,但侵入較嚴重,因此官方推出了新版的skywalking-go探針,新版探針具有無侵入的特性。本文同時提供skywalking-go和Go2Sky兩種探針接入流程,方便您將數據上報至可觀測鏈路 OpenTelemetry 版控制臺。
Go2Sky
舊版SkyWalking Agent,在skywalking-go Agent正式發布后停止支持。
根據官網頁面顯示,Go2Sky已被移到Retired,即不再維護。
代碼侵入較嚴重,每一個插件都要在項目中添加Hook。
使用人數較多。
支持的埋點庫:
庫名稱
監控安裝方式
sql
go get -u github.com/SkyAPM/go2sky-plugins/sql
dubbo-go
go get -u github.com/SkyAPM/go2sky-plugins/dubbo-go
gear
go get -u github.com/SkyAPM/go2sky-plugins/gear
gin
go get -u github.com/SkyAPM/go2sky-plugins/gin/v2 go get -u github.com/SkyAPM/go2sky-plugins/gin/v3
go-restful
go get -u github.com/SkyAPM/go2sky-plugins/go-restful
gorm
go get -u github.com/SkyAPM/go2sky-plugins/gorm
http
go get -u github.com/SkyAPM/go2sky
go-kratos v2
go get -u github.com/SkyAPM/go2sky-plugins/kratos
logrus
go get -u github.com/SkyAPM/go2sky-plugins/logrus
go-micro(v3.5.0)
go get -u github.com/SkyAPM/go2sky-plugins/micro
mongo
go get -u github.com/SkyAPM/go2sky-plugins/mongo
go-resty(v2.2.0)
go get -u github.com/SkyAPM/go2sky-plugins/resty
zap(v1.16.0)
go get -u github.com/SkyAPM/go2sky-plugins/zap
skywalking-go
新版SkyWalking Agent,官方提供穩定支持。
代碼幾乎無侵入。
用法簡單,只需要編譯GoLang項目時通過
-toolexec
參數指定skywalking-go Agent。使用人數相對Go2Sky較少。
支持的埋點庫:
庫名稱
監控安裝方式
sql
無需安裝。
dubbo-go
gear
gin
go-restful
gorm
http
go-kratos v2
logrus
go-micro(v3.5.0)
mongo
go-resty(v2.2.0)
zap(v1.16.0)
推薦Agent
建議您使用新版skywalking-go探針,優勢如下:
使用簡便:skywalking-go使用更簡單,您只需要通過簡短的步驟即可完成接入和自動埋點。Skywalking-go是無侵入式探針,而Go2Sky在使用插件時需要手動添加Hook鉤子。
社區支持:官方將取消對Go2Sky的繼續支持,也不再接受關于Go2Sky的PR。
插件生態:官方將會持續將Go2Sky的插件移植到skywalking-go。目前,skywalking-go相比Go2Sky多了對gRPC框架的埋點。
示例Demo
示例Demo倉庫地址:SkyWalking Demo
通過skywalking-go探針上報
下載skywalking-go Agent。
構建Agent。
cd skywalking-go && make build
在skywalking-go/bin路徑下生成可執行文件。
不同的操作系統對應的可執行文件不同。例如,mac系統需選擇skywalking-go-agent--darwin-amd64。
打開Go項目,在main package中導入skywalking module。
方式一
package main import ( _ "github.com/apache/skywalking-go" )
方式二
skywalking-go/bin/skywalking-go-agent--darwin-amd64 -inject path/to/your-project
配置config.yaml文件。
您可以參考示例Demo的skywalking-go/tools/go-agent/config/config.default.yaml文件修改。
agent: # Service name is showed in UI. service_name: ${SW_AGENT_NAME:Your_ApplicationName} # To obtain the environment variable key for the instance name, if it cannot be obtained, an instance name will be automatically generated. instance_env_name: SW_AGENT_INSTANCE_NAME # Sampling rate of tracing data, which is a floating-point value that must be between 0 and 1. sampler: ${SW_AGENT_SAMPLE:1} meter: # The interval of collecting metrics, in seconds. collect_interval: ${SW_AGENT_METER_COLLECT_INTERVAL:20} reporter: grpc: # The gRPC server address of the backend service. backend_service: ${SW_AGENT_REPORTER_GRPC_BACKEND_SERVICE:127.0.0.1:11800} # The maximum count of segment for reporting tracing data. max_send_queue: ${SW_AGENT_REPORTER_GRPC_MAX_SEND_QUEUE:5000} # The interval(s) of checking service and backend service check_interval: ${SW_AGENT_REPORTER_GRPC_CHECK_INTERVAL:20} # The authentication string for communicate with backend. authentication: ${SW_AGENT_REPORTER_GRPC_AUTHENTICATION:} # The interval(s) of fetching dynamic configuration from backend. cds_fetch_interval: ${SW_AGENT_REPORTER_GRPC_CDS_FETCH_INTERVAL:20} tls: # Whether to enable TLS with backend. enable: ${SW_AGENT_REPORTER_GRPC_TLS_ENABLE:false} # The file path of ca.crt. The config only works when opening the TLS switch. ca_path: ${SW_AGENT_REPORTER_GRPC_TLS_CA_PATH:} # The file path of client.pem. The config only works when mTLS. client_key_path: ${SW_AGENT_REPORTER_GRPC_TLS_CLIENT_KEY_PATH:} # The file path of client.crt. The config only works when mTLS. client_cert_chain_path: ${SW_AGENT_REPORTER_GRPC_TLS_CLIENT_CERT_CHAIN_PATH:} # Controls whether a client verifies the server's certificate chain and host name. insecure_skip_verify: ${SW_AGENT_REPORTER_GRPC_TLS_INSECURE_SKIP_VERIFY:false} log: # The type determines which logging type is currently used by the system. # The Go agent wourld use this log type to generate custom logs. It supports: "auto", "logrus", or "zap". # auto: Automatically identifies the source of the log. # If logrus is present in the project, it wourld automatically use logrus. # If zap has been initialized in the project, it would use the zap framework. # By default, it would use std errors to output log content. # logrus: Specifies that the Agent should use the logrus framework. # zap: Specifies that the Agent should use the zap framework. # The system must have already been initialized through methods such as "zap.New", "zap.NewProduction", etc. type: ${SW_AGENT_LOG_TYPE:auto} tracing: # Whether to automatically integrate Tracing information into the logs. enable: ${SW_AGENT_LOG_TRACING_ENABLE:true} # If tracing information is enabled, the tracing information would be stored in the current Key in each log. key: ${SW_AGENT_LOG_TRACING_KEY:SW_CTX} reporter: # Whether to upload logs to the backend. enable: ${SW_AGENT_LOG_REPORTER_ENABLE:true} # The fields name list that needs to added to the label of the log.(multiple split by ",") label_keys: ${SW_AGENT_LOG_REPORTER_LABEL_KEYS:} plugin: # List the names of excluded plugins, multiple plugin names should be splitted by "," # NOTE: This parameter only takes effect during the compilation phase. excluded: ${SW_AGENT_PLUGIN_EXCLUDES:} config: http: # Collect the parameters of the HTTP request on the server side server_collect_parameters: ${SW_AGENT_PLUGIN_CONFIG_HTTP_SERVER_COLLECT_PARAMETERS:false} mongo: # Collect the statement of the MongoDB request collect_statement: ${SW_AGENT_PLUGIN_CONFIG_MONGO_COLLECT_STATEMENT:false} sql: # Collect the parameter of the SQL request collect_parameter: ${SW_AGENT_PLUGIN_CONFIG_SQL_COLLECT_PARAMETER:false}
設置參數有以下兩種方式,例如,如果要配置service_name,配置方法如下:
方式一(推薦):直接在config.yaml中添加參數
agent: service_name: ${SW_AGENT_NAME:<your_service_name>}
方式二:配置系統環境變量
export SW_AGENT_NAME=<your_service_name>
接入可觀測鏈路 OpenTelemetry 版控制臺需要設置以下參數:
service_name: ${SW_AGENT_NAME:Your_ApplicationName}
:服務名稱。backend_service: ${SW_AGENT_REPORTER_GRPC_BACKEND_SERVICE:127.0.0.1:11800}
:接入點的Endpoint。authentication: ${SW_AGENT_REPORTER_GRPC_AUTHENTICATION:}
:接入點鑒權Token。
skywalking-go Agent默認對所有的插件自動埋點,若需要移除特定插件,可以設置excluded參數,例如:
# 如果想要關閉sql plugin plugin: excluded: ${SW_AGENT_PLUGIN_EXCLUDES:sql} # 如果想同時關閉多個plugin,使用,分隔 plugin: excluded: ${SW_AGENT_PLUGIN_EXCLUDES:sql,gorm}
重新構建項目。
# 需要使用-toolexec sudo go build -toolexec "path/to/skywalking-go-agent -config path/to/config.yaml" -a
path/to/skywalking-go-agent
:上文步驟1可執行文件的絕對路徑。path/to/config.yaml
:skywalking-go Agent的參數配置文件的絕對路徑。
啟動項目。此時SkyWalking數據將會上報至可觀測鏈路 OpenTelemetry 版控制臺。
參考信息
skywalking-go探針的部分屬性列表,NULL表示默認值未設置:
環境變量 | 描述 | 默認值 |
SW_AGENT_NAME | 服務名稱。 | NULL |
SW_AGENT_INSTANCE_NAME | 服務實例名稱。 | 自動生成 |
SW_AGENT_SAMPLE | 采樣率,取值在0和1之間。 | 1 |
SW_AGENT_REPORTER_GRPC_BACKEND_SERVICE | 監控數據通過gRPC上報的服務端Endpoint。 | 127.0.0.1:11800 |
SW_AGENT_REPORTER_GRPC_AUTHENTICATION | 監控數據通過gRPC上報的服務端的鑒權Token。 | NULL |
SW_AGENT_PLUGIN_EXCLUDES | 指定移除的插件。 | NULL |
通過Go2Sky探針上報
Go2Sky同時支持配置參數硬編碼到項目或通過環境變量自動配置兩種方法。
配置參數硬編碼
### 使用reporter.WithParameter()導入參數 report, err := reporter.NewGRPCReporter( <your-backend-server-address>, reporter.WithAuthentication(<your-auth-token>))
環境變量自動配置
### 目前go2sky支持從環境變量獲取以下參數 SW_AGENT_AUTHENTICATION SW_AGENT_LAYER SW_AGENT_COLLECTOR_HEARTBEAT_PERIOD SW_AGENT_COLLECTOR_GET_AGENT_DYNAMIC_CONFIG_INTERVAL SW_AGENT_COLLECTOR_BACKEND_SERVICES SW_AGENT_COLLECTOR_MAX_SEND_QUEUE_SIZE SW_AGENT_PROCESS_STATUS_HOOK_ENABLE SW_AGENT_PROCESS_LABELS ### 配置環境變量,以macOS為例 # 方法1:寫入環境變量配置文件(持久化) vim ~/.bash_profile export SW_AGENT_COLLECTOR_BACKEND_SERVICES=<your-collector-address> source ~/.bash_profile # 方法2:打開終端,命令行配置(臨時生效,打開新的終端失效) export SW_AGENT_COLLECTOR_BACKEND_SERVICES=<your-collector-address>
配置ServiceName,用于識別具體的應用。
ServiceName := <your-service-name> tracer, err := go2sky.NewTracer(ServiceName, go2sky.WithReporter(report))
添加Go2Sky-Plugin Hook。
Go2Sky開發了眾多庫的插件,但是需要在項目源代碼中添加埋點。如何添加埋點請參見Go2Sky-Plugins的Github倉庫。在每個插件的plugin文件夾下,README.md文件給了簡單的使用示例。
以gin框架為例:
進入/gin文件夾,查看/gin/v3/README.md文件。
添加Middleware的Hook:v3.Middleware(r, tracer)。
package main import ( "log" "github.com/SkyAPM/go2sky" v3 "github.com/SkyAPM/go2sky-plugins/gin/v3" "github.com/SkyAPM/go2sky/reporter" "github.com/gin-gonic/gin" ) func main() { // Use gRPC reporter for production re, err := reporter.NewLogReporter() if err != nil { log.Fatalf("new reporter error %v \n", err) } defer re.Close() tracer, err := go2sky.NewTracer("gin-server", go2sky.WithReporter(re)) if err != nil { log.Fatalf("create tracer error %v \n", err) } gin.SetMode(gin.ReleaseMode) r := gin.New() //Use go2sky middleware with tracing r.Use(v3.Middleware(r, tracer)) // do something }
重新啟動應用。
參考信息
Go2Sky的Agent屬性配置表,NULL表示默認值未設置:
環境變量 | 描述 | 默認值 |
SW_AGENT_NAME | Go服務的名稱。 | NULL |
SW_AGENT_LAYER | Instance belong layer name which define in the backend 實例所屬的layer名稱。 | NULL |
SW_AGENT_INSTANCE_NAME | Go服務的實例名稱。 | 隨機生成 |
SW_AGENT_SAMPLE | 采樣率,1表示全量采集。 | 1 |
SW_AGENT_COLLECTOR_BACKEND_SERVICES | Agent數據上報的服務端地址。 | NULL |
SW_AGENT_AUTHENTICATION | Agent數據上報的服務端的鑒權令牌。 | NULL |
SW_AGENT_COLLECTOR_HEARTBEAT_PERIOD | Agent心跳上報周期,單位:s。 | 20 |
SW_AGENT_COLLECTOR_GET_AGENT_DYNAMIC_CONFIG_INTERVAL | 動態獲取Agent配置的時間間隔,單位:s。 | 20 |
SW_AGENT_COLLECTOR_MAX_SEND_QUEUE_SIZE | 發送跨度Span的隊列Buffer長度。 | 30000 |
SW_AGENT_PROCESS_STATUS_HOOK_ENABLE | 啟用進程狀態Hook功能。 | False |
SW_AGENT_PROCESS_LABELS | 進程標簽,多個標簽用英文半角逗號(,)分隔。 | NULL |
常見問題
使用skywalking-go時報錯如下:
如果使用inject方式報錯,您可以通過import在main package中導入skywalking module。
跨進程調用時,為什么通過Go2Sky上報可觀測鏈路 OpenTelemetry 版控制臺無法顯示正確的調用鏈?
全鏈路追蹤通過TraceId將整個鏈路串聯起來,而TraceId通過HTTP請求攜帶傳遞。如果調用鏈不正確,說明TraceId沒有正確傳遞,需要設置合理的Span埋點。
通過合理使用下面兩個重要的接口,可以將跨進程的調用鏈正確的串聯起來:
CreateEntrySpan:入口Span,可以通過該接口從HTTP請求中提取得到鏈路追蹤上下文(包含TraceId)。
CreateExitSpan:出口Span,可以通過該接口向HTTP請求注入鏈路追蹤上下文(包含TraceId)。
// 進程內,使用CreateLocalSpan創建一個跨度(Span)。 span, ctx, err := tracer.CreateLocalSpan(context.Background()) subSpan, newCtx, err := tracer.CreateLocalSpan(ctx) // 跨進程,使用入口Span從CreateEntrySpan從Http請求中提取上下文,使用出口Span向CreateExitSpan向Http請求中注入上下文。 span, ctx, err := tracer.CreateEntrySpan(r.Context(), "/api/login", func(key string) (string, error) { return r.Header.Get(key), nil }) span, err := tracer.CreateExitSpan(req.Context(), "/service/validate", "tomcat-service:8080", func(key, value string) error { req.Header.Set(key, value) return nil })
跨進程的項目,不同進程之間需要傳遞TraceId才能將調用鏈串聯起來,所以需要用到上面的接口將上下文注入到HTTP請求中隨著請求在進程間傳遞。