7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

OpenTelemetryAdvent Calendar 2022

Day 17

OpenTelemetry CollectorのProcessorを眺めてみる

Last updated at Posted at 2022-12-16

OpenTelemetry Advent Calendar 2022、17日目の記事です

Processor

Processorとは、メトリクス、トレース、ログをバックエンドに送る際に様々な処理をかけられます、というものです。
とは言っても、何ができて、何を使ったらいいのかという疑問が湧いてくると思います。

そんな疑問に対して公式でRecommended Processorsが提案されています。
(下記は本記事作成時点の情報)

Traces

  1. memory_limiter
  2. any sampling processors
  3. Any processor relying on sending source from Context (e.g. k8sattributes)
  4. batch
  5. any other processors

Metrics

  1. memory_limiter
  2. Any processor relying on sending source from Context (e.g. k8sattributes)
  3. batch
  4. any other processors

これらが何なのかを見てみたいと思います。

memory_limiter

Otel Collectorで使用するメモリに制限をかけるProcessorです。
ソフト制限とハード制限をかけられ、ソフト制限を超えるとデータのドロップを開始、ハード制限を超えるとデータドロップだけでなく強制的にガベージコレクションを実行します。
制限は固定値もしくはパーセントで指定できます。

これは問答無用で入れておいた方が良さそうですね。
なお、Processorをかける順番も大事です。特にデータドロップ系(Memory Limiterや次のサンプリング)は最初に実行する必要があります。

any sampling processors

バックエンドや帯域の制約によってはサンプリング止む無しです。
サンプリングには二種類あります。

いわゆるHead-based samplingで、ランダムでサンプリングします。

ある程度Traceを蓄えた後、ポリシーに基づいてサンプリングします。
TraceのLatency、Status Code、Attribute、TraceState、Batch内のSpan数などに基づきサンプリングを行えます。
問題のないTraceは10%サンプリングし、Latencyが長かったり、エラーが発生したり、特定のAttributeを持つようなTraceを100%サンプリングするような使い方ができます。
Tail-basedの性質上Waitをかけるので(デフォルト30秒)、リアルタイム性であったりメモリ使用量に注意が必要ですね。

Any processor relying on sending source from Context (e.g. k8sattributes)

Contextに基づく送信ソースに依存するProcessorとのことで、これが何を指しているかは具体的な情報はありません。
(色々なコンフィグのサンプルを見ても、memory_limiter、batchと来て他のProcessorが続くものが多いです。)
とりあえず例になっているk8sattributesを見てみます。

以下のKubernetesメタデータをデータに自動的にタグ付けできます。

k8s.namespace.name
k8s.pod.name
k8s.pod.uid
k8s.pod.start_time
k8s.deployment.name
k8s.node.name

こちらの記事に詳しく利用例が載っています。

batch

データ圧縮効率化のためバッチ処理を行うProcessorです。
全てのコレクターにbatchを入れることが強く推奨されています。

バッチ送信タイミングは時間もしくはサイズで指定できます。
データドロップ系のProcessorを入れる場合は、memory_limiter ⇒ サンプリング ⇒ batch の順番でPipelineを組んでね、とのこと。

any other processors

Processorは他にも色々あります。
ざっと概要を見てみます。

Attribute処理系

Attributeに対して以下のような操作を行えます。

操作名 説明
insert データに新しいAttributeを挿入。
update Keyが存在するAttributeを更新。
upsert Keyの有無によりinsertまたはupdateを実行。
delete 対象Attributeを削除
hash 既存のAttributeをハッシュ化(SHA1)。
extract 対象Keyから正規表現ルールで抽出しtarget keyに設定。
convert 既存のAttributeを指定された型に変換(int, double, string)。

対象AttributeのKeyは正規表現マッチもできます。
コンテキストのため任意のサービス名などを埋め込む、機密情報を削除やマスキングするなどの使い方ができますね。

Value処理系

データ操作系

  • Filter Processor
    特定のAttribute(ホスト名やSeverityなど)を持つデータをIncludeもしくはExclude。

  • Group by Attributes processor
    特定のAttributeによりデータをグループ化。

  • Group by Trace processor
    次のProcessorに渡す前に待機して同一TraceのSpanを収集。Tail Sampling Processorなどグループ化されたTraceが必要なProcessorの前で使用する。

  • Routing processor
    Attributeを元にデータを特定のExporterにルーティング。

データ作成系

  1. 加算、減算、乗算、除算、パーセント (複数メトリクスの組み合わせも可)
  2. スケール(bytes ⇒ Mega bytes)
  • Span Metrics Processor
    SpanデータからRED (Request、Error、Duration)を集計。

  • Service graph processor
    Service Graph(分散システムのトポロジーなど)を作成するためのマップ作成。Grafanaで使うらしい。

Custom Processor

上記の他にも、各ベンダーのOtel Distributionだったり、Github上にサードパーティーが作成されたProcessorがあります。どうしても足りなければGo言語で開発することもできます。

まとめ

ざっとProcessorを眺めて見ました。
絶対に入れた方が良いExporterはmemory_limiter、batchで後はお好みで、という感じのようです。

サンプリング、Attributeの操作(リソース情報追加や機密情報マスキング)、フィルタリングなど柔軟な処理ができそうです。データ送信先のバックエンドは何でもよくて、Receiver、Processorは使いまわせるというOtelの良さを存分に発揮できますね。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?