import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
func hoge(ctx context.Context) (err error) {
span, ctx := tracer.StartSpanFromContext(
ctx,
"do hoge",
)
defer func() { span.Finish(tracer.WithError(err)) }()
err = somethings1(ctx)
if err != nil {
return
}
err = somethings2(ctx)
if err != nil {
return
}
return
}
こういう具合に tracer.StartSpanFromContext してあげるとよい。 StartSpanFormContext を使うと context に実行時の span を保持してくれて、親子関係を構築してくれる。
で、これをサードパーティなパッケージが絡んだところや、その他いろいろにモリモリ適用しようとすると大変そうだなあと思ったので、クロージャでシュッと StartSpanFormContext を書いてみた。
sters/wrapspan: for https://github.com/DataDog/dd-trace-go/
別に何も難しいことはやってない。
dd-trace-go に contrib パッケージがあるように、対象のソレをラップした構造体なり関数なりを作るほうが、そういうパッケージとして切り出せるしオプションの勝手もよいだろうしコードの見通しもよくなりそうだ、と、この記事を書いているときに思った。
Readme に書いた例だとこういう感じ。
func Xsomething1(ctx context.Context) (err error) {
span, ctx := tracer.StartSpanFromContext(
ctx,
"span-1",
)
defer func() { span.Finish(tracer.WithError(err)) }()
return X.something1(ctx)
}
func Xsomething2(ctx context.Context) (err error) {
span, ctx := tracer.StartSpanFromContext(
ctx,
"span-2",
)
defer func() { span.Finish(tracer.WithError(err)) }()
return X.something2(ctx)
}
func Xsomethings(ctx) (err error) {
span, ctx := tracer.StartSpanFromContext(
ctx,
"span-somethings",
)
defer func() { span.Finish(tracer.WithError(err)) }()
err = X.something1(ctx)
if err != nil {
return
}
err = X.something2(ctx)
if err != nil {
return
}
}
よさそう。