7. Count Connector でメトリクスを作成する
10 minutesこのセクションでは、Count Connector を使用して、ログから属性値を抽出し、意味のあるメトリクスに変換する方法を説明します。
具体的には、Count Connector を使用して、ログに出現する「Star Wars」と「Lord of the Rings」の名言の数を追跡し、測定可能なデータポイントに変換します。
Exercise
重要
すべてのターミナルウィンドウを 7-sum-count ディレクトリに変更し、clear コマンドを実行してください。
6-routing-data ディレクトリから *.yaml を 7-sum-count にコピーしてください。更新後のディレクトリ構造は以下のようになります
- agent.yaml を更新して、ログを読み取る頻度を変更します。
agent.yaml内のfilelog/quotesレシーバーを見つけ、poll_interval属性を追加してください
遅延を設定する理由は、OpenTelemetry Collector の Count Connector が各処理インターバル内でのみログをカウントするためです。つまり、データが読み取られるたびに、次のインターバルでカウントがゼロにリセットされます。デフォルトの Filelog receiver インターバル 200ms では、loadgen が書き込むすべての行を読み取り、カウントが1になります。このインターバルを設定することで、複数のエントリをカウントできるようになります。
以下に示すように、条件を省略することで、Collector は各読み取りインターバルの累計カウントを維持できます。ただし、バックエンドは長期間にわたってカウントを追跡できるため、累計カウントはバックエンドに任せるのがベストプラクティスです。
Exercise
- Count Connector を追加する
設定の connectors セクションに Count Connector を追加し、使用するメトリクスカウンターを定義します
メトリクスカウンターの説明
logs.full.count:各読み取りインターバルで処理されたログの総数を追跡します。 このメトリクスにはフィルタリング条件がないため、システムを通過するすべてのログがカウントに含まれます。logs.sw.count:Star Wars 映画の名言を含むログをカウントします。logs.lotr.count:Lord of the Rings 映画の名言を含むログをカウントします。logs.error.count:読み取りインターバルで重大度レベルが ERROR のログをカウントする、実際のシナリオを表します。
パイプラインで Count Connector を設定する 以下のパイプライン設定では、connector exporter が
logsセクションに追加され、connector receiver がmetricsセクションに追加されています。
ログは属性に基づいてカウントされます。ログデータが属性ではなくログボディに格納されている場合は、パイプラインで Transform プロセッサーを使用して、キー/バリューのペアを抽出し、属性として追加する必要があります。
このワークショップでは、05-transform-data セクションで既に merge_maps(attributes, cache, "upsert") を追加しています。これにより、関連するすべてのデータが処理用のログ属性に含まれるようになります。
属性を作成するフィールドを選択する際は注意が必要です。すべてのフィールドを無差別に追加することは、本番環境では一般的に理想的ではありません。不要なデータの乱雑さを避けるため、本当に必要なフィールドのみを選択してください。
Exercise
- otelbin.io を使用して agent 設定を検証してください。参考として、パイプラインの
logsとmetrics:セクションは以下のようになります
%%{init:{"fontFamily":"monospace"}}%%
graph LR
%% Nodes
REC1(otlp<br>fa:fa-download):::receiver
REC2(filelog<br>fa:fa-download<br>quotes):::receiver
REC3(otlp<br>fa:fa-download):::receiver
PRO1(memory_limiter<br>fa:fa-microchip):::processor
PRO2(memory_limiter<br>fa:fa-microchip):::processor
PRO3(resource<br>fa:fa-microchip<br>add_mode):::processor
PRO4(resource<br>fa:fa-microchip<br>add_mode):::processor
PRO5(batch<br>fa:fa-microchip):::processor
PRO6(batch<br>fa:fa-microchip):::processor
PRO7(resourcedetection<br>fa:fa-microchip):::processor
PRO8(resourcedetection<br>fa:fa-microchip):::processor
PRO9(transfrom<br>fa:fa-microchip<br>logs):::processor
EXP1(  debug  <br>fa:fa-upload):::exporter
EXP2(  otlphttp  <br>fa:fa-upload):::exporter
EXP3(  debug  <br>fa:fa-upload):::exporter
EXP4(  otlphttp  <br>fa:fa-upload):::exporter
ROUTE1( count <br>fa:fa-route):::con-export
ROUTE2( count <br>fa:fa-route):::con-receive
%% Links
subID1:::sub-logs
subID2:::sub-metrics
subgraph " "
direction LR
subgraph subID1[**Logs**]
direction LR
REC1 --> PRO1
REC2 --> PRO1
PRO1 --> PRO7
PRO7 --> PRO3
PRO3 --> PRO9
PRO9 --> PRO5
PRO5 --> ROUTE1
PRO5 --> EXP1
PRO5 --> EXP2
end
subgraph subID2[**Metrics**]
direction LR
ROUTE1 --> ROUTE2
ROUTE2 --> PRO2
REC3 --> PRO2
PRO2 --> PRO8
PRO8 --> PRO4
PRO4 --> PRO6
PRO6 --> EXP3
PRO6 --> EXP4
end
end
classDef receiver,exporter fill:#8b5cf6,stroke:#333,stroke-width:1px,color:#fff;
classDef processor fill:#6366f1,stroke:#333,stroke-width:1px,color:#fff;
classDef con-receive,con-export fill:#45c175,stroke:#333,stroke-width:1px,color:#fff;
classDef sub-logs stroke:#34d399,stroke-width:1px, color:#34d399,stroke-dasharray: 3 3;
classDef sub-metrics stroke:#38bdf8,stroke-width:1px, color:#38bdf8,stroke-dasharray: 3 3;