Skip to content

Commit

Permalink
feat: display silence after it is created (#11)
Browse files Browse the repository at this point in the history
  • Loading branch information
freak12techno authored Dec 19, 2022
1 parent 83a002e commit 241b5e1
Show file tree
Hide file tree
Showing 8 changed files with 116 additions and 59 deletions.
17 changes: 12 additions & 5 deletions alertmanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ func (g *Alertmanager) Enabled() bool {
return g.Config.User != "" && g.Config.Password != ""
}

func (g *Alertmanager) CreateSilence(silence Silence) (Silence, error) {
func (g *Alertmanager) CreateSilence(silence Silence) (SilenceCreateResponse, error) {
url := g.RelativeLink("/api/v2/silences")
res := Silence{}
err := g.QueryAndDecodePost(url, silence, res)
return silence, err
res := SilenceCreateResponse{}
err := g.QueryAndDecodePost(url, silence, &res)
return res, err
}

func (g *Alertmanager) GetSilences() ([]Silence, error) {
Expand All @@ -40,6 +40,13 @@ func (g *Alertmanager) GetSilences() ([]Silence, error) {
return silences, err
}

func (g *Alertmanager) GetSilence(silenceID string) (Silence, error) {
silence := Silence{}
url := g.RelativeLink("/api/v2/silence/" + silenceID)
err := g.QueryAndDecode(url, &silence)
return silence, err
}

func (g *Alertmanager) DeleteSilence(silenceID string) error {
url := g.RelativeLink("/api/v2/silence/" + silenceID)
return g.QueryDelete(url)
Expand Down Expand Up @@ -91,7 +98,7 @@ func (g *Alertmanager) QueryAndDecodePost(url string, postBody interface{}, outp
}

func (g *Alertmanager) DoQuery(method string, url string, body interface{}) (io.ReadCloser, error) {
if g.Config.Password == "" || g.Config.User == "" {
if !g.Enabled() {
return nil, fmt.Errorf("Alertmanager API not configured")
}

Expand Down
13 changes: 10 additions & 3 deletions grafana.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,10 +200,10 @@ func (g *Grafana) GetAllAlertingRules() ([]GrafanaAlertGroup, error) {
return append(grafanaRules, prometheusRules...), nil
}

func (g *Grafana) CreateSilence(silence Silence) (Silence, error) {
func (g *Grafana) CreateSilence(silence Silence) (SilenceCreateResponse, error) {
url := g.RelativeLink("/api/alertmanager/grafana/api/v2/silences")
res := Silence{}
err := g.QueryAndDecodePost(url, silence, res)
res := SilenceCreateResponse{}
err := g.QueryAndDecodePost(url, silence, &res)
return res, err
}

Expand All @@ -214,6 +214,13 @@ func (g *Grafana) GetSilences() ([]Silence, error) {
return silences, err
}

func (g *Grafana) GetSilence(silenceID string) (Silence, error) {
silence := Silence{}
url := g.RelativeLink("/api/alertmanager/grafana/api/v2/silence/" + silenceID)
err := g.QueryAndDecode(url, &silence)
return silence, err
}

func (g *Grafana) DeleteSilence(silenceID string) error {
url := g.RelativeLink("/api/alertmanager/grafana/api/v2/silence/" + silenceID)
return g.QueryDelete(url)
Expand Down
51 changes: 0 additions & 51 deletions silence_create.go

This file was deleted.

79 changes: 79 additions & 0 deletions silences_create.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package main

import (
"fmt"

tele "gopkg.in/telebot.v3"
)

func (a *App) HandleNewSilence(c tele.Context) error {
a.Logger.Info().
Str("sender", c.Sender().Username).
Str("text", c.Text()).
Msg("Got new silence query")

silenceInfo, err := ParseSilenceOptions(c.Text(), c)
if err != "" {
return c.Reply(err)
}

silenceResponse, silenceErr := a.Grafana.CreateSilence(*silenceInfo)
if silenceErr != nil {
return c.Reply(fmt.Sprintf("Error creating silence: %s", silenceErr))
}

silence, silenceErr := a.Grafana.GetSilence(silenceResponse.SilenceID)
if silenceErr != nil {
return c.Reply(fmt.Sprintf("Error getting created silence: %s", silenceErr))
}

template, renderErr := a.TemplateManager.Render("silences_create", RenderStruct{
Grafana: a.Grafana,
Alertmanager: a.Alertmanager,
Data: silence,
})
if renderErr != nil {
a.Logger.Error().Err(renderErr).Msg("Error rendering silences_create template")
return c.Reply(fmt.Sprintf("Error rendering template: %s", renderErr))
}

return a.BotReply(c, template)
}

func (a *App) HandleAlertmanagerNewSilence(c tele.Context) error {
a.Logger.Info().
Str("sender", c.Sender().Username).
Str("text", c.Text()).
Msg("Got new Alertmanager silence query")

if !a.Alertmanager.Enabled() {
return c.Reply("Alertmanager is disabled.")
}

silenceInfo, err := ParseSilenceOptions(c.Text(), c)
if err != "" {
return c.Reply(err)
}

silenceResponse, silenceErr := a.Alertmanager.CreateSilence(*silenceInfo)
if silenceErr != nil {
return c.Reply(fmt.Sprintf("Error creating silence: %s", silenceErr))
}

silence, silenceErr := a.Alertmanager.GetSilence(silenceResponse.SilenceID)
if silenceErr != nil {
return c.Reply(fmt.Sprintf("Error getting created silence: %s", silenceErr))
}

template, renderErr := a.TemplateManager.Render("silences_create", RenderStruct{
Grafana: a.Grafana,
Alertmanager: a.Alertmanager,
Data: silence,
})
if renderErr != nil {
a.Logger.Error().Err(renderErr).Msg("Error rendering silences_create template")
return c.Reply(fmt.Sprintf("Error rendering template: %s", renderErr))
}

return a.BotReply(c, template)
}
File renamed without changes.
File renamed without changes.
11 changes: 11 additions & 0 deletions templates/silences_create.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<strong>Created silence with following params:</strong>
ID: <code>{{ .Data.ID }}</code>
Starts at: <pre>{{ .Data.StartsAt.String }}</pre>
Ends at: <pre>{{ .Data.EndsAt.String }}</pre>
Created by: <pre>{{ .Data.CreatedBy }}</pre>
Comment: <pre>{{ .Data.Comment }}</pre>
Status: <pre>{{ GetEmojiBySilenceStatus .Data.Status.State }} {{ .Data.Status.State }}</pre>
Matchers:
{{- range $matcherId, $matcher := .Data.Matchers }}
<pre> {{ $matcher.Serialize }}</pre>
{{- end }}
4 changes: 4 additions & 0 deletions types.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,3 +126,7 @@ type DashboardStruct struct {
Dashboard GrafanaDashboardInfo
Panels []PanelStruct
}

type SilenceCreateResponse struct {
SilenceID string `json:"silenceID"`
}

0 comments on commit 241b5e1

Please sign in to comment.