github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/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 }