aboutsummaryrefslogtreecommitdiffstats
path: root/metrics/librato/client.go
blob: 1f8920cb1a0dfecd4827c3b2e33a19571dfefcbc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package librato

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

const Operations = "operations"
const OperationsShort = "ops"

type LibratoClient struct {
    Email, Token string
}

// property strings
const (
    // display attributes
    Color             = "color"
    DisplayMax        = "display_max"
    DisplayMin        = "display_min"
    DisplayUnitsLong  = "display_units_long"
    DisplayUnitsShort = "display_units_short"
    DisplayStacked    = "display_stacked"
    DisplayTransform  = "display_transform"
    // special gauge display attributes
    SummarizeFunction = "summarize_function"
    Aggregate         = "aggregate"

    // metric keys
    Name        = "name"
    Period      = "period"
    Description = "description"
    DisplayName = "display_name"
    Attributes  = "attributes"

    // measurement keys
    MeasureTime = "measure_time"
    Source      = "source"
    Value       = "value"

    // special gauge keys
    Count      = "count"
    Sum        = "sum"
    Max        = "max"
    Min        = "min"
    SumSquares = "sum_squares"

    // batch keys
    Counters = "counters"
    Gauges   = "gauges"

    MetricsPostUrl = "https://metrics-api.librato.com/v1/metrics"
)

type Measurement map[string]interface{}
type Metric map[string]interface{}

type Batch struct {
    Gauges      []Measurement `json:"gauges,omitempty"`
    Counters    []Measurement `json:"counters,omitempty"`
    MeasureTime int64         `json:"measure_time"`
    Source      string        `json:"source"`
}

func (c *LibratoClient) PostMetrics(batch Batch) (err error) {
    var (
        js   []byte
        req  *http.Request
        resp *http.Response
    )

    if len(batch.Counters) == 0 && len(batch.Gauges) == 0 {
        return nil
    }

    if js, err = json.Marshal(batch); err != nil {
        return
    }

    if req, err = http.NewRequest("POST", MetricsPostUrl, bytes.NewBuffer(js)); err != nil {
        return
    }

    req.Header.Set("Content-Type", "application/json")
    req.SetBasicAuth(c.Email, c.Token)

    if resp, err = http.DefaultClient.Do(req); err != nil {
        return
    }

    if resp.StatusCode != http.StatusOK {
        var body []byte
        if body, err = ioutil.ReadAll(resp.Body); err != nil {
            body = []byte(fmt.Sprintf("(could not fetch response body for error: %s)", err))
        }
        err = fmt.Errorf("Unable to post to Librato: %d %s %s", resp.StatusCode, resp.Status, string(body))
    }
    return
}