Glide Note

glidenote's blog

ChatOps + NightmareでメトリクスグラフとBIレポートをSlackに投げるようにした

TL;DR

  • Slack + Hubot + Nightmare + CircleCI を利用してSlackにNewRelicのメトリクスグラフやBIレポートを投げるようにした
  • Slackなどチャットツールとのintegrationが無いツールでもグラフを投稿出来るようにした
  • 会社のKPIやサービスの状態をSlack上からhubotを利用して誰でも簡単に確認が出来るようになった

仕組み

  1. Slack上でHubotを呼び出す(hubot-cronで自動で稼働する)
  2. HubotがCircleCIのAPIを叩いて、rebuid
  3. CircleCI上でNightmareを利用し、NewRelicやBIツールのスクリーンショットを取得し、s3にアップロード
  4. SlackのIncoming webhooksを利用してグラフを投稿する

NewRelicにログインしてスクリーンショットを取るスクリプトサンプル

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var Nightmare = require('nightmare');
var fs = require('fs');

var urls = [];
urls.push('https://rpm.newrelic.com/accounts/xxxxxxxxxxxxxxxxxxxxxxxxxxx');
urls.push('https://rpm.newrelic.com/accounts/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
urls.push('https://rpm.newrelic.com/accounts/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');

var i = 0;

for(u in urls) {
    var url = urls[u];
    var filename = '/tmp/tmp' + i + '.png';
    fs.appendFile('/tmp/urls.txt',url+'\n');
    new Nightmare()
      .viewport(1600, 900)
      .useragent("Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36")
      .goto('https://login.newrelic.com/login')
      .type('#login_email', '[email protected]')
      .type('#login_password', 'foobarpass')
      .click('#login_submit')
      .wait()
      .goto("https://rpm.newrelic.com/set_time_window?tw%5Bdur%5D=last_3_days")
      .goto(url)
      .wait(10000)
      .screenshot(filename)
      .run(function (err, nightmare) {
        if (err) return console.log(err);
        console.log('Done!');
     });
    i = i + 1;
}

circle.yml

  • CircleCI上のphantomjsが古くグラフが正常に表示されないので、2.0.1にバージョンアップしてます。
  • ブランチ毎で処理を変更
  • スクリーンショットをs3にアップロードして、slackにpostするスクリプトはいろいろとハードコードされているので割愛…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
dependencies:
  pre:
    - bundle install
    - npm install
    - sudo apt-get update; sudo apt-get install libicu52
    - curl --output /home/ubuntu/bin/phantomjs-2.0.1-linux-x86_64-dynamic https://s3.amazonaws.com/circle-support-bucket/phantomjs/phantomjs-2.0.1-linux-x86_64-dynamic
    - chmod a+x /home/ubuntu/bin/phantomjs-2.0.1-linux-x86_64-dynamic
    - sudo ln -s --force /home/ubuntu/bin/phantomjs-2.0.1-linux-x86_64-dynamic /usr/local/bin/phantomjs

test:
  pre:
    - phantomjs --version
    - npm test

deployment:
  master:
    branch: master
    commands:
      - node ./scripts/foobar.js
      - ./bin/post_image_to_slack -c \#bot-test -t "post title" -u "kaizenbot"

  newrelic-webapp-overview:
    branch: newrelic/webapp-overview
    commands:
      - node ./scripts/newrelic-webapp-overview.js
      - ./bin/post_image_to_slack -c \#engineering -t "New Relic Webapp Overview" -u "New Relic Report Bot"

  newrelic-external-services:
    branch: newrelic/external-services
    commands:
      - node ./scripts/newrelic-external-services.js
      - ./bin/post_image_to_slack -c \#engineering -t "New Relic External Services" -u "New Relic Report Bot"

  domo-variations:
    branch: domo/variations
    commands:
      - node ./scripts/domo-variations.js
      - ./bin/post_image_to_slack -c \#general -t "K2 & BP Variations" -u "BI Report Bot"

実際の動作

  • 実際にはhubot-cronを用いて自動で動くようになっています。
  • BIレポートは日替わりで内容を変えるようにしてます。
  • hubotを利用して、誰でも任意のタイミングで実行出来るようにしてます。

参考

私が悪戦苦闘しているのを横目に、技術顧問が寿司情報を収集するのにサラッと使いこなしていた有益プレゼン死霊

Comments