0. 前提

  • kubernetes, Operatorに関する初歩的な知識があるとなお良い

1. 動作環境

  • EC2 (t3.2xlarge)
  • Ubuntu 20.04.2 LTS
  • Docker 20.10.7
  • go 1.17.6

2. Dockerでjaegerをインストールする

  • Jaegerインストール済みのDockerコンテナを起動する
docker run -d --name=jaeger -p 5775:5775/udp -p 16686:16686 jaegertracing/all-in-one:latest

http://localhost:16686 でUIにアクセス可能です。

Jaeger UI

3. GoでJaegerにTrace情報を連携する

Trace情報を渡すプログラムをGoで実装してみます。

  • ライブラリをインストールする
go get github.com/uber/jaeger-client-go
go get github.com/opentracing/opentracing-go
go get github.com/pkg/errors
  • Goのブログラムを実装する trace_sampleという名前のTracerを作成し、そのTracerの中にhelloとworldの2種類のspanが流れるサンプルコードになっています。
package main

import (
    "fmt"
    "github.com/opentracing/opentracing-go"
    "github.com/uber/jaeger-client-go"
    "github.com/uber/jaeger-client-go/config"
    "time"
)

func main() {
    cfg := config.Configuration{
        Sampler: &config.SamplerConfig{
            Type:  "const",
            Param: 1,
        },
        Reporter: &config.ReporterConfig{
            LogSpans:            true,
            BufferFlushInterval: 1 * time.Second,
            LocalAgentHostPort:  "127.0.0.1:5775", //先程作成したDockerコンテナの5775ポートをレポート先ホストとして指定して設定(UDP通信)
        },
    }
    tracer, closer, err := cfg.New(
        "trace_sample",
        config.Logger(jaeger.StdLogger),
    )
    if err != nil {
        fmt.Println(err)
    }
    opentracing.SetGlobalTracer(tracer) //Tracerを作成
    defer closer.Close()

    someFunction()
}

func someFunction() {
    parent := opentracing.GlobalTracer().StartSpan("hello")  // helloという名前のspanを作成
    defer parent.Finish()
    child := opentracing.GlobalTracer().StartSpan(
        "world", opentracing.ChildOf(parent.Context()))  // worldという名前のspanを作成
    defer child.Finish()
}
  • 実行する 下記のエラーが発生しました。go.modが無いと怒られているようなので、作成します。
jaeger_sample.go:5:5: no required module provides package github.com/opentracing/opentracing-go: go.mod file not found in current directory or any parent directory; see 'go help modules'
jaeger_sample.go:6:5: no required module provides package github.com/uber/jaeger-client-go: go.mod file not found in current directory or any parent directory; see 'go help modules'
jaeger_sample.go:7:5: no required module provides package github.com/uber/jaeger-client-go/config: go.mod file not found in current directory or any parent directory; see 'go help modules'
  • go.modを作成する
go mod init test3
  • またエラーが発生するので、指示に従う
go run jaeger_sample.go
jaeger_sample.go:5:5: no required module provides package github.com/opentracing/opentracing-go; to add it:
	go get github.com/opentracing/opentracing-go
jaeger_sample.go:6:5: no required module provides package github.com/uber/jaeger-client-go; to add it:
	go get github.com/uber/jaeger-client-go
jaeger_sample.go:7:5: no required module provides package github.com/uber/jaeger-client-go/config; to add it:
	go get github.com/uber/jaeger-client-go/config
go get github.com/opentracing/opentracing-go
go get github.com/uber/jaeger-client-go/config
go get github.com/uber/jaeger-client-go
  • もう一度、実行する
 go run jaeger_sample.go
2022/01/30 07:24:43 debug logging disabled
2022/01/30 07:24:43 Initializing logging reporter
2022/01/30 07:24:43 debug logging disabled
2022/01/30 07:24:43 Reporting span 4910416a0c1a18e3:0b0f7921aa631b9b:4910416a0c1a18e3:1
2022/01/30 07:24:43 Reporting span 4910416a0c1a18e3:4910416a0c1a18e3:0000000000000000:1

うまくいったようですね。

4. UIを確認する

Jaeger UI

Serviceの欄に先程のコード内で指定したサービス名「trace_sample」が出てきます。 Find tracesを実行するとtrace_sampleのサービスで記録されたTrace情報が1件出てきます。 この情報の詳細をチェックすると以下の図のように、helloとworldの2つのspanが登録されていることがわかります。

5. 最後に

今回はdockerで動かしましたが、今度はk8sでもできるかやってみます。

6. 参考にしたサイト