{% package main %} {% import ( "time" "sort" "github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/tpl" ) %} {% code var navItems = []tpl.NavItem{ {Name: "vmalert", Url: "/"}, {Name: "Groups", Url: "/groups"}, {Name: "Alerts", Url: "/alerts"}, {Name: "Docs", Url: "https://docs.victoriametrics.com/vmalert.html"}, } %} {% func Welcome(pathList [][2]string) %} {%= tpl.Header("vmalert", navItems) %}

API:
{% for _, p := range pathList %} {%code p, doc := p[0], p[1] %} {%s p %} - {%s doc %}
{% endfor %}

{%= tpl.Footer() %} {% endfunc %} {% func ListGroups(groups []APIGroup) %} {%= tpl.Header("Groups", navItems) %} {% if len(groups) > 0 %} {%code rOk := make(map[string]int) rNotOk := make(map[string]int) for _, g := range groups { for _, r := range g.AlertingRules{ if r.LastError != "" { rNotOk[g.Name]++ } else { rOk[g.Name]++ } } for _, r := range g.RecordingRules{ if r.LastError != "" { rNotOk[g.Name]++ } else { rOk[g.Name]++ } } } %} Collapse All Expand All {% for _, g := range groups %}
{%s g.Name %}{% if g.Type != "prometheus" %} ({%s g.Type %}){% endif %} (every {%s g.Interval %}) {% if rNotOk[g.Name] > 0 %}{%d rNotOk[g.Name] %} {% endif %} {%d rOk[g.Name] %}

{%s g.File %}

{% if len(g.ExtraFilterLabels) > 0 %}
Extra filter labels {% for k, v := range g.ExtraFilterLabels %} {%s k %}={%s v %} {% endfor %}
{% endif %}
{% for _, ar := range g.AlertingRules %} {% endfor %} {% for _, rr := range g.RecordingRules %} {% endfor %}
Rule Error Samples Updated
alert: {%s ar.Name %} (for: {%v ar.For %})
{%s ar.Expression %}

{% if len(ar.Labels) > 0 %} Labels:{% endif %} {% for k, v := range ar.Labels %} {%s k %}={%s v %} {% endfor %}
{%s ar.LastError %}
{%d ar.LastSamples %} {%f.3 time.Since(ar.LastExec).Seconds() %}s ago
record: {%s rr.Name %}
{%s rr.Expression %}
{% if len(rr.Labels) > 0 %} Labels:{% endif %} {% for k, v := range rr.Labels %} {%s k %}={%s v %} {% endfor %}
{%s rr.LastError %}
{%d rr.LastSamples %} {%f.3 time.Since(rr.LastExec).Seconds() %}s ago
{% endfor %} {% else %}

No items...

{% endif %} {%= tpl.Footer() %} {% endfunc %} {% func ListAlerts(groupAlerts []GroupAlerts) %} {%= tpl.Header("Alerts", navItems) %} {% if len(groupAlerts) > 0 %} Collapse All Expand All {% for _, ga := range groupAlerts %} {%code g := ga.Group %}
{%s g.Name %}{% if g.Type != "prometheus" %} ({%s g.Type %}){% endif %} {%d len(ga.Alerts) %}

{%s g.File %}

{%code var keys []string alertsByRule := make(map[string][]*APIAlert) for _, alert := range ga.Alerts { if len(alertsByRule[alert.RuleID]) < 1 { keys = append(keys, alert.RuleID) } alertsByRule[alert.RuleID] = append(alertsByRule[alert.RuleID], alert) } sort.Strings(keys) %}
{% for _, ruleID := range keys %} {%code defaultAR := alertsByRule[ruleID][0] var labelKeys []string for k := range defaultAR.Labels { labelKeys = append(labelKeys, k) } sort.Strings(labelKeys) %}
alert: {%s defaultAR.Name %} ({%d len(alertsByRule[ruleID]) %})
expr:
{%s defaultAR.Expression %}
{% for _, ar := range alertsByRule[ruleID] %} {% endfor %}
Labels State Active at Value Link
{% for _, k := range labelKeys %} {%s k %}={%s ar.Labels[k] %} {% endfor %} {%s ar.State %} {%s ar.ActiveAt.Format("2006-01-02T15:04:05Z07:00") %} {%s ar.Value %} Details
{% endfor %}

{% endfor %} {% else %}

No items...

{% endif %} {%= tpl.Footer() %} {% endfunc %} {% func Alert(alert *APIAlert) %} {%= tpl.Header("", navItems) %} {%code var labelKeys []string for k := range alert.Labels { labelKeys = append(labelKeys, k) } sort.Strings(labelKeys) var annotationKeys []string for k := range alert.Annotations { annotationKeys = append(annotationKeys, k) } sort.Strings(annotationKeys) %}
{%s alert.Name %}{%s alert.State %}
Active at
{%s alert.ActiveAt.Format("2006-01-02T15:04:05Z07:00") %}
Expr
{%s alert.Expression %}
Labels
{% for _, k := range labelKeys %} {%s k %}={%s alert.Labels[k] %} {% endfor %}
Annotations
{% for _, k := range annotationKeys %} {%s k %}:

{%s alert.Annotations[k] %}

{% endfor %}
Group
{%= tpl.Footer() %} {% endfunc %}