はじめてのSplunk ― 概要から応用までを体系的に学ぶ

5-4 様々なSPLの実行

前節では、チュートリアルデータに対して簡単なサーチを実行してみました。 ここでは、第3章・第4章で学んだSPLを実際に打ち込みながら、 架空のオンラインストア「Buttercup Games」のWebアクセスログを分析していきます。 題材となるデータはインデックスmain、ソースタイプはaccess_combined_wcookieです。 「アクセス状況の把握 → 売上分析 → エラー分析」というストーリーで進めていきましょう。

以降のSPLはコピーして貼り付ければそのまま試せます。 時間範囲は「All time(全期間)」にしておくと、チュートリアルデータ全体が対象になります。 うまく結果が出ないときは、まずindex=mainだけで検索してデータの中身を眺めてみましょう。

1. まずは全体像をつかむ

分析の第一歩は、どんなアクセスがあるのかをざっくり眺めることです。 topコマンドを使えば、多い順の上位を手早く確認できます。

SPL ― アクセス元の上位を見る
index=main sourcetype=access_combined_wcookie | top limit=10 clientip

これで、もっともアクセスの多いクライアントIPの上位10件が件数付きで表示されます。 同じ要領で、利用者がサイト上で行った操作(action)の内訳も見てみましょう。

SPL ― 多いアクションを見る
index=main sourcetype=access_combined_wcookie | top action

actionにはpurchase(購入)、addtocart(カート追加)、view(閲覧)などが入っており、 サイト上でどの操作が多いのかが一目で分かります。

2. 商品カテゴリ別・ステータス別に集計する

次は集計の主役であるstatsです。商品カテゴリ(categoryId)ごとの アクション数を数えて、どのジャンルがよく見られているかを調べます。

SPL ― カテゴリ別のアクセス件数
index=main sourcetype=access_combined_wcookie | stats count by categoryId

byのうしろにフィールドを2つ並べると、組み合わせごとの集計になります。 HTTPステータス(status)とアクションのクロス集計を見てみましょう。

SPL ― ステータスとアクションのクロス集計
index=main sourcetype=access_combined_wcookie
        | stats count by status, action

3. 時系列でアクセス推移を見る

アクセスが時間とともにどう変化したかはtimechartで可視化できます。 1時間ごとの件数を、ステータス別に折れ線で表せます。

SPL ― 時間ごとのアクセス推移
index=main sourcetype=access_combined_wcookie
        | timechart span=1h count by status

サーチ後に「Visualization(可視化)」タブへ切り替えると、 この結果を折れ線グラフとして確認できます。急増している時間帯があれば、 そこで何かが起きたサインかもしれません。

4. evalで新しいフィールドを作る

evalを使うと、既存のフィールドから新しいフィールドを計算して作れます。 ここでは購入イベントだけに絞り、転送バイト数をKB単位に変換してみます。

SPL ― evalでKB単位のフィールドを作る
index=main sourcetype=access_combined_wcookie action=purchase
        | eval kb=round(bytes/1024, 2)
        | table clientip, productId, kb

round()は指定した桁で四捨五入する関数です。tableコマンドで、 見たいフィールドだけを表形式に並べています。

5. lookupで商品情報を付加する

ログには商品ID(productId)しか入っていないため、 「どの商品がいくらで売れたのか」はlookupで商品マスタを突き合わせて補います。 チュートリアルに含まれるprices.csvには、商品IDに対応する 商品名(product_name)と価格(price)が定義されています。

SPL ― lookupで商品名と価格を付ける
index=main sourcetype=access_combined_wcookie action=purchase
        | lookup prices.csv productId OUTPUT product_name, price
        | stats sum(price) as sales by product_name
        | sort -sales

このSPLは、(1)購入イベントに絞り、(2)lookupで商品名と価格を付加し、 (3)商品名ごとに価格を合計して売上を求め、(4)売上の多い順に並べています。 これで「もっとも売れている商品」がランキングとして得られ、立派な売上分析になります。

6. エラーの発生状況を調べる

最後にエラー分析です。500番台のサーバーエラーがいつ、どのくらい起きたかを追います。

SPL ― サーバーエラーの時系列
index=main sourcetype=access_combined_wcookie status>=500
        | timechart span=1h count

topstatsのようなTransformingコマンドを通さないと、グラフや表にはなりません。 「集計してから可視化する」という流れを意識しましょう。

7. まとめ

  • topは多い順の上位を手早く確認するのに便利
  • statsbyで軸を指定してカテゴリ別・ステータス別に集計できる
  • timechartで時系列の推移をグラフ化できる
  • evalで新しいフィールドを計算し、lookupで外部データ(商品情報)を付加できる
  • 絞り込み → 集計 → 並べ替えの組み合わせで、売上分析やエラー分析ができる