github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/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  	"crypto/tls"
     9  	"crypto/x509"
    10  	"encoding/json"
    11  	"net/http"
    12  
    13  	"github.com/juju/errors"
    14  
    15  	"github.com/juju/juju/apiserver/metricsender/wireformat"
    16  )
    17  
    18  var (
    19  	metricsCertsPool *x509.CertPool
    20  	metricsHost      string
    21  )
    22  
    23  // HttpSender is the default used for sending
    24  // metrics to the collector service.
    25  type HttpSender struct {
    26  }
    27  
    28  // Send sends the given metrics to the collector service.
    29  func (s *HttpSender) Send(metrics []*wireformat.MetricBatch) (*wireformat.Response, error) {
    30  	b, err := json.Marshal(metrics)
    31  	if err != nil {
    32  		return nil, errors.Trace(err)
    33  	}
    34  	r := bytes.NewBuffer(b)
    35  	t := &http.Transport{TLSClientConfig: &tls.Config{RootCAs: metricsCertsPool}}
    36  	client := &http.Client{Transport: t}
    37  	resp, err := client.Post(metricsHost, "application/json", r)
    38  	if err != nil {
    39  		return nil, errors.Trace(err)
    40  	}
    41  	if resp.StatusCode != http.StatusOK {
    42  		return nil, errors.Errorf("failed to send metrics http %v", resp.StatusCode)
    43  	}
    44  
    45  	defer resp.Body.Close()
    46  	respReader := json.NewDecoder(resp.Body)
    47  	metricsResponse := wireformat.Response{}
    48  	err = respReader.Decode(&metricsResponse)
    49  	if err != nil {
    50  		return nil, errors.Trace(err)
    51  	}
    52  	return &metricsResponse, nil
    53  }