TIPS & TRICKS

ホストからSplunkにログが送信されていないことをすばやく検出する方法

私がSplunkに来てからまだ8カ月しか経っていませんが、その短い間によく尋ねられた質問の1つが「Splunkにログが送信されていないことを知らせるアラートを受け取るにはどうすればよいか?」というものです。実際、この質問を受けるたびに5セントもらっていたら、今頃25セント貯まっていたでしょう。  

SPL驚くべきことに、これほどよく質問されるにもかかわらず、Splunkのネイティブ機能を使ってこの問題を解決する方法を記したドキュメントはほとんど見つかりませんでした。このブログでは、SplunkのSPL (サーチ処理言語)を使ってこの問題を解決する方法について説明します。

背景

本題に入る前に少し寄り道をして、これから説明するSPLを支える技法を紹介しましょう。それがわかれば、問題の解決策だけでなく、その解決策の仕組みとその解決策が有効である理由も理解できるでしょう。

まず申し上げておきたいのは、Splunkでこの問題を解決する方法は1つではないということです。メタデータを使ってアクティブでないホストを監視する方法を紹介するブログ記事もあります。実際、私が最初に考えた方法は今とはまったく違い、非効率的でした。そこで何人かの同僚に相談した結果、もっと高速なサーチで同じ結果を得られることがわかりました。その主役となるのがtstatsです!

ちなみに、tstatsの優れた解説(およびSplunk内のデータにすばやくアクセスする方法)については、.conf16のすばらしいプレゼンテーション「How to Scale: From _raw to tstats (and beyond!)」(規模を拡大する方法:_rawからtstatsへ(そしてさらにその先へ!))をご覧ください。

前提条件

これから説明する方法を正しく機能させるには、いくつかのコンポーネントのデータが適切に設定されている必要があります。具体的には以下のとおりです。

  • Splunkの時刻が正しく設定されている
  • イベントのタイムスタンプが、Splunkがそのイベントを受信およびインデックスする時刻と近い時刻にマッピングされている
  • サーチ対象の期間内に、Splunkが目的のインデックス、ホスト、ソース、またはソースタイプのデータを受信する
     

今回の方法では、イベントを適切な時間内に受信したかどうかを判断するための相対的な時間範囲との比較にイベントのタイムスタンプを使用するため、2番目の条件が最も重要です。この方法は、Splunkがsyslogサーバーのようなデータソースから頻繁にデータを受信する場合やHTTPイベントコレクタ経由でプッシュログを受信する場合など、リアルタイムに近い環境に適用できます。

デフォルトでインデックスされるフィールド

各イベントの一部としてSplunkでインデックスされるデフォルトのフィールドには以下のものがあります。

  1. ホスト
  2. ソース
  3. ソースタイプ
  4. 時刻(_time)
     

特筆すべきは、これらの情報さえあれば、一定期間以降に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

過去5分間に新しいイベントを送信しなかったホストを表示しているSplunk画面
図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

過去5分間に新しいイベントを受信しなかったインデックスを表示しているSplunk画面
図2.過去5分間に新しいイベントを受信しなかったインデックスを表示しているSplunk画面

最後に

このSPLクエリーを使用してSplunkで管理する資産がデータを送信していないことを検出すれば、アラート、レポート、ダッシュボードに反映することができ、デバイスがオフラインになっていたり、障害が発生してデバイスからのデータ送信が停止していた場合でも、監視によってプロアクティブに対応できます。このブログでは具体的な方法は説明しませんが、豊富な情報が揃ったSplunkのドキュメントサイトを参照すれば良い方法が見つかるでしょう。

このブログで紹介した方法をどうぞお役立てください!

----------------------------------------------------
お読みいただきありがとうございました
Jonathan Torian

このブログはこちらの英語ブログの翻訳、横田 聡によるレビューです。

Splunk
Posted by

Splunk

世界の様々な企業が、デジタルシステムの安全性と信頼性を維持するためにSplunkを信頼しご利用いただいています。Splunkのソフトウェアソリューションとサービスは、ビジネスの継続に関わる重大な問題を未然に防ぎ、回復力を高め、イノベーションを加速します。Splunkの機能Splunkが選ばれる理由をご覧ください。

TAGS
Show All Tags
Show Less Tags