def test_labeled_counter_type(ping_schema_url): labeled_counter_metric = metrics.LabeledCounterMetricType( disabled=False, category="telemetry", lifetime=Lifetime.APPLICATION, name="labeled_counter_metric", send_in_pings=["metrics"], ) labeled_counter_metric["label1"].add(1) labeled_counter_metric["label2"].add(2) assert labeled_counter_metric["label1"].test_has_value() assert 1 == labeled_counter_metric["label1"].test_get_value() assert labeled_counter_metric["label2"].test_has_value() assert 2 == labeled_counter_metric["label2"].test_get_value() json_content = Glean.test_collect(_builtins.pings.metrics) assert 0 == validate_ping.validate_ping(io.StringIO(json_content), sys.stdout, schema_url=ping_schema_url) tree = json.loads(json_content) assert (1 == tree["metrics"]["labeled_counter"] ["telemetry.labeled_counter_metric"]["label1"]) assert (2 == tree["metrics"]["labeled_counter"] ["telemetry.labeled_counter_metric"]["label2"])
def test_other_label_without_predefined_labels_before_glean_init(): labeled_counter_metric = metrics.LabeledCounterMetricType( disabled=False, category="telemetry", lifetime=Lifetime.APPLICATION, name="labeled_counter_metric", send_in_pings=["metrics"], ) Glean._reset() Dispatcher.set_task_queueing(True) for i in range(21): labeled_counter_metric["label_{}".format(i)].add(1) labeled_counter_metric["label_0"].add(1) Glean.initialize( application_id="glean-python-test", application_version=glean_version, upload_enabled=True, ) assert 2 == labeled_counter_metric["label_0"].test_get_value() for i in range(1, 16): assert 1 == labeled_counter_metric["label_{}".format( i)].test_get_value() assert 5 == labeled_counter_metric["__other__"].test_get_value()
def test_other_label_without_predefined_labels(ping_schema_url): labeled_counter_metric = metrics.LabeledCounterMetricType( disabled=False, category="telemetry", lifetime=Lifetime.APPLICATION, name="labeled_counter_metric", send_in_pings=["metrics"], ) for i in range(21): labeled_counter_metric["label_{}".format(i)].add(1) labeled_counter_metric["label_0"].add(1) assert 2 == labeled_counter_metric["label_0"].test_get_value() for i in range(1, 16): assert 1 == labeled_counter_metric["label_{}".format( i)].test_get_value() assert 5 == labeled_counter_metric["__other__"].test_get_value() json_content = Glean.test_collect(_builtins.pings.metrics) assert 0 == validate_ping.validate_ping(io.StringIO(json_content), sys.stdout, schema_url=ping_schema_url)
def test_rapidly_recreating_labeled_metrics_does_not_crash(): """ Regression test for bug 1733757. The underlying map implementation has an upper limit of entries it can handle, currently set to (1<<15)-1 = 32767. We used to create a new object every time a label was referenced, leading to exhausting the available storage in that map, which finally results in a panic. """ labeled_counter_metric = metrics.LabeledCounterMetricType( category="telemetry", name="labeled_nocrash", send_in_pings=["metrics"], lifetime=Lifetime.APPLICATION, disabled=False, labels=["foo"], ) # We go higher than the maximum of `(1<<15)-1 = 32767`. # Python is slow, so we only go a tiny bit higher. max_attempts = (1 << 15) + 1 # 32769 for _ in range(max_attempts): labeled_counter_metric["foo"].add(1) assert max_attempts == labeled_counter_metric["foo"].test_get_value()
def get_upload_failure_metric(): return metrics.LabeledCounterMetricType( disabled=False, send_in_pings=["metrics"], name="ping_upload_failure", category="glean.upload", labels=[ "status_code_4xx", "status_code_5xx", "status_code_unknown", "unrecoverable", "recoverable", ], lifetime=metrics.Lifetime.PING, )
def test_invalid_labels_go_to_other(): labeled_counter_metric = metrics.LabeledCounterMetricType( disabled=False, category="telemetry", lifetime=Lifetime.APPLICATION, name="labeled_counter_metric", send_in_pings=["metrics"], ) labeled_counter_metric["notSnakeCase"].add(1) labeled_counter_metric[""].add(1) labeled_counter_metric["with/slash"].add(1) labeled_counter_metric["this_string_has_more_than_thirty_characters"].add( 1) assert 4 == labeled_counter_metric.test_get_num_recorded_errors( ErrorType.INVALID_LABEL)
def test_other_label_with_predefined_labels(): labeled_counter_metric = metrics.LabeledCounterMetricType( disabled=False, category="telemetry", lifetime=Lifetime.APPLICATION, name="labeled_counter_metric", send_in_pings=["metrics"], labels=["foo", "bar", "baz"], ) labeled_counter_metric["foo"].add(1) labeled_counter_metric["foo"].add(2) labeled_counter_metric["bar"].add(1) labeled_counter_metric["not_there"].add(1) labeled_counter_metric["also_not_there"].add(1) labeled_counter_metric["not_me"].add(1) assert 3 == labeled_counter_metric["foo"].test_get_value() assert 1 == labeled_counter_metric["bar"].test_get_value() assert not labeled_counter_metric["baz"].test_has_value() assert 3 == labeled_counter_metric["not_there"].test_get_value() json_content = Glean.test_collect(_builtins.pings.metrics) assert 0 == validate_ping.validate_ping(io.StringIO(json_content), sys.stdout) tree = json.loads(json_content) assert ( 3 == tree["metrics"]["labeled_counter"]["telemetry.labeled_counter_metric"]["foo"] ) assert ( 1 == tree["metrics"]["labeled_counter"]["telemetry.labeled_counter_metric"]["bar"] ) assert ( 3 == tree["metrics"]["labeled_counter"]["telemetry.labeled_counter_metric"][ "__other__" ] )