Splunk Enterprise:サーチの基本を丁寧に。

この記事は約13分で読めます。
sponsored link

Transforming

Splunkでは「生データをテーブルに変換するコマンド」のことを transforming command と呼び、具体例としてtop, rare, chart, timechart, stats, geostats などが挙げられます。

chart

chart:連続したデータをプロットするコマンド。(x軸:任意,  y軸:数値)

index=security
| chart count over host

index=security
| chart count over host by vendor_action

chart で作成したグラフは [Format] > [General] > [Stack Mode] から『Unstacked』『Stacked』『Stacks 100%』を選択することができます。

index=security
| chart count over host by vendor_action usenull=f

timechart

timechart_time に沿った時系列データをプロットするコマンド。

主な用途『Line chart』『Area chart』(x軸:_time,  y軸:任意)

index=network sourcetype=cisco*
| timechart count by usage 

チャートの時間幅はspan (e.g. span=1m, 30m) で指定することができ、指定しない場合は Time Range (e.g. 直近60m, 直近24h) より自動で決まります。

また [Format] > [General] > [Multi-series Mode] = Yes とすると、それぞれの凡例別に軸を独立させることができ、チャートがごちゃごちゃすることを防げます。(Treills Layout でも代替可)

index=network sourcetype=cisco* 
| timechart span=6h count by usage usenull=f

フィルタリング & テーブル形式

eval

eval:集計結果を新しいフィールド(カラム)として追加するコマンド。追加したフィールドはインデックス

には書き込まれず、サーチでのみ利用可能です。追加するフィールドが既に存在する場合、そのフィールド値が上書きされます。

# actionごとの帯域(MB)を新規フィールドとして利用する場合
index=network sourcetype=cisco*
| stats max(sc_bytes) as max_sc_bytes, sum(sc_bytes) as Bytes by action
| eval "Bandwidth (MB)" = round(Bytes/(1024*1024), 2)   #新規フィールドを追加

※ Splunkではパイプライン ” | ” を追加する毎に中間テーブルが生成/更新されます。

ここではstats, eval に違いがないように見えますが、両者には以下の違いがあります。

コマンド 役割
stats 既存フィールドを集計して新規フィールドを生成。by, over で分析軸を指定。
eval 既存フィールドを集計/非統計処理 (string, boolean) して新規フィールドを生成。
同じ検索ラインでの再帰処理も可能。

stats に似たコマンドとしてtstats があります。これは「生データではなくtsidxに直接統計処理を行う」コマンドで、定型レポートなどに利用されます。

eval の高度な使い方としてstats, sort と組み合わせる方法があります。(下記参照)

index=web sourcetype=access_combined action=purchase
| eval cnt_fail = if(status=200,0,1), rate = case(productId LIKE "WC%",3, productId LIKE "FS%",1, 0=0,0)
| stats sum(price) as tp, sum(sale_price) as tsp, sum(cnt_fail) as "Number of fail", avg(rate) as ar range(_time) as pt by product_name
| sort 5 -"Number of fail" useother=f
| eval Discount = round((tp-tsp)/tp*100, 1)."%", "Total prices" = "$".tostring(tp, "commas"), "Average rate" = ar."pt", "Purchasing time" = tostring(pt, "duration")
| fields - tp, tsp, pt
| rename product_name as "Product"

コード解説

『if(status=200, 0, 1)』:status=200 であれば “0”、そうでなければ “1” を返す。
『case(productId LIKE “WC%”, 3, productId LIKE “FS%”, 1, 0=0, 0)』:productId の先頭文字がWCであれば “3”、FSであれば “1”、それ以外あれば “0” を返す。(0=0 は必ず true になるため”その他”を表現できる)
『range(_time)』:_time の Max〜Min の差分。つまり時間範囲。
『sort 5 -“Number of fail”』:イベント数を5つに絞り Number of fail で降順 (-) にソート。
『useother=f』:イベント数を絞ったときに生成される”その他”を非表示。
『round』:引数を指定せずに数値を整数 (=少数0桁) に丸めている。
『tostring(tp, “commas”)』:tp (小数) を文字列に変換。
『tostring(pt, “duration”)』:pt の書式を “数値 → hh:mm:ss” に変換。(e.g., 175[s]→00:02:55)

また、eval, count を組み合わせることで、フィールド内の特定文字をカウントすることも可能です。

index=web sourcetype=access_combined
| stats count(eval(action="view")) as View, count(eval(action="addtocart")) as "Add to cart", count(eval(action="purchase")) as Purchase by host
host View Add to cart Purchase
www1 1073 1166 1151
www2 1163 1178 1183
www3 1137 1119 1137

search vs. where

| search src_ip="10.9.112.*"
index=main
| where price > 1000 OR (host like "www_" AND source like "tutorialdata%") OR ISNULL(sale_price)

search, where は両方とも結果をフィルタリングしますが、利用上若干の違いがあります。

search where
主な用途 1つのフィールドが対象のとき 複数フィールドを比較したいとき
検索パイプラインの位置 どこでも利用可 2つ目以降でのみ利用可
大文字小文字の区別 区別なし 区別あり
ワイルドカード 任意の文字数(*) に対応 一文字(_), 複数文字(%) に対応
関数の利用 × ◎ (e.g. isnum, isnull, len)

fillnull

fillnull:結果のテーブルに含まれる NULL を指定した文字で埋めるコマンド。
※ “value=” で文字を指定しない場合「0」となります。

index=sales
| chart sum(price) over fruits by country
| fillnull
fruits JAPAN CHINA USA
Orange 200 200 200
Banana 0 100 100
Apple 0 0 150
index=sales
| chart sum(price) over fruits by country
| fillnull value="None"
fruits JAPAN CHINA USA
Orange 200 200 200
Banana None 100 100
Apple None None 150

イベントの相関

transaction

transaction:Sourcesで発生したイベントを紐付けて1つのイベントとして表示するコマンド。

例えば、オンラインストアで買い物をする際には App Server/DB/EC Engine などを経由するため、その過程で多くのイベントが発生します。transaction を用いるとこれらのイベントを共通のキー (e.g., session_id) で紐づけることが可能です。

index=web
| transaction session_id

また、transaction では『duration』『eventcount』というフィールドが自動で生成される他、maxspan, maxpause, startswith, endswith などでイベント間隔をカスタマイズすることも可能です。

index=web sourcetype=access_combined
| transaction session_id maxspan=5m maxpause=30s startswith=eval(action="view") endswith=eval(action="purchase")
| eval duration = tostring(duration, "duration")
| sort 10 -duration
| table _time session_id duration eventcount action   #tableで表構造に変換することで可読性が向上します。
_time session_id duration eventcount action
2021-07-06 17:41:06 21SFAB32FD 00:03:32 15 view
addtocart
purchase
2021-06-22 05:31:26 1SAS2F2SA2 00:02:58 15 view
purchase
2021-07-13 11:21:23 AF8DG91S8 00:02:26 21 view
addtocart
changequantity
purchase
コード解説

『maxspan=5m』:1トランザクションの最大時間範囲を5分に設定。
『maxpause=30s』:30秒以上がたてば別のトランザクションとして扱う。
『startswith=eval(action=”view”)』:action=”view” で始まるトランザクションを抽出。
『endswith=eval(action=”purchase”)』:action=”purchase” で終わるトランザクションを抽出。

transaction は、複数の送受信データを解析してバグの原因を特定する用途でも使われます。

# 通信がREJECTされたログのみをまとめて見る場合
index=network | transaction id_a id_b id_c | search REJECT

transaction vs. stats

transaction stats
処理の速さ × ◎ (実運用向き)
主な用途 単一イベントの情報量が少ないとき
相関があるログをまとめて見たいとき
start/end値, timeを基にグループ化したいとき
集計項目が予め決まっているとき
集計結果をテーブル形式で見たいとき
フィールド値でグループ化したいとき
イベント数の制限 1000 [default] なし (無制限)

transaction で表示されるイベント数を1000より大きくしたい場合、管理者が limit.conf の『max_events_per_buckets』を編集する必要があります。

フィールドの作成/管理

Splunkは生データ内のフィールドを自動で抽出しますが、Field Extractor (FX) を用いて独自のフィールドを抽出することも可能です。

FX をwebで起動する方法は『web』『Fields Sidebar』『Event Actions』の3通りあり、抽出方法は『Regex (正規表現)』『Delimiter (区切り文字)』から選択できます。

FX の起動方法 手順
Settings [Settings] > [Fields] > [Field extractions] > [Open Field Extractor]
Fields Sidebar 画面左のサイドバー (下部) > [+ Extract New Fields]
Event Actions 検索後のイベントを1つ開き [Event Actions▼] > [Extract Fields]

※ FXは基本的に “sourcetype” に紐づいた抽出を行いますが、[Settings]からFXを起動した場合のみ “source” に紐づいた抽出を行えます。

無事に起動できたら次は表示されるイベントを1つ適当にクリックして次へ進むと『Regular Expression』『Delimiters』の選択項目が表示されるので、自分が選びたい方を選択します。

Field Extractor (FX) – 正規表現抽出

Regex はシステムログファイルのような「非構造化データ」の抽出に適しており、表現にマッチする/しないデータを抽出できます。イベント内のフィールドをマウスで囲むことで抽出フィールドを選択でき、新規フィールド名を設定すれば Splunkが自動で正規表現を作成してくれます。

抽出されたフィールドはでハイライトされ、画面下部にプレビューが出ます。

[Next] ボタンを押すと最終レビュー画面が表示されるので、問題がなければパーミッションを決定し、保存すれば完成となります。

Field Extractor (FX) – 区切り文字抽出

Delimiters はCSVファイルのような「構造化データ」の抽出に適しています。指定できる区切り文字には『commas( , )』『pipes ( | )』『spaces』『tabs』『other character』があります。

抽出の作成フローは Regex と同様です。

エイリアス・定義済みフィールド

フィールドエイリアス

フィールドエイリアスとは「既存フィールドのエイリアス(別名)」のことです。

1つのフィールドに対して複数エイリアスを設定することができ、設定した分だけ新規フィールドとしてサイドバーに表示されます。(既存のフィールドへの影響はありません)

エイリアスはフィールド抽出後 Lookups 前に処理されるため、新規で設定したエイリアスをキーにlookup で外部ファイルと紐づけることが可能です。

エイリアスの作成方法:[Settings] > [Fields] > [Fields Aliases] > [New Fields Alias] > 必要な情報を入力

定義済みフィールド

定義済みフィールドとは「繰り返し記述する冗長的な処理をショートカット(引数なし関数)にしたもの」です。

Eval expression には元データに存在するフィールドのみを記述でき、Lookup 紐付けたフィールドは含めることができません。

タグ・イベントタイプ

Tags / Event Types の違い【Splunk】
タグ タグとは「特定のフィールド値につける付加情報」のことです。 例えば、ログ内の clientip = 191.205.189.15というフィールド値に「自社オフィス」というタグをつければ、...

マクロ

Macro 解説【Splunk】
マクロとは マクロとは「よく使う検索条件を関数化した機能」のことです。 例えば、アメリカ本部の売上($)を「日本円(¥) - 税込表記に変換する」というマクロを「sales_jpy_taxin...

ワークフローアクション

Workflow Action 解説【Splunk】
Workflow Action (GET, POST, Search) とは Workflow Action とは「特定のフィールドと外部のwebリソースを連携させる機能」のことで『GET』『POS...

データモデル

Data Model 解説【Splunk】
データモデル (Data Model) とは データモデルとは「Pivot*で利用される階層化されたデータセット」のことで、取り込んだデータに加え、独自に抽出したフィールド /eval, looku...

アプリ・アドオン

App / Add-on の違い【Splunk】
アプリ (App) アプリとは「特定のデータ (e.g., files, script, web) を分析/表示するソフトウェア」で、特定のベンダー/業界/OS専用のものが多く存在します。 サ...