From 14f02f3d6edfd46072425399a2e82a80bd4a1827 Mon Sep 17 00:00:00 2001 From: Daniel Mueller Date: Thu, 12 Mar 2026 16:33:47 -0400 Subject: [PATCH] adjust labeled booleans so that no default values are applied & omitting a label is supported --- glean_parser/templates/go_server.jinja2 | 8 +----- .../go_server_labeled_boolean_metrics.yaml | 1 + tests/test_go_server.py | 26 +++++++++---------- 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/glean_parser/templates/go_server.jinja2 b/glean_parser/templates/go_server.jinja2 index 320bfbfa..729fb965 100644 --- a/glean_parser/templates/go_server.jinja2 +++ b/glean_parser/templates/go_server.jinja2 @@ -227,7 +227,7 @@ func (e {{ event|event_type_name }}) gleanEvent() gleanEvent { // {{ metric.description|clean_string }} type {{ metric|metric_argument_name }} struct { {% for label in metric.ordered_labels %} - {{ label|event_extra_name }} bool // {{ label }} + {{ label|event_extra_name }} *bool `json:"{{ label }},omitempty"` {% endfor %} } {% endfor %} @@ -277,12 +277,6 @@ func (g GleanEventsLogger) Record{{ ping|ping_type_name }}( {% for metric in metrics %} {% if metric_type == 'datetime' %} "{{ metric|metric_name }}": params.{{ metric|metric_argument_name }}.Format("2006-01-02T15:04:05.000Z"), - {% elif metric_type == 'labeled_boolean' %} - "{{ metric|metric_name }}": map[string]bool{ - {% for label in metric.ordered_labels %} - "{{ label }}": params.{{ metric|metric_argument_name }}.{{ label|event_extra_name }}, - {% endfor %} - }, {% else %} "{{ metric|metric_name }}": params.{{ metric|metric_argument_name }}, {% endif %} diff --git a/tests/data/go_server_labeled_boolean_metrics.yaml b/tests/data/go_server_labeled_boolean_metrics.yaml index f4bb729a..c6fef66f 100644 --- a/tests/data/go_server_labeled_boolean_metrics.yaml +++ b/tests/data/go_server_labeled_boolean_metrics.yaml @@ -13,6 +13,7 @@ telemetry: - feature_one - feature_two - feature_three + - feature_four bugs: - https://bugzilla.mozilla.org/show_bug.cgi?id=1234567 data_reviews: diff --git a/tests/test_go_server.py b/tests/test_go_server.py index 24c99e4d..346b7280 100644 --- a/tests/test_go_server.py +++ b/tests/test_go_server.py @@ -77,19 +77,13 @@ def test_parser_go_server_labeled_boolean(tmp_path): # Check that the labeled_boolean struct type was generated assert "type TelemetryFeatureFlags struct {" in content - assert "FeatureOne bool" in content - assert "FeatureTwo bool" in content - assert "FeatureThree bool" in content + assert "FeatureOne *bool" in content + assert "FeatureTwo *bool" in content + assert "FeatureThree *bool" in content # Check that it's used in the ping struct assert "TelemetryFeatureFlags TelemetryFeatureFlags" in content - # Check that serialization includes map creation - assert "map[string]bool{" in content - assert '"feature_one":' in content - assert '"feature_two":' in content - assert '"feature_three":' in content - def test_parser_go_server_events_only(tmp_path): """Test that parser works for definitions that only use events ping""" @@ -399,6 +393,8 @@ def test_run_logging_labeled_boolean(tmp_path): code = """ _ = time.Now() // satisfy Go's unused import check for "time" + t := true + f := false logger.RecordEventsPing( glean.RequestInfo{ UserAgent: "glean-test/1.0", @@ -406,9 +402,10 @@ def test_run_logging_labeled_boolean(tmp_path): }, glean.EventsPing{ TelemetryFeatureFlags: glean.TelemetryFeatureFlags{ - FeatureOne: true, - FeatureTwo: false, - FeatureThree: true, + FeatureOne: &t, + FeatureTwo: &f, + FeatureThree: nil, // valid label on metric but this request had no value for it + // FeatureFour omitted to illustrate zero value behavior }, }, ) @@ -437,13 +434,14 @@ def test_run_logging_labeled_boolean(tmp_path): output.getvalue() ) - # Check that labeled_boolean is properly serialized as a map + # Check that labeled_boolean is properly serialized labeled_boolean_metrics = payload["metrics"]["labeled_boolean"] assert "telemetry.feature_flags" in labeled_boolean_metrics feature_flags = labeled_boolean_metrics["telemetry.feature_flags"] assert feature_flags["feature_one"] is True assert feature_flags["feature_two"] is False - assert feature_flags["feature_three"] is True + assert feature_flags.get("feature_three") is None + assert feature_flags.get("feature_four") is None @pytest.mark.go_dependency