新聞中心
baggage鏈路數(shù)據(jù)傳遞
示例代碼地址:https://github.com/GOgf/gf/tree/master/example/trace/http

創(chuàng)新互聯(lián)公司致力于成都做網(wǎng)站、成都網(wǎng)站制作,成都網(wǎng)站設(shè)計,集團(tuán)網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇創(chuàng)新互聯(lián)公司,就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!
客戶端
package main
import (
"github.com/gogf/gf/contrib/trace/jaeger/v2"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/gtrace"
"github.com/gogf/gf/v2/os/gctx"
)
const (
ServiceName = "http-client"
JaegerUdpEndpoint = "localhost:6831"
)
func main() {
var ctx = gctx.New()
tp, err := jaeger.Init(ServiceName, JaegerUdpEndpoint)
if err != nil {
g.Log().Fatal(ctx, err)
}
defer tp.Shutdown(ctx)
StartRequests()
}
func StartRequests() {
ctx, span := gtrace.NewSpan(gctx.New(), "StartRequests")
defer span.End()
ctx = gtrace.SetBaggageValue(ctx, "name", "john")
content := g.Client().GetContent(ctx, "http://127.0.0.1:8199/hello")
g.Log().Print(ctx, content)
}客戶端代碼簡要說明:
- 首先,客戶端也是需要通過?
jaeger.Init?方法初始化?Jaeger?。 - 隨后,這里通過?
gtrace.SetBaggageValue(ctx, "name", "john")?方法設(shè)置了一個?baggage?,該?baggage?將會在該請求的所有鏈路中傳遞。不過我們該示例也有兩個節(jié)點,因此該?baggage?數(shù)據(jù)只會傳遞到服務(wù)端。該方法會返回一個新的?context.Context?上下文變量,在隨后的調(diào)用鏈中我們將需要傳遞這個新的上下文變量。 - 其中,這里通過?
g.Client()?創(chuàng)建一個?HTTP?客戶端請求對象,該客戶端會自動啟用鏈路跟蹤特性,無需開發(fā)者顯示調(diào)用任何方法或者任何設(shè)置。 - 最后,這里使用了?
g.Log().Print(ctx, content)?方法打印服務(wù)端的返回內(nèi)容,其中的?ctx?便是將鏈路信息傳遞給日志組件,如果?ctx?上下文對象中存在鏈路信息時,日志組件會同時自動將?TraceId?輸出到日志內(nèi)容中。
服務(wù)端
package main
import (
"github.com/gogf/gf/contrib/trace/jaeger/v2"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/net/gtrace"
"github.com/gogf/gf/v2/os/gctx"
)
const (
ServiceName = "http-server"
JaegerUdpEndpoint = "localhost:6831"
)
func main() {
var ctx = gctx.New()
tp, err := jaeger.Init(ServiceName, JaegerUdpEndpoint)
if err != nil {
g.Log().Fatal(ctx, err)
}
defer tp.Shutdown(ctx)
s := g.Server()
s.Group("/", func(group *ghttp.RouterGroup) {
group.GET("/hello", HelloHandler)
})
s.SetPort(8199)
s.Run()
}
func HelloHandler(r *ghttp.Request) {
ctx, span := gtrace.NewSpan(r.Context(), "HelloHandler")
defer span.End()
value := gtrace.GetBaggageVar(ctx, "name").String()
r.Response.Write("hello:", value)
}服務(wù)端代碼簡要說明:
- 當(dāng)然,服務(wù)端也是需要通過?
jaeger.Init?方法初始化?Jaeger?。 - 服務(wù)端啟動啟用鏈路跟蹤特性,開發(fā)者無需顯示調(diào)用任何方法或任何設(shè)置。
- 服務(wù)端通過?
gtrace.GetBaggageVar(ctx, "name").String()?方法獲取客戶端提交的?baggage?信息,并轉(zhuǎn)換為字符串返回。
效果查看
啟動服務(wù)端:
啟動客戶端:
可以看到,客戶端提交的?baggage?已經(jīng)被服務(wù)端成功接收到并打印返回。并且客戶端在輸出日志內(nèi)容的時候也同時輸出的?TraceId?信息。?TraceId?是一條鏈路的唯一?ID?,可以通過該?ID?檢索該鏈路的所有日志信息,并且也可以通過該?TraceId?在?Jaeger?系統(tǒng)上查詢該調(diào)用鏈路詳情。
在?Jaeger?上查看鏈路信息:
可以看到在這里出現(xiàn)了兩個服務(wù)名稱:?tracing-http-client?和?tracing-http-server?,表示我們這次請求涉及到兩個服務(wù),分別是?HTTP?請求的客戶端和服務(wù)端,并且每個服務(wù)中分別涉及到2個?span?鏈路節(jié)點。
我們點擊這個?trace?的詳情,可以看得到調(diào)用鏈的層級關(guān)系。并且可以看得到客戶端請求的地址、服務(wù)端接收的路由以及服務(wù)端路由函數(shù)名稱。我們這里來介紹一下客戶端的?Atttributes?信息和?Events?信息,也就是?Jaeger?中展示的?Tags?信息和?Process?信息。
HTTP Client Attributes
| Attribute/Tag | 說明 | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
otel.instrumentation_library.name | 當(dāng)前儀表器名稱,往往是當(dāng)前span操作的組件名稱 | ||||||||||||||
otel.instrumentation_library.version | 當(dāng)前儀表器組件版本 | ||||||||||||||
span.kind |
當(dāng)前
| ||||||||||||||
status.code | 當(dāng)前span狀態(tài),0為正常,非0表示失敗 | ||||||||||||||
status.message | 當(dāng)前span狀態(tài)信息,往往在失敗時會帶有錯誤信息 | ||||||||||||||
hostname | 當(dāng)前節(jié)點的主機(jī)名稱 | ||||||||||||||
ip.intranet | 當(dāng)前節(jié)點的主機(jī)內(nèi)網(wǎng)地址列表 | ||||||||||||||
http.address.local | HTTP通信的本地地址和端口 | ||||||||||||||
http.address.remote | HTTP通信的目標(biāo)地址和端口 | ||||||||||||||
http.dns.start | 當(dāng)請求的目標(biāo)地址帶有域名時,開始解析的域名地址 | ||||||||||||||
http.dns.done | 當(dāng)請求的目標(biāo)地址帶有域名時,解析結(jié)束之后的IP地址 | ||||||||||||||
http.connect.start | 開始創(chuàng)建連接的類型和地址 | ||||||||||||||
http.connect.done | 創(chuàng)建連接成功后的類型和地址 |
HTTP Client Events
| Event/Log | 說明 |
|---|---|
http.request.headers | HTTP客戶端請求提交的Header信息,可能會比較大。 |
http.request.baggage | HTTP客戶端請求提交的Baggage信息,用于服務(wù)間鏈路信息傳遞。 |
http.request.body |
HTTP客戶端請求提交的 |
http.response.headers | HTTP客戶端請求接收返回的的Header信息,可能會比較大。 |
http.response.body | HTTP客戶端請求接收返回的Body數(shù)據(jù),可能會比較大,最大只記錄512KB,如果超過該大小則忽略。 |
HTTP Server Attributes
?HTTP Server?端的?Attributes?含義同?HTTP Client?,在同一請求中,打印的數(shù)據(jù)基本一致。
HTTP Server Events
?HTTP Server?端的?Events?含義同?HTTP Client?,在同一請求中,打印的數(shù)據(jù)基本一致。
分享名稱:創(chuàng)新互聯(lián)GoFrame教程:GoFrameHTTP示例-Baggage
網(wǎng)頁路徑:http://m.fisionsoft.com.cn/article/cohgcoh.html


咨詢
建站咨詢
