diff --git a/app/vmalert/web.go b/app/vmalert/web.go index 0cdff3a2c7..668a758b0c 100644 --- a/app/vmalert/web.go +++ b/app/vmalert/web.go @@ -8,7 +8,6 @@ import ( "sort" "strconv" "strings" - "sync" "github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/notifier" "github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/tpl" @@ -18,20 +17,14 @@ import ( ) var ( - once = sync.Once{} - apiLinks [][2]string - navItems []tpl.NavItem -) - -func initLinks() { apiLinks = [][2]string{ // api links are relative since they can be used by external clients, // such as Grafana, and proxied via vmselect. {"api/v1/rules", "list all loaded groups and rules"}, {"api/v1/alerts", "list all active alerts"}, {fmt.Sprintf("api/v1/alert?%s=<int>&%s=<int>", paramGroupID, paramAlertID), "get alert status by group and alert ID"}, - - // system links + } + systemLinks = [][2]string{ {"/flags", "command-line flags"}, {"/metrics", "list of application metrics"}, {"/-/reload", "reload configuration"}, @@ -43,7 +36,7 @@ func initLinks() { {Name: "Notifiers", Url: "notifiers"}, {Name: "Docs", Url: "https://docs.victoriametrics.com/vmalert.html"}, } -} +) type requestHandler struct { m *manager @@ -57,10 +50,6 @@ var ( ) func (rh *requestHandler) handler(w http.ResponseWriter, r *http.Request) bool { - once.Do(func() { - initLinks() - }) - if strings.HasPrefix(r.URL.Path, "/vmalert/static") { staticServer.ServeHTTP(w, r) return true diff --git a/app/vmalert/web.qtpl b/app/vmalert/web.qtpl index 61757d17fa..78c2914c8a 100644 --- a/app/vmalert/web.qtpl +++ b/app/vmalert/web.qtpl @@ -16,11 +16,16 @@ <p> API:<br> {% for _, p := range apiLinks %} - {%code - p, doc := p[0], p[1] - %} - <a href="{%s p %}">{%s p %}</a> - {%s doc %}<br/> + {%code p, doc := p[0], p[1] %} + <a href="{%s p %}">{%s p %}</a> - {%s doc %}<br/> {% endfor %} + {% if r.Header.Get("X-Forwarded-For") == "" %} + System:<br> + {% for _, p := range systemLinks %} + {%code p, doc := p[0], p[1] %} + <a href="{%s p %}">{%s p %}</a> - {%s doc %}<br/> + {% endfor %} + {% endif %} </p> {%= tpl.Footer(r) %} {% endfunc %} diff --git a/app/vmalert/web.qtpl.go b/app/vmalert/web.qtpl.go index 19f6f5448f..b31a01afbe 100644 --- a/app/vmalert/web.qtpl.go +++ b/app/vmalert/web.qtpl.go @@ -45,87 +45,127 @@ func StreamWelcome(qw422016 *qt422016.Writer, r *http.Request) { //line app/vmalert/web.qtpl:18 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:20 +//line app/vmalert/web.qtpl:19 p, doc := p[0], p[1] -//line app/vmalert/web.qtpl:21 +//line app/vmalert/web.qtpl:19 qw422016.N().S(` - <a href="`) -//line app/vmalert/web.qtpl:22 + <a href="`) +//line app/vmalert/web.qtpl:20 qw422016.E().S(p) -//line app/vmalert/web.qtpl:22 +//line app/vmalert/web.qtpl:20 qw422016.N().S(`">`) -//line app/vmalert/web.qtpl:22 +//line app/vmalert/web.qtpl:20 qw422016.E().S(p) -//line app/vmalert/web.qtpl:22 +//line app/vmalert/web.qtpl:20 qw422016.N().S(`</a> - `) -//line app/vmalert/web.qtpl:22 +//line app/vmalert/web.qtpl:20 qw422016.E().S(doc) -//line app/vmalert/web.qtpl:22 +//line app/vmalert/web.qtpl:20 qw422016.N().S(`<br/> `) -//line app/vmalert/web.qtpl:23 +//line app/vmalert/web.qtpl:21 } -//line app/vmalert/web.qtpl:23 +//line app/vmalert/web.qtpl:21 + qw422016.N().S(` + `) +//line app/vmalert/web.qtpl:22 + if r.Header.Get("X-Forwarded-For") == "" { +//line app/vmalert/web.qtpl:22 + qw422016.N().S(` + System:<br> + `) +//line app/vmalert/web.qtpl:24 + for _, p := range systemLinks { +//line app/vmalert/web.qtpl:24 + qw422016.N().S(` + `) +//line app/vmalert/web.qtpl:25 + p, doc := p[0], p[1] + +//line app/vmalert/web.qtpl:25 + qw422016.N().S(` + <a href="`) +//line app/vmalert/web.qtpl:26 + qw422016.E().S(p) +//line app/vmalert/web.qtpl:26 + qw422016.N().S(`">`) +//line app/vmalert/web.qtpl:26 + qw422016.E().S(p) +//line app/vmalert/web.qtpl:26 + qw422016.N().S(`</a> - `) +//line app/vmalert/web.qtpl:26 + qw422016.E().S(doc) +//line app/vmalert/web.qtpl:26 + qw422016.N().S(`<br/> + `) +//line app/vmalert/web.qtpl:27 + } +//line app/vmalert/web.qtpl:27 + qw422016.N().S(` + `) +//line app/vmalert/web.qtpl:28 + } +//line app/vmalert/web.qtpl:28 qw422016.N().S(` </p> `) -//line app/vmalert/web.qtpl:25 +//line app/vmalert/web.qtpl:30 tpl.StreamFooter(qw422016, r) -//line app/vmalert/web.qtpl:25 +//line app/vmalert/web.qtpl:30 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:26 +//line app/vmalert/web.qtpl:31 } -//line app/vmalert/web.qtpl:26 +//line app/vmalert/web.qtpl:31 func WriteWelcome(qq422016 qtio422016.Writer, r *http.Request) { -//line app/vmalert/web.qtpl:26 +//line app/vmalert/web.qtpl:31 qw422016 := qt422016.AcquireWriter(qq422016) -//line app/vmalert/web.qtpl:26 +//line app/vmalert/web.qtpl:31 StreamWelcome(qw422016, r) -//line app/vmalert/web.qtpl:26 +//line app/vmalert/web.qtpl:31 qt422016.ReleaseWriter(qw422016) -//line app/vmalert/web.qtpl:26 +//line app/vmalert/web.qtpl:31 } -//line app/vmalert/web.qtpl:26 +//line app/vmalert/web.qtpl:31 func Welcome(r *http.Request) string { -//line app/vmalert/web.qtpl:26 +//line app/vmalert/web.qtpl:31 qb422016 := qt422016.AcquireByteBuffer() -//line app/vmalert/web.qtpl:26 +//line app/vmalert/web.qtpl:31 WriteWelcome(qb422016, r) -//line app/vmalert/web.qtpl:26 +//line app/vmalert/web.qtpl:31 qs422016 := string(qb422016.B) -//line app/vmalert/web.qtpl:26 +//line app/vmalert/web.qtpl:31 qt422016.ReleaseByteBuffer(qb422016) -//line app/vmalert/web.qtpl:26 +//line app/vmalert/web.qtpl:31 return qs422016 -//line app/vmalert/web.qtpl:26 +//line app/vmalert/web.qtpl:31 } -//line app/vmalert/web.qtpl:28 +//line app/vmalert/web.qtpl:33 func StreamListGroups(qw422016 *qt422016.Writer, r *http.Request, groups []APIGroup) { -//line app/vmalert/web.qtpl:28 +//line app/vmalert/web.qtpl:33 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:29 +//line app/vmalert/web.qtpl:34 prefix := utils.Prefix(r.URL.Path) -//line app/vmalert/web.qtpl:29 +//line app/vmalert/web.qtpl:34 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:30 +//line app/vmalert/web.qtpl:35 tpl.StreamHeader(qw422016, r, navItems, "Groups") -//line app/vmalert/web.qtpl:30 +//line app/vmalert/web.qtpl:35 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:31 +//line app/vmalert/web.qtpl:36 if len(groups) > 0 { -//line app/vmalert/web.qtpl:31 +//line app/vmalert/web.qtpl:36 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:33 +//line app/vmalert/web.qtpl:38 rOk := make(map[string]int) rNotOk := make(map[string]int) for _, g := range groups { @@ -138,138 +178,138 @@ func StreamListGroups(qw422016 *qt422016.Writer, r *http.Request, groups []APIGr } } -//line app/vmalert/web.qtpl:44 +//line app/vmalert/web.qtpl:49 qw422016.N().S(` <a class="btn btn-primary" role="button" onclick="collapseAll()">Collapse All</a> <a class="btn btn-primary" role="button" onclick="expandAll()">Expand All</a> `) -//line app/vmalert/web.qtpl:47 +//line app/vmalert/web.qtpl:52 for _, g := range groups { -//line app/vmalert/web.qtpl:47 +//line app/vmalert/web.qtpl:52 qw422016.N().S(` <div class="group-heading`) -//line app/vmalert/web.qtpl:48 +//line app/vmalert/web.qtpl:53 if rNotOk[g.Name] > 0 { -//line app/vmalert/web.qtpl:48 +//line app/vmalert/web.qtpl:53 qw422016.N().S(` alert-danger`) -//line app/vmalert/web.qtpl:48 +//line app/vmalert/web.qtpl:53 } -//line app/vmalert/web.qtpl:48 +//line app/vmalert/web.qtpl:53 qw422016.N().S(`" data-bs-target="rules-`) -//line app/vmalert/web.qtpl:48 +//line app/vmalert/web.qtpl:53 qw422016.E().S(g.ID) -//line app/vmalert/web.qtpl:48 +//line app/vmalert/web.qtpl:53 qw422016.N().S(`"> <span class="anchor" id="group-`) -//line app/vmalert/web.qtpl:49 +//line app/vmalert/web.qtpl:54 qw422016.E().S(g.ID) -//line app/vmalert/web.qtpl:49 +//line app/vmalert/web.qtpl:54 qw422016.N().S(`"></span> <a href="#group-`) -//line app/vmalert/web.qtpl:50 +//line app/vmalert/web.qtpl:55 qw422016.E().S(g.ID) -//line app/vmalert/web.qtpl:50 +//line app/vmalert/web.qtpl:55 qw422016.N().S(`">`) -//line app/vmalert/web.qtpl:50 +//line app/vmalert/web.qtpl:55 qw422016.E().S(g.Name) -//line app/vmalert/web.qtpl:50 +//line app/vmalert/web.qtpl:55 if g.Type != "prometheus" { -//line app/vmalert/web.qtpl:50 +//line app/vmalert/web.qtpl:55 qw422016.N().S(` (`) -//line app/vmalert/web.qtpl:50 +//line app/vmalert/web.qtpl:55 qw422016.E().S(g.Type) -//line app/vmalert/web.qtpl:50 +//line app/vmalert/web.qtpl:55 qw422016.N().S(`)`) -//line app/vmalert/web.qtpl:50 +//line app/vmalert/web.qtpl:55 } -//line app/vmalert/web.qtpl:50 +//line app/vmalert/web.qtpl:55 qw422016.N().S(` (every `) -//line app/vmalert/web.qtpl:50 +//line app/vmalert/web.qtpl:55 qw422016.N().FPrec(g.Interval, 0) -//line app/vmalert/web.qtpl:50 +//line app/vmalert/web.qtpl:55 qw422016.N().S(`s)</a> `) -//line app/vmalert/web.qtpl:51 +//line app/vmalert/web.qtpl:56 if rNotOk[g.Name] > 0 { -//line app/vmalert/web.qtpl:51 +//line app/vmalert/web.qtpl:56 qw422016.N().S(`<span class="badge bg-danger" title="Number of rules with status Error">`) -//line app/vmalert/web.qtpl:51 +//line app/vmalert/web.qtpl:56 qw422016.N().D(rNotOk[g.Name]) -//line app/vmalert/web.qtpl:51 +//line app/vmalert/web.qtpl:56 qw422016.N().S(`</span> `) -//line app/vmalert/web.qtpl:51 +//line app/vmalert/web.qtpl:56 } -//line app/vmalert/web.qtpl:51 +//line app/vmalert/web.qtpl:56 qw422016.N().S(` <span class="badge bg-success" title="Number of rules withs status Ok">`) -//line app/vmalert/web.qtpl:52 +//line app/vmalert/web.qtpl:57 qw422016.N().D(rOk[g.Name]) -//line app/vmalert/web.qtpl:52 +//line app/vmalert/web.qtpl:57 qw422016.N().S(`</span> <p class="fs-6 fw-lighter">`) -//line app/vmalert/web.qtpl:53 +//line app/vmalert/web.qtpl:58 qw422016.E().S(g.File) -//line app/vmalert/web.qtpl:53 +//line app/vmalert/web.qtpl:58 qw422016.N().S(`</p> `) -//line app/vmalert/web.qtpl:54 +//line app/vmalert/web.qtpl:59 if len(g.Params) > 0 { -//line app/vmalert/web.qtpl:54 +//line app/vmalert/web.qtpl:59 qw422016.N().S(` <div class="fs-6 fw-lighter">Extra params `) -//line app/vmalert/web.qtpl:56 +//line app/vmalert/web.qtpl:61 for _, param := range g.Params { -//line app/vmalert/web.qtpl:56 +//line app/vmalert/web.qtpl:61 qw422016.N().S(` <span class="float-left badge bg-primary">`) -//line app/vmalert/web.qtpl:57 +//line app/vmalert/web.qtpl:62 qw422016.E().S(param) -//line app/vmalert/web.qtpl:57 +//line app/vmalert/web.qtpl:62 qw422016.N().S(`</span> `) -//line app/vmalert/web.qtpl:58 +//line app/vmalert/web.qtpl:63 } -//line app/vmalert/web.qtpl:58 +//line app/vmalert/web.qtpl:63 qw422016.N().S(` </div> `) -//line app/vmalert/web.qtpl:60 +//line app/vmalert/web.qtpl:65 } -//line app/vmalert/web.qtpl:60 +//line app/vmalert/web.qtpl:65 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:61 +//line app/vmalert/web.qtpl:66 if len(g.Headers) > 0 { -//line app/vmalert/web.qtpl:61 +//line app/vmalert/web.qtpl:66 qw422016.N().S(` <div class="fs-6 fw-lighter">Extra headers `) -//line app/vmalert/web.qtpl:63 +//line app/vmalert/web.qtpl:68 for _, header := range g.Headers { -//line app/vmalert/web.qtpl:63 +//line app/vmalert/web.qtpl:68 qw422016.N().S(` <span class="float-left badge bg-primary">`) -//line app/vmalert/web.qtpl:64 +//line app/vmalert/web.qtpl:69 qw422016.E().S(header) -//line app/vmalert/web.qtpl:64 +//line app/vmalert/web.qtpl:69 qw422016.N().S(`</span> `) -//line app/vmalert/web.qtpl:65 +//line app/vmalert/web.qtpl:70 } -//line app/vmalert/web.qtpl:65 +//line app/vmalert/web.qtpl:70 qw422016.N().S(` </div> `) -//line app/vmalert/web.qtpl:67 +//line app/vmalert/web.qtpl:72 } -//line app/vmalert/web.qtpl:67 +//line app/vmalert/web.qtpl:72 qw422016.N().S(` </div> <div class="collapse" id="rules-`) -//line app/vmalert/web.qtpl:69 +//line app/vmalert/web.qtpl:74 qw422016.E().S(g.ID) -//line app/vmalert/web.qtpl:69 +//line app/vmalert/web.qtpl:74 qw422016.N().S(`"> <table class="table table-striped table-hover table-sm"> <thead> @@ -281,267 +321,267 @@ func StreamListGroups(qw422016 *qt422016.Writer, r *http.Request, groups []APIGr </thead> <tbody> `) -//line app/vmalert/web.qtpl:79 +//line app/vmalert/web.qtpl:84 for _, r := range g.Rules { -//line app/vmalert/web.qtpl:79 +//line app/vmalert/web.qtpl:84 qw422016.N().S(` <tr`) -//line app/vmalert/web.qtpl:80 +//line app/vmalert/web.qtpl:85 if r.LastError != "" { -//line app/vmalert/web.qtpl:80 +//line app/vmalert/web.qtpl:85 qw422016.N().S(` class="alert-danger"`) -//line app/vmalert/web.qtpl:80 +//line app/vmalert/web.qtpl:85 } -//line app/vmalert/web.qtpl:80 +//line app/vmalert/web.qtpl:85 qw422016.N().S(`> <td> <div class="row"> <div class="col-12 mb-2"> `) -//line app/vmalert/web.qtpl:84 +//line app/vmalert/web.qtpl:89 if r.Type == "alerting" { -//line app/vmalert/web.qtpl:84 +//line app/vmalert/web.qtpl:89 qw422016.N().S(` <b>alert:</b> `) -//line app/vmalert/web.qtpl:85 +//line app/vmalert/web.qtpl:90 qw422016.E().S(r.Name) -//line app/vmalert/web.qtpl:85 +//line app/vmalert/web.qtpl:90 qw422016.N().S(` (for: `) -//line app/vmalert/web.qtpl:85 +//line app/vmalert/web.qtpl:90 qw422016.E().V(r.Duration) -//line app/vmalert/web.qtpl:85 +//line app/vmalert/web.qtpl:90 qw422016.N().S(` seconds) `) -//line app/vmalert/web.qtpl:86 +//line app/vmalert/web.qtpl:91 } else { -//line app/vmalert/web.qtpl:86 +//line app/vmalert/web.qtpl:91 qw422016.N().S(` <b>record:</b> `) -//line app/vmalert/web.qtpl:87 +//line app/vmalert/web.qtpl:92 qw422016.E().S(r.Name) -//line app/vmalert/web.qtpl:87 +//line app/vmalert/web.qtpl:92 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:88 +//line app/vmalert/web.qtpl:93 } -//line app/vmalert/web.qtpl:88 +//line app/vmalert/web.qtpl:93 qw422016.N().S(` | <span><a target="_blank" href="`) -//line app/vmalert/web.qtpl:89 +//line app/vmalert/web.qtpl:94 qw422016.E().S(prefix + r.WebLink()) -//line app/vmalert/web.qtpl:89 +//line app/vmalert/web.qtpl:94 qw422016.N().S(`">Details</a></span> </div> <div class="col-12"> <code><pre>`) -//line app/vmalert/web.qtpl:92 +//line app/vmalert/web.qtpl:97 qw422016.E().S(r.Query) -//line app/vmalert/web.qtpl:92 +//line app/vmalert/web.qtpl:97 qw422016.N().S(`</pre></code> </div> <div class="col-12 mb-2"> `) -//line app/vmalert/web.qtpl:95 +//line app/vmalert/web.qtpl:100 if len(r.Labels) > 0 { -//line app/vmalert/web.qtpl:95 +//line app/vmalert/web.qtpl:100 qw422016.N().S(` <b>Labels:</b>`) -//line app/vmalert/web.qtpl:95 +//line app/vmalert/web.qtpl:100 } -//line app/vmalert/web.qtpl:95 +//line app/vmalert/web.qtpl:100 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:96 +//line app/vmalert/web.qtpl:101 for k, v := range r.Labels { -//line app/vmalert/web.qtpl:96 +//line app/vmalert/web.qtpl:101 qw422016.N().S(` <span class="ms-1 badge bg-primary">`) -//line app/vmalert/web.qtpl:97 +//line app/vmalert/web.qtpl:102 qw422016.E().S(k) -//line app/vmalert/web.qtpl:97 +//line app/vmalert/web.qtpl:102 qw422016.N().S(`=`) -//line app/vmalert/web.qtpl:97 +//line app/vmalert/web.qtpl:102 qw422016.E().S(v) -//line app/vmalert/web.qtpl:97 +//line app/vmalert/web.qtpl:102 qw422016.N().S(`</span> `) -//line app/vmalert/web.qtpl:98 +//line app/vmalert/web.qtpl:103 } -//line app/vmalert/web.qtpl:98 +//line app/vmalert/web.qtpl:103 qw422016.N().S(` </div> `) -//line app/vmalert/web.qtpl:100 +//line app/vmalert/web.qtpl:105 if r.LastError != "" { -//line app/vmalert/web.qtpl:100 +//line app/vmalert/web.qtpl:105 qw422016.N().S(` <div class="col-12"> <b>Error:</b> <div class="error-cell"> `) -//line app/vmalert/web.qtpl:104 +//line app/vmalert/web.qtpl:109 qw422016.E().S(r.LastError) -//line app/vmalert/web.qtpl:104 +//line app/vmalert/web.qtpl:109 qw422016.N().S(` </div> </div> `) -//line app/vmalert/web.qtpl:107 +//line app/vmalert/web.qtpl:112 } -//line app/vmalert/web.qtpl:107 +//line app/vmalert/web.qtpl:112 qw422016.N().S(` </div> </td> <td class="text-center">`) -//line app/vmalert/web.qtpl:110 +//line app/vmalert/web.qtpl:115 qw422016.N().D(r.LastSamples) -//line app/vmalert/web.qtpl:110 +//line app/vmalert/web.qtpl:115 qw422016.N().S(`</td> <td class="text-center">`) -//line app/vmalert/web.qtpl:111 +//line app/vmalert/web.qtpl:116 qw422016.N().FPrec(time.Since(r.LastEvaluation).Seconds(), 3) -//line app/vmalert/web.qtpl:111 +//line app/vmalert/web.qtpl:116 qw422016.N().S(`s ago</td> </tr> `) -//line app/vmalert/web.qtpl:113 +//line app/vmalert/web.qtpl:118 } -//line app/vmalert/web.qtpl:113 +//line app/vmalert/web.qtpl:118 qw422016.N().S(` </tbody> </table> </div> `) -//line app/vmalert/web.qtpl:117 +//line app/vmalert/web.qtpl:122 } -//line app/vmalert/web.qtpl:117 +//line app/vmalert/web.qtpl:122 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:119 +//line app/vmalert/web.qtpl:124 } else { -//line app/vmalert/web.qtpl:119 +//line app/vmalert/web.qtpl:124 qw422016.N().S(` <div> <p>No groups...</p> </div> `) -//line app/vmalert/web.qtpl:123 +//line app/vmalert/web.qtpl:128 } -//line app/vmalert/web.qtpl:123 +//line app/vmalert/web.qtpl:128 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:125 +//line app/vmalert/web.qtpl:130 tpl.StreamFooter(qw422016, r) -//line app/vmalert/web.qtpl:125 +//line app/vmalert/web.qtpl:130 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:127 +//line app/vmalert/web.qtpl:132 } -//line app/vmalert/web.qtpl:127 +//line app/vmalert/web.qtpl:132 func WriteListGroups(qq422016 qtio422016.Writer, r *http.Request, groups []APIGroup) { -//line app/vmalert/web.qtpl:127 +//line app/vmalert/web.qtpl:132 qw422016 := qt422016.AcquireWriter(qq422016) -//line app/vmalert/web.qtpl:127 +//line app/vmalert/web.qtpl:132 StreamListGroups(qw422016, r, groups) -//line app/vmalert/web.qtpl:127 +//line app/vmalert/web.qtpl:132 qt422016.ReleaseWriter(qw422016) -//line app/vmalert/web.qtpl:127 +//line app/vmalert/web.qtpl:132 } -//line app/vmalert/web.qtpl:127 +//line app/vmalert/web.qtpl:132 func ListGroups(r *http.Request, groups []APIGroup) string { -//line app/vmalert/web.qtpl:127 +//line app/vmalert/web.qtpl:132 qb422016 := qt422016.AcquireByteBuffer() -//line app/vmalert/web.qtpl:127 +//line app/vmalert/web.qtpl:132 WriteListGroups(qb422016, r, groups) -//line app/vmalert/web.qtpl:127 +//line app/vmalert/web.qtpl:132 qs422016 := string(qb422016.B) -//line app/vmalert/web.qtpl:127 +//line app/vmalert/web.qtpl:132 qt422016.ReleaseByteBuffer(qb422016) -//line app/vmalert/web.qtpl:127 +//line app/vmalert/web.qtpl:132 return qs422016 -//line app/vmalert/web.qtpl:127 +//line app/vmalert/web.qtpl:132 } -//line app/vmalert/web.qtpl:130 +//line app/vmalert/web.qtpl:135 func StreamListAlerts(qw422016 *qt422016.Writer, r *http.Request, groupAlerts []GroupAlerts) { -//line app/vmalert/web.qtpl:130 +//line app/vmalert/web.qtpl:135 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:131 +//line app/vmalert/web.qtpl:136 prefix := utils.Prefix(r.URL.Path) -//line app/vmalert/web.qtpl:131 +//line app/vmalert/web.qtpl:136 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:132 +//line app/vmalert/web.qtpl:137 tpl.StreamHeader(qw422016, r, navItems, "Alerts") -//line app/vmalert/web.qtpl:132 +//line app/vmalert/web.qtpl:137 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:133 +//line app/vmalert/web.qtpl:138 if len(groupAlerts) > 0 { -//line app/vmalert/web.qtpl:133 +//line app/vmalert/web.qtpl:138 qw422016.N().S(` <a class="btn btn-primary" role="button" onclick="collapseAll()">Collapse All</a> <a class="btn btn-primary" role="button" onclick="expandAll()">Expand All</a> `) -//line app/vmalert/web.qtpl:136 +//line app/vmalert/web.qtpl:141 for _, ga := range groupAlerts { -//line app/vmalert/web.qtpl:136 +//line app/vmalert/web.qtpl:141 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:137 +//line app/vmalert/web.qtpl:142 g := ga.Group -//line app/vmalert/web.qtpl:137 +//line app/vmalert/web.qtpl:142 qw422016.N().S(` <div class="group-heading alert-danger" data-bs-target="rules-`) -//line app/vmalert/web.qtpl:138 +//line app/vmalert/web.qtpl:143 qw422016.E().S(g.ID) -//line app/vmalert/web.qtpl:138 +//line app/vmalert/web.qtpl:143 qw422016.N().S(`"> <span class="anchor" id="group-`) -//line app/vmalert/web.qtpl:139 +//line app/vmalert/web.qtpl:144 qw422016.E().S(g.ID) -//line app/vmalert/web.qtpl:139 +//line app/vmalert/web.qtpl:144 qw422016.N().S(`"></span> <a href="#group-`) -//line app/vmalert/web.qtpl:140 +//line app/vmalert/web.qtpl:145 qw422016.E().S(g.ID) -//line app/vmalert/web.qtpl:140 +//line app/vmalert/web.qtpl:145 qw422016.N().S(`">`) -//line app/vmalert/web.qtpl:140 +//line app/vmalert/web.qtpl:145 qw422016.E().S(g.Name) -//line app/vmalert/web.qtpl:140 +//line app/vmalert/web.qtpl:145 if g.Type != "prometheus" { -//line app/vmalert/web.qtpl:140 +//line app/vmalert/web.qtpl:145 qw422016.N().S(` (`) -//line app/vmalert/web.qtpl:140 +//line app/vmalert/web.qtpl:145 qw422016.E().S(g.Type) -//line app/vmalert/web.qtpl:140 +//line app/vmalert/web.qtpl:145 qw422016.N().S(`)`) -//line app/vmalert/web.qtpl:140 +//line app/vmalert/web.qtpl:145 } -//line app/vmalert/web.qtpl:140 +//line app/vmalert/web.qtpl:145 qw422016.N().S(`</a> <span class="badge bg-danger" title="Number of active alerts">`) -//line app/vmalert/web.qtpl:141 +//line app/vmalert/web.qtpl:146 qw422016.N().D(len(ga.Alerts)) -//line app/vmalert/web.qtpl:141 +//line app/vmalert/web.qtpl:146 qw422016.N().S(`</span> <br> <p class="fs-6 fw-lighter">`) -//line app/vmalert/web.qtpl:143 +//line app/vmalert/web.qtpl:148 qw422016.E().S(g.File) -//line app/vmalert/web.qtpl:143 +//line app/vmalert/web.qtpl:148 qw422016.N().S(`</p> </div> `) -//line app/vmalert/web.qtpl:146 +//line app/vmalert/web.qtpl:151 var keys []string alertsByRule := make(map[string][]*APIAlert) for _, alert := range ga.Alerts { @@ -552,20 +592,20 @@ func StreamListAlerts(qw422016 *qt422016.Writer, r *http.Request, groupAlerts [] } sort.Strings(keys) -//line app/vmalert/web.qtpl:155 +//line app/vmalert/web.qtpl:160 qw422016.N().S(` <div class="collapse" id="rules-`) -//line app/vmalert/web.qtpl:156 +//line app/vmalert/web.qtpl:161 qw422016.E().S(g.ID) -//line app/vmalert/web.qtpl:156 +//line app/vmalert/web.qtpl:161 qw422016.N().S(`"> `) -//line app/vmalert/web.qtpl:157 +//line app/vmalert/web.qtpl:162 for _, ruleID := range keys { -//line app/vmalert/web.qtpl:157 +//line app/vmalert/web.qtpl:162 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:159 +//line app/vmalert/web.qtpl:164 defaultAR := alertsByRule[ruleID][0] var labelKeys []string for k := range defaultAR.Labels { @@ -573,28 +613,28 @@ func StreamListAlerts(qw422016 *qt422016.Writer, r *http.Request, groupAlerts [] } sort.Strings(labelKeys) -//line app/vmalert/web.qtpl:165 +//line app/vmalert/web.qtpl:170 qw422016.N().S(` <br> <b>alert:</b> `) -//line app/vmalert/web.qtpl:167 +//line app/vmalert/web.qtpl:172 qw422016.E().S(defaultAR.Name) -//line app/vmalert/web.qtpl:167 +//line app/vmalert/web.qtpl:172 qw422016.N().S(` (`) -//line app/vmalert/web.qtpl:167 +//line app/vmalert/web.qtpl:172 qw422016.N().D(len(alertsByRule[ruleID])) -//line app/vmalert/web.qtpl:167 +//line app/vmalert/web.qtpl:172 qw422016.N().S(`) | <span><a target="_blank" href="`) -//line app/vmalert/web.qtpl:168 +//line app/vmalert/web.qtpl:173 qw422016.E().S(defaultAR.SourceLink) -//line app/vmalert/web.qtpl:168 +//line app/vmalert/web.qtpl:173 qw422016.N().S(`">Source</a></span> <br> <b>expr:</b><code><pre>`) -//line app/vmalert/web.qtpl:170 +//line app/vmalert/web.qtpl:175 qw422016.E().S(defaultAR.Expression) -//line app/vmalert/web.qtpl:170 +//line app/vmalert/web.qtpl:175 qw422016.N().S(`</pre></code> <table class="table table-striped table-hover table-sm"> <thead> @@ -608,204 +648,204 @@ func StreamListAlerts(qw422016 *qt422016.Writer, r *http.Request, groupAlerts [] </thead> <tbody> `) -//line app/vmalert/web.qtpl:182 +//line app/vmalert/web.qtpl:187 for _, ar := range alertsByRule[ruleID] { -//line app/vmalert/web.qtpl:182 +//line app/vmalert/web.qtpl:187 qw422016.N().S(` <tr> <td> `) -//line app/vmalert/web.qtpl:185 +//line app/vmalert/web.qtpl:190 for _, k := range labelKeys { -//line app/vmalert/web.qtpl:185 +//line app/vmalert/web.qtpl:190 qw422016.N().S(` <span class="ms-1 badge bg-primary">`) -//line app/vmalert/web.qtpl:186 +//line app/vmalert/web.qtpl:191 qw422016.E().S(k) -//line app/vmalert/web.qtpl:186 +//line app/vmalert/web.qtpl:191 qw422016.N().S(`=`) -//line app/vmalert/web.qtpl:186 +//line app/vmalert/web.qtpl:191 qw422016.E().S(ar.Labels[k]) -//line app/vmalert/web.qtpl:186 +//line app/vmalert/web.qtpl:191 qw422016.N().S(`</span> `) -//line app/vmalert/web.qtpl:187 +//line app/vmalert/web.qtpl:192 } -//line app/vmalert/web.qtpl:187 +//line app/vmalert/web.qtpl:192 qw422016.N().S(` </td> <td>`) -//line app/vmalert/web.qtpl:189 +//line app/vmalert/web.qtpl:194 streambadgeState(qw422016, ar.State) -//line app/vmalert/web.qtpl:189 +//line app/vmalert/web.qtpl:194 qw422016.N().S(`</td> <td> `) -//line app/vmalert/web.qtpl:191 +//line app/vmalert/web.qtpl:196 qw422016.E().S(ar.ActiveAt.Format("2006-01-02T15:04:05Z07:00")) -//line app/vmalert/web.qtpl:191 +//line app/vmalert/web.qtpl:196 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:192 +//line app/vmalert/web.qtpl:197 if ar.Restored { -//line app/vmalert/web.qtpl:192 +//line app/vmalert/web.qtpl:197 streambadgeRestored(qw422016) -//line app/vmalert/web.qtpl:192 +//line app/vmalert/web.qtpl:197 } -//line app/vmalert/web.qtpl:192 +//line app/vmalert/web.qtpl:197 qw422016.N().S(` </td> <td>`) -//line app/vmalert/web.qtpl:194 +//line app/vmalert/web.qtpl:199 qw422016.E().S(ar.Value) -//line app/vmalert/web.qtpl:194 +//line app/vmalert/web.qtpl:199 qw422016.N().S(`</td> <td> <a href="`) -//line app/vmalert/web.qtpl:196 +//line app/vmalert/web.qtpl:201 qw422016.E().S(prefix + ar.WebLink()) -//line app/vmalert/web.qtpl:196 +//line app/vmalert/web.qtpl:201 qw422016.N().S(`">Details</a> </td> </tr> `) -//line app/vmalert/web.qtpl:199 +//line app/vmalert/web.qtpl:204 } -//line app/vmalert/web.qtpl:199 +//line app/vmalert/web.qtpl:204 qw422016.N().S(` </tbody> </table> `) -//line app/vmalert/web.qtpl:202 +//line app/vmalert/web.qtpl:207 } -//line app/vmalert/web.qtpl:202 +//line app/vmalert/web.qtpl:207 qw422016.N().S(` </div> <br> `) -//line app/vmalert/web.qtpl:205 +//line app/vmalert/web.qtpl:210 } -//line app/vmalert/web.qtpl:205 +//line app/vmalert/web.qtpl:210 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:207 +//line app/vmalert/web.qtpl:212 } else { -//line app/vmalert/web.qtpl:207 +//line app/vmalert/web.qtpl:212 qw422016.N().S(` <div> <p>No active alerts...</p> </div> `) -//line app/vmalert/web.qtpl:211 +//line app/vmalert/web.qtpl:216 } -//line app/vmalert/web.qtpl:211 +//line app/vmalert/web.qtpl:216 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:213 +//line app/vmalert/web.qtpl:218 tpl.StreamFooter(qw422016, r) -//line app/vmalert/web.qtpl:213 +//line app/vmalert/web.qtpl:218 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:215 +//line app/vmalert/web.qtpl:220 } -//line app/vmalert/web.qtpl:215 +//line app/vmalert/web.qtpl:220 func WriteListAlerts(qq422016 qtio422016.Writer, r *http.Request, groupAlerts []GroupAlerts) { -//line app/vmalert/web.qtpl:215 +//line app/vmalert/web.qtpl:220 qw422016 := qt422016.AcquireWriter(qq422016) -//line app/vmalert/web.qtpl:215 +//line app/vmalert/web.qtpl:220 StreamListAlerts(qw422016, r, groupAlerts) -//line app/vmalert/web.qtpl:215 +//line app/vmalert/web.qtpl:220 qt422016.ReleaseWriter(qw422016) -//line app/vmalert/web.qtpl:215 +//line app/vmalert/web.qtpl:220 } -//line app/vmalert/web.qtpl:215 +//line app/vmalert/web.qtpl:220 func ListAlerts(r *http.Request, groupAlerts []GroupAlerts) string { -//line app/vmalert/web.qtpl:215 +//line app/vmalert/web.qtpl:220 qb422016 := qt422016.AcquireByteBuffer() -//line app/vmalert/web.qtpl:215 +//line app/vmalert/web.qtpl:220 WriteListAlerts(qb422016, r, groupAlerts) -//line app/vmalert/web.qtpl:215 +//line app/vmalert/web.qtpl:220 qs422016 := string(qb422016.B) -//line app/vmalert/web.qtpl:215 +//line app/vmalert/web.qtpl:220 qt422016.ReleaseByteBuffer(qb422016) -//line app/vmalert/web.qtpl:215 +//line app/vmalert/web.qtpl:220 return qs422016 -//line app/vmalert/web.qtpl:215 +//line app/vmalert/web.qtpl:220 } -//line app/vmalert/web.qtpl:217 +//line app/vmalert/web.qtpl:222 func StreamListTargets(qw422016 *qt422016.Writer, r *http.Request, targets map[notifier.TargetType][]notifier.Target) { -//line app/vmalert/web.qtpl:217 +//line app/vmalert/web.qtpl:222 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:218 +//line app/vmalert/web.qtpl:223 tpl.StreamHeader(qw422016, r, navItems, "Notifiers") -//line app/vmalert/web.qtpl:218 +//line app/vmalert/web.qtpl:223 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:219 +//line app/vmalert/web.qtpl:224 if len(targets) > 0 { -//line app/vmalert/web.qtpl:219 +//line app/vmalert/web.qtpl:224 qw422016.N().S(` <a class="btn btn-primary" role="button" onclick="collapseAll()">Collapse All</a> <a class="btn btn-primary" role="button" onclick="expandAll()">Expand All</a> `) -//line app/vmalert/web.qtpl:224 +//line app/vmalert/web.qtpl:229 var keys []string for key := range targets { keys = append(keys, string(key)) } sort.Strings(keys) -//line app/vmalert/web.qtpl:229 +//line app/vmalert/web.qtpl:234 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:231 +//line app/vmalert/web.qtpl:236 for i := range keys { -//line app/vmalert/web.qtpl:231 +//line app/vmalert/web.qtpl:236 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:232 +//line app/vmalert/web.qtpl:237 typeK, ns := keys[i], targets[notifier.TargetType(keys[i])] count := len(ns) -//line app/vmalert/web.qtpl:234 +//line app/vmalert/web.qtpl:239 qw422016.N().S(` <div class="group-heading data-bs-target="rules-`) -//line app/vmalert/web.qtpl:235 +//line app/vmalert/web.qtpl:240 qw422016.E().S(typeK) -//line app/vmalert/web.qtpl:235 +//line app/vmalert/web.qtpl:240 qw422016.N().S(`"> <span class="anchor" id="notifiers-`) -//line app/vmalert/web.qtpl:236 +//line app/vmalert/web.qtpl:241 qw422016.E().S(typeK) -//line app/vmalert/web.qtpl:236 +//line app/vmalert/web.qtpl:241 qw422016.N().S(`"></span> <a href="#notifiers-`) -//line app/vmalert/web.qtpl:237 +//line app/vmalert/web.qtpl:242 qw422016.E().S(typeK) -//line app/vmalert/web.qtpl:237 +//line app/vmalert/web.qtpl:242 qw422016.N().S(`">`) -//line app/vmalert/web.qtpl:237 +//line app/vmalert/web.qtpl:242 qw422016.E().S(typeK) -//line app/vmalert/web.qtpl:237 +//line app/vmalert/web.qtpl:242 qw422016.N().S(` (`) -//line app/vmalert/web.qtpl:237 +//line app/vmalert/web.qtpl:242 qw422016.N().D(count) -//line app/vmalert/web.qtpl:237 +//line app/vmalert/web.qtpl:242 qw422016.N().S(`)</a> </div> <div class="collapse show" id="notifiers-`) -//line app/vmalert/web.qtpl:239 +//line app/vmalert/web.qtpl:244 qw422016.E().S(typeK) -//line app/vmalert/web.qtpl:239 +//line app/vmalert/web.qtpl:244 qw422016.N().S(`"> <table class="table table-striped table-hover table-sm"> <thead> @@ -816,119 +856,119 @@ func StreamListTargets(qw422016 *qt422016.Writer, r *http.Request, targets map[n </thead> <tbody> `) -//line app/vmalert/web.qtpl:248 +//line app/vmalert/web.qtpl:253 for _, n := range ns { -//line app/vmalert/web.qtpl:248 +//line app/vmalert/web.qtpl:253 qw422016.N().S(` <tr> <td> `) -//line app/vmalert/web.qtpl:251 +//line app/vmalert/web.qtpl:256 for _, l := range n.Labels.GetLabels() { -//line app/vmalert/web.qtpl:251 +//line app/vmalert/web.qtpl:256 qw422016.N().S(` <span class="ms-1 badge bg-primary">`) -//line app/vmalert/web.qtpl:252 +//line app/vmalert/web.qtpl:257 qw422016.E().S(l.Name) -//line app/vmalert/web.qtpl:252 +//line app/vmalert/web.qtpl:257 qw422016.N().S(`=`) -//line app/vmalert/web.qtpl:252 +//line app/vmalert/web.qtpl:257 qw422016.E().S(l.Value) -//line app/vmalert/web.qtpl:252 +//line app/vmalert/web.qtpl:257 qw422016.N().S(`</span> `) -//line app/vmalert/web.qtpl:253 +//line app/vmalert/web.qtpl:258 } -//line app/vmalert/web.qtpl:253 +//line app/vmalert/web.qtpl:258 qw422016.N().S(` </td> <td>`) -//line app/vmalert/web.qtpl:255 +//line app/vmalert/web.qtpl:260 qw422016.E().S(n.Notifier.Addr()) -//line app/vmalert/web.qtpl:255 +//line app/vmalert/web.qtpl:260 qw422016.N().S(`</td> </tr> `) -//line app/vmalert/web.qtpl:257 +//line app/vmalert/web.qtpl:262 } -//line app/vmalert/web.qtpl:257 +//line app/vmalert/web.qtpl:262 qw422016.N().S(` </tbody> </table> </div> `) -//line app/vmalert/web.qtpl:261 +//line app/vmalert/web.qtpl:266 } -//line app/vmalert/web.qtpl:261 +//line app/vmalert/web.qtpl:266 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:263 +//line app/vmalert/web.qtpl:268 } else { -//line app/vmalert/web.qtpl:263 +//line app/vmalert/web.qtpl:268 qw422016.N().S(` <div> <p>No targets...</p> </div> `) -//line app/vmalert/web.qtpl:267 +//line app/vmalert/web.qtpl:272 } -//line app/vmalert/web.qtpl:267 +//line app/vmalert/web.qtpl:272 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:269 +//line app/vmalert/web.qtpl:274 tpl.StreamFooter(qw422016, r) -//line app/vmalert/web.qtpl:269 +//line app/vmalert/web.qtpl:274 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:271 +//line app/vmalert/web.qtpl:276 } -//line app/vmalert/web.qtpl:271 +//line app/vmalert/web.qtpl:276 func WriteListTargets(qq422016 qtio422016.Writer, r *http.Request, targets map[notifier.TargetType][]notifier.Target) { -//line app/vmalert/web.qtpl:271 +//line app/vmalert/web.qtpl:276 qw422016 := qt422016.AcquireWriter(qq422016) -//line app/vmalert/web.qtpl:271 +//line app/vmalert/web.qtpl:276 StreamListTargets(qw422016, r, targets) -//line app/vmalert/web.qtpl:271 +//line app/vmalert/web.qtpl:276 qt422016.ReleaseWriter(qw422016) -//line app/vmalert/web.qtpl:271 +//line app/vmalert/web.qtpl:276 } -//line app/vmalert/web.qtpl:271 +//line app/vmalert/web.qtpl:276 func ListTargets(r *http.Request, targets map[notifier.TargetType][]notifier.Target) string { -//line app/vmalert/web.qtpl:271 +//line app/vmalert/web.qtpl:276 qb422016 := qt422016.AcquireByteBuffer() -//line app/vmalert/web.qtpl:271 +//line app/vmalert/web.qtpl:276 WriteListTargets(qb422016, r, targets) -//line app/vmalert/web.qtpl:271 +//line app/vmalert/web.qtpl:276 qs422016 := string(qb422016.B) -//line app/vmalert/web.qtpl:271 +//line app/vmalert/web.qtpl:276 qt422016.ReleaseByteBuffer(qb422016) -//line app/vmalert/web.qtpl:271 +//line app/vmalert/web.qtpl:276 return qs422016 -//line app/vmalert/web.qtpl:271 +//line app/vmalert/web.qtpl:276 } -//line app/vmalert/web.qtpl:273 +//line app/vmalert/web.qtpl:278 func StreamAlert(qw422016 *qt422016.Writer, r *http.Request, alert *APIAlert) { -//line app/vmalert/web.qtpl:273 +//line app/vmalert/web.qtpl:278 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:274 +//line app/vmalert/web.qtpl:279 prefix := utils.Prefix(r.URL.Path) -//line app/vmalert/web.qtpl:274 +//line app/vmalert/web.qtpl:279 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:275 +//line app/vmalert/web.qtpl:280 tpl.StreamHeader(qw422016, r, navItems, "") -//line app/vmalert/web.qtpl:275 +//line app/vmalert/web.qtpl:280 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:277 +//line app/vmalert/web.qtpl:282 var labelKeys []string for k := range alert.Labels { labelKeys = append(labelKeys, k) @@ -941,28 +981,28 @@ func StreamAlert(qw422016 *qt422016.Writer, r *http.Request, alert *APIAlert) { } sort.Strings(annotationKeys) -//line app/vmalert/web.qtpl:288 +//line app/vmalert/web.qtpl:293 qw422016.N().S(` <div class="display-6 pb-3 mb-3">Alert: `) -//line app/vmalert/web.qtpl:289 +//line app/vmalert/web.qtpl:294 qw422016.E().S(alert.Name) -//line app/vmalert/web.qtpl:289 +//line app/vmalert/web.qtpl:294 qw422016.N().S(`<span class="ms-2 badge `) -//line app/vmalert/web.qtpl:289 +//line app/vmalert/web.qtpl:294 if alert.State == "firing" { -//line app/vmalert/web.qtpl:289 +//line app/vmalert/web.qtpl:294 qw422016.N().S(`bg-danger`) -//line app/vmalert/web.qtpl:289 +//line app/vmalert/web.qtpl:294 } else { -//line app/vmalert/web.qtpl:289 +//line app/vmalert/web.qtpl:294 qw422016.N().S(` bg-warning text-dark`) -//line app/vmalert/web.qtpl:289 +//line app/vmalert/web.qtpl:294 } -//line app/vmalert/web.qtpl:289 +//line app/vmalert/web.qtpl:294 qw422016.N().S(`">`) -//line app/vmalert/web.qtpl:289 +//line app/vmalert/web.qtpl:294 qw422016.E().S(alert.State) -//line app/vmalert/web.qtpl:289 +//line app/vmalert/web.qtpl:294 qw422016.N().S(`</span></div> <div class="container border-bottom p-2"> <div class="row"> @@ -971,9 +1011,9 @@ func StreamAlert(qw422016 *qt422016.Writer, r *http.Request, alert *APIAlert) { </div> <div class="col"> `) -//line app/vmalert/web.qtpl:296 +//line app/vmalert/web.qtpl:301 qw422016.E().S(alert.ActiveAt.Format("2006-01-02T15:04:05Z07:00")) -//line app/vmalert/web.qtpl:296 +//line app/vmalert/web.qtpl:301 qw422016.N().S(` </div> </div> @@ -985,9 +1025,9 @@ func StreamAlert(qw422016 *qt422016.Writer, r *http.Request, alert *APIAlert) { </div> <div class="col"> <code><pre>`) -//line app/vmalert/web.qtpl:306 +//line app/vmalert/web.qtpl:311 qw422016.E().S(alert.Expression) -//line app/vmalert/web.qtpl:306 +//line app/vmalert/web.qtpl:311 qw422016.N().S(`</pre></code> </div> </div> @@ -999,23 +1039,23 @@ func StreamAlert(qw422016 *qt422016.Writer, r *http.Request, alert *APIAlert) { </div> <div class="col"> `) -//line app/vmalert/web.qtpl:316 +//line app/vmalert/web.qtpl:321 for _, k := range labelKeys { -//line app/vmalert/web.qtpl:316 +//line app/vmalert/web.qtpl:321 qw422016.N().S(` <span class="m-1 badge bg-primary">`) -//line app/vmalert/web.qtpl:317 +//line app/vmalert/web.qtpl:322 qw422016.E().S(k) -//line app/vmalert/web.qtpl:317 +//line app/vmalert/web.qtpl:322 qw422016.N().S(`=`) -//line app/vmalert/web.qtpl:317 +//line app/vmalert/web.qtpl:322 qw422016.E().S(alert.Labels[k]) -//line app/vmalert/web.qtpl:317 +//line app/vmalert/web.qtpl:322 qw422016.N().S(`</span> `) -//line app/vmalert/web.qtpl:318 +//line app/vmalert/web.qtpl:323 } -//line app/vmalert/web.qtpl:318 +//line app/vmalert/web.qtpl:323 qw422016.N().S(` </div> </div> @@ -1027,24 +1067,24 @@ func StreamAlert(qw422016 *qt422016.Writer, r *http.Request, alert *APIAlert) { </div> <div class="col"> `) -//line app/vmalert/web.qtpl:328 +//line app/vmalert/web.qtpl:333 for _, k := range annotationKeys { -//line app/vmalert/web.qtpl:328 +//line app/vmalert/web.qtpl:333 qw422016.N().S(` <b>`) -//line app/vmalert/web.qtpl:329 +//line app/vmalert/web.qtpl:334 qw422016.E().S(k) -//line app/vmalert/web.qtpl:329 +//line app/vmalert/web.qtpl:334 qw422016.N().S(`:</b><br> <p>`) -//line app/vmalert/web.qtpl:330 +//line app/vmalert/web.qtpl:335 qw422016.E().S(alert.Annotations[k]) -//line app/vmalert/web.qtpl:330 +//line app/vmalert/web.qtpl:335 qw422016.N().S(`</p> `) -//line app/vmalert/web.qtpl:331 +//line app/vmalert/web.qtpl:336 } -//line app/vmalert/web.qtpl:331 +//line app/vmalert/web.qtpl:336 qw422016.N().S(` </div> </div> @@ -1056,17 +1096,17 @@ func StreamAlert(qw422016 *qt422016.Writer, r *http.Request, alert *APIAlert) { </div> <div class="col"> <a target="_blank" href="`) -//line app/vmalert/web.qtpl:341 +//line app/vmalert/web.qtpl:346 qw422016.E().S(prefix) -//line app/vmalert/web.qtpl:341 +//line app/vmalert/web.qtpl:346 qw422016.N().S(`groups#group-`) -//line app/vmalert/web.qtpl:341 +//line app/vmalert/web.qtpl:346 qw422016.E().S(alert.GroupID) -//line app/vmalert/web.qtpl:341 +//line app/vmalert/web.qtpl:346 qw422016.N().S(`">`) -//line app/vmalert/web.qtpl:341 +//line app/vmalert/web.qtpl:346 qw422016.E().S(alert.GroupID) -//line app/vmalert/web.qtpl:341 +//line app/vmalert/web.qtpl:346 qw422016.N().S(`</a> </div> </div> @@ -1078,66 +1118,66 @@ func StreamAlert(qw422016 *qt422016.Writer, r *http.Request, alert *APIAlert) { </div> <div class="col"> <a target="_blank" href="`) -//line app/vmalert/web.qtpl:351 +//line app/vmalert/web.qtpl:356 qw422016.E().S(alert.SourceLink) -//line app/vmalert/web.qtpl:351 +//line app/vmalert/web.qtpl:356 qw422016.N().S(`">Link</a> </div> </div> </div> `) -//line app/vmalert/web.qtpl:355 +//line app/vmalert/web.qtpl:360 tpl.StreamFooter(qw422016, r) -//line app/vmalert/web.qtpl:355 +//line app/vmalert/web.qtpl:360 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:357 +//line app/vmalert/web.qtpl:362 } -//line app/vmalert/web.qtpl:357 +//line app/vmalert/web.qtpl:362 func WriteAlert(qq422016 qtio422016.Writer, r *http.Request, alert *APIAlert) { -//line app/vmalert/web.qtpl:357 +//line app/vmalert/web.qtpl:362 qw422016 := qt422016.AcquireWriter(qq422016) -//line app/vmalert/web.qtpl:357 +//line app/vmalert/web.qtpl:362 StreamAlert(qw422016, r, alert) -//line app/vmalert/web.qtpl:357 +//line app/vmalert/web.qtpl:362 qt422016.ReleaseWriter(qw422016) -//line app/vmalert/web.qtpl:357 +//line app/vmalert/web.qtpl:362 } -//line app/vmalert/web.qtpl:357 +//line app/vmalert/web.qtpl:362 func Alert(r *http.Request, alert *APIAlert) string { -//line app/vmalert/web.qtpl:357 +//line app/vmalert/web.qtpl:362 qb422016 := qt422016.AcquireByteBuffer() -//line app/vmalert/web.qtpl:357 +//line app/vmalert/web.qtpl:362 WriteAlert(qb422016, r, alert) -//line app/vmalert/web.qtpl:357 +//line app/vmalert/web.qtpl:362 qs422016 := string(qb422016.B) -//line app/vmalert/web.qtpl:357 +//line app/vmalert/web.qtpl:362 qt422016.ReleaseByteBuffer(qb422016) -//line app/vmalert/web.qtpl:357 +//line app/vmalert/web.qtpl:362 return qs422016 -//line app/vmalert/web.qtpl:357 +//line app/vmalert/web.qtpl:362 } -//line app/vmalert/web.qtpl:360 +//line app/vmalert/web.qtpl:365 func StreamRuleDetails(qw422016 *qt422016.Writer, r *http.Request, rule APIRule) { -//line app/vmalert/web.qtpl:360 +//line app/vmalert/web.qtpl:365 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:361 +//line app/vmalert/web.qtpl:366 prefix := utils.Prefix(r.URL.Path) -//line app/vmalert/web.qtpl:361 +//line app/vmalert/web.qtpl:366 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:362 +//line app/vmalert/web.qtpl:367 tpl.StreamHeader(qw422016, r, navItems, "") -//line app/vmalert/web.qtpl:362 +//line app/vmalert/web.qtpl:367 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:364 +//line app/vmalert/web.qtpl:369 var labelKeys []string for k := range rule.Labels { labelKeys = append(labelKeys, k) @@ -1150,28 +1190,28 @@ func StreamRuleDetails(qw422016 *qt422016.Writer, r *http.Request, rule APIRule) } sort.Strings(annotationKeys) -//line app/vmalert/web.qtpl:375 +//line app/vmalert/web.qtpl:380 qw422016.N().S(` <div class="display-6 pb-3 mb-3">Rule: `) -//line app/vmalert/web.qtpl:376 +//line app/vmalert/web.qtpl:381 qw422016.E().S(rule.Name) -//line app/vmalert/web.qtpl:376 +//line app/vmalert/web.qtpl:381 qw422016.N().S(`<span class="ms-2 badge `) -//line app/vmalert/web.qtpl:376 +//line app/vmalert/web.qtpl:381 if rule.Health != "ok" { -//line app/vmalert/web.qtpl:376 +//line app/vmalert/web.qtpl:381 qw422016.N().S(`bg-danger`) -//line app/vmalert/web.qtpl:376 +//line app/vmalert/web.qtpl:381 } else { -//line app/vmalert/web.qtpl:376 +//line app/vmalert/web.qtpl:381 qw422016.N().S(` bg-warning text-dark`) -//line app/vmalert/web.qtpl:376 +//line app/vmalert/web.qtpl:381 } -//line app/vmalert/web.qtpl:376 +//line app/vmalert/web.qtpl:381 qw422016.N().S(`">`) -//line app/vmalert/web.qtpl:376 +//line app/vmalert/web.qtpl:381 qw422016.E().S(rule.Health) -//line app/vmalert/web.qtpl:376 +//line app/vmalert/web.qtpl:381 qw422016.N().S(`</span></div> <div class="container border-bottom p-2"> <div class="row"> @@ -1180,17 +1220,17 @@ func StreamRuleDetails(qw422016 *qt422016.Writer, r *http.Request, rule APIRule) </div> <div class="col"> <code><pre>`) -//line app/vmalert/web.qtpl:383 +//line app/vmalert/web.qtpl:388 qw422016.E().S(rule.Query) -//line app/vmalert/web.qtpl:383 +//line app/vmalert/web.qtpl:388 qw422016.N().S(`</pre></code> </div> </div> </div> `) -//line app/vmalert/web.qtpl:387 +//line app/vmalert/web.qtpl:392 if rule.Type == "alerting" { -//line app/vmalert/web.qtpl:387 +//line app/vmalert/web.qtpl:392 qw422016.N().S(` <div class="container border-bottom p-2"> <div class="row"> @@ -1199,17 +1239,17 @@ func StreamRuleDetails(qw422016 *qt422016.Writer, r *http.Request, rule APIRule) </div> <div class="col"> `) -//line app/vmalert/web.qtpl:394 +//line app/vmalert/web.qtpl:399 qw422016.E().V(rule.Duration) -//line app/vmalert/web.qtpl:394 +//line app/vmalert/web.qtpl:399 qw422016.N().S(` seconds </div> </div> </div> `) -//line app/vmalert/web.qtpl:398 +//line app/vmalert/web.qtpl:403 } -//line app/vmalert/web.qtpl:398 +//line app/vmalert/web.qtpl:403 qw422016.N().S(` <div class="container border-bottom p-2"> <div class="row"> @@ -1218,31 +1258,31 @@ func StreamRuleDetails(qw422016 *qt422016.Writer, r *http.Request, rule APIRule) </div> <div class="col"> `) -//line app/vmalert/web.qtpl:405 +//line app/vmalert/web.qtpl:410 for _, k := range labelKeys { -//line app/vmalert/web.qtpl:405 +//line app/vmalert/web.qtpl:410 qw422016.N().S(` <span class="m-1 badge bg-primary">`) -//line app/vmalert/web.qtpl:406 +//line app/vmalert/web.qtpl:411 qw422016.E().S(k) -//line app/vmalert/web.qtpl:406 +//line app/vmalert/web.qtpl:411 qw422016.N().S(`=`) -//line app/vmalert/web.qtpl:406 +//line app/vmalert/web.qtpl:411 qw422016.E().S(rule.Labels[k]) -//line app/vmalert/web.qtpl:406 +//line app/vmalert/web.qtpl:411 qw422016.N().S(`</span> `) -//line app/vmalert/web.qtpl:407 +//line app/vmalert/web.qtpl:412 } -//line app/vmalert/web.qtpl:407 +//line app/vmalert/web.qtpl:412 qw422016.N().S(` </div> </div> </div> `) -//line app/vmalert/web.qtpl:411 +//line app/vmalert/web.qtpl:416 if rule.Type == "alerting" { -//line app/vmalert/web.qtpl:411 +//line app/vmalert/web.qtpl:416 qw422016.N().S(` <div class="container border-bottom p-2"> <div class="row"> @@ -1251,32 +1291,32 @@ func StreamRuleDetails(qw422016 *qt422016.Writer, r *http.Request, rule APIRule) </div> <div class="col"> `) -//line app/vmalert/web.qtpl:418 +//line app/vmalert/web.qtpl:423 for _, k := range annotationKeys { -//line app/vmalert/web.qtpl:418 +//line app/vmalert/web.qtpl:423 qw422016.N().S(` <b>`) -//line app/vmalert/web.qtpl:419 +//line app/vmalert/web.qtpl:424 qw422016.E().S(k) -//line app/vmalert/web.qtpl:419 +//line app/vmalert/web.qtpl:424 qw422016.N().S(`:</b><br> <p>`) -//line app/vmalert/web.qtpl:420 +//line app/vmalert/web.qtpl:425 qw422016.E().S(rule.Annotations[k]) -//line app/vmalert/web.qtpl:420 +//line app/vmalert/web.qtpl:425 qw422016.N().S(`</p> `) -//line app/vmalert/web.qtpl:421 +//line app/vmalert/web.qtpl:426 } -//line app/vmalert/web.qtpl:421 +//line app/vmalert/web.qtpl:426 qw422016.N().S(` </div> </div> </div> `) -//line app/vmalert/web.qtpl:425 +//line app/vmalert/web.qtpl:430 } -//line app/vmalert/web.qtpl:425 +//line app/vmalert/web.qtpl:430 qw422016.N().S(` <div class="container border-bottom p-2"> <div class="row"> @@ -1285,17 +1325,17 @@ func StreamRuleDetails(qw422016 *qt422016.Writer, r *http.Request, rule APIRule) </div> <div class="col"> <a target="_blank" href="`) -//line app/vmalert/web.qtpl:432 +//line app/vmalert/web.qtpl:437 qw422016.E().S(prefix) -//line app/vmalert/web.qtpl:432 +//line app/vmalert/web.qtpl:437 qw422016.N().S(`groups#group-`) -//line app/vmalert/web.qtpl:432 +//line app/vmalert/web.qtpl:437 qw422016.E().S(rule.GroupID) -//line app/vmalert/web.qtpl:432 +//line app/vmalert/web.qtpl:437 qw422016.N().S(`">`) -//line app/vmalert/web.qtpl:432 +//line app/vmalert/web.qtpl:437 qw422016.E().S(rule.GroupID) -//line app/vmalert/web.qtpl:432 +//line app/vmalert/web.qtpl:437 qw422016.N().S(`</a> </div> </div> @@ -1303,9 +1343,9 @@ func StreamRuleDetails(qw422016 *qt422016.Writer, r *http.Request, rule APIRule) <br> <div class="display-6 pb-3">Last `) -//line app/vmalert/web.qtpl:438 +//line app/vmalert/web.qtpl:443 qw422016.N().D(len(rule.Updates)) -//line app/vmalert/web.qtpl:438 +//line app/vmalert/web.qtpl:443 qw422016.N().S(` updates</span>:</div> <table class="table table-striped table-hover table-sm"> <thead> @@ -1320,201 +1360,201 @@ func StreamRuleDetails(qw422016 *qt422016.Writer, r *http.Request, rule APIRule) <tbody> `) -//line app/vmalert/web.qtpl:451 +//line app/vmalert/web.qtpl:456 for _, u := range rule.Updates { -//line app/vmalert/web.qtpl:451 +//line app/vmalert/web.qtpl:456 qw422016.N().S(` <tr`) -//line app/vmalert/web.qtpl:452 +//line app/vmalert/web.qtpl:457 if u.err != nil { -//line app/vmalert/web.qtpl:452 +//line app/vmalert/web.qtpl:457 qw422016.N().S(` class="alert-danger"`) -//line app/vmalert/web.qtpl:452 +//line app/vmalert/web.qtpl:457 } -//line app/vmalert/web.qtpl:452 +//line app/vmalert/web.qtpl:457 qw422016.N().S(`> <td> <span class="badge bg-primary rounded-pill me-3" title="Updated at">`) -//line app/vmalert/web.qtpl:454 +//line app/vmalert/web.qtpl:459 qw422016.E().S(u.time.Format(time.RFC3339)) -//line app/vmalert/web.qtpl:454 +//line app/vmalert/web.qtpl:459 qw422016.N().S(`</span> </td> <td class="text-center" wi>`) -//line app/vmalert/web.qtpl:456 +//line app/vmalert/web.qtpl:461 qw422016.N().D(u.samples) -//line app/vmalert/web.qtpl:456 +//line app/vmalert/web.qtpl:461 qw422016.N().S(`</td> <td class="text-center">`) -//line app/vmalert/web.qtpl:457 +//line app/vmalert/web.qtpl:462 qw422016.N().FPrec(u.duration.Seconds(), 3) -//line app/vmalert/web.qtpl:457 +//line app/vmalert/web.qtpl:462 qw422016.N().S(`s</td> <td class="text-center">`) -//line app/vmalert/web.qtpl:458 +//line app/vmalert/web.qtpl:463 qw422016.E().S(u.at.Format(time.RFC3339)) -//line app/vmalert/web.qtpl:458 +//line app/vmalert/web.qtpl:463 qw422016.N().S(`</td> <td> <textarea class="curl-area" rows="1" onclick="this.focus();this.select()">`) -//line app/vmalert/web.qtpl:460 +//line app/vmalert/web.qtpl:465 qw422016.E().S(u.curl) -//line app/vmalert/web.qtpl:460 +//line app/vmalert/web.qtpl:465 qw422016.N().S(`</textarea> </td> </tr> </li> `) -//line app/vmalert/web.qtpl:464 +//line app/vmalert/web.qtpl:469 if u.err != nil { -//line app/vmalert/web.qtpl:464 +//line app/vmalert/web.qtpl:469 qw422016.N().S(` <tr`) -//line app/vmalert/web.qtpl:465 +//line app/vmalert/web.qtpl:470 if u.err != nil { -//line app/vmalert/web.qtpl:465 +//line app/vmalert/web.qtpl:470 qw422016.N().S(` class="alert-danger"`) -//line app/vmalert/web.qtpl:465 +//line app/vmalert/web.qtpl:470 } -//line app/vmalert/web.qtpl:465 +//line app/vmalert/web.qtpl:470 qw422016.N().S(`> <td colspan="5"> <span class="alert-danger">`) -//line app/vmalert/web.qtpl:467 +//line app/vmalert/web.qtpl:472 qw422016.E().V(u.err) -//line app/vmalert/web.qtpl:467 +//line app/vmalert/web.qtpl:472 qw422016.N().S(`</span> </td> </tr> `) -//line app/vmalert/web.qtpl:470 +//line app/vmalert/web.qtpl:475 } -//line app/vmalert/web.qtpl:470 +//line app/vmalert/web.qtpl:475 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:471 +//line app/vmalert/web.qtpl:476 } -//line app/vmalert/web.qtpl:471 +//line app/vmalert/web.qtpl:476 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:473 +//line app/vmalert/web.qtpl:478 tpl.StreamFooter(qw422016, r) -//line app/vmalert/web.qtpl:473 +//line app/vmalert/web.qtpl:478 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:474 +//line app/vmalert/web.qtpl:479 } -//line app/vmalert/web.qtpl:474 +//line app/vmalert/web.qtpl:479 func WriteRuleDetails(qq422016 qtio422016.Writer, r *http.Request, rule APIRule) { -//line app/vmalert/web.qtpl:474 +//line app/vmalert/web.qtpl:479 qw422016 := qt422016.AcquireWriter(qq422016) -//line app/vmalert/web.qtpl:474 +//line app/vmalert/web.qtpl:479 StreamRuleDetails(qw422016, r, rule) -//line app/vmalert/web.qtpl:474 +//line app/vmalert/web.qtpl:479 qt422016.ReleaseWriter(qw422016) -//line app/vmalert/web.qtpl:474 +//line app/vmalert/web.qtpl:479 } -//line app/vmalert/web.qtpl:474 +//line app/vmalert/web.qtpl:479 func RuleDetails(r *http.Request, rule APIRule) string { -//line app/vmalert/web.qtpl:474 +//line app/vmalert/web.qtpl:479 qb422016 := qt422016.AcquireByteBuffer() -//line app/vmalert/web.qtpl:474 +//line app/vmalert/web.qtpl:479 WriteRuleDetails(qb422016, r, rule) -//line app/vmalert/web.qtpl:474 +//line app/vmalert/web.qtpl:479 qs422016 := string(qb422016.B) -//line app/vmalert/web.qtpl:474 +//line app/vmalert/web.qtpl:479 qt422016.ReleaseByteBuffer(qb422016) -//line app/vmalert/web.qtpl:474 +//line app/vmalert/web.qtpl:479 return qs422016 -//line app/vmalert/web.qtpl:474 +//line app/vmalert/web.qtpl:479 } -//line app/vmalert/web.qtpl:478 +//line app/vmalert/web.qtpl:483 func streambadgeState(qw422016 *qt422016.Writer, state string) { -//line app/vmalert/web.qtpl:478 +//line app/vmalert/web.qtpl:483 qw422016.N().S(` `) -//line app/vmalert/web.qtpl:480 +//line app/vmalert/web.qtpl:485 badgeClass := "bg-warning text-dark" if state == "firing" { badgeClass = "bg-danger" } -//line app/vmalert/web.qtpl:484 +//line app/vmalert/web.qtpl:489 qw422016.N().S(` <span class="badge `) -//line app/vmalert/web.qtpl:485 +//line app/vmalert/web.qtpl:490 qw422016.E().S(badgeClass) -//line app/vmalert/web.qtpl:485 +//line app/vmalert/web.qtpl:490 qw422016.N().S(`">`) -//line app/vmalert/web.qtpl:485 +//line app/vmalert/web.qtpl:490 qw422016.E().S(state) -//line app/vmalert/web.qtpl:485 +//line app/vmalert/web.qtpl:490 qw422016.N().S(`</span> `) -//line app/vmalert/web.qtpl:486 +//line app/vmalert/web.qtpl:491 } -//line app/vmalert/web.qtpl:486 +//line app/vmalert/web.qtpl:491 func writebadgeState(qq422016 qtio422016.Writer, state string) { -//line app/vmalert/web.qtpl:486 +//line app/vmalert/web.qtpl:491 qw422016 := qt422016.AcquireWriter(qq422016) -//line app/vmalert/web.qtpl:486 +//line app/vmalert/web.qtpl:491 streambadgeState(qw422016, state) -//line app/vmalert/web.qtpl:486 +//line app/vmalert/web.qtpl:491 qt422016.ReleaseWriter(qw422016) -//line app/vmalert/web.qtpl:486 +//line app/vmalert/web.qtpl:491 } -//line app/vmalert/web.qtpl:486 +//line app/vmalert/web.qtpl:491 func badgeState(state string) string { -//line app/vmalert/web.qtpl:486 +//line app/vmalert/web.qtpl:491 qb422016 := qt422016.AcquireByteBuffer() -//line app/vmalert/web.qtpl:486 +//line app/vmalert/web.qtpl:491 writebadgeState(qb422016, state) -//line app/vmalert/web.qtpl:486 +//line app/vmalert/web.qtpl:491 qs422016 := string(qb422016.B) -//line app/vmalert/web.qtpl:486 +//line app/vmalert/web.qtpl:491 qt422016.ReleaseByteBuffer(qb422016) -//line app/vmalert/web.qtpl:486 +//line app/vmalert/web.qtpl:491 return qs422016 -//line app/vmalert/web.qtpl:486 +//line app/vmalert/web.qtpl:491 } -//line app/vmalert/web.qtpl:488 +//line app/vmalert/web.qtpl:493 func streambadgeRestored(qw422016 *qt422016.Writer) { -//line app/vmalert/web.qtpl:488 +//line app/vmalert/web.qtpl:493 qw422016.N().S(` <span class="badge bg-warning text-dark" title="Alert state was restored after the service restart from remote storage">restored</span> `) -//line app/vmalert/web.qtpl:490 +//line app/vmalert/web.qtpl:495 } -//line app/vmalert/web.qtpl:490 +//line app/vmalert/web.qtpl:495 func writebadgeRestored(qq422016 qtio422016.Writer) { -//line app/vmalert/web.qtpl:490 +//line app/vmalert/web.qtpl:495 qw422016 := qt422016.AcquireWriter(qq422016) -//line app/vmalert/web.qtpl:490 +//line app/vmalert/web.qtpl:495 streambadgeRestored(qw422016) -//line app/vmalert/web.qtpl:490 +//line app/vmalert/web.qtpl:495 qt422016.ReleaseWriter(qw422016) -//line app/vmalert/web.qtpl:490 +//line app/vmalert/web.qtpl:495 } -//line app/vmalert/web.qtpl:490 +//line app/vmalert/web.qtpl:495 func badgeRestored() string { -//line app/vmalert/web.qtpl:490 +//line app/vmalert/web.qtpl:495 qb422016 := qt422016.AcquireByteBuffer() -//line app/vmalert/web.qtpl:490 +//line app/vmalert/web.qtpl:495 writebadgeRestored(qb422016) -//line app/vmalert/web.qtpl:490 +//line app/vmalert/web.qtpl:495 qs422016 := string(qb422016.B) -//line app/vmalert/web.qtpl:490 +//line app/vmalert/web.qtpl:495 qt422016.ReleaseByteBuffer(qb422016) -//line app/vmalert/web.qtpl:490 +//line app/vmalert/web.qtpl:495 return qs422016 -//line app/vmalert/web.qtpl:490 +//line app/vmalert/web.qtpl:495 }