スパンの加工が必要なときにどれを使うといいのだっけ、とたまに思い出せなくなるので、メモ的にまとめてみた。
フィルタリング、サンプリング
フィルタリングおよびサンプリングは、エクスポータへのスパンの送出を減らす役割を担う(たくさん送るとそれだけコストになるので、無駄なものは送りたくない)。
フィルタリングのFilter Processorは、条件に基づいて合致したスパンを削除する。
- YAMLに列挙したリストがOR評価され、いずれかにマッチすればそのスパンを除去する
- 1つの評価式内で
andを使うことはできる IsMatchで値の正規表現評価ができる- 評価項目は属性
attributes["〜"]、リソース属性resource.attributes["〜"]、スパン名name、タイプtypeなど
Filter Processorの注意点として、これはスパンを削除するだけで、トレースが削除されるわけではない。トレースとして削除したいときには、「関係するスパンを何らかの条件で削除する」か「テールベースサンプリングを使う」かとなる。
サンプリングでは、スパンの集合体であるトレースを条件に基づいて選び取る。シンプルに確率的に選出するヘッドベースサンプリング(Probabilistic Sampling Processor)と、いったんCollectorに貯めてから選ぶテールベースサンプリング(Tail Sampling Processor)がある。
パイプラインで設定するときには、フィルタリングをまず実施し、そのあとにサンプリングという順序にすることが推奨される。
属性の加工
属性やリソース属性の追加・削除、および値の変更の目的に対しては、Transform Processorと、用途範囲を絞ってその役割に特化した各種プロセッサがある。
Transform Processorは、強力な属性加工プロセッサである。
処理はOTTLの記法で記載し、OTTLの関数を利用して、属性・リソース属性の追加・削除・値の変更ができる。以下はスパンのレイテンシー値をスパン属性に持たせた例である。
transform:
error_mode: ignore
trace_statements:
- set(span.attributes["app.duration_ms"], (span.end_time_unix_nano - span.start_time_unix_nano) / 1000000)
Attributes Processorは、スパン属性を加工するプロセッサである。スパン属性の追加(insertおよびupsert)と削除、値のハッシュ化、値のマッチャによる展開(たとえばhttp.url属性値からpattern: ^(?P<http_protocol>.*):\/\/(?P<http_domain>.*)\/(?P<http_path>.*)(\?|\&)(?P<http_query_params>.*)で属性を作る)、属性値の型の変更(int・double・string)ができる。
Resource Processorは、Attributes Processorのリソース属性版で、設定方法も同等である。
Span Processorは、スパンの名前を属性に基づいてリネームしたり、スパンの名前から属性を作ったりできるプロセッサである。スパンのステータスを変更する機能もある。
Redaction Processorは、個人情報・機微情報の除去あるいはマスキングに特化したプロセッサで、ほかのプロセッサでも同じことはできるが、よりシンプルに定義できる。また、データベースクエリ内の機微情報に特化した機能も「Database Query Sanitization」として用意されている。SQL databases、Redis、Memcached、MongoDB、OpenSearch、ElasticsearchがREADMEで挙げられているが、コードを見るとValkeyも対応している。具体的な処理はDataDogのobfuscate.goを利用しているようだ。