Splunkでメールの配送図を作ろう

2024年12月13日 金曜日


【この記事を書いた人】
YKR

2024年中途入社。メールサービスの運用業務をしています。休日はVR空間にログインしていることが多いです。

「Splunkでメールの配送図を作ろう」のイメージ

IIJ 2024 TECHアドベントカレンダー 12/14の記事です】

はじめに

こんにちは、IIJセキュアMXサービスの運用をしているYKRです。初投稿です🔰

サービスの運用をしていると、色々と可視化したくなってきますよね。
メールという分野でもそこは変わらず、サーバの負荷やプロセスの状態はもちろん、メールがどのサーバに流れていったのか、配送に成功しているのか……などなど、見たい情報はたくさんあります。

今回は「Splunkを使ってメールの配送の流れを可視化してみた」というテーマで記事を書いてみたいと思います。

Splunkとは

Splunkを一言でいうと「ログ分析プラットフォーム」です。サーバからログを集めて、イイ感じに検索したり統計が出せたり、ダッシュボードが作れたりするすぐれもの。IIJでは、社内情報分析基盤illuminoの中心となる機能として社内向けにサービス提供されています。(以前、IIRに記事が出ていました

Splunkでログを検索したり統計を出したいときは、Search Processing Language(SPL)という言語を使って検索や集計を行います。例えば、sendmailやpostfixが出すログをざっと見たいときは、次のようなSPLを書いています。

index="index_name" host="hostname"
| stats min(_time) as first_time, max(_time) as last_time, first(msgid) as msgid, values(_raw) as raw by qid
| eval first_time=strftime(first_time,"%Y-%m-%dT%H:%M:%S") 
| eval last_time=strftime(last_time,"%Y-%m-%dT%H:%M:%S") 
| table first_time, last_time, qid, msgid, raw

検索結果は表形式で表示されます

sendmailやpostfixなど多くのMTAでは、メールキューに入ってきたメールに対してqueue idというユニークIDを割り当てて、ログにもこのIDを出力します。したがって、ログをqueue idごとにまとめることで(2行目のstats ... by qidがその部分)、バラバラだったログがそれぞれのメール単位で集約されてちょっと見やすくなる、という感じです。
今回はSPLの書き方自体は主題ではないのであまり細かくは説明しませんが、ログの集計や検索だけでも色々できて楽しいです。

このように、普段はログの検索や集計をメインに色々なダッシュボードを作って運用に役立てているのですが、最近、Splunkでネットワーク図が描画できるアドオンがあることを知りました。しかも!既にilluminoの環境にインストールされているではありませんか。というわけで、メールの配送図を作るのに使ってみることにしました。

ぬるぬる動くとウワサのFlow Map Vizを使って配送図を作ってみる

最初に手を出したのは Flow Map Vizという、ネットワークトラフィックをアニメーション表示してくれるアドオンです。試しに、特定のメール1通がどのホストを経由して配送されたのかを表す図を出力してみます。

まずSPLを書きます。Flow Map Vizを使うために、from、to、good、warn、errorの5つのフィールドを出力するようにSPLを組んでいます(この他にも任意でいくつかのフィールドを指定することで見え方をカスタマイズできますが、数が多いので本記事では紹介しません)。

  • from:送信元のホスト
  • to:送信先のホスト
  • good:正常な通信の数。デフォルトで緑色(今回は正常に配送できたメールの通数にしました)
  • warn:再送しているなど、正常ではないがエラーでもない通信の数。デフォルトで橙色(今回は一時的なエラー(dsn=4.x.x)となったメールの通数にしました)
  • error:エラーが発生した通信の数。デフォルトで赤色(今回は雑に、正常でも一時エラーでもないメールの通数にしました)

※実際に使用しているSPLとは異なります。あまりにも社内情報が多かったのでほとんど載せられませんでした……。

index="index_name" source="/var/log/maillog" qid="queue_id"
| stats first(client) as from, first(host) as to, last(dsn) as last_dsn, first(qid) as qid
| eval status = if(match(last_dsn, "^2"),"good",if(match(last_dsn, "^4"),"warn", "error"))
| stats count(eval(status = "good")) as good, count(eval(status = "warn")) as warn, count(eval(status = "error")) as error by from, to

検索結果が出たら、 視覚エフェクト から「Flow Map Viz」を選びます。

すると……

ウネウネ

このように、各ホストの間をパーティクルが移動する図が表示されます(大人の事情によりホスト名をランダム化しています)。流れるパーティクルの量は全体に対する割合で決まるようなので、今回のケース(1通のみ)だと最大量で出てきますね。
また、ホストをドラッグ&ドロップして整理できます。

この図を応用すると、特定の配送先との通信においてどの程度エラーが発生しているかを把握できます。先ほどのSPLに少し手を加えて、配送先を指定してログを検索すると、次のような図が表示されます。

赤いパーティクルがエラー。1~2割ほどエラーになっていることが分かる

このように、通信の偏り方や、エラーの傾向をざっくりと把握するのに便利です。

しかし、しばらく使っている内に気になる点も出てきました。例えば、複数のメールの配送図を表示するときには配送の流れに沿って順番に表示してほしいのですが、Flow Map Vizでは次のようにランダムな位置に配置されます。位置情報を特定のフィールドに入れることで位置を固定できるのですが、ホスト数が多いと手間も増えて厳しそうです。

なんとなくゴチャついた見た目になりやすい

そこで、別のアドオンも試してみることにします。

ツリー表示ができるとウワサのNetwork Diagram Vizを使って配送図を作ってみる

2つ目のアドオンはNetwork Diagram Vizです。アニメーションはしないものの、Hierarchy Viewを有効にすると、図をツリー構造で作ってくれるようです。

こちらもまずはSPLを書きます。Network Diagram Vizでは、必須となる from、to のほか、任意で次のフィールド(value、color、type、linktext、linkwidth、linkcolor )が指定できます。今回はfrom、to、linkcolor、linkwidthだけを使ってみます。

  • from:送信元のホスト
  • to:送信先のホスト
  • value:ツールチップに表示される値
  • color:fromのアイコンの色
  • type:fromのアイコンの画像
  • linktext:fromとtoを結ぶ線の近くに書かれるテキストの値
  • linkwidth:fromとtoを結ぶ線の太さ(今回はメールの通数によって太さを変えるようにしました)
  • linkcolor:fromとtoを結ぶ線の色(今回はエラーの有無によって色を分けるようにしました)

※実際に使用しているSPLとは異なります。

index="index_name" source="/var/log/maillog" qid="queue_id"
| stats first(client) as from, first(host) as to, last(dsn) as last_dsn, first(qid) as qid
| eval status = if(match(last_dsn, "^2"),"good", if(match(last_dsn, "^4"),"warn", "error"))
| stats count(eval(status = "good")) as good, count(eval(status = "warn")) as warn, count(eval(status = "error")) as error by from, to
| eval linkcolor = if(error >= 1, "red", if(warn >= 1, "orange", "green")) 
| eval linkwidth = good + warn + error

検索結果が出たら、 視覚エフェクト から「Network Diagram Viz」を選びます。

すると、デフォルトではこんな図が表示されます。

これだけだと通信の方向が分からなかったり、位置がランダムだったりするので、より配送図らしい見た目にするために設定を入れてあげましょう。
「フォーマット」を選んで、以下の設定を入れます。

  • General/Default Node Type:server (デフォルトのアイコンをサーバの見た目にする)
  • Links/Arrow Location:End(from→toの方向に矢印をつける)
  • Hierarchy/Hierarchy View:True(ツリー構造で位置を整理する)
  • Hierarchy/Hierarchy Direction:Left-Right(左から右へ並べる)

 

すると……

これは配送経路が単純なパターンなのでちょっと味気ないですが、配送した順に並んでくれます。
これなら、配送経路が複雑な場合や、複数のメールを対象にして検索した場合も次のように出てきます。

(役割が同じホストがどれかわかるように、ホスト名にプレフィックスを付けています)

見てのとおり、役割別にグループ化されていてイイ感じ。これならホストが多くても流れを追いかけやすくて便利ですね。

おわりに

今回はSplunkを使ってメールの配送図を生成してみました。メール以外でも、メッセージをリレーしていくプロトコルであれば同じ要領で可視化できますし、VoIPやネットワーク機器などにも応用が効きそうです。

ご紹介したものの他にもたくさんのアドオンが有志によって開発されているので、色々と試してみるのも面白いかもしれません。

 

IIJ Engineers blog読者プレゼントキャンペーン

Xのフォロー&条件付きツイートで、「IoT米」と「バリーくんシール」のセットを抽選でプレゼント!
応募期間は2024/12/02~2024/12/31まで。詳細はこちらをご覧ください。
今すぐポストするならこちら→ フォローもお忘れなく!

YKR

2024年12月13日 金曜日

2024年中途入社。メールサービスの運用業務をしています。休日はVR空間にログインしていることが多いです。

Related
関連記事