<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] > [opencensus 官網](https://opencensus.io/quickstart/go/metrics/#0) ## opencensus ## zipkin 1. 將Trace ID記錄到日志,方便追蹤 ## 例子 **需要先啟動 zipkin** `docker run -d -p 9411:9411 openzipkin/zipkin ` ### hello word 追蹤http請求耗時情況 <details> <summary>main.go</summary> ``` package main import ( "log" "math/rand" "net/http" "time" "contrib.go.opencensus.io/exporter/zipkin" "go.opencensus.io/plugin/ochttp" "go.opencensus.io/stats/view" "go.opencensus.io/trace" openzipkin "github.com/openzipkin/zipkin-go" zipkinHTTP "github.com/openzipkin/zipkin-go/reporter/http" ) func registerZipkin(){ //設置Tags 第一參數為服務器名 ,第二為真實的標記的ip&port,不用實際程序,只做標記 localEndpoint, err := openzipkin.NewEndpoint("golangsvc", "xxxxx:port") if err != nil { log.Fatalf("Failed to create Zipkin exporter: %v", err) } reporter := zipkinHTTP.NewReporter("http://192.168.0.110:9411/api/v2/spans") exporter := zipkin.NewExporter(reporter, localEndpoint) trace.RegisterExporter(exporter) trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) } func main() { //初始化一個發送給 zipkin 的程序 registerZipkin() mux := http.NewServeMux() mux.HandleFunc("/list", list) h := &ochttp.Handler{Handler: mux} if err := view.Register(ochttp.DefaultServerViews...); err != nil { log.Fatal("Failed to register ochttp.DefaultServerViews") } log.Printf("Server listening! ...") log.Fatal(http.ListenAndServe(":8080", h)) } func list(w http.ResponseWriter, r *http.Request) { log.Printf("Serving request: %s", r.URL.Path) database(r) serviceb(r) time.Sleep(3*time.Second) w.Write([]byte("Hello, world!")) } // 每個一個 r.context() 都是片段的時間消耗 // _, span := trace.StartSpan(r.Context(), "database") // defer span.End() func database(r *http.Request) { cache(r) _, span := trace.StartSpan(r.Context(), "database") defer span.End() time.Sleep(time.Duration(rand.Intn(977)+300) * time.Millisecond) } func cache(r *http.Request) { _, span := trace.StartSpan(r.Context(), "cache") defer span.End() time.Sleep(time.Duration(rand.Intn(100)+1) * time.Millisecond) } func serviceb(r *http.Request) { _, span := trace.StartSpan(r.Context(), "serviceb") defer span.End() time.Sleep(time.Duration(rand.Intn(800)+200) * time.Millisecond) servicec(r) } func servicec(r *http.Request) { _, span := trace.StartSpan(r.Context(), "servicec") defer span.End() time.Sleep(time.Duration(rand.Intn(700)+100) * time.Millisecond) } ``` </details> <br/> ``` go run main.go ``` ### 非http程序 <details> <summary>main.go</summary> ``` package main import ( "bytes" "context" "encoding/binary" "fmt" "log" "time" "contrib.go.opencensus.io/exporter/zipkin" "go.opencensus.io/trace" openzipkin "github.com/openzipkin/zipkin-go" zipkinHTTP "github.com/openzipkin/zipkin-go/reporter/http" ) func main() { // 1. 配置Zipkin出口 localEndpoint, err := openzipkin.NewEndpoint("go-quickstart", "192.168.1.5:5454") if err != nil { log.Fatalf("Failed to create the local zipkinEndpoint: %v", err) } reporter := zipkinHTTP.NewReporter("http://192.168.0.110:9411/api/v2/spans") ze := zipkin.NewExporter(reporter, localEndpoint) trace.RegisterExporter(ze) // 配置100%的采樣率,否則,一些痕跡將采樣 trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) // 3. 創建一個跨度與背景環境,使這個父跨度 // span 必須關閉 ctx, span := trace.StartSpan(context.Background(), "main") defer span.End() for i := 0; i < 10; i++ { doWork(ctx) } } func doWork(ctx context.Context) { _, span := trace.StartSpan(ctx, "doWork") defer span.End() fmt.Println("doing busy work") time.Sleep(80 * time.Millisecond) buf := bytes.NewBuffer([]byte{0xFF, 0x00, 0x00, 0x00}) num, err := binary.ReadVarint(buf) if err != nil { // 6. Set status upon error span.SetStatus(trace.Status{ Code: trace.StatusCodeUnknown, Message: err.Error(), }) } // 7. Annotate our span to capture metadata about our operation span.Annotate([]trace.Attribute{ trace.Int64Attribute("bytes to int", num), }, "Invoking doWork") time.Sleep(20 * time.Millisecond) } ``` </details> <br/> 運行 `go run main.go` ### rpc 調用時的實例 在rpc 夸程序調用時候,如何追蹤 > [詳情查看 idcpj/LearnRpcx](https://github.com/idcpj/LearnRpcx) ![UTOOLS1584070117483.png](https://github.com/idcpj/LearnRpcx/raw/master/image/1.png) ![](https://github.com/idcpj/LearnRpcx/raw/master/image/2.png) ``` ctx := context.Background() span, ctx, _ := opentracing.GenerateSpanWithContext(ctx, "proxy") // 設置標簽 span.SetTag("1111", "2222") // 設置注釋 span.LogKV( "event", "soft error", "type", "cache timeout", "waited.millis", 1500) ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看