DatadogのSynthetics(外形監視)つかってみた

外形監視（API_test）が2月末にリリースされたということで試してみました。
https://www.datadoghq.com/blog/introducing-synthetic-monitoring/
https://docs.datadoghq.com/synthetics/api_test/

ほかにも「Browser Tests」というのがあるようです。
https://docs.datadoghq.com/synthetics/browser_test/
Datadog test recorderというchromeプラグインを入れて使うようです。
（[selenium](https://www.google.com/search?q=selenium&oq=selenium)や[Puppeteer](https://qiita.com/kanoe/items/9043a81d28a1b733b2e2)みたいなE2Eテストができるというものらしい）

とりあえず普通に外形監視設定はマニュアルの動画に出てるとおりにさくっとできてました。
Advanced Option指定でベーシック認証があったので認証突破できることを確認してみました。

![synthetics_authbasic.png](https://qiita-image-store.s3.amazonaws.com/0/25031/341ba717-c6c5-d3da-3345-631e6937ea3c.png)

TestURLボタンを押すとリクエストヘッダとボディが返ってくるので右にでてるのをクリックすると
Assertionという条件がValidateResultのあたりに勝手に設定される感じでした。
（複数条件の計算結果を用いるみたいなことはできなさそうでした）
sorryに遷移したらアラートなど、ヘッダで判別できるようならその条件定義できそう。

設定後の詳細画面でどの地域で何にどのくらいかかってる等のグラフがでてました。
![synthetics_detail.png](https://qiita-image-store.s3.amazonaws.com/0/25031/ae743dfa-dbf7-fd64-50e5-4ef991df1f1d.png)

ローカルホストではなく各地域から確認できることとエージェント設定不要なのはいいなと思いました。
~~接続元IPが公開されてる様子はないのでファイアウォール設定は監視対象http(s)ポートはAny許可にしないと監視できないようでした。~~
接続元IPレンジ公開されてる情報を見かけたので訂正しておきます。
https://ip-ranges.datadoghq.com/
たぶんIP変わったらセキュリティグループ的な制限更新しないと監視に失敗しそう。
定期で自動チェックして変わったら更新するスクリプトの仕込みが要る類な気がします。

19/9/18追記、プライベートロケーションという任意の場所からのチェックが可能になった模様（要サポート申請）。詳しくは以下リンク先をどうぞ。
https://docs.datadoghq.com/ja/synthetics/private_locations/?tab=docker

SSL証明書の期限通知について、~~http_checkでやったことあったのですが
Syntheticsでできるかどうかはちょっと[マニュアル見た感じ](https://docs.datadoghq.com/synthetics/api_test/#ssl-errors)そういう設定は見当たらずです。失効したことならわかりそうだけど事前通知の設定方法は私にはわからなかったです。~~

メトリクスが取れるようなことがマニュアルに書いてあったので訂正。

synthetics.ssl.time_to_expiry というのが証明書の残りの期限を分単位でとれる模様。
（エージェントの設定ファイルいじらなくて済むのでうれしい機能ですね。）
https://docs.datadoghq.com/synthetics/#metrics

やりかたを書いてくださっている方が。APIテスト作るときに最初にSSLと選ぶとこがあるみたいですね。
https://dev.classmethod.jp/etc/datadog-synthetics-api-test-certificate/

エージェントでの証明書期限設定するやり方は今後は要らなさそうですが一応置いときます。
(接続元絞るも難しいか内部通信しかしないが証明書は使ってるケースでは要るかも）
カスタムなhttp_checkで（要エージェント設定）SSL証明書の期限通知↓参考。
https://docs.datadoghq.com/integrations/http_check/

```
## agentの設定（ホスト）
# cat /etc/datadog-agent/conf.d/http_check.d/conf.yaml
instances:
-   name: isao-httpschk
    url: https://www.isao.co.jp
    disable_ssl_validation: true

## monitorの設定
{
    "name": "ssl cert valid date is too short",
    "type": "query alert",
    "query": "avg(last_1d):avg:http.ssl.days_left{*} by {url} < 7",
    "message": "URL: {{url.name}}  \nssl証明書の有効期限が短すぎます  \n閾値：{{threshold}}   \nトリガされた値：  \n{{value}}   \n",
    "tags": [],
    "options": {
        "notify_audit": false,
        "locked": false,
        "timeout_h": 0,
        "silenced": {},
        "include_tags": true,
        "no_data_timeframe": null,
        "require_full_window": true,
        "new_host_delay": 300,
        "notify_no_data": false,
        "renotify_interval": 0,
        "escalation_message": "",
        "thresholds": {
            "critical": 7,
            "warning": 14
        }
    }
}
```
AWSインテグレーションしていてACMのメトリクスから期限みられれば、「aws.certificatemanager.days_to_expiry」をつかっても監視設定可能。


あと他にはブラウザテスト用っぽいID/PW管理する項目が増えてました。
テスト自体から平文で見えてしまうの防止するものな気がしました。

あとbot識別するやつが増えてました。
https://docs.datadoghq.com/synthetics/identify_synthetics_bots/

お値段はこのへんで
1ヶ月あたり1万回のテスト実行あたりの価格設定で、1ヶ月＄5とのことでした。
（from地域を複数選ぶとその費用がかかる気がするのでサービス提供地域からの監視だけでよさそう）
https://www.datadoghq.com/pricing/

APIとterraformのリソースは~~なさそうで~~なんかふえてましたね。monitorと違ってeditはできるけどexportはないようでした。
https://docs.datadoghq.com/api/
https://www.terraform.io/docs/providers/datadog/index.html

apiでデータとってくる(terraformでimportするときにつかうパラメータを確認する）

```
api_key=******************************
app_key=*************************************
curl "https://api.datadoghq.com/api/v1/synthetics/tests?api_key=${api_key}&application_key=${app_key}"|jq . >> all_monitor.json
```

terraformのテンプレ以下の様でよさそうです。ただidはなんかmonitorと違いpublic_id(WEBUIだと詳細画面のURIで確認可能）でした。

追記：subtypeが追加されてて、証明書監視はssl,URL監視はhttpの指定が必要に。provider.datadog設定上げてinit打つとパラメータ追加されてました
https://www.terraform.io/docs/providers/datadog/r/synthetics.html


```

resource "datadog_synthetics_test" "url_url1" {
  name = "[${var.environment}]URL Test on url1"
  type = "api"
  subtype = "http"
    request = {
    port = "443"
    host = ""
    method = "GET"
    url = "https://<url1>"
    timeout = 30
  }
  assertions = [
    {
      type = "statusCode"
      operator = "is"
      target = "200"
    },
    {
      type = "header"
      property = "content-type"
      operator = "is"
      target = "text/html; charset=UTF-8"
    },
    {
      type = "responseTime"
      operator = "lessThan"
      target = "2000"
    }
  ]
  locations = [ "aws:ap-northeast-1" ]
  options = {
    min_failure_duration = 0
    min_location_failed = 1
    tick_every = 60
  }
  message = " ${var.notifies1}"
  tags = []
  status = "live"
}

resource "datadog_synthetics_test" "ssl_url1" {
  name = "[${var.environment}]SSL cert valid date is too short on url1"
  type = "api"
  subtype = "ssl"
  request = {
   port = "443"
   host = "<url1>"
  }
  assertions = [
    {
      operator = "isInMoreThan"
      target = "14"
      type = "certificate"
    }
  ]
  locations = [ "aws:ap-northeast-1" ]
  options = {
    min_failure_duration = 0
    min_location_failed = 1
    tick_every = 86400
  }
  message = "SSL証明書の有効期限が迫っています。 ${var.notifies1}"
  tags = []
  status = "live"
}
```

普通のmonitorのterraformでどうこうするのは以前にかいたやつが↓
https://qiita.com/smallpalace/items/8a8f927321c19daef0ad

以上。