Cuando se activa una regla de alerta en una política de notificación, ARMS envía notificaciones de alerta a través de canales como DingTalk, Lark, WeCom, SMS, llamadas telefónicas, correo electrónico y webhooks. ARMS proporciona plantillas de notificación preconfiguradas para cada método de notificación. Si estas plantillas predeterminadas no cubren sus necesidades, puede personalizarlas. Este tema explica la sintaxis de las plantillas de Go para la personalización, describe las plantillas preconfiguradas y enumera las variables de plantilla disponibles.
Sintaxis de las plantillas de Go
Las plantillas de notificación de alertas de ARMS utilizan la sintaxis de plantillas de Go para rellenar la plantilla con los datos de un contexto proporcionado.
Los parámetros de alerta en una plantilla de notificación constan de varias etiquetas. Las etiquetas le permiten incluir parámetros de alerta específicos en sus notificaciones. Por ejemplo, la etiqueta alertname de este ejemplo indica el nombre de la alerta.
A continuación se utiliza el siguiente código de ejemplo para describir la sintaxis común de las plantillas de 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"
},
El carácter .
Representa el objeto actual dentro del alcance y permite acceder a sus datos.
Ejemplo 1: obtenga todo el contenido del alcance de nivel superior, que corresponde a todos los datos de contexto del código de ejemplo.
{{ . }}
Devuelve todo el contenido del código de ejemplo.
Ejemplo 2: obtenga el campo level de los datos de contexto.
{{ .level }}
Devuelve:
error
Ejemplo 3: obtenga el campo commonLabels.alertname de los datos de contexto.
{{ .commonLabels.alertname }}
Devuelve:
Container memory usage exceeds 80%
Variables
Puede almacenar los datos que se pasan a la plantilla en variables accesibles en toda la plantilla. Por ejemplo, en {{$context := .}}, la variable $context almacena los datos entrantes, a los cuales puede acceder mediante {{$context}}.
Ejemplo 1: asigne el nombre de la alerta a $alertname y, después, muestre $alertname.
{{ $alertname := .commonLabels.alertname }} {{$alertname}}
Devuelve:
Container memory usage exceeds 80%
Ejemplo 2: asigne la primera alerta de la lista alerts a $alert0 y muestre su alertname.
{{ $alert0 := index .alerts 0 }} {{$alert0.labels.alertname}}
Devuelve:
Container memory usage exceeds 80%
La acción if/else
La acción if proporciona lógica condicional. Si la condición es falsa, se ejecuta un bloque else opcional. Los valores como 0, nil o una cadena vacía se evalúan como false.
Ejemplo 1: si el valor de la etiqueta severity en un evento de alerta es warning, muestre P3 alert.
{{if eq "warning" .commonLabels.severity }} P3 alert {{ end }}
Devuelve:
P3 alert
Ejemplo 2: si el valor de la etiqueta severity en un evento de alerta es critical, muestre P1 alert. De lo contrario, muestre P2 alert.
{{if eq "critical" .commonLabels.severity }} P1 alert {{ else }} P2 alert {{ end }}
Devuelve:
P2 alert
La acción for
La acción for ejecuta un bloque de código de forma repetida.
Ejemplo 1: recorra la lista alerts para obtener el alertname de cada alerta.
{{ for .alerts}} {{.labels.alertname}} \n {{end}}
Devuelve:
Container memory usage exceeds 80%
La acción range
La acción range itera sobre una estructura de datos, como un slice o un map.
Ejemplo 1: itere sobre una lista para obtener el índice y el valor de cada elemento.
{{ range $index, $alert := .alerts }}Index {{ $index }}: {{ $alert.labels.alertname }}\n{{ end }}
Devuelve:
Index 0: Container memory usage exceeds 80%
La función index
La función index accede a un elemento de un array, un slice o un map.
Ejemplo 1: obtenga el primer elemento de la lista alerts y asígnelo a $alert0.
{{ $alert0 := index .alerts 0 }} {{$alert0.labels.alertname}}
Devuelve:
Container memory usage exceeds 80%
Funciones de comparación
A continuación se muestran las funciones de comparación de uso más frecuente:
eq: igual ane: distinto delt: menor quele: menor o igual quegt: mayor quege: mayor o igual que
Ejemplo: si el valor de la etiqueta severity en commonLabels es igual a warning, muestre P3 alert.
{{if eq "warning" .commonLabels.severity }} P3 alert {{ end }}
Devuelve:
P3 alert
Funciones lógicas: and, or, not
Ejemplo: si el valor de la etiqueta severity en commonLabels es igual a warning o a warnning, muestre P3 alert.
{{if or (eq "warning" .commonLabels.severity) (eq "warnning" .commonLabels.severity) }} P3 alert {{ end }}
Devuelve:
P3 alert
Funciones integradas comunes
printf: da formato a una cadena según un especificador de formato determinado.
Ejemplo: muestre el value de la primera alerta en la lista alerts con dos decimales.
{{ $alert0 := index .alerts 0 }} {{ printf "%.2f" $alert0.annotations.value }}
Devuelve:
15.52
humanizePercentage: da formato de porcentaje a un valor.
Ejemplo: convierta la cadena "0.95332123123124" en un porcentaje más legible.
{{ "0.95332123123124" | humanizePercentage }}
Devuelve:
95.33%
humanizeDate: convierte una marca de tiempo en milisegundos en una fecha. El formato de fecha es yyyy-MM-dd HH:mm:ss.
Ejemplo: convierta la marca de tiempo 1671074058234 en una fecha.
{{ "1671074058234" | humanizeDate }}
Devuelve:
2022-12-15 11:14:18
len: devuelve la longitud de un array, un slice, una cadena o un map.
Ejemplo: obtenga la longitud de la lista alerts.
{{ len .alerts }}
Devuelve:
1
Plantillas de notificación preconfiguradas
Plantilla de notificación por correo electrónico
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 }}
|
Contenido de la plantilla |
Descripción |
|
El nombre de la alerta. De manera predeterminada, una política de notificación agrupa las alertas por la etiqueta |
|
Si un evento contiene la etiqueta |
|
Si el tipo del objeto implicado es |
|
El nombre de la política de notificación coincidente. |
|
La hora a la que se activó la alerta por primera vez. |
|
Itera sobre la lista de eventos de alerta para representar el valor de Nota
La plantilla preconfigurada utiliza la sintaxis HTML
El bloque |
Ejemplo de salida representada:
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%
Plantillas de notificación por SMS y llamada telefónica
Estas plantillas son similares a la de correo electrónico, pero omiten la URL de detalles.
{{ .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 }}
Plantilla de notificación de 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}}
La salida se representa en Markdown. La compatibilidad con cada función varía según el chatbot.
Cita en bloque:
>-
Color de fuente:
<font color='#ff0000'>root cause</font>NotaSolo DingTalk y WeCom admiten cambios de color de fuente. Lark no es compatible con esta función.
-
Saltos de línea:
DingTalk: agregue dos saltos de línea en la plantilla.
Lark: agregue un salto de línea en la plantilla.
WeCom: agregue un salto de línea en la plantilla.
Plantilla 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 }}"
}
Ejemplo de salida representada:
{
"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%"
}
Referencia de variables
La siguiente tabla describe las variables disponibles en las plantillas de notificación.
|
Parámetro |
Descripción |
|
alarmId |
El ID de la alerta original. |
|
alerts |
Una lista de los eventos de alerta originales. Tipo: List<Alert>. |
|
alerts.annotations |
Las anotaciones de una alerta original. Tipo: map de cadenas. |
|
alerts.endsAt |
La hora de resolución de la alerta original. Hora de resolución = Hora de activación + Duración hasta la resolución |
|
alerts.startsAt |
La hora de activación de la alerta original. |
|
alerts.fingerprint |
La huella digital de la alerta original. Las alertas con el mismo conjunto de etiquetas tienen la misma huella digital. |
|
alerts.labels |
Las etiquetas de la alerta original. |
|
alerts.status |
El estado de una alerta original:
|
|
commonAnnotations |
Un conjunto de anotaciones comunes a todas las alertas del grupo. |
|
commonLabels |
Un conjunto de etiquetas comunes a todas las alertas del grupo. |
|
groupLabels |
Las etiquetas utilizadas para agrupar las alertas, tal como se definen en la política de notificación. |
|
status |
El estado del grupo de alertas:
|
|
startTime |
La hora a la que se creó el grupo de alertas. |
|
endTime |
La hora a la que se resolvió el grupo de alertas. Corresponde a la hora de resolución de la última alerta original del grupo. |
|
level |
El nivel de gravedad de la notificación. Los valores se asignan a niveles de prioridad:
|
|
dispatchRuleName |
El nombre de la política de notificación coincidente. |