Merge pull request #85 from cloudflare/support-0.6.1

Add basic support for Alertmanager 0.6.1
This commit is contained in:
Łukasz Mierzwa
2017-04-28 13:19:43 -07:00
committed by GitHub
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
}