(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)
}