Quando uma regra de alerta em uma política de notificação é acionada, o ARMS envia notificações de alerta por canais como DingTalk, Lark, WeCom, SMS, telefone, e-mail e webhooks. O ARMS fornece modelos de notificação pré-configurados para cada método. Caso os modelos padrão não atendam às suas necessidades, personalize-os. Este tópico explica a sintaxe de modelos Go para personalização, descreve os modelos pré-configurados e lista as variáveis disponíveis.
Sintaxe de modelos Go
Os modelos de notificação de alertas do ARMS usam a sintaxe Go template para preencher o modelo com dados de um contexto fornecido.
Os parâmetros de alerta em um modelo de notificação consistem em múltiplos rótulos. Os rótulos permitem incluir parâmetros específicos nas notificações. Por exemplo, o rótulo alertname indica o nome do alerta.
Este tópico usa o código de exemplo a seguir para descrever a sintaxe comum de modelos Go.
{
"alerts": [
{
"annotations": {
"message": "Namespace: arms-prom / Pod: kube-state-metrics-ccb59dbff-jljg4 / Container: kube-state-metrics memory usage has exceeded 80%, current value 15.52%",
"value": "15.521240234375"
},
"endsAt": "2023-02-22T07:27:15.404000000Z",
"fingerprint": "bec72890cc2c7b4a027e008df0cd1013",
"labels": {
"container": "kube-state-metrics",
"severity": "warning",
"instance": "10.0.80.186:10255",
"clustername": "klyz1688-kubernetes-1",
"alertname": "Container memory usage exceeds 80%",
"_aliyun_arms_involvedObject_name": "klyz1688-kubernetes-1",
"pod_name": "kube-state-metrics-ccb59dbff-jljg4",
"_aliyun_arms_involvedObject_kind": "cluster",
"name": "k8s_kube-state-metrics_kube-state-metrics-ccb59dbff-jljg4_arms-prom_359508f3-7e76-4740-b915-41ea48849641_0",
"namespace": "arms-prom"
},
"startsAt": "2023-02-22T07:18:15.578000000Z",
"status": "firing"
}
],
"commonAnnotations": {
"message": "Namespace: arms-prom / Pod: kube-state-metrics-ccb59dbff-jljg4 / Container: kube-state-metrics memory usage has exceeded 80%, current value 15.52%",
"value": "15.521240234375"
},
"commonLabels": {
"container": "kube-state-metrics",
"severity": "warning",
"instance": "10.0.80.186:10255",
"clustername": "klyz1688-kubernetes-1",
"alertname": "Container memory usage exceeds 80%",
"_aliyun_arms_involvedObject_name": "klyz1688-kubernetes-1",
"pod_name": "kube-state-metrics-ccb59dbff-jljg4",
"_aliyun_arms_involvedObject_kind": "cluster",
"name": "k8s_kube-state-metrics_kube-state-metrics-ccb59dbff-jljg4_arms-prom_359508f3-7e76-4740-b915-41ea48849641_0",
"namespace": "arms-prom"
},
"groupLabels": {
"alertname": "Container memory usage exceeds 80%"
},
"status": "firing",
"startTime":"2023-02-22 07:18:15",
"endTime":"Alert resolution time",
"level":"error",
"dispatchRuleName":"notification policy name",
"alarmId":"123456"
},
O caractere .
Representa o objeto atual no escopo e permite acessar seus dados.
Exemplo 1: Obtenha todo o conteúdo do escopo de nível superior, que corresponde aos dados completos do contexto do código de exemplo.
{{ . }}
Retorna todo o conteúdo do código de exemplo.
Exemplo 2: Obtenha o campo level dos dados de contexto.
{{ .level }}
Retorno:
error
Exemplo 3: Obtenha o campo commonLabels.alertname dos dados de contexto.
{{ .commonLabels.alertname }}
Retorno:
Container memory usage exceeds 80%
Variáveis
Armazene dados passados ao modelo em variáveis acessíveis em todo o modelo. Por exemplo, em {{$context := .}}, a variável $context armazena os dados recebidos, acessíveis por meio de {{$context}}.
Exemplo 1: Atribua o nome do alerta a $alertname e gere a saída de $alertname.
{{ $alertname := .commonLabels.alertname }} {{$alertname}}
Retorno:
Container memory usage exceeds 80%
Exemplo 2: Atribua o primeiro alerta da lista alerts a $alert0 e gere a saída de seu alertname.
{{ $alert0 := index .alerts 0 }} {{$alert0.labels.alertname}}
Retorno:
Container memory usage exceeds 80%
A ação if/else
A ação if fornece lógica condicional. Se a condição for falsa, o bloco else opcional será executado. Valores como 0, nil ou string vazia são avaliados como false.
Exemplo 1: Se o valor do rótulo severity em um evento de alerta for warning, gere a saída P3 alert.
{{if eq "warning" .commonLabels.severity }} P3 alert {{ end }}
Retorno:
P3 alert
Exemplo 2: Se o valor do rótulo severity em um evento de alerta for critical, gere a saída P1 alert. Caso contrário, gere a saída P2 alert.
{{if eq "critical" .commonLabels.severity }} P1 alert {{ else }} P2 alert {{ end }}
Retorno:
P2 alert
A ação for
A ação for executa um bloco de código repetidamente.
Exemplo 1: Itere pela lista alerts para obter o alertname de cada alerta.
{{ for .alerts}} {{.labels.alertname}} \n {{end}}
Retorno:
Container memory usage exceeds 80%
A ação range
A ação range itera sobre uma estrutura de dados, como um slice ou map.
Exemplo 1: Itere sobre uma lista para obter o índice e o valor de cada elemento.
{{ range $index, $alert := .alerts }}Index {{ $index }}: {{ $alert.labels.alertname }}\n{{ end }}
Retorno:
Index 0: Container memory usage exceeds 80%
A função index
A função index acessa um elemento de um array, slice ou map.
Exemplo 1: Obtenha o primeiro elemento da lista alerts e atribua-o a $alert0.
{{ $alert0 := index .alerts 0 }} {{$alert0.labels.alertname}}
Retorno:
Container memory usage exceeds 80%
Funções de comparação
As funções de comparação a seguir são comuns:
eq: Igual ane: Diferente delt: Menor quele: Menor ou igual agt: Maior quege: Maior ou igual a
Exemplo: Se o valor do rótulo severity em commonLabels for igual a warning, gere a saída P3 alert.
{{if eq "warning" .commonLabels.severity }} P3 alert {{ end }}
Retorno:
P3 alert
Funções lógicas: and, or, not
Exemplo: Se o valor do rótulo severity em commonLabels for igual a warning ou warnning, gere a saída P3 alert.
{{if or (eq "warning" .commonLabels.severity) (eq "warnning" .commonLabels.severity) }} P3 alert {{ end }}
Retorno:
P3 alert
Funções integradas comuns
printf: Formata uma string conforme um especificador de formato definido.
Exemplo: Gere a saída do value do primeiro alerta na lista alerts, formatado com duas casas decimais.
{{ $alert0 := index .alerts 0 }} {{ printf "%.2f" $alert0.annotations.value }}
Retorno:
15.52
humanizePercentage: Formata um valor como porcentagem.
Exemplo: Converta a string "0.95332123123124" em uma porcentagem mais legível.
{{ "0.95332123123124" | humanizePercentage }}
Retorno:
95.33%
humanizeDate: Formata um timestamp em milissegundos como data. O formato da data é yyyy-MM-dd HH:mm:ss.
Exemplo: Converta o timestamp 1671074058234 em uma data.
{{ "1671074058234" | humanizeDate }}
Retorno:
2022-12-15 11:14:18
len: Retorna o comprimento de um array, slice, string ou map.
Exemplo: Obtenha o comprimento da lista alerts.
{{ len .alerts }}
Retorno:
1
Modelos de notificação pré-configurados
Modelo de notificação por e-mail
Alert name: {{ .commonLabels.alertname }}
{{if .commonLabels.clustername }}
Cluster name: {{ .commonLabels.clustername }}
{{ end }}
{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }}
Application name: {{ .commonLabels._aliyun_arms_involvedObject_name }}
{{ end }}
Notification policy: {{ .dispatchRuleName }}
Alert time: {{ .startTime }}
Alert content: {{ if .newIncidentIn }} (New event) {{end}} {{ for .alerts }} {{ .annotations.message }} {{if .generatorURL }} <a href="{{.generatorURL}}" >Details URL</a> {{ end }} {{ end }}
|
Conteúdo do modelo |
Descrição |
|
Nome do alerta. Por padrão, a política de notificação agrupa alertas pelo rótulo |
|
Se um evento contiver o rótulo |
|
Se o tipo do objeto envolvido for |
|
Nome da política de notificação correspondente. |
|
Momento em que o alerta foi acionado pela primeira vez. |
|
Itera sobre a lista de eventos de alerta para renderizar o valor de Nota
O modelo pré-configurado usa a sintaxe HTML
O bloco |
Exemplo de saída renderizada:
Alert name: Container memory usage exceeds 80%
Cluster name: klyz1688-kubernetes-1
Notification policy: notification policy name
Alert time: 2023-02-22 07:18:15
Alert content: Namespace: arms-prom / Pod: kube-state-metrics-ccb59dbff-jljg4 / Container: kube-state-metrics memory usage has exceeded 80%, current value 15.52%
Modelos de notificação por SMS e telefone
Estes modelos são semelhantes ao modelo de e-mail, mas omitem a URL de detalhes.
{{ .level }} alert occurred
Alert name: {{ .commonLabels.alertname }}
{{if .commonLabels.clustername }}
Cluster name: {{ .commonLabels.clustername }}
{{ end }}
{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }}
Application name: {{ .commonLabels._aliyun_arms_involvedObject_name }}
{{ end }}
Notification policy: {{ .dispatchRuleName }}
Alert time: {{ .startTime }}
Alert content: {{ if .newIncidentIn }} (New event)
{{end}} {{ for .alerts }} {{ .annotations.message }} {{ end }}
Modelo de notificação por chatbot
{{ if .newIncidentIn }} (New event) {{end}}
{{if .commonLabels.clustername }} > Cluster name: {{ .commonLabels.clustername }}
{{ end }}
{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }} > Application name: {{ .commonLabels._aliyun_arms_involvedObject_name }}
{{ end }}
{{ for .alerts }} > {{ .annotations.message }} {{if .generatorURL }} [details URL]({{.generatorURL}}) {{end}}{{if .annotations._aliyun_arms_insights_analyze_link }}[<font color='#ff0000'>root cause</font>]({{ .annotations._aliyun_arms_insights_analyze_link}}){{ end }}{{if eq "1" .labels._aliyun_arms_denoise_code }} (Important:{{.labels._aliyun_arms_important_reason }}) {{end}}
{{end}}
A saída é renderizada em Markdown. O suporte a recursos varia conforme o chatbot.
Citação em bloco:
>-
Cor da fonte:
<font color='#ff0000'>root cause</font>NotaApenas DingTalk e WeCom suportam alterações na cor da fonte. O Lark não oferece esse suporte.
-
Quebras de linha:
DingTalk: Adicione duas novas linhas no modelo.
Lark: Adicione uma nova linha no modelo.
WeCom: Adicione uma nova linha no modelo.
Modelo de webhook
{
"alert_name":"{{ .commonLabels.alertname }}",
{{if .commonLabels.clustername }}"cluster_name":"{{ .commonLabels.clustername }}",{{ end }}
{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }}"application_name":"{{ .commonLabels._aliyun_arms_involvedObject_name }}",{{ end }}
"notification_policy":"{{ .dispatchRuleName }}",
"alert_time":"{{ .startTime }}",
"alert_content":"{{ range $index, $alert := .alerts }}{{if $index}}, {{end}}{{.annotations.message}}{{ end }}"
}
Exemplo de saída renderizada:
{
"alert_name": "Container memory usage exceeds 80%",
"cluster_name": "klyz1688-kubernetes-1",
"notification_policy": "notification policy name",
"alert_time": "2023-02-22 07:18:15",
"alert_content": "Namespace: arms-prom / Pod: kube-state-metrics-ccb59dbff-jljg4 / Container: kube-state-metrics memory usage has exceeded 80%, current value 15.52%"
}
Referência de variáveis
A tabela a seguir descreve as variáveis disponíveis nos modelos de notificação.
|
Parâmetro |
Descrição |
|
alarmId |
ID do alerta original. |
|
alerts |
Lista dos eventos de alerta originais. Tipo: List<Alert>. |
|
alerts.annotations |
Anotações de um alerta original. Tipo: map de strings. |
|
alerts.endsAt |
Horário de resolução do alerta original. Horário de resolução = Horário de acionamento + Duração até a resolução |
|
alerts.startsAt |
Horário de acionamento do alerta original. |
|
alerts.fingerprint |
Impressão digital do alerta original. Alertas com o mesmo conjunto de rótulos possuem a mesma impressão digital. |
|
alerts.labels |
Rótulos do alerta original. |
|
alerts.status |
Status de um alerta original:
|
|
commonAnnotations |
Conjunto de anotações comuns a todos os alertas do grupo. |
|
commonLabels |
Conjunto de rótulos comuns a todos os alertas do grupo. |
|
groupLabels |
Rótulos usados para agrupar os alertas, conforme definido na política de notificação. |
|
status |
Status do grupo de alertas:
|
|
startTime |
Horário de criação do grupo de alertas. |
|
endTime |
Horário de resolução do grupo de alertas. Corresponde ao horário de resolução do último alerta original no grupo. |
|
level |
Nível de severidade da notificação. Os valores correspondem aos níveis de prioridade:
|
|
dispatchRuleName |
Nome da política de notificação correspondente. |