Slide 1

Slide 1 text

Data Shipper Platform 「Beats」 Future Architect, Inc. Technology Innovation Group Hiroki Takeda

Slide 2

Slide 2 text

Beats? 2

Slide 3

Slide 3 text

Beatsとは Elastic社の新プロダクト(2015.11.24 v1 Release) 一言で言えば「データ収集ツール」群 とか とか みたいなもの 3

Slide 4

Slide 4 text

バックエンドとしてElasticsearch + Kibanaを前提とした データ収集ツール データ可視化プラットフォームにおける位置付け 4 収集 ・Beats ・Logstash ・Fluentd ・Flume etc... 蓄積 可視化 ・Elasticsearch ・Graphite ・InfluxDB ・Solr etc... ・Kibana ・Grafana ・Giraffe ・Influga ・Banana etc...

Slide 5

Slide 5 text

どんなデータが収集できるの? 現在Elastic社から公開されているBeatは4つ ✓ Packetbeat … パケット情報収集 ✓ Topbeat … リソース情報収集 ✓ Filebeat … ログファイル収集 ✓ Winlogbeat … Windowsイベントログ収集 OSSのコミュニティでも様々なBeatが公開 https://www.elastic.co/guide/en/beats/libbeat/current/community-beats.html 5

Slide 6

Slide 6 text

特徴 ✓ バックエンドとしてElasticsearch + Kibanaを想定 ✓ 1Beat 1Binary ✓ シンプルで軽い ✓ Go製 • マルチプラットフォーム • 別途ランタイム(JVMとか)のインストール不要 ✓ 設定ファイルはYAML形式 6

Slide 7

Slide 7 text

使ってみた 7

Slide 8

Slide 8 text

今回は Topbeatを 試してみる 8

Slide 9

Slide 9 text

環境情報 OS :CentOS6.5 on VirtualBox Elasticsearch :2.1.0 Kibana :4.3.0 ※Elasticsearch, Kibanaはインストール済みとする 9

Slide 10

Slide 10 text

① インストール 1. 公開鍵追加 2. リポジトリ追加 3. インストール ※deb, rpm, tgz, zip形式でも公開されているので、 Windowsの場合はzipを落としましょう。 https://www.elastic.co/guide/en/beats/topbeat/1.1/topbeat-installation.html 10 rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch [beats] name=Elastic Beats Repository baseurl=https://packages.elastic.co/beats/yum/el/$basearch enabled=1 gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch gpgcheck=1 yum install topbeat /etc/yum.repos.d/

Slide 11

Slide 11 text

② 設定 1. データ転送先のElasticsearch指定 11 output: ### Elasticsearch as output elasticsearch: hosts: ["localhost:9200"] /etc/topbeat/topbeat.yml

Slide 12

Slide 12 text

③ Elasticsearchインデックス定義 1. テンプレート定義JSONをElasticsearchに取込み 12 curl -XPUT 'http://localhost:9200/_template/topbeat' -d @/etc/topbeat/topbeat.template.json"

Slide 13

Slide 13 text

④ 起動 1. 起動 13 service topbeat start

Slide 14

Slide 14 text

以上!!! 14

Slide 15

Slide 15 text

簡単でしょ? 15

Slide 16

Slide 16 text

Kibanaで 見てみよう 16

Slide 17

Slide 17 text

17 データが連携されていますね

Slide 18

Slide 18 text

グラフ作るの 面倒くさい? 18

Slide 19

Slide 19 text

Dashboardも 公開されてます 19

Slide 20

Slide 20 text

Dashboard作成 1. githubから取得 2. ElasticsearchのURLを指定してload.sh実行 20 git clone https://github.com/elastic/beats-dashboards.git ./load.sh -url "http://localhost:9200"

Slide 21

Slide 21 text

21

Slide 22

Slide 22 text

22 マシン情報 マシン別 プロセス状態 メモリ使用率 CPU使用率 プロセス当たり CPU使用率 プロセス当たり メモリ使用率 プロセス一覧 ディスク使用率

Slide 23

Slide 23 text

お手軽 モニタリング♪ 23

Slide 24

Slide 24 text

使うだけじゃ 面白くない? 24

Slide 25

Slide 25 text

作ってみた 25

Slide 26

Slide 26 text

Developer Guide https://www.elastic.co/guide/en/beats/libbeat/curre nt/new-beat.html 26

Slide 27

Slide 27 text

何つくろ? 27

Slide 28

Slide 28 text

今回作るBeat Windowsのタスクマネージャのタスクを定期的に取得する 通称「Winappbeat」 28

Slide 29

Slide 29 text

環境情報 OS :Windows7 Go :1.6 ※Goの開発環境はセットアップ済みとする 29

Slide 30

Slide 30 text

Beatの構成 30 共通機能は「libbeat」が提供 開発者はデータを収集する個別ロジックを実装するだけ

Slide 31

Slide 31 text

① libbeat取得 1. libbeatのソースをgo get 31 go get github.com/elastic/beats

Slide 32

Slide 32 text

② beatテンプレート生成(任意) 1. テンプレートジェネレータ取得 2. 実行 3. projectnameを尋ねられるので、Beatの名前を入力 今回は「Winappbeat」を指定 32 rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch cookiecutter https://github.com/elastic/beat-generator.git

Slide 33

Slide 33 text

③ 構成 最低限実装すべきは下記の赤字 33 winappbeat │ main.go │ main_test.go │ Makefile │ README.md │ winappbeat.yml … 設定ファイル ├─beater │ winappbeat.go … メインロジック ├─config │ config.go … 設定ファイルに対応する構造体 ├─docs │ index.asciidoc ├─etc │ beat.yml │ fields.yml │ winappbeat.template.json └─tests └─system │ requirements.txt │ test_base.py │ winappbeat.py └─config winappbeat.yml.j2

Slide 34

Slide 34 text

④ 設定ファイル作成 1. YAML形式で設定項目を記述 今回は ・ データの取得タイミング ・ 名称がないウィンドウの情報を取得するか? ・ 不可視ウィンドウの情報を取得するか? を設定項目として定義 34 input: # Defines how often an event is sent to the output period: 30s # Whether to get only window that has name onlyNotEmpty: true # Whether to get only visible window onlyVisible: true output: elasticsearch: hosts: ["10.23.46.5:9200"] winappbeat.yml

Slide 35

Slide 35 text

⑤ 設定ファイルに対応する構造体を実装 1. 設定ファイルと対になる構造体を実装 35 package config type Config struct { Winappbeat WinappbeatConfig } type WinappbeatConfig struct { Period string `yaml:"period"` OnlyNotEmpty string `yaml:"onlyNotEmpty"` OnlyVisible string `yaml:"onlyVisible"` } config/config.go

Slide 36

Slide 36 text

⑤ データ取得・転送ロジックを実装 libbeatのbeaterインターフェースで定義されている5メソッドを実装 ✓ Config … 設定ファイルを扱う ✓ Setup … 初期処理を行う ✓ Run … データ収集のメイン処理を行う ✓ Cleanup … 終了処理を行う ✓ Stop … 停止要求があった場合の処理を行う 36 // Beater interface that every beat must use type Beater interface { Config(*Beat) error Setup(*Beat) error Run(*Beat) error Cleanup(*Beat) error Stop() } libbeat/beat/beat.go

Slide 37

Slide 37 text

⑤ データ取得・転送ロジックを実装 1. Config 設定ファイルを読込み 37 func (bt *Winappbeat) Config(b *beat.Beat) error { // Load beater configuration err := cfgfile.Read(&bt.Configuration, "") if err != nil { return fmt.Errorf("Error reading config file: %v", err) } return nil } beater/winappbeat.go

Slide 38

Slide 38 text

⑤ データ取得・転送ロジックを実装 2. Setup 設定ファイルの値がセットされていない場合のデフォルト値をセット 38 func (bt *Winappbeat) Setup(b *beat.Beat) error { // Setting default period if not set if bt.Configuration.Winappbeat.Period == "" { bt.Configuration.Winappbeat.Period = "30s" } var err error bt.period, err = time.ParseDuration(bt.Configuration.Winappbeat.Period) if err != nil { return err } // 省略(他の設定値も同様にデフォルト値をセット) return nil } beater/winappbeat.go

Slide 39

Slide 39 text

⑤ データ取得・転送ロジックを実装 3. Run(詳細は割愛) 設定ファイルで指定した間隔でループ処理 eventオブジェクトにデータを設定し、PublishEventで送信 39 func (bt *Winappbeat) Run(b *beat.Beat) error { ticker := time.NewTicker(bt.period) for { select { case <-bt.done: return nil case <-ticker.C: } list := listWindows(win.HWND(0)) for _, w := range list { if bt.onlyNotEmpty && w.name == "" { continue } if bt.onlyVisible && !w.visible { continue } event := common.MapStr{ "@timestamp": common.Time(time.Now()), "type": b.Name, "windowname": w.name, "windowcategory": w.nameCategory, "windowclass": w.class, } b.Events.PublishEvent(event) } } } beater/winappbeat.go

Slide 40

Slide 40 text

⑤ データ取得・転送ロジックを実装 4. Cleanup 特に処理なし 5. Stop チャネルをクローズして、Runメソッドの処理を終了 40 func (bt *Winappbeat) Cleanup(b *beat.Beat) error { return nil } beater/winappbeat.go func (bt *Winappbeat) Stop() error { close(bt.done) } beater/winappbeat.go

Slide 41

Slide 41 text

⑥ コンパイル&実行 1. go build 2. 生成されたwinappbeat.exeを実行 41 go build

Slide 42

Slide 42 text

わりと 簡単でしょ? 42

Slide 43

Slide 43 text

可視化結果は デモで 43

Slide 44

Slide 44 text

一通り使ってみて、作ってみての所感 ◎ Go言語実装 ✓ クロスコンパイルできるので展開しやすい ✓ OSネイティブな実行ファイルが作られるので別途ランタイムは不要 ◎ 個々のBeatsが「小さく」「疎」である ✓ 必要なものだけを組み合わせて使う ◎ Elasticsearch + Kibanaとの連携が容易 △ Elasticsearch以外とも連携したい。 (厳密にはElasticsearch, Logstash, File, Console, Redisは連携可能) △ 設定ファイルレベルでのフィルタやパースができない 44

Slide 45

Slide 45 text

おまけ Qiitaにも書きました。 http://qiita.com/rhumie/items/d936cf866f78d7aa9393 45

Slide 46

Slide 46 text

Enjoy Beats! 46