Skip to content
This repository has been archived by the owner on Jul 22, 2020. It is now read-only.

Commit

Permalink
Migrate rest of the code to new mapper and transport packages
Browse files Browse the repository at this point in the history
  • Loading branch information
prymitive committed Jan 21, 2018
1 parent fcf9026 commit a2f14b1
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 13 deletions.
5 changes: 4 additions & 1 deletion internal/alertmanager/dedup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ func init() {
log.SetLevel(log.ErrorLevel)
for i, uri := range mock.ListAllMockURIs() {
name := fmt.Sprintf("dedup-mock-%d", i)
am := alertmanager.NewAlertmanager(name, uri, alertmanager.WithRequestTimeout(time.Second))
am, err := alertmanager.NewAlertmanager(name, uri, alertmanager.WithRequestTimeout(time.Second))
if err != nil {
log.Fatal(err)
}
alertmanager.RegisterAlertmanager(am)
}
}
Expand Down
53 changes: 49 additions & 4 deletions internal/alertmanager/models.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package alertmanager

import (
"encoding/json"
"fmt"
"path"
"sort"
Expand Down Expand Up @@ -34,6 +35,8 @@ type Alertmanager struct {
Name string `json:"name"`
// whenever this instance should be proxied
ProxyRequests bool
// transport instances are specific to URI scheme we collect from
transport transport.Transport
// lock protects data access while updating
lock sync.RWMutex
// fields for storing pulled data
Expand All @@ -56,9 +59,19 @@ func (am *Alertmanager) detectVersion() string {
return defaultVersion
}
ver := alertmanagerVersion{}
err = transport.ReadJSON(url, am.RequestTimeout, &ver)

// read raw body from the source
source, err := am.transport.Read(url)
defer source.Close()
if err != nil {
log.Errorf("[%s] %s request failed: %s", am.Name, url, err)
return defaultVersion
}

// decode body as JSON
err = json.NewDecoder(source).Decode(&ver)
if err != nil {
log.Errorf("[%s] %s request failed: %s", am.Name, url, err.Error())
log.Errorf("[%s] %s failed to decode as JSON: %s", am.Name, url, err)
return defaultVersion
}

Expand Down Expand Up @@ -91,8 +104,24 @@ func (am *Alertmanager) pullSilences(version string) error {
return err
}

// generate full URL to collect silences from
url, err := mapper.AbsoluteURL(am.URI)
if err != nil {
log.Errorf("[%s] Failed to generate silences endpoint URL: %s", am.Name, err)
return err
}

start := time.Now()
silences, err := mapper.GetSilences(am.URI, am.RequestTimeout)
// read raw body from the source
source, err := am.transport.Read(url)
defer source.Close()
if err != nil {
log.Errorf("[%s] %s request failed: %s", am.Name, url, err)
return err
}

// decode body text
silences, err := mapper.Decode(source)
if err != nil {
return err
}
Expand Down Expand Up @@ -134,8 +163,24 @@ func (am *Alertmanager) pullAlerts(version string) error {
return err
}

// generate full URL to collect alerts from
url, err := mapper.AbsoluteURL(am.URI)
if err != nil {
log.Errorf("[%s] Failed to generate alerts endpoint URL: %s", am.Name, err)
return err
}

start := time.Now()
groups, err := mapper.GetAlerts(am.URI, am.RequestTimeout)
// read raw body from the source
source, err := am.transport.Read(url)
defer source.Close()
if err != nil {
log.Errorf("[%s] %s request failed: %s", am.Name, url, err)
return err
}

// decode body text
groups, err := mapper.Decode(source)
if err != nil {
return err
}
Expand Down
11 changes: 9 additions & 2 deletions internal/alertmanager/upstream.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"time"

"github.com/cloudflare/unsee/internal/models"
"github.com/cloudflare/unsee/internal/transport"

log "github.com/sirupsen/logrus"
)
Expand All @@ -18,7 +19,7 @@ var (
)

// NewAlertmanager creates a new Alertmanager instance
func NewAlertmanager(name, uri string, opts ...Option) *Alertmanager {
func NewAlertmanager(name, uri string, opts ...Option) (*Alertmanager, error) {
am := &Alertmanager{
URI: uri,
RequestTimeout: time.Second * 10,
Expand All @@ -40,7 +41,13 @@ func NewAlertmanager(name, uri string, opts ...Option) *Alertmanager {
opt(am)
}

return am
var err error
am.transport, err = transport.NewTransport(am.URI, am.RequestTimeout)
if err != nil {
return am, err
}

return am, nil
}

// RegisterAlertmanager will add an Alertmanager instance to the list of
Expand Down
11 changes: 10 additions & 1 deletion internal/alertmanager/version.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package alertmanager

import (
"encoding/json"
"time"

"github.com/cloudflare/unsee/internal/transport"
Expand Down Expand Up @@ -30,7 +31,15 @@ func GetVersion(uri string, timeout time.Duration) string {
return defaultVersion
}
ver := alertmanagerVersion{}
err = transport.ReadJSON(url, timeout, &ver)

t, err := transport.NewTransport(uri, timeout)
if err != nil {
log.Errorf("Unable to get the version information from %s", url)
return defaultVersion
}

source, err := t.Read(url)
err = json.NewDecoder(source).Decode(&ver)
if err != nil {
log.Errorf("%s request failed: %s", url, err.Error())
return defaultVersion
Expand Down
5 changes: 4 additions & 1 deletion internal/filters/filter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,10 @@ var tests = []filterTest{
func TestFilters(t *testing.T) {
log.SetLevel(log.ErrorLevel)

am := alertmanager.NewAlertmanager("test", "http://localhost", alertmanager.WithRequestTimeout(time.Second))
am, err := alertmanager.NewAlertmanager("test", "http://localhost", alertmanager.WithRequestTimeout(time.Second))
if err != nil {
t.Error(err)
}
for _, ft := range tests {
alert := models.Alert(ft.Alert)
if &ft.Silence != nil {
Expand Down
9 changes: 6 additions & 3 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,13 @@ func setupRouter(router *gin.Engine) {

func setupUpstreams() {
for _, s := range config.Config.Alertmanager.Servers {
am := alertmanager.NewAlertmanager(s.Name, s.URI, alertmanager.WithRequestTimeout(s.Timeout), alertmanager.WithProxy(s.Proxy))
err := alertmanager.RegisterAlertmanager(am)
am, err := alertmanager.NewAlertmanager(s.Name, s.URI, alertmanager.WithRequestTimeout(s.Timeout), alertmanager.WithProxy(s.Proxy))
if err != nil {
log.Fatalf("Failed to configure Alertmanager '%s' with URI '%s': %s", s.Name, s.URI, err)
log.Fatalf("Failed to create Alertmanager '%s' with URI '%s': %s", s.Name, s.URI, err)
}
err = alertmanager.RegisterAlertmanager(am)
if err != nil {
log.Fatalf("Failed to register Alertmanager '%s' with URI '%s': %s", s.Name, s.URI, err)
}
}
}
Expand Down
5 changes: 4 additions & 1 deletion proxy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,12 +90,15 @@ var proxyTests = []proxyTest{

func TestProxy(t *testing.T) {
r := ginTestEngine()
am := alertmanager.NewAlertmanager(
am, err := alertmanager.NewAlertmanager(
"dummy",
"http://localhost:9093",
alertmanager.WithRequestTimeout(time.Second*5),
alertmanager.WithProxy(true),
)
if err != nil {
t.Error(err)
}
setupRouterProxyHandlers(r, am)

httpmock.Activate()
Expand Down

0 comments on commit a2f14b1

Please sign in to comment.