def test_should_add_matching_hashes_for_matching_labels(self): a_dict = {u'test': u'dict'} mv1 = metric_value.create(labels=a_dict) mv2 = metric_value.create(labels=a_dict) want = self.make_hash(mv1) got = self.make_hash(mv2) expect(got).to(equal(want))
def test_should_update_hash_for_when_currency_is_added(self): a_dict = {u'test': u'dict'} mv1 = metric_value.create(labels=a_dict) mv2 = metric_value.create(labels=a_dict) mv2.moneyValue = sc_messages.Money(currencyCode=u'JPY') want = self.make_hash(mv1) got = self.make_hash(mv2) expect(got).to_not(equal(want))
def test_should_fail_for_delta_metrics_with_unmergable_types(self): no_init = metric_value.create() unmergeables = [ metric_value.create(stringValue=u'a test string'), metric_value.create(boolValue=False), ] for mv in unmergeables: testf = lambda: metric_value.merge(MetricKind.DELTA, mv, mv) expect(testf).to(raise_error(ValueError))
def test_should_use_the_earliest_start_time_in_delta_merges(self): early_starting = metric_value.create( labels=self.TEST_LABELS, doubleValue=self.A_FLOAT_VALUE, startTime=self.EARLY) late_starting = metric_value.create( labels=self.TEST_LABELS, doubleValue=self.A_FLOAT_VALUE, startTime=self.LATER) got = metric_value.merge(MetricKind.DELTA, early_starting, late_starting) expect(got.startTime).to(equal(early_starting.startTime)) got = metric_value.merge(MetricKind.DELTA, late_starting, early_starting) expect(got.startTime).to(equal(early_starting.startTime))
def setUp(self): self.test_value = metric_value.create( labels=self.TEST_LABELS, doubleValue=self.A_FLOAT_VALUE) self.early_ending = metric_value.create( labels=self.TEST_LABELS, doubleValue=self.A_FLOAT_VALUE, endTime=self.EARLY) self.late_ending = metric_value.create( labels=self.TEST_LABELS, doubleValue=self.A_FLOAT_VALUE, endTime=self.LATER) self.test_value_with_money = metric_value.create( labels=self.TEST_LABELS, moneyValue=messages.Money(currencyCode=u'JPY', units=100, nanos=0))
def test_should_update_temp_response_with_actual(self): req = _make_test_request(self.SERVICE_NAME, self.FAKE_OPERATION_ID) temp_response = sc_messages.AllocateQuotaResponse( operationId=self.FAKE_OPERATION_ID) real_response = sc_messages.AllocateQuotaResponse( operationId=self.FAKE_OPERATION_ID, quotaMetrics=[sc_messages.MetricValueSet( metricName=u'a_float', metricValues=[ metric_value.create( labels={ u'key1': u'value1', u'key2': u'value2'}, doubleValue=1.1, ), ] )] ) agg = self.agg agg.allocate_quota(req) signature = quota_request.sign(req.allocateQuotaRequest) with agg._cache as cache: item = cache[signature] expect(item.response).to(equal(temp_response)) expect(item.is_in_flight).to(be_true) agg.add_response(req, real_response) item = cache[signature] expect(item.response).to(equal(real_response)) expect(item.is_in_flight).to(be_false)
def test_expiration(self): req = _make_test_request(self.SERVICE_NAME, self.FAKE_OPERATION_ID) temp_response = sc_messages.AllocateQuotaResponse( operationId=self.FAKE_OPERATION_ID) real_response = sc_messages.AllocateQuotaResponse( operationId=self.FAKE_OPERATION_ID, quotaMetrics=[sc_messages.MetricValueSet( metricName=u'a_float', metricValues=[ metric_value.create( labels={ u'key1': u'value1', u'key2': u'value2'}, doubleValue=1.1, ), ] )] ) agg = self.agg agg.allocate_quota(req) assert len(agg.flush()) == 1 agg.add_response(req, real_response) signature = quota_request.sign(req.allocateQuotaRequest) with agg._cache as cache, agg._out as out: assert len(out) == 0 assert signature in cache self.timer.tick() self.timer.tick() assert len(agg.flush()) == 0 assert len(out) == 0 assert signature in cache self.timer.tick() # expired at 3rd second assert len(agg.flush()) == 0 assert len(out) == 0 assert signature not in cache
def test_request_extraction_with_aggregation(self): req = _make_test_request(self.SERVICE_NAME, self.FAKE_OPERATION_ID) req = req.allocateQuotaRequest req.allocateOperation.quotaMetrics = [ sc_messages.MetricValueSet( metricName=u'a_float', metricValues=[ metric_value.create( labels={ u'key1': u'value1', u'key2': u'value2'}, int64Value=12, ), ] ) ] resp = sc_messages.AllocateQuotaResponse( operationId=self.FAKE_OPERATION_ID) item = quota_request.CachedItem(req, resp, self.SERVICE_NAME, None) expect(item._op_aggregator).to(be_none) item.aggregate(req) item.aggregate(req) extracted = item.extract_request() op = extracted.allocateQuotaRequest.allocateOperation expect(op.quotaMetrics[0].metricValues[0].int64Value).to(equal(24))
def test_should_succeed_for_delta_metrics_with_the_distribution_type(self): test_distribution = distribution.create_explicit([0.1, 0.3, 0.5]) distribution.add_sample(0.4, test_distribution) v = metric_value.create(labels=self.TEST_LABELS, distributionValue=test_distribution) want = 2 * test_distribution.count got = metric_value.merge(MetricKind.DELTA, v, v) expect(got.distributionValue.count).to(equal(want))
class TestProducerBackendLatencies(KnownMetricsBase, unittest2.TestCase): SUBJECT = _KNOWN.PRODUCER_BACKEND_LATENCIES WANTED_DISTRIBUTION = _wanted_distribution_with_sample( KnownMetricsBase.GIVEN_INFO.backend_time.seconds, *metric_descriptor._TIME_DISTRIBUTION_ARGS) WANTED_ADDED_METRICS = messages.MetricValueSet( metricName=SUBJECT.metric_name, metricValues=[ metric_value.create(distributionValue=WANTED_DISTRIBUTION) ])
class TestConsumerTotalLatencies(KnownMetricsBase, unittest2.TestCase): SUBJECT = _KNOWN.CONSUMER_TOTAL_LATENCIES WANTED_DISTRIBUTION = _wanted_distribution_with_sample( KnownMetricsBase.GIVEN_INFO.request_time.seconds, *metric_descriptor._TIME_DISTRIBUTION_ARGS) WANTED_ADDED_METRICS = messages.MetricValueSet( metricName=SUBJECT.metric_name, metricValues=[ metric_value.create(distributionValue=WANTED_DISTRIBUTION) ])
class TestProducerErrorCountWithErrors(KnownMetricsBase, unittest2.TestCase): SUBJECT = _KNOWN.PRODUCER_ERROR_COUNT GIVEN_INFO = report_request.Info( response_code=401, api_key=KnownMetricsBase.TEST_API_KEY, api_key_valid=True, ) WANTED_ADDED_METRICS = messages.MetricValueSet( metricName=SUBJECT.metric_name, metricValues=[metric_value.create(int64Value=1)])
class TestConsumerResponseSizes(KnownMetricsBase, unittest2.TestCase): SUBJECT = _KNOWN.CONSUMER_RESPONSE_SIZES WANTED_DISTRIBUTION = _wanted_distribution_with_sample( KnownMetricsBase.WANTED_SIZE, *metric_descriptor._SIZE_DISTRIBUTION_ARGS) WANTED_ADDED_METRICS = messages.MetricValueSet( metricName=SUBJECT.metric_name, metricValues=[ metric_value.create(distributionValue=WANTED_DISTRIBUTION) ])
class TestProducerRequestSizes(KnownMetricsBase, unittest2.TestCase): SUBJECT = _KNOWN.PRODUCER_REQUEST_SIZES WANTED_DISTRIBUTION = _wanted_distribution_with_sample( KnownMetricsBase.WANTED_SIZE, *metric_descriptor._SIZE_DISTRIBUTION_ARGS) WANTED_ADDED_METRICS = sc_messages.MetricValueSet( metricName=SUBJECT.metric_name, metricValues=[ metric_value.create(distributionValue=WANTED_DISTRIBUTION) ])
class TestProducerByConsumerRequestOverheadLatencies(KnownMetricsBase, unittest2.TestCase): SUBJECT = _KNOWN.PRODUCER_BY_CONSUMER_REQUEST_OVERHEAD_LATENCIES WANTED_DISTRIBUTION = _wanted_distribution_with_sample( KnownMetricsBase.GIVEN_INFO.overhead_time.seconds, *metric_descriptor._TIME_DISTRIBUTION_ARGS) WANTED_ADDED_METRICS = sc_messages.MetricValueSet( metricName=SUBJECT.metric_name, metricValues=[ metric_value.create(distributionValue=WANTED_DISTRIBUTION) ])
def test_should_change_signature_when_metric_values_are_added(self): without_mvs = check_request.sign(self.test_check_request) self.test_op.metricValueSets = [ messages.MetricValueSet(metricName=u'a_float', metricValues=[ metric_value.create( labels={ u'key1': u'value1', u'key2': u'value2' }, doubleValue=1.1, ), ]) ] with_mvs = check_request.sign(self.test_check_request) expect(with_mvs).not_to(equal(without_mvs))
def test_should_change_signature_when_metric_values_are_added(self): without_mvs = quota_request.sign(self.test_quota_request) self.test_op.quotaMetrics = [ sc_messages.MetricValueSet( metricName=u'a_float', metricValues=[ metric_value.create( labels={ u'key1': u'value1', u'key2': u'value2'}, doubleValue=1.1, ), ] ) ] with_mvs = quota_request.sign(self.test_quota_request) expect(with_mvs).not_to(equal(without_mvs))
def test_should_cache_responses(self): req = _make_test_request(self.SERVICE_NAME, self.FAKE_OPERATION_ID) temp_response = sc_messages.AllocateQuotaResponse( operationId=self.FAKE_OPERATION_ID) real_response = sc_messages.AllocateQuotaResponse( operationId=self.FAKE_OPERATION_ID, quotaMetrics=[sc_messages.MetricValueSet( metricName=u'a_float', metricValues=[ metric_value.create( labels={ u'key1': u'value1', u'key2': u'value2'}, doubleValue=1.1, ), ] )] ) agg = self.agg expect(agg.allocate_quota(req)).to(equal(temp_response)) agg.add_response(req, real_response) expect(agg.allocate_quota(req)).to(equal(real_response))
def test_should_fail_for_metric_values_with_different_types(self): changed = metric_value.create(labels=self.TEST_LABELS, int64Value=1) for kind in (MetricKind.GAUGE, MetricKind.CUMULATIVE, MetricKind.DELTA): testf = lambda: metric_value.merge(kind, self.test_value, changed) expect(testf).to(raise_error(ValueError))
] ) }, { u'description': u'combines the metric value using the default kind', u'kinds': None, u'initial': messages.Operation( startTime=_EARLY, endTime=_LATER, metricValueSets = [ messages.MetricValueSet( metricName=u'some_floats', metricValues=[ metric_value.create( labels=_TEST_LABELS, doubleValue=_A_FLOAT_VALUE, endTime=_EARLY ), ] ), messages.MetricValueSet( metricName=u'other_floats', metricValues=[ metric_value.create( labels=_TEST_LABELS, doubleValue=_A_FLOAT_VALUE, endTime=_EARLY ), ] ) ]
messages.Operation( importance=messages.Operation.ImportanceValueValuesEnum.LOW, logEntries=[], labels=encoding.PyValueToMessage( messages.Operation.LabelsValue, { u'servicecontrol.googleapis.com/service_agent': _WANTED_SERVICE_AGENT, u'servicecontrol.googleapis.com/user_agent': _WANTED_USER_AGENT, u'servicecontrol.googleapis.com/platform': _WANTED_PLATFORM, }), metricValueSets=[ messages.MetricValueSet( metricName=_EXPECTED_OK_METRIC.metric_name, metricValues=[ metric_value.create(int64Value=1), ]), ], consumerId=u'api_key:' + _TEST_API_KEY, operationId=u'an_op_id', operationName=u'an_op_name', startTime=_START_OF_EPOCH_TIMESTAMP, endTime=_START_OF_EPOCH_TIMESTAMP)), (report_request.Info(response_code=404, operation_id=u'an_op_id', operation_name=u'an_op_name', method=u'GET', referer=u'a_referer', backend_time=_TEST_LATENCY, overhead_time=_TEST_LATENCY, request_time=_TEST_LATENCY,
importance=messages.Operation.ImportanceValueValuesEnum.LOW, logEntries=[], labels=encoding.PyValueToMessage( messages.Operation.LabelsValue, { u'servicecontrol.googleapis.com/service_agent': _WANTED_SERVICE_AGENT, u'servicecontrol.googleapis.com/user_agent': _WANTED_USER_AGENT, u'servicecontrol.googleapis.com/platform': _WANTED_PLATFORM, }), metricValueSets = [ messages.MetricValueSet( metricName=_EXPECTED_OK_METRIC.metric_name, metricValues=[ metric_value.create(int64Value=1), ] ), ], consumerId=u'api_key:' + _TEST_API_KEY, operationId=u'an_op_id', operationName=u'an_op_name', startTime=_START_OF_EPOCH_TIMESTAMP, endTime=_START_OF_EPOCH_TIMESTAMP) ), (report_request.Info( response_code=404, operation_id=u'an_op_id', operation_name=u'an_op_name', method=u'GET', referer=u'a_referer',
def test_should_succeed_for_delta_metrics_with_the_int64_type(self): test_int = 4 v = metric_value.create(labels=self.TEST_LABELS, int64Value=test_int) want = 2 * test_int got = metric_value.merge(MetricKind.DELTA, v, v) expect(got.int64Value).to(equal(want))
def test_should_fail_for_uninitialized_metric_values(self): no_init = metric_value.create() for kind in (MetricKind.GAUGE, MetricKind.CUMULATIVE, MetricKind.DELTA): testf = lambda: metric_value.merge(kind, no_init, no_init) expect(testf).to(raise_error(ValueError))
class TestConsumerRequestCount(KnownMetricsBase, unittest2.TestCase): SUBJECT = _KNOWN.CONSUMER_REQUEST_COUNT WANTED_ADDED_METRICS = sc_messages.MetricValueSet( metricName=SUBJECT.metric_name, metricValues=[metric_value.create(int64Value=1)])