func (s *metricsReaderSuite) TestUnblockedReaders(c *gc.C) { r, err := spool.NewJSONMetricReader(s.paths.GetMetricsSpoolDir()) c.Assert(err, jc.ErrorIsNil) err = r.Close() c.Assert(err, jc.ErrorIsNil) r2, err := spool.NewJSONMetricReader(s.paths.GetMetricsSpoolDir()) c.Assert(err, jc.ErrorIsNil) c.Assert(r2, gc.NotNil) err = r2.Close() c.Assert(err, jc.ErrorIsNil) }
func (s *metricsRecorderSuite) TestInit(c *gc.C) { w, err := spool.NewJSONMetricRecorder( spool.MetricRecorderConfig{ SpoolDir: s.paths.GetMetricsSpoolDir(), Metrics: map[string]corecharm.Metric{"pings": corecharm.Metric{}}, CharmURL: "local:precise/wordpress", UnitTag: s.unitTag, }) c.Assert(err, jc.ErrorIsNil) c.Assert(w, gc.NotNil) err = w.AddMetric("pings", "5", time.Now()) c.Assert(err, jc.ErrorIsNil) err = w.Close() c.Assert(err, jc.ErrorIsNil) r, err := spool.NewJSONMetricReader(s.paths.GetMetricsSpoolDir()) c.Assert(err, jc.ErrorIsNil) batches, err := r.Read() c.Assert(err, jc.ErrorIsNil) c.Assert(batches, gc.HasLen, 1) batch := batches[0] c.Assert(batch.CharmURL, gc.Equals, "local:precise/wordpress") c.Assert(batch.UUID, gc.Not(gc.Equals), "") c.Assert(batch.Metrics, gc.HasLen, 1) c.Assert(batch.Metrics[0].Key, gc.Equals, "pings") c.Assert(batch.Metrics[0].Value, gc.Equals, "5") c.Assert(batch.UnitTag, gc.Equals, s.unitTag) err = r.Close() c.Assert(err, jc.ErrorIsNil) }
func (s *FlushContextSuite) TestBuiltinMetricNotGeneratedIfNotDefined(c *gc.C) { uuid := utils.MustNewUUID() paths := runnertesting.NewRealPaths(c) ctx := s.getMeteredHookContext(c, uuid.String(), -1, "", noProxies, true, s.metricsDefinition("pings"), paths) reader, err := spool.NewJSONMetricReader( paths.GetMetricsSpoolDir(), ) err = ctx.Flush("some badge", nil) c.Assert(err, jc.ErrorIsNil) batches, err := reader.Read() c.Assert(err, jc.ErrorIsNil) c.Assert(batches, gc.HasLen, 0) }
func (s *senderSuite) TestMetricSendingSuccess(c *gc.C) { apiSender := newTestAPIMetricSender() metricSender := sender.NewSender(apiSender, s.metricfactory) stopCh := make(chan struct{}) err := metricSender.Do(stopCh) c.Assert(err, jc.ErrorIsNil) c.Assert(apiSender.batches, gc.HasLen, 1) reader, err := spool.NewJSONMetricReader(s.spoolDir) c.Assert(err, jc.ErrorIsNil) batches, err := reader.Read() c.Assert(err, jc.ErrorIsNil) c.Assert(batches, gc.HasLen, 0) }
func (s *metricsReaderSuite) TestRemoval(c *gc.C) { r, err := spool.NewJSONMetricReader(s.paths.GetMetricsSpoolDir()) c.Assert(err, jc.ErrorIsNil) batches, err := r.Read() c.Assert(err, jc.ErrorIsNil) for _, batch := range batches { err := r.Remove(batch.UUID) c.Assert(err, jc.ErrorIsNil) } err = r.Close() c.Assert(err, jc.ErrorIsNil) batches, err = r.Read() c.Assert(err, jc.ErrorIsNil) c.Assert(batches, gc.HasLen, 0) err = r.Close() c.Assert(err, jc.ErrorIsNil) }
func (s *metricsRecorderSuite) TestUnknownMetricKey(c *gc.C) { w, err := spool.NewJSONMetricRecorder( spool.MetricRecorderConfig{ SpoolDir: s.paths.GetMetricsSpoolDir(), Metrics: map[string]corecharm.Metric{}, CharmURL: "local:precise/wordpress", UnitTag: s.unitTag, }) c.Assert(err, jc.ErrorIsNil) c.Assert(w, gc.NotNil) err = w.AddMetric("pings", "5", time.Now()) c.Assert(err, gc.ErrorMatches, `metric key "pings" not declared by the charm`) err = w.Close() c.Assert(err, jc.ErrorIsNil) r, err := spool.NewJSONMetricReader(s.paths.GetMetricsSpoolDir()) c.Assert(err, jc.ErrorIsNil) batches, err := r.Read() c.Assert(err, jc.ErrorIsNil) c.Assert(batches, gc.HasLen, 0) }
func (s *senderSuite) TestSendingFails(c *gc.C) { apiSender := newTestAPIMetricSender() select { case apiSender.sendError <- errors.New("something went wrong"): default: c.Fatalf("blocked error channel") } metricSender := sender.NewSender(apiSender, s.metricfactory) stopCh := make(chan struct{}) err := metricSender.Do(stopCh) c.Assert(err, gc.ErrorMatches, "something went wrong") c.Assert(apiSender.batches, gc.HasLen, 1) reader, err := spool.NewJSONMetricReader(s.spoolDir) c.Assert(err, jc.ErrorIsNil) batches, err := reader.Read() c.Assert(err, jc.ErrorIsNil) c.Assert(batches, gc.HasLen, 1) }
func (s *senderSuite) TestSendingGetDuplicate(c *gc.C) { apiSender := newTestAPIMetricSender() apiErr := ¶ms.Error{Message: "already exists", Code: params.CodeAlreadyExists} select { case apiSender.errors <- apiErr: default: c.Fatalf("blocked error channel") } metricSender := sender.NewSender(apiSender, s.metricfactory) stopCh := make(chan struct{}) err := metricSender.Do(stopCh) c.Assert(err, jc.ErrorIsNil) c.Assert(apiSender.batches, gc.HasLen, 1) reader, err := spool.NewJSONMetricReader(s.spoolDir) c.Assert(err, jc.ErrorIsNil) batches, err := reader.Read() c.Assert(err, jc.ErrorIsNil) c.Assert(batches, gc.HasLen, 0) }
func (s *stubMetricFactory) Reader() (spool.MetricReader, error) { s.MethodCall(s, "Reader") return spool.NewJSONMetricReader(s.spoolDir) }
func (s *metricsRecorderSuite) TestMetricValidation(c *gc.C) { tests := []struct { about string key string value string expectedError string }{{ about: "metric not declared", key: "pings", value: "5", expectedError: `metric key "pings" not declared by the charm`, }, { about: "non float metrics", key: "pongs", value: "abcd", expectedError: `invalid value type: expected float, got "abcd"`, }, { about: "negative value", key: "pongs", value: "-5.0", expectedError: `invalid value: value must be greater or equal to zero, got -5.0`, }, { about: "large value", key: "pongs", value: "1234567890123456789012345678901234567890", expectedError: `metric value is too large`, }, } for _, test := range tests { w, err := spool.NewJSONMetricRecorder( spool.MetricRecorderConfig{ SpoolDir: s.paths.GetMetricsSpoolDir(), Metrics: map[string]corecharm.Metric{ "juju-units": corecharm.Metric{}, "pongs": corecharm.Metric{ Type: corecharm.MetricTypeAbsolute, }, }, CharmURL: "local:precise/wordpress", UnitTag: s.unitTag, }) c.Assert(err, jc.ErrorIsNil) c.Assert(w, gc.NotNil) c.Logf("running test: %s", test.about) err = w.AddMetric(test.key, test.value, time.Now()) if test.expectedError != "" { c.Assert(err, gc.ErrorMatches, test.expectedError) err = w.Close() c.Assert(err, jc.ErrorIsNil) r, err := spool.NewJSONMetricReader(s.paths.GetMetricsSpoolDir()) c.Assert(err, jc.ErrorIsNil) batches, err := r.Read() c.Assert(err, jc.ErrorIsNil) c.Assert(batches, gc.HasLen, 0) } else { c.Assert(err, jc.ErrorIsNil) err = w.Close() c.Assert(err, jc.ErrorIsNil) } } }