https://docs.datadoghq.com/ja/monitors/types/database_monitoring/
https://registry.terraform.io/providers/DataDog/datadog/latest/docs/resources/monitor
- 待機クエリ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
resource "datadog_monitor" "rds_waiting_queries" { name = "[${var.service_name}] rds_waiting_queries" type = "database-monitoring alert" query = "database-monitoring(\"dbm_type:activity source:mysql service:${var.service_name} @db.is_waiting:true\").index(\"*\").rollup(\"count\").by(\"host\").last(\"5m\") > ${var.rds_waiting_queries_critical}" require_full_window = true evaluation_delay = 120 notify_no_data = false include_tags = true monitor_thresholds { warning = var.rds_waiting_queries_warning critical = var.rds_waiting_queries_critical } message = <<-EOT @${var.slack_channel} Waiting queries detected (tag: @db.is_waiting:true) - Critical: {{threshold}} queries - Current: {{value}} Check in DBM > Query Samples with filter `@db.is_waiting:true` EOT tags = local.combined_tags } |
- スロークエリ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
resource "datadog_monitor" "rds_long_running_queries_alert" { name = "[${var.service_name}] rds_long_running_queries_alert" type = "database-monitoring alert" query = "database-monitoring(\"dbm_type:activity source:mysql service:${var.service_name} @duration:>${var.rds_slow_queries_duration_threshold * 1000000000}\").index(\"*\").rollup(\"count\").by(\"host\").last(\"5m\") > ${var.rds_slow_queries_rate_critical}" require_full_window = true evaluation_delay = 120 notify_no_data = false notify_audit = false timeout_h = 1 include_tags = true monitor_thresholds { warning = var.rds_slow_queries_rate_warning critical = var.rds_slow_queries_rate_critical } escalation_message = "RDS long running queries (> ${var.rds_slow_queries_duration_threshold}s) detected for ${var.service_name}_${var.environment}" message = <<-EOT @${var.slack_channel} RDS long running queries detected (> ${var.rds_slow_queries_duration_threshold}s). - Critical: {{threshold}} queries - Current value: {{value}} queries Long running queries can indicate: - Poorly optimized queries - Missing or inefficient indexes - Lock contention or blocking - Resource bottlenecks (CPU, I/O) Please check: - DBM > Query Samples (filter: @duration:>${var.rds_slow_queries_duration_threshold * 1000000000}) - Execution plans (EXPLAIN) - Index usage - Lock waits EOT tags = local.combined_tags } |
- variables.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# Database Monitoring Variables variable "rds_waiting_queries_warning" { description = "Warning threshold for number of waiting queries (tag: @db.is_waiting:true)" type = number default = 5 } variable "rds_waiting_queries_critical" { description = "Critical threshold for number of waiting queries (tag: @db.is_waiting:true)" type = number default = 10 } variable "rds_slow_queries_rate_warning" { description = "Warning threshold for number of long-running queries (duration > threshold)" type = number default = 1 } variable "rds_slow_queries_rate_critical" { description = "Critical threshold for number of long-running queries (duration > threshold)" type = number default = 3 } variable "rds_slow_queries_duration_threshold" { description = "Time threshold in seconds to consider a query as 'slow/long-running'" type = number default = 600 } |
Database Monitoringで可視化されたデータに対してアラート設定ができる。今回は待機クエリやスロークエリのアラート通知。typeは database-monitoring alert
となる。queryがなかなか複雑なため、一度手動で作成して確認することをおすすめする。また、durationがナノ秒単位となるため、1000000000を掛ける必要がある。10分なら600を掛ければOK。
Was this helpful?
0 / 0
1989年生まれのFindy/SRE。ホスティングから大規模なアドテクなどのインフラエンジニアとして携わる。現在はサービスの信頼性向上、DevOps、可用性、レイテンシ、パフォーマンス、モニタリング、オブザーバビリティ、緊急対応、AWSでのインフラ構築、Docker開発環境の提供、IaC、新技術の検証、リファクタリング、セキュリティ強化、分析基盤の運用などを担当している。
個人事業主では数社サーバー保守とベンチャー企業のインフラコンサルティングを行うほか、TechBullを創業し、未経験者向けにSREのコーチングやコミュニティ運営、LT大会の開催、 会員管理システム「Members」の開発をリードしている。さらに、エンジニア向けYouTubeメディア「TECH WORLD」ではSRE関連の動画に出演し、過去には脆弱性スキャナ「Vuls」のOSS活動にも貢献。