nisshiee.org

テーブルレコード数監視ダッシュボードの自動同期

2018-12-04

昨日、MySQLの各テーブルのレコード数をDatadogに送る方法について書いた。

MySQLの各テーブルのレコード数をDatadogで監視する
https://nisshiee.org/blog/2018/103/

この記事の時点では、Datadogにメトリクスを送ることしかしていない。実際に監視を行うためにはDatadogにダッシュボードを作成してグラフとして閲覧できるようにする必要がある。

完成イメージ(テーブルの数だけ下にグラフが並ぶ)

ここで1つ問題がある。

それは、開発が進み、テーブルを新しく作ったり不要なテーブルを削除したときである。
メトリクス送信のスクリプトはinformation_schemaを参照しているので自動でテーブルの増減に追従することができるが、Datadogダッシュボードは送られてくるメトリクスに勝手に合わせてはくれない。

「テーブルを作ったり消したりしたときはこのダッシュボードも更新してね!」というルールは、1人や2人で開発してるなら守られるかもしれないが、まぁ筋は悪い。自動化したい。

解決手段

ありがたいことにDatadogダッシュボードはTerraformで管理できる。

datadog_timeboard - Terraform
https://www.terraform.io/docs/providers/datadog/r/timeboard.html

なので、Terraformの.tfファイルを自動生成して実行してやれば、自動でダッシュボードを最新化することができる。

コード

Makefile

定期的にmake clean init applyすれば良いようにした。

TERRAFORM?=terraform

default: plan
.PHONY: init clean plan apply

table.txt:
	@echo mysql -h "$(RDS_HOST)" -u "$(RDS_USER)" -p "$(RDS_DATABASE)" -NB -e "show tables" "> table.txt 2> /dev/null"
	@mysql -h "$(RDS_HOST)" -u "$(RDS_USER)" -p"$(RDS_PASSWORD)" "$(RDS_DATABASE)" -NB -e "show tables" > table.txt 2> /dev/null

main.tf: table.txt *.tmpl
	cat before.tmpl | envsubst > main.tf
	for table in `cat table.txt`; do cat graph.tmpl | table=$${table} envsubst >> main.tf; done
	cat after.tmpl | envsubst >> main.tf

clean:
	rm -f table.txt main.tf tfplan

init:
	$(TERRAFORM) init -reconfigure -backend-config="bucket=my-tfstate" -backend-config="key=datadog-mysql-row.tfstate" .

plan: main.tf
	$(TERRAFORM) plan

apply: main.tf
	$(TERRAFORM) plan -out=tfplan
	$(TERRAFORM) apply tfplan

before.tmpl

resource "datadog_timeboard" "main" {
  title       = "MySQL Row Count"
  description = "Managed by terraform"

graph.tmpl

この部分が繰り返し記述される。


  graph = {
    title     = "${table}"
    viz       = "timeseries"
    autoscale = true
     request {
      aggregator = "avg"
      q          = "avg:mysql.tables.${table}.records.count{*}"
       style {
        palette = "dog_classic"
        type    = "solid"
        width   = "normal"
      }
    }
  }

after.tmpl

}

backend.tf

  • この backendprovider の指定は、 terraform init を実行するときに必要
  • main.tf の生成をしなくても terraform init できる状態にしたい

という理由で、 main.tf の基になるテンプレートとは別の .tf ファイルに書いている

terraform {
  backend "s3" {
    region = "ap-northeast-1"
  }
}

provider "datadog" {}