天天看點

分布式鍊路追蹤系統--OpenCensus

作者:寒笛過霜天

OpenCensus 是 Google 開源的一個用來收集和追蹤應用程式名額中立廠商的第三方庫。支援多個語言的lib庫, 但是不能展示。

OpenCensus 是 Google 開源的一個用來收集和追蹤應用程式名額中立廠商的第三方庫, 能夠減少應用的部署與建構成本, 尤其适合微服務架構。

OpenCensus 有各種不同的程式設計語言編寫的版本, 包括 Go、Java、PHP、C++、Python 等等。它旨在幫助開發者更容易收集和送出跟蹤應用程式名額。

這是一個中立的單一庫發行, 可自動收集和跟蹤應用名額, 可在本地顯示, 也可将其發送到分析工具。

OpenCensus 目前支援 Prometheus、SignalFX、Stackdriver 和 Zipkin。

開發者可以使用它來測試微服務, 并将資料發送到任何受支援的後端服務。

官方網:

http://opencensus.io/

GitHub 項目:

https://github.com/census-instrumentation

有多個項目的用戶端。 Java, C++, Go, .Net, Python, PHP, Node.js, Erlang, and Ruby。這些用戶端都支援。

使用的案例

https://github.com/census-instrumentation/opencensus-go/tree/v0.22.5/examples

案例: HTTP服務分布式鍊路追蹤

> # mkdir tracing

> # vim server.go

package main
import (
"fmt"
"log"
"net/http"
"time"
"go.opencensus.io/zpages"
"go.opencensus.io/examples/exporter"
"go.opencensus.io/plugin/ochttp"
"go.opencensus.io/stats/view"
"go.opencensus.io/trace"
)
const (
metricsLogFile = "/tmp/metrics.log"
tracesLogFile = "/tmp/trace.log"
)
func main() {
// 啟動z-Pages伺服器。
go func() {
mux := http.NewServeMux()
zpages.Handle(mux, "/debug")
log.Fatal(http.ListenAndServe("127.0.0.1:8081", mux))
}()
// 使用日志導出器導出度量,但您可以選擇任何支援的導出器。
exporter, err := exporter.NewLogExporter(exporter.Options{
ReportingInterval: 10 * time.Second,
MetricsLogFile: metricsLogFile,
TracesLogFile: tracesLogFile,
})
if err != nil {
log.Fatalf("Error creating log exporter: %v", err)
}
exporter.Start()
defer exporter.Stop()
defer exporter.Close()
// 始終跟蹤此示範。在生産應用程式中,您應該将此配置為跟蹤機率采樣器設定在所需的位置機率。
trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()})
// 每秒鐘報告一次資料
view.SetReportingPeriod(1 * time.Second)
client := &http.Client{Transport: &ochttp.Transport{}}
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "hello world")
// 提供一個示例,說明如何使用中繼資料對跨度進行注釋
_, span := trace.StartSpan(req.Context(), "child")
defer span.End()
span.Annotate([]trace.Attribute{trace.StringAttribute("key", "value")}, "something happened")
span.AddAttributes(trace.StringAttribute("hello", "world"))
time.Sleep(time.Millisecond * 125)
r, _ := http.NewRequest("GET", "https://example.com", nil)
// 在傳出請求中傳遞跟蹤頭資訊。
r = r.WithContext(req.Context())
resp, err := client.Do(r)
if err != nil {
log.Println(err)
} else {
// TODO: handle response
resp.Body.Close()
}
})
log.Fatal(http.ListenAndServe(":50030", &ochttp.Handler{}))
}           

> # vim client.go

package main
import (
"log"
"net/http"
"time"
"go.opencensus.io/plugin/ochttp"
"go.opencensus.io/trace"
"go.opencensus.io/examples/exporter"
"go.opencensus.io/stats/view"
)
const server = "http://localhost:50030"
func main() {
// 注冊 stats 并跟蹤導出程式以導出收集的資料。
exporter := &exporter.PrintExporter{}
view.RegisterExporter(exporter)
trace.RegisterExporter(exporter)
// 始終跟蹤此示範。在生産應用程式中,您應該将此配置為跟蹤機率采樣器設定在所需的位置機率。
trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()})
// 每秒鐘報告一次資料
view.SetReportingPeriod(1 * time.Second)
client := &http.Client{Transport: &ochttp.Transport{}}
resp, err := client.Get(server)
if err != nil {
log.Printf("Failed to get response: %v", err)
} else {
resp.Body.Close()
}
time.Sleep(2 * time.Second) // 等到統計報告出來。
}           

> # go run server.go

> # go run client.go

#----------------------------------------------

TraceID: 7a4b4b8d5c9c0ad37f8896d7c046d507

SpanID: c94fc0853d16c131

Span:

Status: OK [0]

Elapsed: 3.072s

Attributes:

- http.method=GET

- http.status_code=200

- http.path=

- http.url=http://localhost:50030

- http.host=localhost:50030

繼續閱讀