terraform/vendor/github.com/henrikhodne/go-librato/librato/metrics.go

177 lines
5.1 KiB
Go

package librato
import (
"fmt"
"net/http"
)
// MetricsService handles communication with the Librato API methods related to
// metrics.
type MetricsService struct {
client *Client
}
// Metric represents a Librato Metric.
type Metric struct {
Name *string `json:"name"`
Description *string `json:"description,omitempty"`
Type *string `json:"type"`
Period *uint `json:"period,omitempty"`
DisplayName *string `json:"display_name,omitempty"`
Composite *string `json:"composite,omitempty"`
Attributes *MetricAttributes `json:"attributes,omitempty"`
}
// MetricAttributes are named attributes as key:value pairs.
type MetricAttributes struct {
Color *string `json:"color"`
// These are interface{} because sometimes the Librato API
// returns strings, and sometimes it returns integers
DisplayMax interface{} `json:"display_max"`
DisplayMin interface{} `json:"display_min"`
DisplayUnitsLong string `json:"display_units_long"`
DisplayUnitsShort string `json:"display_units_short"`
DisplayStacked bool `json:"display_stacked"`
DisplayTransform string `json:"display_transform"`
CreatedByUA string `json:"created_by_ua,omitempty"`
GapDetection bool `json:"gap_detection,omitempty"`
Aggregate bool `json:"aggregate,omitempty"`
}
// ListMetricsOptions are used to coordinate paging of metrics.
type ListMetricsOptions struct {
*PaginationMeta
Name string `url:"name,omitempty"`
}
// AdvancePage advances to the specified page in result set, while retaining
// the filtering options.
func (l *ListMetricsOptions) AdvancePage(next *PaginationMeta) ListMetricsOptions {
return ListMetricsOptions{
PaginationMeta: next,
Name: l.Name,
}
}
// ListMetricsResponse represents the response of a List call against the metrics service.
type ListMetricsResponse struct {
ThisPage *PaginationResponseMeta
NextPage *PaginationMeta
}
// List metrics using the provided options.
//
// Librato API docs: https://www.librato.com/docs/api/#list-a-subset-of-metrics
func (m *MetricsService) List(opts *ListMetricsOptions) ([]Metric, *ListMetricsResponse, error) {
u, err := urlWithOptions("metrics", opts)
if err != nil {
return nil, nil, err
}
req, err := m.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}
var metricsResponse struct {
Query PaginationResponseMeta
Metrics []Metric
}
_, err = m.client.Do(req, &metricsResponse)
if err != nil {
return nil, nil, err
}
return metricsResponse.Metrics,
&ListMetricsResponse{
ThisPage: &metricsResponse.Query,
NextPage: metricsResponse.Query.nextPage(opts.PaginationMeta),
},
nil
}
// Get a metric by name
//
// Librato API docs: https://www.librato.com/docs/api/#retrieve-a-metric-by-name
func (m *MetricsService) Get(name string) (*Metric, *http.Response, error) {
u := fmt.Sprintf("metrics/%s", name)
req, err := m.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}
metric := new(Metric)
resp, err := m.client.Do(req, metric)
if err != nil {
return nil, resp, err
}
return metric, resp, err
}
// MeasurementSubmission represents the payload to submit/create a metric.
type MeasurementSubmission struct {
MeasureTime *uint `json:"measure_time,omitempty"`
Source *string `json:"source,omitempty"`
Gauges []*GaugeMeasurement `json:"gauges,omitempty"`
Counters []*Measurement `json:"counters,omitempty"`
}
// Measurement represents a Librato Measurement.
type Measurement struct {
Name string `json:"name"`
Value *float64 `json:"value,omitempty"`
MeasureTime *uint `json:"measure_time,omitempty"`
Source *string `json:"source,omitempty"`
}
// GaugeMeasurement represents a Librato measurement gauge.
type GaugeMeasurement struct {
*Measurement
Count *uint `json:"count,omitempty"`
Sum *float64 `json:"sum,omitempty"`
Max *float64 `json:"max,omitempty"`
Min *float64 `json:"min,omitempty"`
SumSquares *float64 `json:"sum_squares,omitempty"`
}
// Submit metrics
//
// Librato API docs: https://www.librato.com/docs/api/#create-a-measurement
func (m *MetricsService) Submit(measurements *MeasurementSubmission) (*http.Response, error) {
req, err := m.client.NewRequest("POST", "/metrics", measurements)
if err != nil {
return nil, err
}
return m.client.Do(req, nil)
}
// Edit a metric.
//
// Librato API docs: https://www.librato.com/docs/api/#update-a-metric-by-name
func (m *MetricsService) Edit(metric *Metric) (*http.Response, error) {
u := fmt.Sprintf("metrics/%s", *metric.Name)
req, err := m.client.NewRequest("PUT", u, metric)
if err != nil {
return nil, err
}
return m.client.Do(req, nil)
}
// Delete a metric.
//
// Librato API docs: https://www.librato.com/docs/api/#delete-a-metric-by-name
func (m *MetricsService) Delete(name string) (*http.Response, error) {
u := fmt.Sprintf("metrics/%s", name)
req, err := m.client.NewRequest("DELETE", u, nil)
if err != nil {
return nil, err
}
return m.client.Do(req, nil)
}