* metrics/*: golint updates for this or self warning * metrics/*: golint updates for this or self warning, updated pr from feedback
		
			
				
	
	
		
			103 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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
 | 
						|
}
 |