テーブルレコード数監視ダッシュボードの自動同期
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
- この
backend
とprovider
の指定は、terraform init
を実行するときに必要 main.tf
の生成をしなくてもterraform init
できる状態にしたい
という理由で、 main.tf
の基になるテンプレートとは別の .tf
ファイルに書いている
terraform {
backend "s3" {
region = "ap-northeast-1"
}
}
provider "datadog" {}