私がSplunkに来てからまだ8カ月しか経っていませんが、その短い間によく尋ねられた質問の1つが「Splunkにログが送信されていないことを知らせるアラートを受け取るにはどうすればよいか?」というものです。実際、この質問を受けるたびに5セントもらっていたら、今頃25セント貯まっていたでしょう。
驚くべきことに、これほどよく質問されるにもかかわらず、Splunkのネイティブ機能を使ってこの問題を解決する方法を記したドキュメントはほとんど見つかりませんでした。このブログでは、SplunkのSPL (サーチ処理言語)を使ってこの問題を解決する方法について説明します。
本題に入る前に少し寄り道をして、これから説明するSPLを支える技法を紹介しましょう。それがわかれば、問題の解決策だけでなく、その解決策の仕組みとその解決策が有効である理由も理解できるでしょう。
まず申し上げておきたいのは、Splunkでこの問題を解決する方法は1つではないということです。メタデータを使ってアクティブでないホストを監視する方法を紹介するブログ記事もあります。実際、私が最初に考えた方法は今とはまったく違い、非効率的でした。そこで何人かの同僚に相談した結果、もっと高速なサーチで同じ結果を得られることがわかりました。その主役となるのがtstatsです!
ちなみに、tstatsの優れた解説(およびSplunk内のデータにすばやくアクセスする方法)については、.conf16のすばらしいプレゼンテーション「How to Scale: From _raw to tstats (and beyond!)」(規模を拡大する方法:_rawからtstatsへ(そしてさらにその先へ!))をご覧ください。
これから説明する方法を正しく機能させるには、いくつかのコンポーネントのデータが適切に設定されている必要があります。具体的には以下のとおりです。
今回の方法では、イベントを適切な時間内に受信したかどうかを判断するための相対的な時間範囲との比較にイベントのタイムスタンプを使用するため、2番目の条件が最も重要です。この方法は、Splunkがsyslogサーバーのようなデータソースから頻繁にデータを受信する場合やHTTPイベントコレクタ経由でプッシュログを受信する場合など、リアルタイムに近い環境に適用できます。
各イベントの一部としてSplunkでインデックスされるデフォルトのフィールドには以下のものがあります。
特筆すべきは、これらの情報さえあれば、一定期間以降にSplunkがイベントを受信しなかったことを判断できる点です。これらの情報を使って以下のことを行います。
これらの点を理解したところで、Splunkがイベントを受信しなかったことを検出してアラートを生成するサーチを作成します。
いずれかのホストからイベントが送信されていないときにアラートを受け取りたい場合は、ホストから送られるイベントのタイムスタンプと相対的な時間範囲を比較するサーチを作成します。
| tstats latest(_time) as latest where index=* earliest=-24h by host
| eval recent = if(latest > relative_time(now(),"-5m"),1,0), realLatest = strftime(latest,"%c")
| where recent=0
図1.過去5分間に新しいイベントを送信しなかったホストを表示しているSplunk画面
このサーチで何をしているか、SPLを1行ずつ見ていきましょう。
| tstats latest(_time) as latest where index=* earliest=-24h by host
tstatsサーチを実行して、ユーザーがアクセスできる任意のインデックスで最も新しいイベントの「_time」フィールドを抽出します。取得するイベントは過去24時間以内のものに絞り、結果をホスト名でグループ化します。
| eval recent = if(latest > relative_time(now(),"-5m"),1,0), realLatest = strftime(latest,"%c")
「recent」という名前の新しいフィールドを作成します。このフィールドの値を決めるために、最も新しいイベントの時刻が現在時刻の5分前より大きい(過去5分以内である)かどうかを調べるための条件付きチェックを実行します。過去5分以内であればrecentの値を1に、そうでなければ0に設定します。また、strftime関数を使って、最も新しいイベントの時刻をエポック形式から人間が読める形式に変換します。
| where recent=0
recentフラグが0に設定された場合のすべての結果を返します(フラグが1以上の場合は時間内にイベントを受信しているためです)。
このサーチでは、Splunkがデータを受信すると想定される時間内にホストがイベントを送信したかどうかを判断するために、そのホストから受信した最も新しいログのタイムスタンプを使用しています。このSPLステートメントは、少し変更するだけでソースやソースタイプにも適用できます。
簡単に言えば、tstatsコマンド(非常に高速)を使ってすべてのホストを監視し、過去5分間にデータを送信しなかったホストを検出しているだけです。このクエリーでは、上記のコマンドで取得したホストから、サーチ対象の期間内にデータを受信したことを前提としている点に注意してください。
このサーチは、サーチ対象の期間内(この例では過去24時間以内)にすでに存在しているホストに対して有効です。 Splunkで検出されないホストやサーチ対象の期間内に存在していないホストに対して、ルックアップファイルを使って受信状況をチェックする方法については、別の機会にブログで紹介したいと思います。
特定のインデックスから一定期間データを受信していないときにアラート受け取りたい場合は、上記のクエリーの「host」を「index」に置き換えて、次のように指定します。
| tstats latest(_time) as latest where index=* earliest=-24h by index
| eval recent = if(latest > relative_time(now(),"-5m"),1,0), realLatest = strftime(latest,"%c")
| where recent=0
図2.過去5分間に新しいイベントを受信しなかったインデックスを表示しているSplunk画面
このSPLクエリーを使用してSplunkで管理する資産がデータを送信していないことを検出すれば、アラート、レポート、ダッシュボードに反映することができ、デバイスがオフラインになっていたり、障害が発生してデバイスからのデータ送信が停止していた場合でも、監視によってプロアクティブに対応できます。このブログでは具体的な方法は説明しませんが、豊富な情報が揃ったSplunkのドキュメントサイトを参照すれば良い方法が見つかるでしょう。
このブログで紹介した方法をどうぞお役立てください!
----------------------------------------------------
お読みいただきありがとうございました
Jonathan Torian
Splunkプラットフォームは、データを行動へとつなげる際に立ちはだかる障壁を取り除いて、オブザーバビリティチーム、IT運用チーム、セキュリティチームの能力を引き出し、組織のセキュリティ、レジリエンス(回復力)、イノベーションを強化します。
Splunkは、2003年に設立され、世界の21の地域で事業を展開し、7,500人以上の従業員が働くグローバル企業です。取得した特許数は1,020を超え、あらゆる環境間でデータを共有できるオープンで拡張性の高いプラットフォームを提供しています。Splunkプラットフォームを使用すれば、組織内のすべてのサービス間通信やビジネスプロセスをエンドツーエンドで可視化し、コンテキストに基づいて状況を把握できます。Splunkなら、強力なデータ基盤の構築が可能です。