2015年5月20日水曜日

Splunkでサマリインデックスを使う

まとめ
・サマリインデックスを使うことで大量データであっても効率よくレポートが作成できる。
・レポートでは先頭にsiが付くsixxxxコマンドを使う。


サンプルデータを登録・設定する
まず以下のようなデータがインデックスに登録されていくものとする。
販売履歴のようなデータ。
フィールドは「タイムススタンプ、アイテム、価格」

<やりたいこと>
・週次で売上履歴のサマリを取得したい。ここでは価格の合計値。
・集計対象は前週の日曜日から土曜日とする。

<インデックスの登録されていくデータ>
2015-03-01 13:00:00,book,100
2015-03-02 11:00:00,book,200
2015-03-03 16:00:00,book,300
2015-03-04 10:00:00,eraser,400
2015-03-05 09:00:00,note,500
2015-03-06 08:00:00,note,600
2015-03-07 07:00:00,book,700
2015-03-08 16:00:00,book,800
2015-03-09 13:00:00,book,900
2015-03-10 14:00:00,book,1000
2015-03-11 22:00:00,pen,1100
2015-03-12 23:00:00,book,1200
2015-03-13 10:00:00,note,1300
2015-03-14 12:00:00,note,1400
2015-03-15 16:00:00,book,1500
2015-03-16 13:00:00,book,100
2015-03-17 11:00:00,book,200
2015-03-18 16:00:00,book,300
2015-03-19 10:00:00,eraser,400
2015-03-20 09:00:00,note,500
2015-03-21 08:00:00,note,600
2015-03-22 07:00:00,book,700
2015-03-23 16:00:00,book,800
2015-03-24 13:00:00,book,900
2015-03-25 14:00:00,book,1000
2015-03-26 22:00:00,pen,1100
2015-03-27 23:00:00,book,1200
2015-03-28 10:00:00,note,1300
2015-03-29 12:00:00,note,1400
2015-03-30 16:00:00,book,1500
2015-03-31 16:00:00,book,1600


<事前の条件>
インデックス名
  demo_alert

フィールド定義
$SPLUNK_HOME$/etc/system/local/props.confで以下のように定義しておく。
定義後はsplunkdの再起動を忘れない。

 [demo_alert]
NO_BINARY_CHECK = true
SHOULD_LINEMERGE = false
category = Custom
pulldown_type = true
FIELD_NAMES = time,item,amount
disabled = false
TIME_FORMAT=%Y-%m-%d %H:%M:%S
MAX_DAYS_HENCE=7

サマリインデックスを作成する
サマリインデックスは通常のインデックスを作成する場合と同じ方法。
サマリインデックスを作成するための特別な手順はない。

インデックス名はdemo_alert_sumとして作成する。

レポートを作成する
ここで毎週スケジューリングして週次の集計値を作成するための
設定を行う。サマリインデックスに集計値を格納する部分もここで行う。
1.[設定]-[サーチ、アラート、レポート]を選択する

2.[新規追加]ボタンをクリックする。


3.サーチ文字列を設定する。ここで記述するコマンドはサマリインデックス用の
コマンドを使う。先頭にsiが付くコマンド。例えばsistatsなど。

3-1.サーチ文字列を設定する
index="demo_alert" | sistats sum(amount)

ここでは、amountの合計を取得する。

開始時刻と完了時刻が-w@w0@w0となっている。
これはサーチ対象とする時間の範囲を指定している。この表現を細かく見ていく。

まず開始時刻だが、[-w@w0]は先週の日曜日を示す。@より前の部分[-w]は先週、@移行の部分w0は日曜日を示す。(0が日曜で、1が月曜、、、、6が土曜日となる。)

一方[@w0]は今週の日曜日を示す。今週を示すのであれば@より前の部分の定義は不要だ。

開始時刻と完了時刻は以上・未満の関係になるため、
先週日曜の00:00:00から先週土曜の23:59:59までを意味する。

時間に関する表現は以下のURLを参照。
http://docs.splunk.com/Documentation/Splunk/6.2.2/SearchReference/Commontimeformatvariables

 3-2.[このサーチをスケジュールする]にチェックを入れる。


3-3.スケジュールタイプで[基本]を選択する
3-4.実行間隔を選択する。ここでは[週(毎土曜日の午前0時)]を選択する。
  選択肢はいくつか用意されているが、任意のタイミングで実施したい場合は、
  cronと同じ形式で設定することも可能。








サマリインデックスを確認する

スケジュールどおりに動作し、サマリインデックス[demo_alert_sum]を開くと、下記のように集計値が保存される。

1行目はXからXまでのフィールド「amount」の集計で3600
2行目はXからXまでのフィールド「amount」の集計で3600
3行目はXからXまでのフィールド「amount」の集計で7200

上記のログデータとつき合わせて確認するとちゃんと週次で集計されていることが
分かる。

格納されている情報を見るとわかるが、集計元のイベントは無くsixxxxコマンドで集計した統計情報だけである。



集計対象の時間はinfo_min_time,info_max_timeフィールドに値が登録される。
unixtimeなのでわかりにくいので、わかりやすく変換してみる。

unixtimeを変換し、変換した値を新たなフィールドとして追加するためには、evalコマンドとsrftimeコマンドを使用する。
例)
eval info_min_time2=strftime("%Y-%m-%d %H %M %S")

それぞれの集計データが
2015/3/8(日) 00:00:00以上、2015/3/15(日) 00:00:00未満
2015/3/15(日) 00:00:00以上、2015/3/22(日) 00:00:00未満
の範囲のデータを対象にしていたことがわかる。


終わりに
大量データから集計値を作成する場合、長期間に渡るデータを1回の操作で抽出するのは、
非効率的だし、処理をするのに多くのリソースを必要とする。要は作成に時間がかかりすぎる。ユーザ要件の中で例えば1ヶ月に1回のレポート作成があるのならば、
週次や日次で集計データを作成しておくと効率的にレポートを作成することができる。
レポートとサマリインデックスを併用するとそれが実現できる。





2014年11月26日水曜日

AMIにMechanizeをインストールする

AMIのruby環境はあまりパッケージがインストールされていないので、mechanizeのインストールにつまずくことがある。
 なので、ここに一連の手順を残しておく。

rubyバージョン ruby 2.0.0p481






1.yum install ruby-devel

2.yum install gcc-c++.noarch

3.yum install libxslt-devel.x86_64

4.yum install patch.x86_64
  以下のような nokogoriやmechanizeをインストールするときに
  以下のようなメッセージが出で失敗する事があるので
  必ずインストールする。


  patch.logを見ると、パッチコマンドが見つからないという趣旨のエラーが出力されている。

  Running 'patch' for libxml2 2.9.2... ERROR, review '/home/ec2-user/.gem/ruby  /2.0/gems/nokogiri-1.6.4.1/ext/nokogiri/tmp/x86_64-redhat-linux-gnu/ports  /libxml2/2.9.2/patch.log' to see what happened.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
 
5.gem install nokogiri

6.gem install mechanize

以上

2014年10月20日月曜日

ZaimApp for Splunk

Zaimに入力データをJson形式でインポートすればデータ解析ができる
SplunkのAppを作ってみた

Zaimは分析能力が乏しいことから分析能力が非常にすばらしいSplunkでの
利用を検討。

基本的にはJsonフォーマットによるインポートだが
CSVファイルでもinputs.confを調整すればいけるはず。

まずはベータとして。
https://github.com/maar4569/splunk_zaimapp

2014年5月9日金曜日

Splunkをインストールする

Splunkとは何か。Splunkは 主にセキュリティのインシデント分析(SIEM)を
中心としたログデータの検索・分析システム。
CSVやJSONなどテキスト形式のデータであれば何でも取り込める。データベースのように
スキーマを定義する必要が無く、Splunkが自動的に判別する。検索スピードもとても速い。この手の分析ツールは高価で大企業しか使えないイメージがあるが無償版も提供している。1日500MB未満のデータ取り込みであれば無料で使えるので、個人で使うのであれば十分過ぎる。
 
とりあえず使ってみるために以下のチュートリアルを参考にインストールした。
 http://docs.splunk.com/Documentation/Splunk/latest/SearchTutorial/InstallSplunk
 
OSはCentOS 6.2
 
オペレーションは以下のとおり。
 
1.ルートに切り替える。
 su root ( splunk do not needs root user! )

2.Splunkを展開。とりあえず/optへ。

  tar xvzf splunk-6.0.2-196940-Linux-x86_64.tgz -C /opt
 
  詳細は以下のURL
    http://docs.splunk.com/Documentation/Splunk/6.0.3/Installation/InstallonLinux

3.Splunkを開始するためにシェルを作っておく。

  3-1.cd /opt

  3-2.vim run_splunk.sh

         cd /splunk/bin
         ./splunk start

  3-3.chmod +x run_splunk.sh

4.splunkを開始する。
   4-1.  ./run_splunk.sh
            installration processing, you need to agree user licencse.
    
   4-2.  splunk web site is http://hostname:8000
   

5.splunkにサインする。
   デフォルト認証情報は以下のとおり。
           user admin
           pass changeme
 パスワードの変更を求められるので変える。

以上で完了。簡単過ぎ。
      
 

2014年3月6日木曜日

PostgreSQL9.3に更新してからDBのサイズが取得できなくなった

仕事でPostgreSQL8.3を使っていたがいろいろ問題があって9.3にアップする事に。
DB監視でサイズ情報を取得していたが動かなくなってしまいさあ大変。
ということで調べてみた。

これが今まで使っていたクエリ(の抜粋)
select
  relname,
  to_char(pg_relation_size(relname)),
  to_char(pg_total_relation_size(relname)),
  relfilenode
where
 pg_class
where
 relowner = xxxx and
 relkind = 'r';

こんな情報がありました。明示的なキャストが必要みたい。でも8.3だぞ?

 http://www.sraoss.co.jp/technology/postgresql/8.3/



select
  relname,
  to_char(pg_relation_size(relname::text)),
  to_char(pg_total_relation_size(relname::text)),
  relfilenode
where
 pg_class
where
 relowner = xxxx and
 relkind = 'r';

実際に明示的に記述することで取得できるようになった。
実務ではプログラミングから離れているため、このようなちょっとしたことでも
キャッチアップできていない。そんな自分に腹が立つ。。。

2013年12月24日火曜日

車に追突してきた容疑者が見つかった

 11月に家族と車で買い物に出かけた。信号待ちで止まっていたところ後ろから追突された。ハザードを出して車から出ようとしたところ、急発進して私の車の横を駆け抜け信号無視して逃げていった。車の特徴・ナンバーを覚えていた私は、頭にきて警察に通報、もろもろの処理をして、1か月ほど経過したところだった。

 警察からは容疑者が謝りたい、弁償したいとのことだった。ならばということで電話で話をしようということで待っているのだがかかってこない。
正直、車の破損についてはどうでもいい。 いい大人が逃げる、そして謝ると言って謝りの連絡がないことに憤りを感じている。本当はこんないい加減な人間と話す時間さえももったいないくらいなので、話すことさえためらわれる。しかし言いたい事は言っておきたいので待ってることにする。


はあ、全く人間的に問題のある大人が多すぎてうんざりする。

2013年12月19日木曜日

[Ruby]Zaim API V2に対応した認証用ライブラリを作ってみた

家計簿ソフトZaim(https://zaim.net)が提供するWebAPIの認証部分を
omniauthを参考に作ってみた。

ソースコードは以下のサイトにアップロード。
https://github.com/maar4569/omniauth-zaimv2

参考にしたのは以下のライブラリ。(v1用のライブラリ。)
mururuさんありがとうございます。

https://github.com/mururu/omniauth-zaim


以前Google Apps ScriptからZaim APIをたたこうとして失敗し涙したが、
今回は成功。

Railsに組み込む場合、コールバック用のコントローラに
以下のような記述をしておくと、verify APIのレスポンスが得られる。

#サンプル
def callback
  auth = request.env['omniauth.auth']
  @user_id = auth.info.id
  @name = auth.info.name
  @input_count = auth.info.input_count
  @day_count = auth.info.day_count
  @repeat_count = auth.info.repeat_count
  @day = auth.info.day
  @week = auth.info.week
  @currency_code = auth.info.currency_code"
end

また、カテゴリに関する情報を取得する場合は以下のコードで取得できる。
 api_url = auth.extra.access_token.consumer.options[:site] + "/v2/home/category"
 raw_info = MultiJson.load(auth.extra.access_token.get(api_url).body)['categories']
 p "categries =>  #{raw_info}"

ジャンルなども基本的には同じ要領で取得する。

Zaimの情報を分析して家計を助けるぞー