From 7a6220121f4d1552b015738d8db0ae13f60982e0 Mon Sep 17 00:00:00 2001 From: David Dollar Date: Wed, 25 Sep 2019 10:52:23 -0400 Subject: [PATCH] add heartbeat --- pkg/metrics/metrics.go | 31 +++++++++++++++++++++++++++++++ provider/aws/heartbeat.go | 21 +++++++++++++++++++++ provider/gcp/heartbeat.go | 36 ++++++++++++++++++++++++++++++++++++ provider/k8s/k8s.go | 2 +- 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 pkg/metrics/metrics.go create mode 100644 provider/aws/heartbeat.go create mode 100644 provider/gcp/heartbeat.go diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go new file mode 100644 index 0000000..26ac295 --- /dev/null +++ b/pkg/metrics/metrics.go @@ -0,0 +1,31 @@ +package metrics + +import ( + "bytes" + "encoding/json" + "fmt" + "net/http" +) + +type Metrics struct { + url string +} + +func New(url string) *Metrics { + return &Metrics{url: url} +} + +func (m *Metrics) Post(name string, attrs map[string]interface{}) error { + data, err := json.Marshal(attrs) + if err != nil { + return err + } + + res, err := http.Post(fmt.Sprintf("%s/%s", m.url, name), "application/json", bytes.NewReader(data)) + if err != nil { + return err + } + defer res.Body.Close() + + return nil +} diff --git a/provider/aws/heartbeat.go b/provider/aws/heartbeat.go new file mode 100644 index 0000000..855f929 --- /dev/null +++ b/provider/aws/heartbeat.go @@ -0,0 +1,21 @@ +package aws + +import ( + "strings" + + "github.com/convox/convox/pkg/common" +) + +func (p *Provider) Heartbeat() (map[string]interface{}, error) { + data, err := common.Get("http://169.254.169.254/latest/meta-data/instance-type") + if err != nil { + return nil, err + } + + hs := map[string]interface{}{ + "instance_type": strings.TrimSpace(string(data)), + "region": p.Region, + } + + return hs, nil +} diff --git a/provider/gcp/heartbeat.go b/provider/gcp/heartbeat.go new file mode 100644 index 0000000..d26a566 --- /dev/null +++ b/provider/gcp/heartbeat.go @@ -0,0 +1,36 @@ +package gcp + +import ( + "io/ioutil" + "net/http" + "strings" +) + +func (p *Provider) Heartbeat() (map[string]interface{}, error) { + req, err := http.NewRequest("GET", "http://metadata.google.internal/computeMetadata/v1/instance/machine-type", nil) + if err != nil { + return nil, err + } + + req.Header.Add("Metadata-Flavor", "Google") + + res, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer res.Body.Close() + + data, err := ioutil.ReadAll(res.Body) + if err != nil { + return nil, err + } + + tparts := strings.Split(strings.TrimSpace(string(data)), "/") + + hs := map[string]interface{}{ + "instance_type": tparts[len(tparts)-1], + "region": p.Region, + } + + return hs, nil +} diff --git a/provider/k8s/k8s.go b/provider/k8s/k8s.go index 9fe56e9..3e6a70a 100644 --- a/provider/k8s/k8s.go +++ b/provider/k8s/k8s.go @@ -212,7 +212,7 @@ func (p *Provider) heartbeat() error { ms[k] = v } - if err := p.metrics.Post("heartbeat", hs); err != nil { + if err := p.metrics.Post("heartbeat", ms); err != nil { return err }