Coppeは、BigQuery用データ品質監視ツールです。定期的なBigQueryへの監視やSlackへの通知を行います。監視項目の追加はYAMLとSQLファイルのみで可能です。
インフラ構成は下図の通りです。TerraformとGitHub Actionsによる自動デプロイが可能です。
- GitHub Actions Secretsの追加
- GOOGLE_APPLICATION_CREDENTIALS_JSON - JSON形式のGCP認証キー
- Cloud Monitoring用のNotification Channel IDの設定
- Google Cloud Consoleで通知チャンネルにSlackを追加。公式ドキュメントはこちら
- 設定後、以下のgcloudコマンドで通知チャンネルIDを取得し、coppe.tfの
locals.slack_channel_id
に貼り付ける。公式ドキュメントはこちら
$ gcloud alpha monitoring channels list | grep 'name:'
- .env.yamlに環境変数を設定
- GCP_PROJECT_ID (デプロイ用のGCPプロジェクトID)
- SLACK_HOOK_URL (アラート通知用のデフォルトのSlack Webhook URL。詳しくはAlert Channel)
- TIMEZONE (スケジュール用。日本時間の場合、Asia/Tokyo)
-
./setup.sh
の実行で、Service Accountとtfstate管理用のStorage Bucketを作成 -
yaml
フォルダーにYAMLファイルを以下のフォーマットで記述
- schedule: "* * * * *"
sql: "SELECT count(*) as cnt FROM foo"
expect:
expression: "cnt == 0"
description: "Foo table check"
- schedule: "* * * * *"
sql: "SELECT * as cnt FROM foo"
expect:
row_count: 0
description: "Foo table check"
- GitHubにPush/Merge - GitHub ActionsとTerraformによって、インフラの設定やデプロイは行われます
監視項目のスケジュールはcron形式で記述してください。cron形式は以下の方法で記述できます。
<minute> <hour> <day> <month> <weekday>
例:
毎時0分と30分:0,30 * * * *
毎時10分、11分、12分:10-12 * * * *
5分毎:*/5 * * * *
毎週月曜日の12時:0 12 * * MON
詳しくはこちら(https://github.com/adhocore/gronx#cron-expression)
sql:
に直接SQLを書く代わりに、SQLファイルsql
フォルダーに置いて、sql
フォルダーからの相対パスにをsql_file:
に書くこともできます。
例:
- ...
sql_file: sample.foo
...
In sql/sample.foo
,
SELECT count(*) FROM foo
* 注意: sql:
かsql_file
のどちらかは必須です
SQLにパラメーターを設定することもできます。その場合、params:
に連想配列として記述してください。
例:
- ...
sql: SELECT count(*) FROM `{{.table}}` limit {{.limit}}
params:
table: "zz.foo"
limit: 100
...
* Coppeはテキストテンプレートライブラリを使用しています。書き方など詳しくはこちら(https://pkg.go.dev/text/template)
複数のパラメータの組み合わせを使用したい場合、matrix:
を利用することも可能です。
例:
- ...
sql: SELECT count(*) FROM `project-{{.env}}.schema.table_name` ...
matrix:
env: [stg, prd]
...
上の監視項目は、下の2通りの組み合わせに分解されます。
- ...
sql: SELECT count(*) FROM `project-stg.schema.table_name` ...
...
- ...
sql: SELECT count(*) FROM `project-prd.schema.table_name` ...
...
* Coppeはテキストテンプレートライブラリを使用しています。書き方など詳しくはこちら(https://pkg.go.dev/text/template)
Coppeは期待するクエリ結果として、row_count:
もしくはexpression:
を利用可能です。
row_count:
:クエリ結果の列数
expression:
:正常であればtrue
になるべきクエリ結果を利用した式。例は以下を参照。
- ...
sql: SELECT table_name, count(*) as error_count ...
...
expected:
expression: table_name == "foo" && error_count > 10
* 注意:row_countとexpressionは、どちらか一方のみ記載可能です
監視項目によって、Slackの通知チャンネルを使い分けたい場合、環境変数の追加とchannel:
で通知するURLを指定できます。指定しなかった場合、デフォルトでSLACK_HOOK_URLが使われますが、channel:
で指定されている場合、SLACK_HOOK_URL_ + channel:
の値を環境変数から取得し、通知に使用します。
例えば、
channel: CRITICAL
のように指定する場合、環境変数(.env.yaml)に'SLACK_HOOK_URL_CRITICAL'を取得します。もし、環境変数になかった場合は代わりにデフォルトのURLが使用されます。また、channel:
の値はケース無視(criticalと書いてもCRITICALとして扱われる)されますが、環境変数は大文字で書くようにしてください。
クエリ結果が期待される値でなかった場合、Slackへの通知を行います。アラートメッセージはクエリ結果を利用・展開して書くこともできます。また、SQLに使用したparamsやmatrixも使用することが可能です。
それぞれの型は、
- query_result: []map[string]interface{}
- params: map[string]interface{}
- matrix: map[string]interface{}
例:
- ...
sql: SELECT table_name, count(*) as cnt, avg(diff) as delay_avg, max(diff) as delay_max ...
params:
interval_time: 5
matrix:
env: [prd, stg]
description: |
ENV: {{ .matrix.env }}
Detected more than {{ .interval_time }} min data transfer delay in the following tables
{{ range . }}
{{ .table_name }} : {{ .cnt }} (cnt) : {{ .delay_avg }} (delay_avg) : {{ .delay_max }} (max_delay)
{{ end }}
クエリ結果はの型は[]map[string]interface{}
なので、基本的な書き方としては、
{{ . }}
で、クエリ結果を[]map[string]interface{}のまま、printfします
{{ range . }}
{{ .column_name }}
{{ end }}
クエリ結果をループして表示可能です。なお、column_nameには、クエリで取得したカラム名のみ使用可能です。
{{ range $i, $row := . }}
{{ $i }} : {{ $row.column_name }}
{{ end }}
また、インデックスはこのように取得できます。
{{ range . }}
{{ if ne .column_name "" }}
- foo
{{ else }}
- bar
{{ end }}
{{ end }}
if文はこのように記載可能です。
* テキストテンプレートライブラリを使用しているので、書き方など詳しくは公式ドキュメントを参照してください。
IssueやPull Requestの作成など、コントリビューションは誰でも歓迎です。コントリビューターはContributor Covenantを遵守することを期待します。
CoppeはMITライセンスを適応してオープンソースとして公開しています。LICENSE を参照してください。