kintone縛りでURL監視システムを構築する

kintoneにできるだけ処理をよせてURL監視（http/https）システムが作れるか試してみました。kintoneのお試しで無理やり作ってみたので本当にURL監視したい場合は[pingdom](https://www.pingdom.com/)や[site24x7](https://www.site24x7.jp/)などを使うのが良いかと思います。

ソースコード
https://github.com/isotai/url_monitoring_by_kintone

# 機能
- 15分に1回ポーリング
- URLごとに監視するか、中止するか設定できる
- URLごとにしきい値をつけられる(連続n回失敗したらアラートする)
- URLごとにしきい値を超えた場合にアラートするか決められる

# 処理フロー
![XL9TIy9G6BxVhpZigWAXwox27z1Lq5Lu8RJfo6Rel0h1dPEr24iYflI99f9QIeJIf_wOr-FMl-WzcyeKmLrixvxdUS_xlCyMJXlHb94vI4ZI8HQQeILrufusUJiFj0li1rWHx-H88cHbRPM4Gfj4vzO9x-T7ZKS41I3lQxgHr1MWLM0bO4qmMwAc7Q3VG3zbrEb9Go4fBHOto0O1LWR6W9q1Uq4Uc0si0RGEj2T6qglXxy2v.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162167/e0b26c90-387c-7158-c617-1fe4dda0eff9.png)


# kintoneアプリ
アプリは4つ作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162167/3eac7384-240b-9b7d-daf9-0d1b22af30ff.png)

- 「url_monitoring_resorce」アプリがユーザーが監視対象のURLやしきい値を入力するアプリです。

- 「url_monitoring_alarm」はURL監視の失敗回数を記録するアプリです。「url_monitoring_resorce」でレコードを登録した際に自動的に「url_monitoring_alarm」のレコードが作成されます。

- 「url_monitoring_result」は監視結果を登録するアプリです。
- 「[開くの禁止]monitoring_定期実行」にレコードはなく、本アプリを開いた時にURLへの監視がキックされるようにしています。監視機能をkintoneのJavaScriptのカスタマイズ機能で実装しているので処理を実行するためにはアプリにアクセスしてJavaScriptを実行する必要があります、そのため監視キック用のアプリを作成しています。監視は別サーバーで実行して、結果をkintoneに登録するのが楽そうですがkintone縛りでやっているので、監視もkintoneで実装します。。

![bP7FJW8n4CRl-nGD9ptu6bwyU2UaQQ1YmzAIjdiWGCA21nCrNWGY60b_97eG8J6UZ2_JR1VUmh9qoO9YufpwpNmp_NLQGja2ocEGAX0g6SNmZF5Y2Y019E9vBA4e2ucBeE80WAaaiWnI7dTXaL4Y6ISq3paMpEDP77N58cfO1Sc1zEb9nghWxMin7vW1Lgl6K3LVLFDJDI_ZbDzH_etoBuBw-61P7uKVtM0yrwrEq7lKhTcX.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162167/aa31971d-6d24-c9cd-a895-bdeac9936cda.png)

* kintoneにプライマリーキー、外部キーを設定することはできないので、上記図の[PK][FK]はそうしたい気持ちです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162167/2fa76b94-dc94-e825-ca80-5e230f74acce.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162167/4176c9de-c55e-cc12-ecf8-478242c1ef20.png)

# ポイント

###  定期実行
kintone側に実装した監視処理を定期実行したかったのですが、kintone側にはcronのような定期実行を設定できる機能がない、作成した関数をAPIとして公開するようなこともできないようでした。そのためkintoneの[event処理](https://developer.cybozu.io/hc/ja/articles/201941954-%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E5%87%A6%E7%90%86%E3%81%AE%E8%A8%98%E8%BF%B0%E6%96%B9%E6%B3%95) (JavaScriptのイベントリスナーの様な機能)を利用して監視処理を実行する必要があります。今回は苦肉の策として、「[開くの禁止]monitoring_定期実行」アプリの一覧画面表示イベントで監視処理を実行するように設定。別サーバーでヘッドレスブラウザーを使用して定期的に「[開くの禁止]monitoring_定期実行」へアクセスして処理をキックするように設計しました。kintone縛りしたかったのですが、定期実行をキックする部分のみkintoneだけでは実現できず... 

具体的には[puppeteer](https://github.com/puppeteer/puppeteer)というHeadless Chrome使うのを便利にするNode ライブラを使用して処理を書き、自宅のラズベリーパイでcronを設定して15分間隔で定期実行するようにしています。

```javascript

  1 const puppeteer = require('puppeteer');
  2 const user = 'xxx'
  3 const pass = 'xxx'
  4 const kintone_app_url = 'xxx'
  5 const kintone_login_url = 'xxx'
  6 
  7 (async () => {
  8   const browser = await puppeteer.launch({
  9     executablePath: '/usr/bin/chromium-browser',
 10     args: ['--no-sandbox']
 11   });
 12   const page = await browser.newPage();
 13   await page.goto(kintone_login_url)
 14   await page.waitFor(1000);
 15   await page.$eval('input[name="username"]', (el) => {
 16     el.value = user
 17   });
 18   await page.waitFor(1000);
 19   await page.$eval('input[name="password"]', (el) => {
 20     el.value = pass
 21   });
 22   await page.waitFor(1000);
 23   await page.click('input[type="submit"]');
 24   await page.waitFor(1000);
 25   await page.goto(kintone_app_url);
 26   await page.waitFor(2000);
 27   await browser.close();
 28 })();
```

###  JavaScriptからの別ドメインへの疎通確認
クロスドメイン制約で別ドメインへのリクエストが送れないのでkintoneに用意されている[kintone.proxy(url, method, headers, data, callback, errback)メソッドで回避します。](https://developer.cybozu.io/hc/ja/articles/202166320-%E5%A4%96%E9%83%A8API%E3%81%AE%E5%AE%9F%E8%A1%8C)

# 所感
今回kintone側に無理やり処理を寄せましたが、本来であればkintoneはフロント側のデータ入力と表示、データベースの役割で使用し、監視などのロジックはlambdaなど使って構築するのが良いのかなと思います。