見出し画像

KibanaのScripted Fieldの使用例とPainlessスクリプトの書き方

こんにちは。Airitech ビッグデータ・AI活用グループのニャン テッ ナイン(Nyan Htet Naing)です。
ElasticsearchとKibanaを含むデータ分析基盤の構築や、データ分析用プログラムの開発などを行っています。

本記事では、Kibana Scripted Fieldの使い方と、ElasticsearchのPainlessスクリプトの書き方についてご紹介します。

KibanaのScripted Fieldとは

KibanaのScripted Fieldとは、indexに存在するfieldのデータを用いて、それを加工した別のfieldを作る仕組みのことです。

Elasticsearchでログデータの分析を行うためには、通常、データをElasticsearchに入れる前に必要な情報の抽出や加工を行います。

画像14

     図1:ログデータをLogstashを使って加工する際のイメージ

ですが、データをElasticsearchに入れた後で「やっぱりこういうfieldも必要だった」となる場合があります。そのようなケースで活用できるのがScripted fieldです。

Scripted fieldの使い道として、主に以下のような使用例が考えられます。

・文字列の数値への変換
 ・ログレベルの文字列を数値に変換
  INFO → 1
  WARN → 2
  ERROR → 3 

・日付時刻の変換
 ・時刻のデータを曜日に変換
  2020-11-01T00:00:00+09:00 → 日

・複数のfieldの差を取る
 ・「開始時刻」と「終了時刻」の差分を取った「処理時間」のfieldを追加

なお、Scripted fieldの使い方によっては、事前に加工した上でデータを投入するよりも大幅にクエリ実行時の負荷が上がってしまう場合があるので、注意してください。データをElasticsearchに入れる前にLogstashやIngest Pipelineで変換できるのであれば、その方が望ましいです。

Painlessとは

Elasticsearch固有のスクリプト言語です。
Elasticsearchの検索クエリやaggregationクエリの他、ReindexやIngest Pipelineなどでも使用されます。

昔のバージョンのElasticsearchではgroovyが使われていましたが、セキュリティやパフォーマンスの問題に対処するために作られたPainlessが現在では使われています。

Scripted Fieldの使用例

Scripted Fieldの使用例を一つご紹介します。以下のログが入っているindexに対して、Scripted Fieldを一つ追加します。

画像14

     表1:投入データのフィールド名、型、サンプルデータ

画像10

        図2:KibanaのDiscoverでデータを確認した例

log_levelのfieldに対して、
「INFO」→ 1, 「WARN」→ 2, 「ERROR」 → 3 のように数値に変換した、log_level_numというScripted Fieldを追加します。その手順は以下の通りです。

手順1:インデックスパターンの表示
KibanaのメニューからIndex Patternsをクリックします。その後対象index patternをクリックし、表示されたindex patternの中Scripted fieldsタグをクリックします。

画像11

       図3:Scripted fieldsタグをクリックした画面

手順2:Scripted Field作成画面の表示
Scripted Fieldが一つも追加されていない場合以下のように表示されますので、Add scripted fieldボタンをクリックします。

画像10

      図4:Add scripted fieldボタンをクリックした画面

手順3:Scripted Fieldの作成
以下項目に必要な設定をします。

Name: Scripted Fieldの名前を記入
Language: painlessを選択
Type: numberを選択する
Format: Defaultのまま
Script: 以下スクリプトを設定する。
(log_level.keywordの値を元に数値をリターンする簡単なスクリプト)
最後にCreate fieldボタンをクリックして完了します。
if (doc['log_level.keyword'].value == 'INFO') {
 return 1
} 
else if (doc['log_level.keyword'].value == 'WARN') {
 return 2
}
else if (doc['log_level.keyword'].value == 'ERROR') {
 return 3
} 
else {
 return 0
}

画像11

         図5:Scripted Fieldに設定を行った図

作成されたScripted Fieldの確認
Scripted fieldで設定したlog_level_numがindex patternに追加されます。

画像12

   図6:Scripted Fieldsにlog_level_numフィールドが追加された図

Discover画面にもlog_level_numが表示されるようになります。

画像10

   図7:Discover画面にlog_level_numフィールドが追加された図

作成したフィールドのVisualizeでの利用

・各機能がいつ稼働していたか
・その時にWARNやERRORのログが出力されていないか
という、動作の状況を把握するためのヒートマップを作成して見ましょう。

以下の図はFuntion毎にどのレベルのログが出力されているかを色で表すHeat Mapです。
 ・「INFO」ログのみ → 緑色
 ・「WARN」以下のログのみ → オレンジ色
 ・「ERROR」ログが出力 → 赤色
こうするとFunctionごとの動作状況を把握することができます。

画像10

          図8:ヒートマップを作成した図

上記Heat Mapを作成するため以下の設定をします。

・Metricsにlog_level_numフィールドのMaxを取得するよう設定します。

画像11

             図9:Metricsの設定

・BucketsにX-axisとY-axisを以下のように設定します。
 X-axisはAggregationにDate Histogramを選びます。

画像12

           図10:Bucketsの設定(X-axis)

 Y-axisはSub aggregationにTermsを選び、function毎に表示して並び順はAlphabeticalを選択します。

画像13

           図11:Bucketsの設定(Y-axis)

 表示の色分けをするためCustom rangesを設定します。

画像14

           図12:Custom rangesの設定

 Custom ranges設定完了後以下HeatMapの右上のように各Rangesが表示されるためクリックして好きな色に変更します。

画像15

       図13:設定した値から生成されたヒートマップ

まとめ

Elasticsearchに入れるデータの加工方法を変えて再投入するのは、手間と時間がかかる場合が多いです。
簡単な加工を行うだけであれば、Scripted Fieldを使えばあたかも元からそのfieldがあったかのようにVisualizationを作成することができるので、とても便利です。
ぜひみなさんも使ってみてください。

弊社ではビックデータ解析ツール導入・支援のほか、トラブルシュートやシステム性能サービスなど、さまざまなサービスを提供しております。

UiPathユーザー向けElasticsearch・Kibanaのオンライントレーニングも行っています。Elasticsearch・Kibanaに興味のある方は、ぜひご参加ください。

Elasticsearch・Kibanaトレーニング(オンラインセミナー)
https://www.airitech.co.jp/service/bigdata/uipath_elasticsearch_training/

また、Elasticsearchエンジニアの募集も行っていますので興味ある方はぜひご応募ください。

Airitechの採用情報はこちら
https://www.airitech.co.jp/recruit/

ホームページ
https://www.airitech.co.jp/




いいなと思ったら応援しよう!