func (s *WireFormatSuite) TestToWire(c *gc.C) { meteredCharm := s.Factory.MakeCharm(c, &factory.CharmParams{Name: "metered", URL: "cs:quantal/metered"}) meteredService := s.Factory.MakeService(c, &factory.ServiceParams{Charm: meteredCharm}) unit := s.Factory.MakeUnit(c, &factory.UnitParams{Service: meteredService, SetCharmURL: true}) now := time.Now().Round(time.Second) metric := s.Factory.MakeMetric(c, &factory.MetricParams{Unit: unit, Sent: false, Time: &now}) result := wireformat.ToWire(metric) m := metric.Metrics()[0] metrics := []wireformat.Metric{ { Key: m.Key, Value: m.Value, Time: m.Time.UTC(), }, } expected := &wireformat.MetricBatch{ UUID: metric.UUID(), ModelUUID: metric.ModelUUID(), UnitName: metric.Unit(), CharmUrl: metric.CharmURL(), Created: metric.Created().UTC(), Metrics: metrics, Credentials: metric.Credentials(), } c.Assert(result, gc.DeepEquals, expected) }
// SendMetrics will send any unsent metrics // over the MetricSender interface in batches // no larger than batchSize. func SendMetrics(st *state.State, sender MetricSender, batchSize int) error { metricsManager, err := st.MetricsManager() if err != nil { return errors.Trace(err) } sent := 0 for { metrics, err := st.MetricsToSend(batchSize) if err != nil { return errors.Trace(err) } lenM := len(metrics) if lenM == 0 { if sent == 0 { logger.Infof("nothing to send") } else { logger.Infof("done sending") } break } wireData := make([]*wireformat.MetricBatch, lenM) for i, m := range metrics { wireData[i] = wireformat.ToWire(m) } response, err := sender.Send(wireData) if err != nil { logger.Errorf("%+v", err) if incErr := metricsManager.IncrementConsecutiveErrors(); incErr != nil { logger.Errorf("failed to increment error count %v", incErr) return errors.Trace(errors.Wrap(err, incErr)) } return errors.Trace(err) } if response != nil { // TODO (mattyw) We are currently ignoring errors during response handling. handleResponse(metricsManager, st, *response) if err := metricsManager.SetLastSuccessfulSend(time.Now()); err != nil { err = errors.Annotate(err, "failed to set successful send time") logger.Warningf("%v", err) return errors.Trace(err) } } sent += lenM } unsent, err := st.CountOfUnsentMetrics() if err != nil { return errors.Trace(err) } sentStored, err := st.CountOfSentMetrics() if err != nil { return errors.Trace(err) } logger.Infof("metrics collection summary: sent:%d unsent:%d (%d sent metrics stored)", sent, unsent, sentStored) return nil }