From d6cfc210c2d86b354cd9d124cd3c40681a6aac48 Mon Sep 17 00:00:00 2001 From: Travis Long Date: Thu, 16 Apr 2026 07:05:09 -0500 Subject: [PATCH 1/4] Bug 2020962 - Add in_session field to metrics schema and model Add support for the `in_session` boolean field on metric definitions. When `in_session: true` is set on an event metric, the parser sets `out_of_session: false` on the metric object for code generation. - Schema: add `in_session` property to metrics 2-0-0 schema with a validation rule that rejects `in_session: true` on non-event types - Model: Event.__init__ pops `in_session` and sets `out_of_session`; Event.serialize strips `out_of_session` so it doesn't round-trip back into YAML validation - Util: add `out_of_session` to `common_metric_args` so Kotlin, Swift, and JavaScript templates pick it up automatically via their existing iteration over that list --- glean_parser/metrics.py | 12 ++++++++++ .../schemas/metrics.2-0-0.schema.yaml | 24 +++++++++++++++++++ glean_parser/util.py | 1 + 3 files changed, 37 insertions(+) diff --git a/glean_parser/metrics.py b/glean_parser/metrics.py index 9ba944fe3..fb3badab0 100644 --- a/glean_parser/metrics.py +++ b/glean_parser/metrics.py @@ -61,6 +61,7 @@ def __init__( data_sensitivity: Optional[List[str]] = None, defined_in: Optional[Dict] = None, telemetry_mirror: Optional[str] = None, + in_session: bool = False, _config: Optional[Dict[str, Any]] = None, _validated: bool = False, ): @@ -98,6 +99,8 @@ def __init__( self.defined_in = defined_in if telemetry_mirror is not None: self.telemetry_mirror = telemetry_mirror + if in_session: + self.in_session = in_session # _validated indicates whether this metric has already been jsonschema # validated (but not any of the Python-level validation). @@ -312,10 +315,19 @@ class Event(Metric): def __init__(self, *args, **kwargs): self.extra_keys = kwargs.pop("extra_keys", {}) + in_session = kwargs.pop("in_session", False) + if in_session: + self.in_session = True + self.out_of_session = False self.validate_extra_keys(self.extra_keys, kwargs.get("_config", {})) super().__init__(*args, **kwargs) self._generate_enums = [("allowed_extra_keys_with_types", "Extra")] + def serialize(self) -> Dict[str, "util.JSONType"]: + d = super().serialize() + d.pop("out_of_session", None) + return d + @property def allowed_extra_keys(self): # Sort keys so that output is deterministic diff --git a/glean_parser/schemas/metrics.2-0-0.schema.yaml b/glean_parser/schemas/metrics.2-0-0.schema.yaml index 47086784d..157733942 100644 --- a/glean_parser/schemas/metrics.2-0-0.schema.yaml +++ b/glean_parser/schemas/metrics.2-0-0.schema.yaml @@ -627,6 +627,18 @@ definitions: so glean_parser can find it. type: string + in_session: + title: In session + description: | + Whether this metric participates in session sampling. + When `true`, the metric is subject to session-level sampling and + session metadata is attached to it. + When `false` (default), the metric bypasses session sampling entirely. + + Only valid when `type`_ is `event`. + type: boolean + default: false + structure: title: A subset of a JSON schema definition description: | @@ -773,6 +785,18 @@ additionalProperties: description: | `denominator_metric` is only allowed for `rate`. maxLength: 0 + - if: + not: + properties: + type: + const: event + then: + properties: + in_session: + description: | + `in_session: true` is only allowed for `event` metrics. + Only event metrics support session sampling. + const: false - if: properties: diff --git a/glean_parser/util.py b/glean_parser/util.py index 794a8426a..55c91f444 100644 --- a/glean_parser/util.py +++ b/glean_parser/util.py @@ -515,6 +515,7 @@ def remove_output_params(d, output_params): "send_in_pings", "lifetime", "disabled", + "out_of_session", ] From 46eb3ecdaeb7ecc4b16722d692eef943e80cc1e5 Mon Sep 17 00:00:00 2001 From: Travis Long Date: Thu, 16 Apr 2026 07:05:39 -0500 Subject: [PATCH 2/4] Bug 2020962 - Emit out_of_session in Rust template The Rust template hardcodes CommonMetricData fields rather than iterating common_metric_args like Kotlin/Swift/JS, so it needs an explicit addition to emit `out_of_session` when defined. --- glean_parser/templates/rust.jinja2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/glean_parser/templates/rust.jinja2 b/glean_parser/templates/rust.jinja2 index b6593e44b..7ac300bb5 100644 --- a/glean_parser/templates/rust.jinja2 +++ b/glean_parser/templates/rust.jinja2 @@ -102,6 +102,9 @@ CommonMetricData { send_in_pings: {{ obj.send_in_pings|rust }}, lifetime: {{ obj.lifetime|rust }}, disabled: {{ obj.is_disabled()|rust }}, + {% if obj.out_of_session is defined %} + out_of_session: {{ obj.out_of_session|rust }}, + {% endif %} ..Default::default() } {%- endmacro -%} From e1ed3abea9a3e5b925118c64c38ba19e62164ba0 Mon Sep 17 00:00:00 2001 From: Travis Long Date: Thu, 16 Apr 2026 07:06:01 -0500 Subject: [PATCH 3/4] Bug 2020962 - Add tests for in_session support - Model tests: verify in_session on events sets out_of_session, default omits it, non-event with in_session: true is rejected, non-event with in_session: false is accepted - Output tests: verify generated Rust, Kotlin, and Swift code contains outOfSession/out_of_session when in_session: true - Test data: add in_session: true to the event in all_metrics.yaml --- tests/data/all_metrics.yaml | 1 + tests/test_kotlin.py | 4 +++ tests/test_metrics.py | 60 +++++++++++++++++++++++++++++++++++++ tests/test_rust.py | 18 +++++++++++ tests/test_swift.py | 4 +++ 5 files changed, 87 insertions(+) diff --git a/tests/data/all_metrics.yaml b/tests/data/all_metrics.yaml index ec6c5431e..c28acb188 100644 --- a/tests/data/all_metrics.yaml +++ b/tests/data/all_metrics.yaml @@ -107,6 +107,7 @@ all_metrics: event: <<: *defaults type: event + in_session: true extra_keys: source: description: Source of this event diff --git a/tests/test_kotlin.py b/tests/test_kotlin.py index 9d0e9329b..d151da330 100644 --- a/tests/test_kotlin.py +++ b/tests/test_kotlin.py @@ -105,6 +105,10 @@ def test_parser_all_metrics(tmp_path): assert set(x.name for x in tmp_path.iterdir()) == set(["AllMetrics.kt"]) + with (tmp_path / "AllMetrics.kt").open("r", encoding="utf-8") as fd: + content = fd.read() + assert "outOfSession = false" in content + run_linters(tmp_path.glob("*.kt")) diff --git a/tests/test_metrics.py b/tests/test_metrics.py index aa6a75d42..8f743b89e 100644 --- a/tests/test_metrics.py +++ b/tests/test_metrics.py @@ -190,6 +190,66 @@ def test_no_unit(): assert not event.unit +def test_in_session_on_event(): + """in_session: true on event produces out_of_session = False.""" + event = metrics.Event( + type="event", + category="category", + name="metric", + bugs=["http://bugzilla.mozilla.com/12345"], + notification_emails=["nobody@example.com"], + description="description...", + expires="never", + in_session=True, + ) + assert event.out_of_session is False + assert event.in_session is True + + +def test_in_session_default_on_event(): + """Omitting in_session defaults to out-of-session (no out_of_session attr).""" + event = metrics.Event( + type="event", + category="category", + name="metric", + bugs=["http://bugzilla.mozilla.com/12345"], + notification_emails=["nobody@example.com"], + description="description...", + expires="never", + ) + assert not hasattr(event, "out_of_session") + + +def test_in_session_true_on_non_event_rejected(): + """in_session: true on a non-event metric must raise a validation error.""" + with pytest.raises(ValueError): + metrics.Counter( + type="counter", + category="category", + name="metric", + bugs=["http://bugzilla.mozilla.com/12345"], + notification_emails=["nobody@example.com"], + description="description...", + expires="never", + in_session=True, + ) + + +def test_in_session_false_on_non_event_accepted(): + """in_session: false (explicit) on a non-event metric should be accepted.""" + counter = metrics.Counter( + type="counter", + category="category", + name="metric", + bugs=["http://bugzilla.mozilla.com/12345"], + notification_emails=["nobody@example.com"], + description="description...", + expires="never", + in_session=False, + ) + assert not hasattr(counter, "out_of_session") + + def test_jwe_is_rejected(): with pytest.raises(ValueError): metrics.Jwe( diff --git a/tests/test_rust.py b/tests/test_rust.py index ddd438e5a..c387db938 100644 --- a/tests/test_rust.py +++ b/tests/test_rust.py @@ -289,6 +289,24 @@ def test_object_metric(tmp_path): assert "}" in content +def test_in_session_output(tmp_path): + """Assert that in_session: true produces out_of_session: false in Rust output.""" + translate.translate( + ROOT / "data" / "all_metrics.yaml", + "rust", + tmp_path, + {}, + {"allow_reserved": False}, + ) + + assert set(x.name for x in tmp_path.iterdir()) == set(["glean_metrics.rs"]) + + with (tmp_path / "glean_metrics.rs").open("r", encoding="utf-8") as fd: + content = fd.read() + + assert "out_of_session: false" in content + + def test_dual_labeled_counter_metric(tmp_path): """ Assert that a dual labeled counter metric is created. diff --git a/tests/test_swift.py b/tests/test_swift.py index 593a6d32d..8fec38727 100644 --- a/tests/test_swift.py +++ b/tests/test_swift.py @@ -109,6 +109,10 @@ def test_parser_all_metrics(tmp_path): assert set(x.name for x in tmp_path.iterdir()) == set(["Metrics.swift"]) + with (tmp_path / "Metrics.swift").open("r", encoding="utf-8") as fd: + content = fd.read() + assert "outOfSession: false" in content + run_linters(tmp_path.glob("*.swift")) From 2a4c166d937cfa719922f4aeffffea451dc86e5d Mon Sep 17 00:00:00 2001 From: Travis Long Date: Fri, 8 May 2026 09:03:28 -0500 Subject: [PATCH 4/4] Address change requests, remove out_of_session to match SDK --- glean_parser/.metrics.py.swp | Bin 0 -> 32768 bytes glean_parser/metrics.py | 1 - 2 files changed, 1 deletion(-) create mode 100644 glean_parser/.metrics.py.swp diff --git a/glean_parser/.metrics.py.swp b/glean_parser/.metrics.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..12a4cb45d4c6f922cef5372b0d5d92a5f52b316b GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/glean_parser/metrics.py b/glean_parser/metrics.py index fb3badab0..243759ed2 100644 --- a/glean_parser/metrics.py +++ b/glean_parser/metrics.py @@ -318,7 +318,6 @@ def __init__(self, *args, **kwargs): in_session = kwargs.pop("in_session", False) if in_session: self.in_session = True - self.out_of_session = False self.validate_extra_keys(self.extra_keys, kwargs.get("_config", {})) super().__init__(*args, **kwargs) self._generate_enums = [("allowed_extra_keys_with_types", "Extra")]