やること
今回は、newrelic_nrql_alert_condition
を設定していきます。
特に詰まりそうな、部分を重点的に説明できるといいかなと思います。
ソースコード
簡単にterraform module化しているので、必要なかたはソースからダウンロードしてみてください。
terraform provider について
参考URL
NewRelicのprodiverでは、以下が必須の設定項目になっています。
- account_id (アカウントID)
-
NEW_RELIC_ACCOUNT_ID
の環境変数で代用可能
-
- api_key (APIキー)
-
NEW_RELIC_API_KEY
の環境変数で代用可能 - NRAKから始まるキー
-
- region (リージョン)
-
US
もしくはEU
-
provider "newrelic" {
account_id = "<Your Account ID>"
api_key = "<Your Personal API Key>" # usually prefixed with 'NRAK'
region = "US" # Valid regions are US and EU
}
newrelic_insights_event
以外は、基本的に api_key の設定でOKです。
newrelic_nrql_alert_condition について
これを使うと、NRQLを使って確認できるメトリクスであれば、ほとんどのアラートを設定できます。
ちなみに、 newrelic_alert_policy
(policy) に対して、複数のアラートを設定可能です。
これの何が嬉しいかというと、
今までAPMとInfrastructureのアラートを設定するときは、 newrelic_alert_condition
と newrelic_infra_alert_condition
2つのresourceを使い分けないといけなかったのですが、これがあれば 1つのresouceで設定可能
になります。
さらに、NRQLをそのまま使用できるので、既存のダッシュボードの設定から、View query
でNRQLをコピーしてそのまま貼り付けるだけでアラートをコード化できます。
参考URL
- https://registry.terraform.io/providers/newrelic/newrelic/latest/docs/resources/nrql_alert_condition
APMのSlow Queryアラートを設定してみる
where句に設定可能な、演算子(NRQL)はこちらを参照ください
newrelic_nrql_alert_condition の設定項目で難しいところ
-
type
- おそらく、どの条件でアラート設定をするかというもの
- baseline と outliner も設定可能だけど、通常のアラートであれば static でOK
-
value_function
- single_value と sum が設定可能、たぶんメトリクスの集計方法
- single_value だと合計値じゃないので、
メトリクスがないところはデータなし
となる
- single_value だと合計値じゃないので、
- single_value と sum が設定可能、たぶんメトリクスの集計方法
-
violation_time_limit
- この時間を設定していると、アラート発生から時間経過後になにかしらの自動設定が可能
- ちなみに、TerraformのドキュメントにはDEPRECATEDと書いてあったけど、
violation_time_limit_seconds
のほうが、terraform plan時にDEPRECATEDになっていた、ドキュメントのミス??
- nrql ->
evaluation_offset
- よくわからないけど、3分にしておく
- グラフを表示するときに使う設定?
- NRQLで設定したクエリの開始時間??
- critical/warning ->
threshold_occurrences
- 閾値を超えた値の評価方法
-
all
: すべての値が閾値を超えている -
at_least_once
: 1つ以上の値が閾値を超えている
-
- value_functionでsumを選んだ場合は、
at_least_once
のみ設定可能
- 閾値を超えた値の評価方法
moduleのサンプル
resource "newrelic_alert_policy" "alert" {
name = var.name
}
resource "newrelic_nrql_alert_condition" "alert" {
policy_id = newrelic_alert_policy.alert.id
type = var.type
name = var.name
value_function = var.value_function
violation_time_limit = var.violation_time_limit
nrql {
query = var.query
evaluation_offset = var.evaluation_offset
}
dynamic "critical" {
for_each = var.critical
content {
operator = critical.value.operator
threshold = critical.value.threshold
threshold_duration = critical.value.threshold_duration
threshold_occurrences = critical.value.threshold_occurrences
}
}
dynamic "warning" {
for_each = var.warning
content {
operator = warning.value.operator
threshold = warning.value.threshold
threshold_duration = warning.value.threshold_duration
threshold_occurrences = warning.value.threshold_occurrences
}
}
}
variable "name" {
type = string
}
variable "type" {
type = string
}
variable "value_function" {
type = string
}
variable "violation_time_limit" {
type = string
default = "ONE_HOUR"
}
variable "query" {
type = string
}
variable "evaluation_offset" {
type = number
default = 3
}
variable "critical" {
type = list(any)
}
variable "warning" {
type = list(any)
default = []
}
module呼び出し側のサンプル
module "nrql_alert_mysql_slow_query" {
source = "../modules/newrelic/nrql_alert"
name = "${local.name} slow query"
type = "static"
value_function = "sum"
# query
## ヒアドキュメントを使うとわかりやすいので、おすすめ
## apm_app_name はAPMの設定で付けている名前に変更する
query = <<EOF
SELECT average(apm.service.datastore.operation.duration) * 1000
FROM Metric
WHERE (appName = '${var.apm_app_name}')
AND ((metricTimesliceName = 'Datastore/operation/MySQL/show' AND datastoreType = 'MySQL'))
FACET `metricTimesliceName`
EOF
# critical
## operator は閾値の下か上かどちらでアラートを出すか
## threshold_duration は秒単位なので、 300secで5分
critical = [
{
operator = "above"
threshold = 10
threshold_duration = 300
threshold_occurrences = "at_least_once"
}
]
warning = [
{
operator = "above"
threshold = 5
threshold_duration = 300
threshold_occurrences = "at_least_once"
}
]
}
アラートの確認方法
Alerts & AI
-> Polices
-> newrelic-sample-default slow query
ちゃんとPreview chart
が表示されていることを確認
Thresholds
の設定値も確認