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にアクセス可能です。
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を確認する
Serviceの欄に先程のコード内で指定したサービス名「trace_sample」が出てきます。 Find tracesを実行するとtrace_sampleのサービスで記録されたTrace情報が1件出てきます。 この情報の詳細をチェックすると以下の図のように、helloとworldの2つのspanが登録されていることがわかります。
5. 最後に
今回はdockerで動かしましたが、今度はk8sでもできるかやってみます。