Add basic support for Alertmanager 0.6.1

This makes unsee work with 0.6.1, but the new status means that we should refactor unsee data model and pull inhibited and silenced into it, with a single filter
This commit is contained in:
Łukasz Mierzwa
2017-04-28 12:38:47 -07:00
parent a6d2c287dd
commit 3a1f6905e0
3 changed files with 104 additions and 1 deletions

View File

@@ -6,6 +6,7 @@ import (
"github.com/cloudflare/unsee/mapper"
"github.com/cloudflare/unsee/mapper/v04"
"github.com/cloudflare/unsee/mapper/v05"
"github.com/cloudflare/unsee/mapper/v061"
"github.com/cloudflare/unsee/models"
log "github.com/Sirupsen/logrus"
@@ -15,6 +16,7 @@ import (
func init() {
mapper.RegisterAlertMapper(v04.AlertMapper{})
mapper.RegisterAlertMapper(v05.AlertMapper{})
mapper.RegisterAlertMapper(v061.AlertMapper{})
mapper.RegisterSilenceMapper(v04.SilenceMapper{})
mapper.RegisterSilenceMapper(v05.SilenceMapper{})
}

View File

@@ -45,7 +45,7 @@ type AlertMapper struct {
// IsSupported returns true if given version string is supported
func (m AlertMapper) IsSupported(version string) bool {
versionRange := semver.MustParseRange(">=0.5.0")
versionRange := semver.MustParseRange(">=0.5.0 <=0.6.0")
return versionRange(semver.MustParse(version))
}

101
mapper/v061/alerts.go Normal file
View File

@@ -0,0 +1,101 @@
// Package v061 package implements support for interacting with
// Alertmanager 0.6.1
// Collected data will be mapped to unsee internal schema defined the
// unsee/models package
// This file defines Alertmanager alerts mapping
package v061
import (
"errors"
"time"
"github.com/blang/semver"
"github.com/cloudflare/unsee/config"
"github.com/cloudflare/unsee/mapper"
"github.com/cloudflare/unsee/models"
"github.com/cloudflare/unsee/transport"
)
type alert struct {
Annotations map[string]string `json:"annotations"`
Labels map[string]string `json:"labels"`
StartsAt time.Time `json:"startsAt"`
EndsAt time.Time `json:"endsAt"`
GeneratorURL string `json:"generatorURL"`
Status string `json:"Status"`
SilencedBy []string `json:"silencedBy"`
InhibitedBy []string `json:"inhibitedBy"`
}
type alertsGroups struct {
Labels map[string]string `json:"labels"`
Blocks []struct {
Alerts []alert `json:"alerts"`
} `json:"blocks"`
}
type alertsGroupsAPISchema struct {
Status string `json:"status"`
Groups []alertsGroups `json:"data"`
Error string `json:"error"`
}
// AlertMapper implements Alertmanager API schema
type AlertMapper struct {
mapper.AlertMapper
}
// IsSupported returns true if given version string is supported
func (m AlertMapper) IsSupported(version string) bool {
versionRange := semver.MustParseRange(">=0.6.1")
return versionRange(semver.MustParse(version))
}
// GetAlerts will make a request to Alertmanager API and parse the response
// It will only return alerts or error (if any)
func (m AlertMapper) GetAlerts() ([]models.AlertGroup, error) {
groups := []models.AlertGroup{}
resp := alertsGroupsAPISchema{}
url, err := transport.JoinURL(config.Config.AlertmanagerURI, "api/v1/alerts/groups")
if err != nil {
return groups, err
}
err = transport.ReadJSON(url, config.Config.AlertmanagerTimeout, &resp)
if err != nil {
return groups, err
}
if resp.Status != "success" {
return groups, errors.New(resp.Error)
}
for _, g := range resp.Groups {
alertList := models.AlertList{}
for _, b := range g.Blocks {
for _, a := range b.Alerts {
silenceID := ""
if len(a.SilencedBy) > 0 {
silenceID = a.SilencedBy[0]
}
us := models.Alert{
Annotations: a.Annotations,
Labels: a.Labels,
StartsAt: a.StartsAt,
EndsAt: a.EndsAt,
GeneratorURL: a.GeneratorURL,
Inhibited: len(a.InhibitedBy) > 0,
Silenced: silenceID,
}
alertList = append(alertList, us)
}
}
ug := models.AlertGroup{
Labels: g.Labels,
Alerts: alertList,
}
groups = append(groups, ug)
}
return groups, nil
}