{% package main %} {% import ( "time" "sort" "net/http" "github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/tpl" "github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/utils" "github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/notifier" ) %} {% func Welcome(r *http.Request) %} {%= tpl.Header(r, navItems, "vmalert") %}

API:
{% for _, p := range apiLinks %} {%code p, doc := p[0], p[1] %} {%s p %} - {%s doc %}
{% endfor %} {% if r.Header.Get("X-Forwarded-For") == "" %} System:
{% for _, p := range systemLinks %} {%code p, doc := p[0], p[1] %} {%s p %} - {%s doc %}
{% endfor %} {% endif %}

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

{%s g.File %}

{% if len(g.Params) > 0 %}
Extra params {% for _, param := range g.Params %} {%s param %} {% endfor %}
{% endif %} {% if len(g.Headers) > 0 %}
Extra headers {% for _, header := range g.Headers %} {%s header %} {% endfor %}
{% endif %}
{% for _, r := range g.Rules %} {% endfor %}
Rule Samples Updated
{% if r.Type == "alerting" %} alert: {%s r.Name %} (for: {%v r.Duration %} seconds) {% else %} record: {%s r.Name %} {% endif %} | Details
{%s r.Query %}
{% if len(r.Labels) > 0 %} Labels:{% endif %} {% for k, v := range r.Labels %} {%s k %}={%s v %} {% endfor %}
{% if r.LastError != "" %}
Error:
{%s r.LastError %}
{% endif %}
{%d r.LastSamples %} {%f.3 time.Since(r.LastEvaluation).Seconds() %}s ago
{% endfor %} {% else %}

No groups...

{% endif %} {%= tpl.Footer(r) %} {% endfunc %} {% func ListAlerts(r *http.Request, groupAlerts []GroupAlerts) %} {%code prefix := utils.Prefix(r.URL.Path) %} {%= tpl.Header(r, navItems, "Alerts") %} {% 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]) %}) | Source
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 %} {%= badgeState(ar.State) %} {%s ar.ActiveAt.Format("2006-01-02T15:04:05Z07:00") %} {% if ar.Restored %}{%= badgeRestored() %}{% endif %} {%s ar.Value %} Details
{% endfor %}

{% endfor %} {% else %}

No active alerts...

{% endif %} {%= tpl.Footer(r) %} {% endfunc %} {% func ListTargets(r *http.Request, targets map[notifier.TargetType][]notifier.Target) %} {%= tpl.Header(r, navItems, "Notifiers") %} {% if len(targets) > 0 %} Collapse All Expand All {%code var keys []string for key := range targets { keys = append(keys, string(key)) } sort.Strings(keys) %} {% for i := range keys %} {%code typeK, ns := keys[i], targets[notifier.TargetType(keys[i])] count := len(ns) %}
{%s typeK %} ({%d count %})
{% for _, n := range ns %} {% endfor %}
Labels Address
{% for _, l := range n.Labels.GetLabels() %} {%s l.Name %}={%s l.Value %} {% endfor %} {%s n.Notifier.Addr() %}
{% endfor %} {% else %}

No targets...

{% endif %} {%= tpl.Footer(r) %} {% endfunc %} {% func Alert(r *http.Request, alert *APIAlert) %} {%code prefix := utils.Prefix(r.URL.Path) %} {%= tpl.Header(r, 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) %}
Alert: {%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
Source link
{%= tpl.Footer(r) %} {% endfunc %} {% func RuleDetails(r *http.Request, rule APIRule) %} {%code prefix := utils.Prefix(r.URL.Path) %} {%= tpl.Header(r, navItems, "") %} {%code var labelKeys []string for k := range rule.Labels { labelKeys = append(labelKeys, k) } sort.Strings(labelKeys) var annotationKeys []string for k := range rule.Annotations { annotationKeys = append(annotationKeys, k) } sort.Strings(annotationKeys) %}
Rule: {%s rule.Name %}{%s rule.Health %}
Expr
{%s rule.Query %}
{% if rule.Type == "alerting" %}
For
{%v rule.Duration %} seconds
{% endif %}
Labels
{% for _, k := range labelKeys %} {%s k %}={%s rule.Labels[k] %} {% endfor %}
{% if rule.Type == "alerting" %}
Annotations
{% for _, k := range annotationKeys %} {%s k %}:

{%s rule.Annotations[k] %}

{% endfor %}
Debug
{%v rule.Debug %}
{% endif %}
Group

Last {%d len(rule.Updates) %}/{%d rule.MaxUpdates %} updates:
{% for _, u := range rule.Updates %} {% if u.err != nil %} {% endif %} {% endfor %} {%= tpl.Footer(r) %} {% endfunc %} {% func badgeState(state string) %} {%code badgeClass := "bg-warning text-dark" if state == "firing" { badgeClass = "bg-danger" } %} {%s state %} {% endfunc %} {% func badgeRestored() %} restored {% endfunc %}
Updated at Samples Duration Executed at cURL
{%s u.time.Format(time.RFC3339) %} {%d u.samples %} {%f.3 u.duration.Seconds() %}s {%s u.at.Format(time.RFC3339) %}
{%v u.err %}