通知にAlertmanagerを使用しますが、デフォルトではalertmanager
Webフックは1つだけです。私の要件に応じてWebフックも必要です。
既存の構成
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: {{ getsdcv "system" "group_wait" "10s"}}
group_interval: {{ getsdcv "system" "group_interval" "10s"}}
{{- $repeat_interval := getsdcv "system" "repeat_interval" "" }}
{{- if not (eq $repeat_interval "") }}
repeat_interval: {{ $repeat_interval }}
{{- end }}
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://{{ getsdcv "system" "ip" "localhost"}}:{{ getsdcv "system" "port" "8005"}}/'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
新しいウェブフックを追加した後
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: {{ getsdcv "system" "group_wait" "10s"}}
group_interval: {{ getsdcv "system" "group_interval" "10s"}}
{{- $repeat_interval := getsdcv "system" "repeat_interval" "" }}
{{- if not (eq $repeat_interval "") }}
repeat_interval: {{ $repeat_interval }}
{{- end }}
receiver: 'web.hook'
routes:
- receiver: "web.hook"
continue: true
- receiver: "web.hook1"
match:
alertname: BusinessKpiDown
continue: true
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://{{ getsdcv "system" "ip" "localhost"}}:{{ getsdcv "system" "port" "8005"}}/'
- name: 'web.hook1'
webhook_configs:
- url: 'http://0.0.0.0:8010/hooks/my-webhook'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
シェルスクリプトでこれを試しましたが失敗しました。
awk -v RS='^$' '{$0=gensub(/(receivers:\s+users:)(\s+)/,"\\1\\2- name: 'web.hook2'\\2",1)}1'
ただし、新しいWebフックを添付することはできません。
答え1
注:この回答は、次の非常に異なる入力文書に適用されます。
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: ''
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
これで質問の文書が修正され、有効なYAMLファイルにはなりません。残念ながら、この回答はそのまま使用できません。興味深いかもしれない方のためにここに残しておきます。
receivers
配列に次の項目を追加したいようです。
- name: web.hook2
webhook_configs:
- url: ''
...そしてそこには
- continue: true
各receivers
要素にwebhook_configs
。
私たちはこれを行うことができます。yq
私達はからまで利用できますhttps://kislyuk.github.io/yq/:
yq -y '
.receivers += [{"name":"web.hook2","webhook_configs":[{"url":""}]}] |
.receivers |= map(.webhook_configs += [{"continue":true}])' file.yaml
yq
JSONパーサーの周りのYAML対応ラッパーで、必要な部分を配列に追加し、追加のキー値を配列内のjq
項目に追加します。receivers
webhook_configs
receivers
コマンドラインで新しいWebフックの名前とそのURLを渡すには、シェル変数を使用して文字列として式に挿入しないyq
でyq
くださいyq
。必要):
myname='web.hook2'
myurl=''
yq -y --arg name "$myname" --arg url "$myurl" '
.receivers += [{"name":$name,"webhook_configs":[{"url":$url}]}] |
.receivers |= map(.webhook_configs += [{"continue":true}])' file.yaml
yq
-i
--in-place
または、オプションを使用した「内部」編集もサポートしています。
結果は質問の例を提供します。
global:
resolve_timeout: 5m
route:
group_by:
- alertname
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
receiver: web.hook
receivers:
- name: web.hook
webhook_configs:
- url: ''
- continue: true
- name: web.hook2
webhook_configs:
- url: ''
- continue: true
inhibit_rules:
- source_match:
severity: critical
target_match:
severity: warning
equal:
- alertname
- dev
- instance
-Y
代わりにinを使用して実行すると、混合タグのソートが停止-y
します。yq
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: ''
- continue: true
- name: web.hook2
webhook_configs:
- url: ''
- continue: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
--indentless-lists
元の文書と同様に、オプションを指定してリストのインデントを削除することもできますyq
。
yq
ラッパーなので、jq
このyq
式はJSONに変換された文書を処理します。その後、文書は再びYAMLに変換されますyq
。参考までに、次は式で変更された元の文書のJSONバリアントですyq
。
{
"global": {
"resolve_timeout": "5m"
},
"route": {
"group_by": [
"alertname"
],
"group_wait": "10s",
"group_interval": "10s",
"repeat_interval": "12h",
"receiver": "web.hook"
},
"receivers": [
{
"name": "web.hook",
"webhook_configs": [
{
"url": ""
}
]
}
],
"inhibit_rules": [
{
"source_match": {
"severity": "critical"
},
"target_match": {
"severity": "warning"
},
"equal": [
"alertname",
"dev",
"instance"
]
}
]
}
答え2
yq
実際に2つの人気のあるプロジェクトがありますが、唯一の人@Kusalananda おすすめとマクパラの yq
。 2番目のバージョン(yqバージョン4.11.2)で同じことを行う方法は次のとおりです。
yq e -P '
.receivers += [{"name":"web.hook2", "webhook_configs": [{"url":""}]}] |
.receivers[].webhook_configs += [{"continue":true}]
' infile.yaml
スイッチは-P
yamlを美しく印刷します。出力:
global:
resolve_timeout: 5m
route:
group_by:
- alertname
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
receiver: web.hook
receivers:
- name: web.hook
webhook_configs:
- url: ""
- continue: true
- name: web.hook2
webhook_configs:
- url: ""
- continue: true
inhibit_rules:
- source_match:
severity: critical
target_match:
severity: warning
equal:
- alertname
- dev
- instance