Splunkのデータパイプラインについて学ぶ

こんにちは。torippy1024です。

今日は、splunkの仕組みを理解する上で重要なポイントであるデータパイプライン(Splunkがどのようにデータを取得し、処理し、提供するか)についてざっくり学びます。

ぶっちゃけると以下の公式ドキュメントのまとめです。
https://docs.splunk.com/Documentation/Splunk/latest/Deploy/Datapipeline


# 大きな流れ

ログファイルなどのソースから、データを検索可能なイベントに変換するまでのルートを、Splunkではデータパイプラインと呼びます。
データパイプラインは、大きく以下の4つのセグメントに分かれます。
- 入力(Input)
- 解析(Parsing)
- インデックス化(Indexing)
- サーチ(Search)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/4f9da9a7-5875-0ce2-13db-cc7a0912bdfd.png)

画像引用元：https://docs.splunk.com/File:Datapipeline1_60.png

参考：https://docs.splunk.com/Splexicon:Datapipeline


# データパイプラインとコンポーネントのマッピング表

データパイプラインの各セグメントにおいて、重要な役割を果たすSplunkのコンポーネントを示す表は以下の通りです。

|データパイプラインセグメント|コンポーネント|コンポーネントが果たす役割|重要なconfigファイル|
|---|---|---|---|
|入力(Input)|ユニバーサルフォワーダー、ヘビーフォワーダー、インデクサー|ユニバーサルフォワーダーまたはヘビーフォワーダーがログなどのソースからデータを取得し、ブロックに分割する。|inputs.conf, props.conf, sourcetype, wmi.conf, regmon-filters.conf|
|解析(Parse)|ヘビーフォワーダー、インデクサー|インデクサーまたはヘビーフォワーダーが本処理を行う。入力フェーズで転送されてきたデータについて、行のマージまたは分割、タイムスタンプなどの重要なフィールドの抽出、データの圧縮など、データの整理および構造化を行う。|props.conf|
|インデックス化(Indexing)|インデクサー|インデクサーが解析されたイベントをディスク上のインデックスに書き込む。|props.conf, transforms.conf|
|検索(Seeach)|インデクサー、サーチヘッド|サーチヘッドがインデクサーに対し、SPLで記述されたサーチの指示を行う。インデクサーはサーチを実行し、結果を返却する。サーチヘッドがその結果をGUI上でユーザーに表示する。|props.conf, indexes.conf, segmenters.conf|

参考：https://docs.splunk.com/Documentation/Splunk/latest/Deploy/Componentsofadistributedenvironment#How_components_support_the_data_pipeline
https://docs.splunk.com/Documentation/Splunk/latest/Admin/Configurationparametersandthedatapipeline#How_configuration_parameters_correlate_to_phases_of_the_pipeline

# 入力(Input)セグメント

入力セグメントでは、ログなどのソースからデータを取得し、データをホスト、ソース、ソースタイプなどのメタデータを付与したブロック(64KB)単位に分割してインデクサーまたはヘビーフォワーダーまで転送するまでを行います。

注意しなければならないことが一点あります。ヘビーフォワーダーなどでソースからデータを取得した後、インデクサーなどに転送する前に解析を行う場合、データを転送する前に解析フェーズが行われることになる、という点です。ユニバーサルフォワーダーを使っている場合、入力フェーズにデータ転送が含まれることになりますが、へビーフォワーダーで解析を行う場合、解析フェーズにデータ転送が含まれることになります。

参考：
https://docs.splunk.com/Splexicon:Input
https://docs.splunk.com/Documentation/Splunk/latest/Deploy/Datapipeline#Input


# 解析(Parsing)セグメント

解析セグメントでは、データの解析、マージ、タイピングが行われます。具体的には、文字コードをブロック単位に分割されたデータをマージし行単位に分割したり(解析)、複数行を一つのイベントにマージしたり、タイムスタンプを識別して設定したり(マージ)、ブロックに付与されたメタデータを使用して個々のイベントにもメタデータを付与(Annotationと呼ぶ)したり、正規表現を使った変換を行ったり(タイピング)します。

解析セグメントにおける、解析、マージ、タイピングのパイプラインを示している図は以下です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/43185604-108c-1ce5-df43-e4253fd11712.png)

画像引用元：https://community.splunk.com/t5/image/serverpage/image-id/18766i82B2A1CA2DAE04F6/image-size/large

参考：
https://docs.splunk.com/Splexicon:Parsing
https://docs.splunk.com/Splexicon:Eventprocessing
https://community.splunk.com/t5/Getting-Data-In/Diagrams-of-how-indexing-works-in-the-Splunk-platform-the-Masa/m-p/590774
https://community.splunk.com/t5/Getting-Data-In/Diagrams-of-how-indexing-works-in-the-Splunk-platform-the-Masa/m-p/590774

# インデックス化(Indexing)セグメント

インデックス化(Indexing)セグメントでは、インデクサーが解析されたイベントをディスク上のインデックスに書き込みます。

・・・・・・だけだとまんますぎるので、もう少し補足をします。Splunkでは、インデックスデータは2種類に分けられます。イベントインデックスと、メトリックインデックスです。
デフォルトのインデックスタイプは、イベントインデックスであり、これらは任意のタイプのデータを保管できるインデックスタイプです。これに対し、メトリックデータを保持するためにカスタマイズされたデータ構造のインデックスタイプがメトリックインデックスです。
(メトリックについては、Splunk Observabilityを学ぶときに同様の概念を学ぶことになるため、最初のうちは飛ばしても良いかもしれません)

参考：
https://docs.splunk.com/Splexicon:Index
https://docs.splunk.com/Documentation/Splunk/latest/Metrics/Overview

# サーチ(Search)セグメント

サーチ(Search)セグメントは、実際にSplunkをユーザーが利用している状態です。サーチヘッドがインデクサーに対し、SPLで記述されたサーチの指示を行い、インデクサーはがサーチを実行し、結果を返却し、サーチヘッドがその結果をGUI上でユーザーに表示します。

ユーザーが実行するサーチには大きく二種類あり、ユーザーが検索バーなどから任意に実行するアドホックサーチ(ad hoc search)と、レポート、アラート、スケジュールドサーチなどを含む保存されたサーチ(saved search)に分けられます。アドホックサーチは常に実行されますが、リソースが不足したりするなどの問題が発生していると、保存されたサーチはスキップされてしまうことがあります。


参考：
https://docs.splunk.com/Splexicon:Search
https://www.splunk.com/ja_jp/blog/tips-and-tricks/are-you-skipping-please-read.html
https://lantern.splunk.com/Splunk_Platform/Product_Tips/Searching_and_Reporting/Reducing_skipped_searches