def testLaterValuesDoNotOverridePrevious(self): stats.STATS.RegisterCounterMetric("counter") stats.STATS.IncrementCounter("counter") self.stats_store.WriteStats( process_id=self.process_id, timestamp=42, sync=True) stats.STATS.IncrementCounter("counter") self.stats_store.WriteStats( process_id=self.process_id, timestamp=43, sync=True) row = data_store.DB.ResolvePrefix( "aff4:/stats_store/some_pid", "", token=self.token) counters = [x for x in row if x[0] == "aff4:stats_store/counter"] self.assertEqual(len(counters), 2) counters = sorted(counters, key=lambda x: x[2]) stored_value = stats_store.StatsStoreValue( value_type=stats.MetricMetadata.ValueType.INT, int_value=1) self.assertEqual(counters[0], ("aff4:stats_store/counter", stored_value.SerializeToString(), 42)) stored_value = stats_store.StatsStoreValue( value_type=stats.MetricMetadata.ValueType.INT, int_value=2) self.assertEqual(counters[1], ("aff4:stats_store/counter", stored_value.SerializeToString(), 43))
def testCountersAreWrittenToDataStore(self): stats.STATS.RegisterCounterMetric("counter") stats.STATS.IncrementCounter("counter") self.stats_store.WriteStats( process_id=self.process_id, timestamp=42, sync=True) row = data_store.DB.ResolvePrefix( "aff4:/stats_store/some_pid", "", token=self.token) counter = [x for x in row if x[0] == "aff4:stats_store/counter"] self.assertTrue(counter) stored_value = stats_store.StatsStoreValue( value_type=stats.MetricMetadata.ValueType.INT, int_value=1) self.assertEqual(counter[0], ("aff4:stats_store/counter", stored_value.SerializeToString(), 42))
def testStringGaugeValuesAreWrittenToDataStore(self): stats.STATS.RegisterGaugeMetric("str_gauge", str) stats.STATS.SetGaugeValue("str_gauge", "some_value") self.stats_store.WriteStats( process_id=self.process_id, timestamp=42, sync=True) row = data_store.DB.ResolvePrefix( "aff4:/stats_store/some_pid", "", token=self.token) counter = [x for x in row if x[0] == "aff4:stats_store/str_gauge"] self.assertTrue(counter) stored_value = stats_store.StatsStoreValue( value_type=stats.MetricMetadata.ValueType.STR, str_value="some_value") self.assertEqual(counter[0], ("aff4:stats_store/str_gauge", stored_value.SerializeToString(), 42))
def testEventMetricsWithFieldsAreWrittenToDataStore(self): stats.STATS.RegisterEventMetric("foo_event", fields=[("source", str)]) stats.STATS.RecordEvent("foo_event", 5, fields=["http"]) stats.STATS.RecordEvent("foo_event", 15, fields=["rpc"]) self.stats_store.WriteStats(process_id=self.process_id, timestamp=42, sync=True) row = data_store.DB.ResolveRegex("aff4:/stats_store/some_pid", ".*", token=self.token) values = [ stats_store.StatsStoreValue(x[1]) for x in row if x[0] == "aff4:stats_store/foo_event" ] self.assertEqual(len(values), 2) http_field_value = stats_store.StatsStoreFieldValue( field_type=stats.MetricFieldDefinition.FieldType.STR, str_value="http") rpc_field_value = stats_store.StatsStoreFieldValue( field_type=stats.MetricFieldDefinition.FieldType.STR, str_value="rpc") # Check that distribution with source=http is written. http_events = [ x for x in values if x.fields_values == [http_field_value] ] self.assertTrue(http_events) self.assertEqual(http_events[0].value_type, stats.MetricMetadata.ValueType.DISTRIBUTION) self.assertEqual(http_events[0].distribution_value.count, 1) self.assertEqual(http_events[0].distribution_value.sum, 5) # Check that distribution with source=rpc is written. rpc_events = [ x for x in values if x.fields_values == [rpc_field_value] ] self.assertTrue(rpc_events) self.assertEqual(rpc_events[0].value_type, stats.MetricMetadata.ValueType.DISTRIBUTION) self.assertEqual(rpc_events[0].distribution_value.count, 1) self.assertEqual(rpc_events[0].distribution_value.sum, 15)
def testCountersWithFieldsAreWrittenToDataStore(self): stats.STATS.RegisterCounterMetric("counter", fields=[("source", str)]) stats.STATS.IncrementCounter("counter", fields=["http"]) stats.STATS.IncrementCounter("counter", delta=2, fields=["rpc"]) self.stats_store.WriteStats(process_id=self.process_id, timestamp=42, sync=True) row = data_store.DB.ResolveRegex("aff4:/stats_store/some_pid", ".*", token=self.token) # Check that no plain counter is written. values = [ stats_store.StatsStoreValue(x[1]) for x in row if x[0] == "aff4:stats_store/counter" ] self.assertEqual(len(values), 2) http_field_value = stats_store.StatsStoreFieldValue( field_type=stats.MetricFieldDefinition.FieldType.STR, str_value="http") rpc_field_value = stats_store.StatsStoreFieldValue( field_type=stats.MetricFieldDefinition.FieldType.STR, str_value="rpc") # Check that counter with source=http is written. http_counter = [ x for x in values if x.fields_values == [http_field_value] ] self.assertTrue(http_counter) self.assertEqual(http_counter[0].value_type, stats.MetricMetadata.ValueType.INT) self.assertEqual(http_counter[0].int_value, 1) # Check that counter with source=rpc is written. rpc_counter = [ x for x in values if x.fields_values == [rpc_field_value] ] self.assertTrue(rpc_counter) self.assertEqual(rpc_counter[0].value_type, stats.MetricMetadata.ValueType.INT) self.assertEqual(rpc_counter[0].int_value, 2)
def testEventMetricsAreWrittenToDataStore(self): stats.STATS.RegisterEventMetric("foo_event") stats.STATS.RecordEvent("foo_event", 5) stats.STATS.RecordEvent("foo_event", 15) self.stats_store.WriteStats(process_id=self.process_id, timestamp=42, sync=True) row = data_store.DB.ResolvePrefix("aff4:/stats_store/some_pid", "", token=self.token) values = [stats_store.StatsStoreValue(x[1]) for x in row if x[0] == "aff4:stats_store/foo_event"] self.assertEqual(len(values), 1) stored_value = values[0] self.assertEqual(stored_value.value_type, stats.MetricMetadata.ValueType.DISTRIBUTION) self.assertEqual(stored_value.distribution_value.count, 2) self.assertEqual(stored_value.distribution_value.sum, 20)