github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/apiserver/metricsender/sender.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package metricsender
     5  
     6  import (
     7  	"bytes"
     8  	"encoding/json"
     9  	"net/http"
    10  
    11  	"github.com/juju/errors"
    12  	wireformat "github.com/juju/romulus/wireformat/metrics"
    13  )
    14  
    15  var (
    16  	metricsHost string = "https://api.jujucharms.com/omnibus/v2/metrics"
    17  )
    18  
    19  // HTTPSender is the default used for sending
    20  // metrics to the collector service.
    21  type HTTPSender struct {
    22  }
    23  
    24  // Send sends the given metrics to the collector service.
    25  func (s *HTTPSender) Send(metrics []*wireformat.MetricBatch) (*wireformat.Response, error) {
    26  	b, err := json.Marshal(metrics)
    27  	if err != nil {
    28  		return nil, errors.Trace(err)
    29  	}
    30  	r := bytes.NewBuffer(b)
    31  	client := &http.Client{}
    32  	resp, err := client.Post(metricsHost, "application/json", r)
    33  	if err != nil {
    34  		return nil, errors.Trace(err)
    35  	}
    36  	if resp.StatusCode != http.StatusOK {
    37  		return nil, errors.Errorf("failed to send metrics http %v", resp.StatusCode)
    38  	}
    39  
    40  	defer resp.Body.Close()
    41  	respReader := json.NewDecoder(resp.Body)
    42  	metricsResponse := wireformat.Response{}
    43  	err = respReader.Decode(&metricsResponse)
    44  	if err != nil {
    45  		return nil, errors.Trace(err)
    46  	}
    47  	return &metricsResponse, nil
    48  }