def test_send(self, _psmonitor): mon = monitors.PubSubMonitor('/path/to/creds.p8.json', 'myproject', 'mytopic') mon._api = mock.MagicMock() mon._topic = 'mytopic' metric1 = metrics_pb2.MetricsData(name='m1') mon.send(metric1) metric2 = metrics_pb2.MetricsData(name='m2') mon.send([metric1, metric2]) collection = metrics_pb2.MetricsCollection(data=[metric1, metric2]) mon.send(collection) def message(pb): pb = monitors.Monitor._wrap_proto(pb) return { 'messages': [{ 'data': base64.b64encode(pb.SerializeToString()) }] } publish = mon._api.projects.return_value.topics.return_value.publish publish.assert_has_calls([ mock.call(topic='mytopic', body=message(metric1)), mock.call().execute(num_retries=5), mock.call(topic='mytopic', body=message([metric1, metric2])), mock.call().execute(num_retries=5), mock.call(topic='mytopic', body=message(collection)), mock.call().execute(num_retries=5), ])
def test_populate_buckets(self): pb = metrics_pb2.MetricsData() m = metrics.DistributionMetric('test') d = distribution.Distribution( distribution.FixedWidthBucketer(10)) d.add(5) d.add(15) d.add(35) d.add(65) m._populate_value(pb, d) self.assertEquals([1, 1, -1, 1, -2, 1], pb.distribution.bucket) self.assertEquals(0, pb.distribution.underflow) self.assertEquals(0, pb.distribution.overflow) self.assertEquals(30, pb.distribution.mean) pb = metrics_pb2.MetricsData() d = distribution.Distribution( distribution.FixedWidthBucketer(10, num_finite_buckets=1)) d.add(5) d.add(15) d.add(25) m._populate_value(pb, d) self.assertEquals([1], pb.distribution.bucket) self.assertEquals(0, pb.distribution.underflow) self.assertEquals(2, pb.distribution.overflow) self.assertEquals(15, pb.distribution.mean)
def test_send(self, _fake_api): m = monitors.ApiMonitor('/path/to/creds.p8.json', 'https://www.tld/api') metric1 = metrics_pb2.MetricsData(name='m1') m.send(metric1) metric2 = metrics_pb2.MetricsData(name='m2') m.send([metric1, metric2]) collection = metrics_pb2.MetricsCollection(data=[metric1, metric2]) m.send(collection) self.assertEquals(m._api.Send.call_count, 3)
def test_send(self): with tempfile.NamedTemporaryFile(delete=True) as f: m = monitors.DiskMonitor(f.name) metric1 = metrics_pb2.MetricsData(name='m1') m.send(metric1) metric2 = metrics_pb2.MetricsData(name='m2') m.send([metric1, metric2]) collection = metrics_pb2.MetricsCollection(data=[metric1, metric2]) m.send(collection) output = f.read() self.assertEquals(output.count('data {\n name: "m1"\n}'), 3) self.assertEquals(output.count('data {\n name: "m2"\n}'), 2)
def test_not_instrumented(self, fake_api): m = monitors.ApiMonitor('/path/to/creds.p8.json', 'https://www.tld/api', use_instrumented_http=False) m.send(metrics_pb2.MetricsData(name='m1')) self.assertFalse(fake_api.SetHttp.called)
def test_invalid_field_value(self): pb = metrics_pb2.MetricsData() m = metrics.Metric('test', fields={'pi': 3.14}) with self.assertRaises(errors.MonitoringInvalidFieldTypeError) as e: m._populate_fields(pb, m._normalized_fields) self.assertEquals(e.exception.metric, 'test') self.assertEquals(e.exception.field, 'pi') self.assertEquals(e.exception.value, 3.14)
def test_populate_field_values(self): pb1 = metrics_pb2.MetricsData() m1 = metrics.Metric('foo', fields={'asdf': 1}) m1._populate_fields(pb1, m1._normalized_fields) self.assertEquals(pb1.fields[0].name, 'asdf') self.assertEquals(pb1.fields[0].int_value, 1) pb2 = metrics_pb2.MetricsData() m2 = metrics.Metric('bar', fields={'qwer': True}) m2._populate_fields(pb2, m2._normalized_fields) self.assertEquals(pb2.fields[0].name, 'qwer') self.assertEquals(pb2.fields[0].bool_value, True) pb3 = metrics_pb2.MetricsData() m3 = metrics.Metric('baz', fields={'zxcv': 'baz'}) m3._populate_fields(pb3, m3._normalized_fields) self.assertEquals(pb3.fields[0].name, 'zxcv') self.assertEquals(pb3.fields[0].string_value, 'baz')
def test_populate_target(self): pb = metrics_pb2.MetricsData() t = targets.DeviceTarget('reg', 'net', 'host') t._populate_target_pb(pb) self.assertEquals(pb.network_device.metro, 'reg') self.assertEquals(pb.network_device.hostgroup, 'net') self.assertEquals(pb.network_device.hostname, 'host') self.assertEquals(pb.network_device.realm, 'ACQ_CHROME') self.assertEquals(pb.network_device.alertable, True)
def test_instrumented(self, fake_api): m = monitors.ApiMonitor('/path/to/creds.p8.json', 'https://www.tld/api') m.send(metrics_pb2.MetricsData(name='m1')) api = fake_api.AcquisitionApi.return_value api.SetHttp.assert_called_once() self.assertIsInstance(api.SetHttp.call_args[0][0], infra_libs.InstrumentedHttp)
def test_populate_target(self): pb = metrics_pb2.MetricsData() t = targets.TaskTarget('serv', 'job', 'reg', 'host') t._populate_target_pb(pb) self.assertEquals(pb.task.service_name, 'serv') self.assertEquals(pb.task.job_name, 'job') self.assertEquals(pb.task.data_center, 'reg') self.assertEquals(pb.task.host_name, 'host') self.assertEquals(pb.task.task_num, 0)
def test_populate_buckets_last_zero(self): pb = metrics_pb2.MetricsData() m = metrics.DistributionMetric('test') d = distribution.Distribution( distribution.FixedWidthBucketer(10, num_finite_buckets=10)) d.add(5) d.add(105) m._populate_value(pb, d) self.assertEquals([1], pb.distribution.bucket) self.assertEquals(1, pb.distribution.overflow)
def test_populate_is_cumulative(self): pb = metrics_pb2.MetricsData() d = distribution.Distribution( distribution.FixedWidthBucketer(10, num_finite_buckets=10)) m = metrics.CumulativeDistributionMetric('test') m._populate_value(pb, d) self.assertTrue(pb.distribution.is_cumulative) m = metrics.NonCumulativeDistributionMetric('test2') m._populate_value(pb, d) self.assertFalse(pb.distribution.is_cumulative)
def test_populate_buckets_underflow(self): pb = metrics_pb2.MetricsData() m = metrics.DistributionMetric('test') d = distribution.Distribution( distribution.FixedWidthBucketer(10, num_finite_buckets=10)) d.add(-5) d.add(-1000000) m._populate_value(pb, d) self.assertEquals([], pb.distribution.bucket) self.assertEquals(2, pb.distribution.underflow) self.assertEquals(0, pb.distribution.overflow) self.assertEquals(-500002.5, pb.distribution.mean)
def test_populate_canonical(self): pb = metrics_pb2.MetricsData() m = metrics.DistributionMetric('test') m._populate_value(pb, distribution.Distribution(distribution.GeometricBucketer())) self.assertEquals(pb.distribution.spec_type, metrics_pb2.PrecomputedDistribution.CANONICAL_POWERS_OF_10_P_0_2) m._populate_value(pb, distribution.Distribution(distribution.GeometricBucketer(2))) self.assertEquals(pb.distribution.spec_type, metrics_pb2.PrecomputedDistribution.CANONICAL_POWERS_OF_2) m._populate_value(pb, distribution.Distribution(distribution.GeometricBucketer(10))) self.assertEquals(pb.distribution.spec_type, metrics_pb2.PrecomputedDistribution.CANONICAL_POWERS_OF_10)
def test_populate_custom(self): pb = metrics_pb2.MetricsData() m = metrics.DistributionMetric('test') m._populate_value(pb, distribution.Distribution(distribution.GeometricBucketer(4))) self.assertEquals(pb.distribution.spec_type, metrics_pb2.PrecomputedDistribution.CUSTOM_PARAMETERIZED) self.assertEquals(0, pb.distribution.width) self.assertEquals(4, pb.distribution.growth_factor) self.assertEquals(100, pb.distribution.num_buckets) m._populate_value(pb, distribution.Distribution(distribution.FixedWidthBucketer(10))) self.assertEquals(pb.distribution.spec_type, metrics_pb2.PrecomputedDistribution.CUSTOM_PARAMETERIZED) self.assertEquals(10, pb.distribution.width) self.assertEquals(0, pb.distribution.growth_factor) self.assertEquals(100, pb.distribution.num_buckets)
def test_failed_request_should_not_crash(self, _fake_api, _fake_creds): m = monitors.ApiMonitor('/path/to/creds.p8.json', 'https://www.tld/api') m._api.Send.side_effect = acquisition_api.AcquisitionApiRequestException( ) m.send(metrics_pb2.MetricsData(name='m1'))
def test_populate_value(self): pb = metrics_pb2.MetricsData() m = metrics.StringMetric('test') m._populate_value(pb, 'foo') self.assertEquals(pb.string_value, 'foo')
def test_populate_value(self): pb = metrics_pb2.MetricsData() m = metrics.BooleanMetric('test') m._populate_value(pb, True) self.assertEquals(pb.boolean_value, True)
def test_send(self): m = monitors.NullMonitor() metric1 = metrics_pb2.MetricsData(name='m1') m.send(metric1)
def test_send(self): m = monitors.Monitor() metric1 = metrics_pb2.MetricsData(name='m1') with self.assertRaises(NotImplementedError): m.send(metric1)
def test_populate_value(self): pb = metrics_pb2.MetricsData() m = metrics.CounterMetric('test') m._populate_value(pb, 1) self.assertEquals(pb.counter, 1)
def test_populate_value(self): pb = metrics_pb2.MetricsData() m = metrics.GaugeMetric('test') m._populate_value(pb, 1) self.assertEquals(pb.gauge, 1)
def test_populate_value(self): pb = metrics_pb2.MetricsData() m = metrics.FloatMetric('test') m._populate_value(pb, 1.618) self.assertEquals(pb.noncumulative_double_value, 1.618)
def test_populate_value(self): pb = metrics_pb2.MetricsData() m = metrics.CumulativeMetric('test') m._populate_value(pb, 1.618) self.assertAlmostEquals(pb.cumulative_double_value, 1.618)