こんばんは。torippy1024です。
今回は、ちょっと今更感もある基礎的な記事ですが、Splunkのタグとイベントタイプの違いについてまとめます。
タグとイベントタイプとは何か
だいぶ前の記事(https://qiita.com/torippy1024/items/d55d6ac7ce92c95650f8#60--creating-tags-and-event-types )でちらっと書いたのですが、タグとイベントタイプの定義は以下となります。
タグとは
https://help.splunk.com/en/splunk-cloud-platform/manage-knowledge-objects/knowledge-management-manual/10.5.2605/tags/about-tags-and-aliases
特定のフィールドのKey-Valueペアに対して付与できる情報がタグです。
例えば、IPaddress=192.168.1.2というフィールドに対し、mainofficeというタグを付与できます。
別のサーチを実行する際に、tag=mainofficeを指定することで、該当するイベントのみを効率的にフィルターすることができます。
※ちなみに、後述のイベントタイプもフィールドの一種として扱われます。つまり、イベントタイプを指定したサーチeventtype=successful_purchaseに対してタグpurchase_eventというタグを付与することも可能です。
イベントタイプとは
https://help.splunk.com/en/splunk-cloud-platform/manage-knowledge-objects/knowledge-management-manual/10.5.2605/event-types/about-event-types
特定のイベントに対して付与できる情報がイベントタイプです。
例えば、sourcetype=access_combined_wcookie status=200 action=purchaseというサーチを実行し、その結果のイベント群に、successful_purchaseなどの名前をつけることができます。(ただし、パイプ|やサブサーチなどを含めることはできないことに注意が必要です)
別のサーチを実行する際に、eventtype=successful_purchaseを指定することで、該当するイベントのみを効率的にフィルターすることができる機能です。
ちなみに、タグもイベントタイプも、すでにインデックス化されたデータのみを対象にしているわけではありません。タグやイベントタイプを定義した後、新しくインデックス化されたデータに対しても適用されます。
タグとイベントタイプの違いは何か、ユースケースは何か
タグとイベントタイプの違いは、付与する対象です。
タグは特定のフィールド(IPaddress=192.168.1.2)に対して付与するもの、イベントタイプはサーチ(sourcetype=access_combined_wcookie status=200 action=purchase)結果に対して付与するもの、という点が異なります。
タグもイベントタイプも、フィールドやサーチ結果に対して付与する情報という点では共通していますが、イベントタイプのほうが複数のフィールドやサーチ条件を指定できるので対象が幅広いと言えます。一方で、イベントタイプを追加するとサーチコストが増える可能性があるようです。このため、基本的にタグで十分なユースケースにおいてはタグを利用し、イベントタイプはどうしても複数条件を指定する必要があるのみ利用する方針がよさそうです。
ちなみに、sourcetype=access_combined_wcookieというサーチを実行したときに付与されるタグやイベントタイプの範囲を図示すると以下となります。
ここで、tag=mainofficeは IPaddress=192.168.1.2、eventtype=successful_purchaseはsourcetype=access_combined_wcookie status=200 action=purchaseです。
タグやイベントタイプを指定することで、フィールドを直接指定せずにサーチを実行することが可能になりますし、取得したイベントに対して、タグやイベントが追加されることでデータの意味づけを行うことができるということになります。
ユースケースとしては、タグもイベントタイプも、サーチ文を短縮して使うという使い方が最初に思い浮かびますが、その用途であればマクロを使うほうがよさそうです。
どちらかというと、サーチ文をただ短縮するためというよりは、ダッシュボードやアラートを定義する際、抽象化レイヤとしてタグやイベントタイプを使ったSPLを利用することで、対象となるデータが増減した場合であってもSPL自体を書き換えずに済む、といった用途で使うほうがよさそうに思います。
タグとイベントタイプの付与順序
タグとイベントタイプは、Splunkのインデックスデータ内にメタデータとして直接保管されているものではありません。
Splunkの内部には、タグ定義を含むtags.conf、イベントタイプ定義を含むeventtypes.confというコンフィグファイルが存在しています。サーチ実行時には、Splunkがこれらコンフィグを参照して、タグやイベントタイプをフィールドサーチに展開したり、得られたイベントに対してタグやイベントタイプを付与して表示しています。
サーチ実行時、タグとイベントタイプはいつ、どのように付与されるのかが気になる人は、以下の資料をみてください。
基本的にはほとんどの処理が終わった最後に、イベントタイプが付与され、最後にタグが付与されるという仕組みになっています。
これによって、タグを付与する前提条件にイベントタイプが含まれている場合であっても、適切にタグが付与されることになります。
https://help.splunk.com/en/splunk-enterprise/manage-knowledge-objects/knowledge-management-manual/10.2/get-started-with-knowledge-objects/the-sequence-of-search-time-operations#ariaid-title2
実際に操作してみる
では、チュートリアルデータを使用して、clientip=87.194.216.51にタグvip_clientipを、sourcetype=access_combined_wcookie status=200 action=purchaseにイベントタイプsuccessful_purchaseを定義して使ってみます。
事前にチュートリアルデータ(https://help.splunk.com/en/splunk-enterprise/get-started/search-tutorial/10.4/part-1-getting-started/what-you-need-for-this-tutorial#ariaid-title5 )をSplunkにアップロードし、時間を全期間にするとサーチ結果が返ってくることを確認してから試してみてください。アップロード先インデックスはどこでも構いません。
タグの定義
タグの定義手順にはいくつかのやり方がありますが、サーチから定義するのが分かりやすいので、今回はサーチ画面から定義する方法を試してみます。まず以下のサーチを実行します。時間範囲を全期間にして実行してください。
index=* clientip=87.194.216.51
clientip=87.194.216.51であるイベントのみが表示されています。一番上のイベントにある「i」行を選択して詳細データを表示します。そしてclientip=87.194.216.51の右列の「アクション」行を選択して「タグの編集」を選択します。

「タグの作成」画面が表示されます。「タグ」に「vip_clientip」と入力して保存すればタグの定義は完了です。

実際に以下のサーチを実行して確認します。時間範囲は同じく全期間です。
index=* tag=vip_clientip
実行結果は以下です。index=* clientip=87.194.216.51を実行したときと同じサーチ結果が得られ、かつclientipのフィールドを見ると、87.194.216.51(vip_clientip)とタグ名が並列で表示されるようになったことが分かります。
イベントタイプの定義
イベントタイプも同様にサーチ画面から定義が可能です。時間範囲を全期間にして、以下のサーチを実行します。
index=* sourcetype=access_combined_wcookie status=200 action=purchase
サーチ結果から、「イベントアクション」-「イベントアクションの作成」を選択します。

イベントタイプに含むイベントの一覧が表示されます。「保存」を選択します。

イベントタイプの保存画面が表示されます。
スタイルでは色を、優先度ではイベントタイプの優先度を選択できますが、今回はデフォルトのまま、「保存」を選択すれば完了です。

実際に以下のサーチを実行して確認します。
index=* eventtype=successful_purchase
実行結果は以下です。index=* sourcetype=access_combined_wcookie status=200 action=purchase を実行したときと同じサーチ結果が得られ、かつ関連するフィールドに、eventtype=successful_purchaseが表示されるようになったことが分かります。

イベントタイプを使う場合の注意
一見したところでは、タグとイベントタイプは、サーチ文を簡略化したりすることに使えそうに思います。しかし公式ドキュメントでは、特にイベントタイプについては、サーチ文の簡略化として使わないことがベストプラクティスだと書かれています。
これは、イベントタイプには、サーチコストが増えやすいという問題があるためのようです。
イベントタイプを追加すると、サーチ結果に対して、そのイベントがイベントタイプにマッチするかの判定処理が行われます。この判定処理のコストが高いため、気軽にイベントタイプを追加することは推奨されていないということのように個人的には推察しています。
Note: Using event types can consume a lot of data, because any search attempts to correlate events with any known event type. As more event types are defined, the cost in search performance goes up.
サーチ文を簡略化する目的であれば、イベントタイプでなくマクロを使用することがSplunkとしての推奨のようです。
(一方で、タグはサーチコスト増加には影響が低いようです。ただどちらにしろ、サーチ文の簡略化の用途であればマクロを使うほうがよさそうではあります)
タグとイベントタイプの使い分けに関する個人的な考察
とりあえず定義を調べ、実際に操作をやってみましたが、結局タグとイベントタイプはなぜ必要で、どのような使い分けができるのでしょうか?
タグはフィールドにつくもので、イベントタイプはサーチにつくものです。
このため、特定のフィールドだけを対象にして分類したい場合(例えばIPaddress=192.168.1.2という条件を対象にする場合)はタグだけで十分です。
一方で、いくつかのフィールドを複合的に組み合わせたい場合(例えばstatus=200 action=purchaseという条件を対象にする場合)、イベントタイプを使うべき、ということになります。
ただ、個人的にはこの使いわけはやや冗長に思えます。似たような機能なのに、なぜSplunkはこの二つの機能を分けて実装しているのでしょうか?
いろいろドキュメントを調べると、以下の資料にその答えが書いてあるように見えました。
https://help.splunk.com/en/splunk-enterprise/common-information-model/8.5/using-the-common-information-model/match-ta-event-types-with-cim-data-models-to-accelerate-searches
上記はSplunkのCIMがどのようにイベントを分類し、CIM上のデータモデルにマッピングしているかを説明している資料です。
こちらのドキュメントを見ると、CIMでは、まずイベントタイプで該当のイベントを複数条件でフィルタリングし、その後で特定のタグによってCIMデータモデルへのマッピングを行っているということがわかります。
CIMは、タグを使ってデータモデルのマッピングを行っていますが、タグは複数の条件に対応していません。このため複数の条件によってデータモデルにマッピングさせたいイベントがあっても、そのような処理を行うことはできないということになります。
これを解決するために、イベントタイプが利用されていると考えられます。最初にイベントタイプを使って該当のイベントを絞ったあと、タグによるデータモデルへのマッピングを適用することで、複数条件を満たすイベントのみを対象にしてデータモデルへのマッピングを行えるようになった、ということです。
言い換えると、イベントタイプは、CIMへのマッピングを実現するための補助機能として使われているもの、と捉えてもよいのかもしれません。
※上記の見解は個人の想像によるものですのでご注意ください。
参考資料
About event types
https://help.splunk.com/en/splunk-enterprise/manage-knowledge-objects/knowledge-management-manual/10.2/event-types/about-event-types
About tags and aliases
https://help.splunk.com/en/splunk-enterprise/manage-knowledge-objects/knowledge-management-manual/10.2/tags/about-tags-and-aliases
Search-time operation sequence
https://help.splunk.com/en/splunk-enterprise/manage-knowledge-objects/knowledge-management-manual/10.2/get-started-with-knowledge-objects/the-sequence-of-search-time-operations#ariaid-title2

