(2023年06月22日時点での情報)
困ったこと
OpenTelemetryを使用して、トレースを行なっていたところ、Spannerの利用箇所で、unsupported sampler
というエラーが何度も出ていた。このログ出力を無効化したかった。
本文
前提
OpenTelemetryのOpenCensus bridgeを使用している。
GCPのCloud Traceを利用する時には、OpenTelemetryを使用している。
(OpenCensusは、プロジェクトが廃止されているらしい。)
ただ、現在の時点で、Spannerなどのパッケージでは、トレースには、OpenCensusが使用されている。そこで、bridge(wrap)を行い、OpenCensusのStartSpan()
が呼ばれても、OpenTelemetryのStart()
が利用されるようにしている。
問題点
エラーレベルで、starting span "cloud.google.com/go/spanner.ping": unsupported sampler
というログが、何度も出力されていた。
解決策
otel.SetErrorHandler()
を利用して、ErrorHandlerを設定し、ハンドリングできるようにする。
解説
OpenCensus bridgeを見に行くと、StartSpan()
内で、オプションの変換が行われている。
変換処理を見に行くと、Sampler
が存在した場合、fmt.Errorf("unsupported sampler")
みたいな感じで、エラーが作成されている。
オプションの変換処理でエラーがあった場合、internalのvar Handle
が利用される。これを書き換えれば良くて、方法として、otel.SetErrorHandler()
がある。これを使って、otel.ErrorHandler
を設定する。
以下、雑なコード
func main() {
otel.SetErrorHandler(New())
}
func New() otel.ErrorHandler {
return errorHandler{}
}
type errorHandler struct{}
func (_ errorHandler) Handle(err error) {
if strings.Contains(err.Error(), "unsupported sampler") {
return
}
log.Println(err)
}