Kibanaで円グラフ(Pie Chart)を作って可視化する #elasticsearch
リソースの可視化、ログデータの投入と来たら次はログデータ自身の可視化ですね。
Kibanaでは様々なグラフや表が用意されており、
それらを組み合わせることで目的に合わせたダッシュボードを作ることができます。
今回は、ログ内のUser Agent情報から、デバイス・OS・ブラウザの割合を円グラフ(Pie Chart)を使って可視化してみたいと思います。
User Agentは以下のサイトを参考にさせていただきました。
歌うキツネ : User-Agent (ユーザー エージェント) 一覧
こんな感じのログを適当に作成
2017-03-02_23-11-00.123,hostap1,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393 2017-03-02_23-12-00.123,hostap1,Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Logstashの設定ファイルはこんな感じ。
input{ file{ path => "C:\dev\ua.txt" start_position => "beginning" } } filter{ csv{ columns => ["processingDate","hostName","userAgent"] separator => "," } date{ match => ["processingDate" , "yyyy-MM-dd_HH-mm-ss.SSS"] timezone => "Asia/Tokyo" } useragent{ source => "message" prefix => "ua." } mutate{ remove_field => ["host","userAgent"] } } output{ elasticsearch{ hosts => ["<Elasticsearchが動作しているサーバのIPアドレス>"] index => "useragent-%{+YYYYMMdd}" } }
filter-useragent
今回の肝。
指定されたソースからUserAgentの書式を見つけて、
いい感じに各項目にパースしてくれるフィルターです。
prefixで接頭語を指定できます。この場合"ua."で始まる項目がuseragentフィルターで作成された項目ということになります。
mutate-remove_field
出力項目から指定された項目を除外するフィルターです。
userAgent項目はパースされており、2重になるので省いています。
Kibanaで可視化
さて、Kibanaで可視化してみましょう。
Index Patternsの追加
Kibanaのメニューの一番下にある「Management」をクリックし、
表示された項目の「Index Patterns」をクリックします。
そして「+Add New」ボタンをクリック。
Index name or patternに今回設定ファイルで設定した”useragent-YYYYMMdd”が対象になるように
「useragent-*」を入力し、「Create」ボタンをクリック。
Discoverでの表示
Kibana画面右上の時計マークをクリックして、対象のログの時間に合わせます。
Kibanaのメニュー「Discover」をクリックし、
左上に表示されているindexパターンの「▼」を押して「useragent-*」を指定します。
するとまあなんということでしょう。
ログデータが表示されますね。
円グラフ(Pie chart)の作成
さて遂に本題の可視化です。
今回はどんなOSが使われているのか、
そしてそのOSからどのようなブラウザを使用していて、
ブラウザのバージョンはいくつなのかといったことを可視化していきたいと思います。
Visualizeの作成
Kibanaメニューの「Visualize」をクリックし、
表示された中から「Pie chart」をクリックします。
index選択で今回追加した「useragent-*」を選択します。
OSの分布を可視化する
Split Slices選択して以下のように入力します。
- Aggregation : Terms
- Field : ua.os.keyword
- Order By : metric:Count
こんな感じにOS毎の円グラフが作成されます!
円グラフの分割しブラウザの使用状況を可視化する
OS分布を可視化したら次はOS毎の使用ブラウザを可視化します!
「Add Sub buckets」から再度「Split Slices」を選択し以下のように入力します。
- Aggregation : Terms
- Field : ua.name.keyword
- Order By : metric:Count
ブラウザのバージョンを可視化する
最後にブラウザのバージョンを可視化しましょう。
サポート外のブラウザ使ってアクセスしてる人、
サポート外したいのに、まだ使ってる人が多いブラウザなどが可視化出来ますね。
「Add Sub buckets」から再度「Split Slices」を選択し以下のように入力します。
- Aggregation : Terms
- Field : ua.major.keyword
- Order By : metric:Count
まだIE8を使ってる人がいる、ということを可視化出来ました!
作ったグラフは画面右上の「Save」ボタンから保存することができます。
Logstashで一部がkey value形式のログをパースする #elasticsearch
Logstashで取り込むログは多種多様で、色々なテンプレートも用意されています。
ただ、アプリケーションログはそれぞれのアプリで独自のフォーマットで記述されていることが多いと思います。
今回、ちょっと複雑なログの形式として
項目が":"区切りで且つKey=Value形式の項目があるログをパース出来たので、方法を残しておきます。
ログはこんな形式です。
2017-02-26_11-46-00.123:hostap1:bwegaa3JkLKJIHGKGGIkjahawlwk2134:10000123:OUT:OAUT45 :OperateId=1Update&0&ProcessId=2kdajgkagkdjgjgkgjgkb&ProcessPass=214resdkljg6ykdhjglkgshg&SalesDate=20170226&TenantId=0001&TransactionDate=20170226&ResponseCd=OK 2017-02-26_12-46-00.123:hostap1:bwegaa3JkLKJIHGKGGIkjahawlwk2134:10000123:OUT:OAUT45 :OperateId=1Update&0&ProcessId=2kdajgkagkdjgjgkgjgkb&ProcessPass=214resdkljg6ykdhjglkgshg&SalesDate=20170226&TenantId=0001&TransactionDate=20170226&ResponseCd=NG 2017-02-26_12-45-00.123:hostap1:bwegaakJkLKJIHGKGGIkjahawlwk2134:10000123:IN :OAUT45 :OperateId=1Create&0&ProcessId=d5aaa2jgkjgghhhglalkg&ProcessPass=234resdkljg6ykdhjglkgshg&SalesDate=20170226&TenantId=0001&TransactionDate=20170226 2017-02-26_12-46-00.123:hostap1:bwegaa3JkLKJIHGKGGIkjahawlwk2134:10000123:OUT:OAUT45 :OperateId=1Update&0&ProcessId=2kdajgkagkdjgjgkgjgkb&ProcessPass=214resdkljg6ykdhjglkgshg&SalesDate=20170226&TenantId=0001&TransactionDate=20170226&ResponseCd=NG
処理日付、サーバ名、セッションIDが":"区切りで、最後の項目にPOSTされた内容がKey=Value形式で記述されています。
Logstashの設定ファイルは以下のような感じで記述しました。
input{ file{ path => "C:\dev\inout.txt" start_position => "beginning" } } filter{ csv{ columns => ["processingDate","hostName","sessionId","merchantId","inout","functionId","telegram"] separator => ":" } date{ match => ["processingDate" , "yyyy-MM-dd_HH-mm-ss.SSS"] } kv{ source => "telegram" field_split => "&?" } mutate{ remove_field => ["telegram","@version","host"] } } output{ elasticsearch{ hosts => ["<Elasticsearchが動作しているサーバのIPアドレス>"] index => "inout-%{+YYYYMMdd}" } }
filter-kv
ここが今回のキモです。
csvフィルターで":"に項目分けをされた項目を
sourceで指定し、field_splitで"&?”を指定することでKey=Valueをそれぞれの項目として抽出できます。
(dateフィルターで、同じようなことをしているので、もしかしたら出来るかなとやってみたら見事出来ました。)
Elasticsearchに投入しKibanaで見てみます。
項目数に差異があっても同じインデックスに格納されていますね。
便利!
検索もきちんと出来ます。
WindowsでLogstashを使ってElasticsearchに既存のログを投入する #elasticsearch
Elasticsearch、Kibanaの環境を構築したら、
次はログを流し込んで可視化したくなるのが人情ですよね。
ということで出番なのがLogstash。
以下のURLからダウンロードできます。
通常の使い方はLogstashを各種サーバにインストールし、
リアルタイムでログを転送し可視化するのですが、
まずは手始めとして、手元にあるログをElasticsearchに転送してみようと思います。
動作させている環境は以下の通りです。
OS:Windows 10 Pro
Java: Oracle JDK 8u121
Logstash:5.2.1
Elasticsarch,Kibanaは以下の記事で作成したものを使っています。
mamelog.hatenablog.jp
Logstashとは
公式ページには以下の記述があります。
つまるところ、いろんな形式のデータを一か所に集約できる凄いツールってことですね。
使い方
ダウンロードしてきたzipファイルを適当な場所に解凍します。
(C:\dev配下に解凍しました。)
テストデータを用意する
こんな感じの:区切りのデータを用意しました。
2017-02-26_00-00-00.123:hostap1:B01hkafjaglggkgngaJHFJHGlgkghwgh:00000123:OCC001:CREATE:0,351:0.901 2017-02-26_03-00-00.123:hostap1:B01hkafjaglggkgngaJHFJHGlgkghwgh:00000123:OCC001:CREATE:0,351:0.901 2017-02-26_06-00-00.123:hostap1:B01hkafjaglggkgngaJHFJHGlgkghwgh:00000123:OCC001:CREATE:0,351:10.901 2017-02-26_09-00-00.123:hostap1:B01hkafjaglggkgngaJHFJHGlgkghwgh:00000123:OCC001:CREATE:0,251:0.901 2017-02-26_12-00-00.123:hostap1:B01hkafjaglggkgngaJHFJHGlgkghwgh:00000123:OCC001:CREATE:0,51:0.901 2017-02-26_15-00-00.123:hostap1:B01hkafjaglggkgngaJHFJHGlgkghwgh:00000123:OCC001:DELETE:0,551:0.901 2017-02-26_18-00-00.123:hostap1:B01hkafjaglggkgngaJHFJHGlgkghwgh:00000123:OCC001:CREATE:0,351:0.901 2017-02-26_21-00-00.123:hostap1:B01hkafjaglggkgngaJHFJHGlgkghwgh:00000123:OCC001:UPDATE:0,311:0.901
設定ファイルを書く
Logstashは大きく分けて、
input,filter,outputの3つの処理に分かれます。
こんな感じで書いてみました。
input{ file{ path => "C:\dev\request.txt" start_position => "beginning" } } filter{ csv{ columns => [ "processingDate", "hostName", "sessionId", "merchantId", "functionId", "operateId", "internalProcessingTime", "externalProcessingTime"] separator => ":" } date{ match => ["processingDate" , "yyyy-MM-dd_HH-mm-ss.SSS"] timezone => "Asia/Tokyo" } mutate{ convert => { internalProcessingTime => float externalProcessingTime => float } remove_field => ["telegram","@version","host"] } } output{ elasticsearch{ hosts => ["<elasticsearchが動作しているサーバのIPアドレス>"] index => "request-%{+YYYYMMdd}" } }
input-file
pathに取り込みたいファイルのパスを書きます。
start_positionはファイルのどこから取り込み対象にするかを指定します。"beginning"を指定することでファイルの最初から取り込めます。
デフォルトではLogstash起動後に更新された行から取り込み対象にするようです。
filter-csv
CSV形式のファイルを取り込むときに使用します。csvと書いていますが、今回のようにseparatorに任意の文字を指定することで
カラム区切りでない文字列にも対応できます。
columusに区切ったそれぞれの値の項目名を指定します。
date
様々な書式の日付の文字列をパースします。
mutate-convert
指定しないと全て文字列になってしまうので、数値の項目は明示的に変換をかける必要があります。
floatやintegerが指定可能です。
数値にしておかないと、平均や合計、最大値最小値などの値を可視化出来なくなるので注意が必要です。
Logstashを起動する
コマンドプロンプトでLogstashをインストールしたフォルダ直下のbinフォルダに移動します。
cd C:\dev\logstash-5.2.1\bin
以下のように設定ファイルを指定して起動します
logstash -f request.conf
しばらくすればElasticsearchにデータが投入されKibanaで見ることができます。
テストデータの通り、3時間おきの計8件のデータが投入されました。
インデックス名と@timestampの日付がずれる
時差、タイムゾーンの問題だと思うのですが、
設定ファイルでインデックス名をパラメータ指定していると、午前9時までのデータが前日のindex名で格納されてしまいます。
indexを日付指定で削除するような運用をしていきたいのですが、
この状態だと日付をまたいでデータが削除されてしまうので困っています。
第18回Elasticsearch勉強会に参加してきました #elasticsearch
新機能の紹介と色々な事例を聞けてとても為になりました。
開催ありがとうございました!
What's new Elastic Stack 5.2 Jun Ohtaniさん
トップバッターはElasticの大谷さん。
Elastic5.1,5.2の新機能とElastic日本法人の説明をしていただきました。
speakerdeck.com
Elasticsearch Serverという本を翻訳しましたが、買わないでください。(古すぎる)
トレーニングはマニュアルは英語だけどエンジニアは日本人で日本語で受けられるとのこと。
上司を説得しましょう。(僕は既にしました。)
Elastic日本チーム
・8人
・オフィス:大手町フィナンシャルシティグランキューブ
・株式会社なのでサポート契約も安心
タスクマネジメントAPI
検索のクエリをキャンセルできるように。
レンジ
数値のレンジを登録できるようになり、クエリでも直接指定できるようになった。
(スケジュールとか宿泊データとかで便利らしい)
keywordとtext
5.0から追加されたkeywordに対して、小文字寄せなどが簡単に。
集計結果のページング
アグリゲーションの集計結果TOP10件などを今まで取っていたが、全件ほしいというニーズがあるため対応。
Kibana
タグクラウド
頻出単語が大きくなったりするやつ。
ヒートマップ
アクロクエストの人が書いてるからそこをみて。
acro-engineer.hatenablog.com
地図のズームレベルが18まで
地図の詳細表示が可能に。
X-Packが必要
Logstash
パーシステントキュー
inputを受け取って、outputする前にLogstashが落ちた時などにもデータの漏れがないように。
input受け取ったら、いったんキューに格納し、outputし終わったらキューから削除。
x-pack
すべてが有料ではない。登録するだけで使えるものも。
モニタリング
Elasticsearchのモニタリングが可能。
Logstashのモニタリングも可能(5.2~)
pairsでのElasticsearch 小島広樹さん 株式会社エウレカ
ユーザ増えて検索負荷に耐え切れなく。(MySQL)
ユーザ検索などにElasticsearchを使用。
MySQLとElasticsearchのデータってどういう風に同期取ってるんだろと質問しようとしたら、
質問してくれた人がいて、同期バッチとかでやってるらしい。
資料が喪失してしまったらしく、中途半端な形で終わってしまったのは残念でした。
LT1 : タイトル:RettyのElasticsearchの使い方 李晟圭(イ・ソンギュ)さん Retty株式会社
Retty:実名グルメサービス
retty.me
ログ解析
データ検索に使用しているの事。
ビジュアライズしていると説明しやすい。
エンジニアだけならログだけでもなんとかなっても、ディレクターなどにグラフを見せると話が早い。
LT2 : タイトル:Elasticsearch 5.2とJava Clientで戯れる森谷 大輔さん ヤフー株式会社
www.slideshare.net
1M メッセージ/s
Elasticsearchはログ可視化で使用中。
Logstashとかで頑張るより、Javaでやっときゃ何でもできるだろっていう考え。
Java Clientが使いやすい感じでした。
Elastic Stack使うとコード書く機会がなくなっちゃうので、コード書きたい人にはいい選択かもしれない。
LT3 : タイトル:Amazon Elasticsearch Serviceを使ってコンテンツ検索を速くした話中村真一郎 さん 株式会社ヒトメディア
珍しいAmazon Elasticsearch Serviceを使った事例。
Elastic CloudとAmazonがやってるサービスは違うんですよと大谷さんも強調されていたので、何か溝があるのでしょうか。
今確認したら、5.1が選択できるようになってました。
Elastic Stackをどのように適用するのか、どのように運用していくのかっていう情報が不足しているのかなーと感じました。
自分でも色々試して、トライアンドエラーでノウハウ積んでいくしかないですね。
いつかコミュニティに情報発信で貢献できるようにしたいものです。
『簡単、クレカ決済! PAY.JPを使ったクレカ決済の仕組み・開発運用時の考慮点について』に参加してきました
資料はこれ。
www.slideshare.net
決済システムの保守をやっているので、決済システムを使う側の人はどのように実装・保守をやってるのか気になって参加してきました。
クレジットカードのデータを自社で保有すると、PCI DSSの取得が必要になります。
保有を含めて、以下の3つを自社サーバでやる場合はPCIDSS準拠が必要になるため、
PAY.JPのようなECサイト事業者などがカード番号を保有せずに決済が行える仕組みが必要になってきました。
「保存」
DBなどストレージに保存してはいけない。
「処理」
アプリケーション内で処理をしてはいけない。(ログに吐かれる可能性があるため)
「通過」
ネットワークを通過させない。
決済システムってほとんどのシステムで必要な機能なのに、あまり実例が報告されないのでこういう機会は貴重ですね。
貴重な機会をありがとうございました。
Elastic Stack5.2でMetricbeatのダッシュボードを作って可視化してみた #elasticsearch
AWSを仕事で触れるようになって、色々試し始めてるので備忘録的に記載します。
Elastic Stackは、現在の業務を飛躍的に楽にしてくれると期待しているので、
社内でステマしまくって、何とか来期予算を少しだけ確保できましたので、
みっちり触っていこうと思ってます。
殆ど以下の記事を参考にしました。
acro-engineer.hatenablog.com
LogstashやBeatsで色んなサーバからログを集約して、Kibanaで一元的に可視化する方法とか
まだ全然わかってませんが、大事な1歩です。
↓これ。
Open JDKのアンインストール
Amazon Linuxには初期状態でOpenJDK7がインストールされているので、
Oracle JDK8にアップデートします。(Open JDK8でも問題ありません)
$ sudo yum remove -y java
Oracle JDKのインストール
Oracle JDKは以下のURLからあらかじめDLし、SCPでEC2インスタンスに転送しました。
この後出てくる各種インストーラも同じです。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
$ rpm -ivh jdk-8u121-linux-x64.rpm
インストールが完了したら以下のコマンドで、Javaのバージョンを確認。
$ java -version java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
Elasticsearchのインストール
yumでインストールするのが普通ですが、rpm版でインストールしてみました。
インストーラは以下のURLでDLできます。
https://www.elastic.co/jp/downloads/elasticsearch
以下のコマンドでインストール。
$ rpm -ivh elasticsearch-5.2.0.rpm
Kibanaのインストール
インストーラ
https://www.elastic.co/downloads/kibana
$ sudo rpm -ivh kinbana-5.2.1-x86_64.rpm
アクロクエストさんの記事でもある通り、Kibanaのネットワーク設定を行います。
$ sudo vi /etc/kibana/kibana.yml
開いたファイルに以下の設定を追加。
server.host: "0.0.0.0"
そしてElasticsearch、Kibanaを実行。
$ sudo service elasticsearch start $ sudo service kibana start
t2.nanoだと実行できなかったのである程度メモリが必要だと思われます。
(※どこでメモリ量指定してるか分からず)
起動したら以下のURLをたたいてKibanaの画面が表示されれば成功です。
http://<作ったインスタンスのIP>:5601
Metricbeatのインストール
インストーラ
https://www.elastic.co/downloads/beats/metricbeat
インストール実行
$ sudo rpm -ivh metricbeat-5.2.1-x86_64.rpm
起動
$ sudo service metricbeat start
Metricbeatのダッシュボードをインストール
データを流すのが簡単なだけでなく、可視化するのも簡単なのがElasticスタックの利点。
Metricbeatからのデータを可視化するためのダッシュボードがすでに用意されています。
$ cd /usr/share/metricbeat/scripts $ sudo ./import_dashboards
Kibanaでインストールしたダッシュボードを見てみる。
画面左の「Dashboard」をクリックして、画面右上の「Open」をクリックします。
Metricbeat system overviewを選択するとこんな感じにしてくれます。
ダッシュボード上の「System Navigation」でCPU選ぶとこんな感じ。
メモリ
プロセス
いやあ、可能性に満ち溢れてます。
今はCPU使用率をモニタリングするのに、作業依頼を起票しないといけませんからね!!w
Elastic Stackがあれば、誰でもいつでも好きな時に好きなサーバのリソース状況を見ることができますね!
情報処理安全確保支援士 登録に申し込みました
2011年の特別試験で情報セキュリティスペシャリストに合格していたので、登録資格を持っておりました。
今のところ、メリットが全くない資格ですが、資格保持者が出てくればある程度状況も変わってくるかなぁ。
追記:
2017年2月1日から7月31日の間に申込んだ人は、10月1日に登録されるとのこと…。
4月1日に間に合いませんでした…。