[tor-commits] [tor-browser] 232/311: Bug 1758795 - Test all IPC-available Glean metric types over GIFFT r=TravisLong a=dmeehan

gitolite role git at cupani.torproject.org
Tue Apr 26 15:30:32 UTC 2022


This is an automated email from the git hooks/post-receive script.

pierov pushed a commit to branch geckoview-99.0.1-11.0-1
in repository tor-browser.

commit a2102f0afc62cc8a70c9da8f4b2a4d8aac83fa60
Author: Chris H-C <chutten at mozilla.com>
AuthorDate: Mon Mar 21 21:19:26 2022 +0000

    Bug 1758795 - Test all IPC-available Glean metric types over GIFFT r=TravisLong a=dmeehan
    
    Differential Revision: https://phabricator.services.mozilla.com/D140772
---
 .../glean/tests/browser/browser_labeled_gifft.js   |   4 +-
 toolkit/components/glean/tests/test_metrics.yaml   |  25 +-
 .../components/glean/tests/xpcshell/test_GIFFT.js  |  15 +-
 .../glean/tests/xpcshell/test_GIFFTIPC.js          | 308 +++++++++++++++++++++
 .../components/glean/tests/xpcshell/xpcshell.ini   |   2 +
 toolkit/components/telemetry/Events.yaml           |   3 +-
 toolkit/components/telemetry/Histograms.json       |   5 +-
 toolkit/components/telemetry/Scalars.yaml          |  53 +++-
 8 files changed, 400 insertions(+), 15 deletions(-)

diff --git a/toolkit/components/glean/tests/browser/browser_labeled_gifft.js b/toolkit/components/glean/tests/browser/browser_labeled_gifft.js
index 7b2d562e63767..2203424e82fc7 100644
--- a/toolkit/components/glean/tests/browser/browser_labeled_gifft.js
+++ b/toolkit/components/glean/tests/browser/browser_labeled_gifft.js
@@ -33,7 +33,9 @@ add_task(async () => {
     "Can't get the value when you're error'd"
   );
 
-  let value = keyedScalarValue("telemetry.test.keyed_unsigned_int");
+  let value = keyedScalarValue(
+    "telemetry.test.another_mirror_for_labeled_counter"
+  );
   Assert.deepEqual(
     {
       a_label: 1,
diff --git a/toolkit/components/glean/tests/test_metrics.yaml b/toolkit/components/glean/tests/test_metrics.yaml
index 3be59d989c3f0..c0e54e931ec3e 100644
--- a/toolkit/components/glean/tests/test_metrics.yaml
+++ b/toolkit/components/glean/tests/test_metrics.yaml
@@ -348,7 +348,7 @@ test_only.ipc:
       - store1
     no_lint:
       - COMMON_PREFIX
-    telemetry_mirror: TELEMETRY_TEST_UNSIGNED_INT_KIND
+    telemetry_mirror: TELEMETRY_TEST_MIRROR_FOR_COUNTER
   a_bool:
     type: boolean
     description: |
@@ -607,7 +607,28 @@ test_only.ipc:
       - store1
     no_lint:
       - COMMON_PREFIX
-    telemetry_mirror: TELEMETRY_TEST_KEYED_UNSIGNED_INT
+    telemetry_mirror: TELEMETRY_TEST_ANOTHER_MIRROR_FOR_LABELED_COUNTER
+  another_labeled_counter:
+    type: labeled_counter
+    description: |
+      This is a test-only metric.
+      Just another metric counting labeled things.
+    bugs:
+      - https://bugzilla.mozilla.org/show_bug.cgi?id=1688281
+      - https://bugzilla.mozilla.org/show_bug.cgi?id=1685406
+      - https://bugzilla.mozilla.org/show_bug.cgi?id=1758795
+    data_reviews:
+      - https://bugzilla.mozilla.org/show_bug.cgi?id=1688281#c1
+    data_sensitivity:
+      - technical
+    notification_emails:
+      - glean-team at mozilla.com
+    expires: never
+    send_in_pings:
+      - store1
+    no_lint:
+      - COMMON_PREFIX
+    telemetry_mirror: TELEMETRY_TEST_MIRROR_FOR_LABELED_COUNTER
   a_quantity:
     type: quantity
     unit: squad
diff --git a/toolkit/components/glean/tests/xpcshell/test_GIFFT.js b/toolkit/components/glean/tests/xpcshell/test_GIFFT.js
index 6aad05d627372..01fd98b7ad3cb 100644
--- a/toolkit/components/glean/tests/xpcshell/test_GIFFT.js
+++ b/toolkit/components/glean/tests/xpcshell/test_GIFFT.js
@@ -38,11 +38,6 @@ add_task(function test_setup() {
     true
   );
 
-  Services.prefs.setBoolPref(
-    "toolkit.telemetry.testing.overrideProductsCheck",
-    true
-  );
-
   // We need to initialize it once, otherwise operations will be stuck in the pre-init queue.
   // On Android FOG is set up through head.js.
   if (AppConstants.platform != "android") {
@@ -53,7 +48,7 @@ add_task(function test_setup() {
 add_task(function test_gifft_counter() {
   Glean.testOnlyIpc.aCounter.add(20);
   Assert.equal(20, Glean.testOnlyIpc.aCounter.testGetValue());
-  Assert.equal(20, scalarValue("telemetry.test.unsigned_int_kind"));
+  Assert.equal(20, scalarValue("telemetry.test.mirror_for_counter"));
 });
 
 add_task(function test_gifft_boolean() {
@@ -253,7 +248,9 @@ add_task(function test_gifft_labeled_counter() {
     "Can't get the value when you're error'd"
   );
 
-  let value = keyedScalarValue("telemetry.test.keyed_unsigned_int");
+  let value = keyedScalarValue(
+    "telemetry.test.another_mirror_for_labeled_counter"
+  );
   Assert.deepEqual(
     {
       a_label: 4,
@@ -376,7 +373,7 @@ add_task(
       /NS_ERROR_LOSS_OF_SIGNIFICANT_DATA/,
       "Can't get the value when you're error'd"
     );
-    Assert.equal(undefined, scalarValue("telemetry.test.unsigned_int_kind"));
+    Assert.equal(undefined, scalarValue("telemetry.test.mirror_for_counter"));
     // Clear the error state
     Services.fog.testResetFOG();
 
@@ -393,7 +390,7 @@ add_task(
       Glean.testOnlyIpc.aCounter.testGetValue()
     );
     // Telemetry will have wrapped around to 1
-    Assert.equal(1, scalarValue("telemetry.test.unsigned_int_kind"));
+    Assert.equal(1, scalarValue("telemetry.test.mirror_for_counter"));
 
     // 2) Quantity: i64 (saturates), mirrored to uint Scalar: u32 (overflows)
     // 2.1) Negative parameters refused.
diff --git a/toolkit/components/glean/tests/xpcshell/test_GIFFTIPC.js b/toolkit/components/glean/tests/xpcshell/test_GIFFTIPC.js
new file mode 100644
index 0000000000000..952f4d6246802
--- /dev/null
+++ b/toolkit/components/glean/tests/xpcshell/test_GIFFTIPC.js
@@ -0,0 +1,308 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const { AppConstants } = ChromeUtils.import(
+  "resource://gre/modules/AppConstants.jsm"
+);
+const { ContentTaskUtils } = ChromeUtils.import(
+  "resource://testing-common/ContentTaskUtils.jsm"
+);
+const { setTimeout } = ChromeUtils.import("resource://gre/modules/Timer.jsm");
+const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+const Telemetry = Services.telemetry;
+const { TelemetryTestUtils } = ChromeUtils.import(
+  "resource://testing-common/TelemetryTestUtils.jsm"
+);
+
+function sleep(ms) {
+  /* eslint-disable mozilla/no-arbitrary-setTimeout */
+  return new Promise(resolve => setTimeout(resolve, ms));
+}
+
+function scalarValue(aScalarName, aProcessName) {
+  let snapshot = Telemetry.getSnapshotForScalars();
+  return aProcessName in snapshot
+    ? snapshot[aProcessName][aScalarName]
+    : undefined;
+}
+
+function keyedScalarValue(aScalarName, aProcessName) {
+  let snapshot = Telemetry.getSnapshotForKeyedScalars();
+  return aProcessName in snapshot
+    ? snapshot[aProcessName][aScalarName]
+    : undefined;
+}
+
+add_task({ skip_if: () => !runningInParent }, function test_setup() {
+  // Give FOG a temp profile to init within.
+  do_get_profile();
+
+  // Allows these tests to properly run on e.g. Thunderbird
+  Services.prefs.setBoolPref(
+    "toolkit.telemetry.testing.overrideProductsCheck",
+    true
+  );
+
+  // We need to initialize it once, otherwise operations will be stuck in the pre-init queue.
+  // on Android FOG is set up through head.js
+  if (AppConstants.platform != "android") {
+    Services.fog.initializeFOG();
+  }
+});
+
+const COUNT = 42;
+const CHEESY_STRING = "a very cheesy string!";
+const CHEESIER_STRING = "a much cheesier string!";
+const CUSTOM_SAMPLES = [3, 4];
+const EVENT_EXTRA = { extra1: "so very extra" };
+const MEMORIES = [13, 31];
+const MEMORY_BUCKETS = ["13193", "31378"]; // buckets are strings : |
+const A_LABEL_COUNT = 3;
+const ANOTHER_LABEL_COUNT = 5;
+const INVALID_COUNTERS = 7;
+const IRATE_NUMERATOR = 44;
+const IRATE_DENOMINATOR = 14;
+
+add_task({ skip_if: () => runningInParent }, async function run_child_stuff() {
+  Glean.testOnlyIpc.aCounter.add(COUNT);
+  Glean.testOnlyIpc.aStringList.add(CHEESY_STRING);
+  Glean.testOnlyIpc.aStringList.add(CHEESIER_STRING);
+
+  Glean.testOnlyIpc.noExtraEvent.record();
+  Glean.testOnlyIpc.anEvent.record(EVENT_EXTRA);
+
+  for (let memory of MEMORIES) {
+    Glean.testOnlyIpc.aMemoryDist.accumulate(memory);
+  }
+
+  let t1 = Glean.testOnlyIpc.aTimingDist.start();
+  let t2 = Glean.testOnlyIpc.aTimingDist.start();
+
+  await sleep(5);
+
+  let t3 = Glean.testOnlyIpc.aTimingDist.start();
+  Glean.testOnlyIpc.aTimingDist.cancel(t1);
+
+  await sleep(5);
+
+  Glean.testOnlyIpc.aTimingDist.stopAndAccumulate(t2); // 10ms
+  Glean.testOnlyIpc.aTimingDist.stopAndAccumulate(t3); // 5ms
+
+  Glean.testOnlyIpc.aCustomDist.accumulateSamples(CUSTOM_SAMPLES);
+
+  Glean.testOnlyIpc.aLabeledCounter.a_label.add(A_LABEL_COUNT);
+  Glean.testOnlyIpc.aLabeledCounter.another_label.add(ANOTHER_LABEL_COUNT);
+
+  // Has to be different from aLabeledCounter so the error we record doesn't
+  // get in the way.
+  Glean.testOnlyIpc.anotherLabeledCounter.InvalidLabel.add(INVALID_COUNTERS);
+
+  Glean.testOnlyIpc.irate.addToNumerator(IRATE_NUMERATOR);
+  Glean.testOnlyIpc.irate.addToDenominator(IRATE_DENOMINATOR);
+});
+
+add_task(
+  { skip_if: () => !runningInParent },
+  async function test_child_metrics() {
+    Telemetry.setEventRecordingEnabled("telemetry.test", true);
+
+    // Clear any stray Telemetry data
+    Telemetry.clearScalars();
+    Telemetry.getSnapshotForHistograms("main", true);
+    Telemetry.clearEvents();
+
+    await run_test_in_child("test_GIFFTIPC.js");
+
+    // Wait for both IPC mechanisms to flush.
+    await Services.fog.testFlushAllChildren();
+    await ContentTaskUtils.waitForCondition(() => {
+      let snapshot = Telemetry.getSnapshotForKeyedScalars();
+      return (
+        "content" in snapshot &&
+        "telemetry.test.mirror_for_rate" in snapshot.content
+      );
+    });
+
+    // boolean
+    // Doesn't work over IPC
+
+    // counter
+    Assert.equal(Glean.testOnlyIpc.aCounter.testGetValue(), COUNT);
+    Assert.equal(
+      scalarValue("telemetry.test.mirror_for_counter", "content"),
+      COUNT,
+      "content-process Scalar has expected count"
+    );
+
+    // custom_distribution
+    const customSampleSum = CUSTOM_SAMPLES.reduce((acc, a) => acc + a, 0);
+    const customData = Glean.testOnlyIpc.aCustomDist.testGetValue("store1");
+    Assert.equal(customSampleSum, customData.sum, "Sum's correct");
+    for (let [bucket, count] of Object.entries(customData.values)) {
+      Assert.ok(
+        count == 0 || (count == CUSTOM_SAMPLES.length && bucket == 1), // both values in the low bucket
+        `Only two buckets have a sample ${bucket} ${count}`
+      );
+    }
+    const histSnapshot = Telemetry.getSnapshotForHistograms(
+      "main",
+      false,
+      false
+    );
+    const histData = histSnapshot.content.TELEMETRY_TEST_MIRROR_FOR_CUSTOM;
+    Assert.equal(customSampleSum, histData.sum, "Sum in histogram's correct");
+    Assert.equal(2, histData.values["1"], "Two samples in the first bucket");
+
+    // datetime
+    // Doesn't work over IPC
+
+    // event
+    var events = Glean.testOnlyIpc.noExtraEvent.testGetValue();
+    Assert.equal(1, events.length);
+    Assert.equal("test_only.ipc", events[0].category);
+    Assert.equal("no_extra_event", events[0].name);
+
+    events = Glean.testOnlyIpc.anEvent.testGetValue();
+    Assert.equal(1, events.length);
+    Assert.equal("test_only.ipc", events[0].category);
+    Assert.equal("an_event", events[0].name);
+    Assert.deepEqual(EVENT_EXTRA, events[0].extra);
+
+    TelemetryTestUtils.assertEvents(
+      [
+        [
+          "telemetry.test",
+          "not_expired_optout",
+          "object1",
+          undefined,
+          undefined,
+        ],
+        ["telemetry.test", "mirror_with_extra", "object1", null, EVENT_EXTRA],
+      ],
+      { category: "telemetry.test" },
+      { process: "content" }
+    );
+
+    // labeled_boolean
+    // Doesn't work over IPC
+
+    // labeled_counter
+    const counters = Glean.testOnlyIpc.aLabeledCounter;
+    Assert.equal(counters.a_label.testGetValue(), A_LABEL_COUNT);
+    Assert.equal(counters.another_label.testGetValue(), ANOTHER_LABEL_COUNT);
+
+    Assert.throws(
+      () => Glean.testOnlyIpc.anotherLabeledCounter.__other__.testGetValue(),
+      /NS_ERROR_LOSS_OF_SIGNIFICANT_DATA/,
+      "Invalid labels record errors, which throw"
+    );
+
+    let value = keyedScalarValue(
+      "telemetry.test.another_mirror_for_labeled_counter",
+      "content"
+    );
+    Assert.deepEqual(
+      {
+        a_label: A_LABEL_COUNT,
+        another_label: ANOTHER_LABEL_COUNT,
+      },
+      value
+    );
+    value = keyedScalarValue(
+      "telemetry.test.mirror_for_labeled_counter",
+      "content"
+    );
+    Assert.deepEqual(
+      {
+        InvalidLabel: INVALID_COUNTERS,
+      },
+      value
+    );
+
+    // labeled_string
+    // Doesn't work over IPC
+
+    // memory_distribution
+    const memoryData = Glean.testOnlyIpc.aMemoryDist.testGetValue();
+    const memorySum = MEMORIES.reduce((acc, a) => acc + a, 0);
+    // The sum's in bytes, but the metric's in KB
+    Assert.equal(memorySum * 1024, memoryData.sum);
+    for (let [bucket, count] of Object.entries(memoryData.values)) {
+      // We could assert instead, but let's skip to save the logspam.
+      if (count == 0) {
+        continue;
+      }
+      Assert.ok(count == 1 && MEMORY_BUCKETS.includes(bucket));
+    }
+
+    const memoryHist = histSnapshot.content.TELEMETRY_TEST_LINEAR;
+    Assert.equal(
+      memorySum,
+      memoryHist.sum,
+      "Histogram's in `memory_unit` units"
+    );
+    Assert.equal(2, memoryHist.values["1"], "Samples are in the right bucket");
+
+    // quantity
+    // Doesn't work over IPC
+
+    // rate
+    Assert.deepEqual(
+      { numerator: IRATE_NUMERATOR, denominator: IRATE_DENOMINATOR },
+      Glean.testOnlyIpc.irate.testGetValue()
+    );
+    Assert.deepEqual(
+      { numerator: IRATE_NUMERATOR, denominator: IRATE_DENOMINATOR },
+      keyedScalarValue("telemetry.test.mirror_for_rate", "content")
+    );
+
+    // string
+    // Doesn't work over IPC
+
+    // string_list
+    // Note: this will break if string list ever rearranges its items.
+    const cheesyStrings = Glean.testOnlyIpc.aStringList.testGetValue();
+    Assert.deepEqual(cheesyStrings, [CHEESY_STRING, CHEESIER_STRING]);
+    // Note: this will break if keyed scalars rearrange their items.
+    Assert.deepEqual(
+      {
+        [CHEESY_STRING]: true,
+        [CHEESIER_STRING]: true,
+      },
+      keyedScalarValue("telemetry.test.keyed_boolean_kind", "content")
+    );
+
+    // timespan
+    // Doesn't work over IPC
+
+    // timing_distribution
+    const NANOS_IN_MILLIS = 1e6;
+    const EPSILON = 40000; // bug 1701949
+    const times = Glean.testOnlyIpc.aTimingDist.testGetValue();
+    Assert.greater(times.sum, 15 * NANOS_IN_MILLIS - EPSILON);
+    // We can't guarantee any specific time values (thank you clocks),
+    // but we can assert there are only two samples.
+    Assert.equal(
+      2,
+      Object.entries(times.values).reduce(
+        (acc, [bucket, count]) => acc + count,
+        0
+      )
+    );
+    const timingHist = histSnapshot.content.TELEMETRY_TEST_EXPONENTIAL;
+    Assert.greaterOrEqual(timingHist.sum, 15, "Histogram's in milliseconds.");
+    Assert.equal(
+      2,
+      Object.entries(timingHist.values).reduce(
+        (acc, [bucket, count]) => acc + count,
+        0
+      ),
+      "Only two samples"
+    );
+
+    // uuid
+    // Doesn't work over IPC
+  }
+);
diff --git a/toolkit/components/glean/tests/xpcshell/xpcshell.ini b/toolkit/components/glean/tests/xpcshell/xpcshell.ini
index a196cf90232b0..2be9d081fe672 100644
--- a/toolkit/components/glean/tests/xpcshell/xpcshell.ini
+++ b/toolkit/components/glean/tests/xpcshell/xpcshell.ini
@@ -10,6 +10,8 @@ skip-if = os == "android" # FOG isn't responsible for monitoring prefs and contr
 
 [test_GIFFT.js]
 
+[test_GIFFTIPC.js]
+
 [test_Glean.js]
 
 [test_GleanIPC.js]
diff --git a/toolkit/components/telemetry/Events.yaml b/toolkit/components/telemetry/Events.yaml
index 2153b8b0ee0ec..ef5f0c14fdd2d 100644
--- a/toolkit/components/telemetry/Events.yaml
+++ b/toolkit/components/telemetry/Events.yaml
@@ -1321,7 +1321,7 @@ telemetry.test:
       - "firefox"
       - "fennec"
       - "thunderbird"
-    record_in_processes: ["main"]
+    record_in_processes: ["main", "content"]
     expiry_version: "999"
   main_only:
     objects: ["object1"]
@@ -1405,6 +1405,7 @@ telemetry.test:
       extra1: "This must be kept in-sync"
       extra2: "With the extra_keys in the Glean metric"
     products: ["firefox", "thunderbird"]
+    release_channel_collection: opt-out
 
 # This is a secondary category used for Telemetry tests.
 # The events here will not be sent out with any pings.
diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json
index 041b96d54b72c..a0b0143a12db3 100644
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -9714,6 +9714,7 @@
     "high": 2147483646,
     "n_buckets": 10,
     "bug_numbers": [1288745, 1685406],
+    "releaseChannelCollection": "opt-out",
     "description": "a testing histogram; not meant to be touched"
   },
   "TELEMETRY_TEST_LINEAR": {
@@ -9726,10 +9727,11 @@
     "high": 2147483646,
     "n_buckets": 10,
     "bug_numbers": [1288745, 1685406],
+    "releaseChannelCollection": "opt-out",
     "description": "a testing histogram; not meant to be touched"
   },
   "TELEMETRY_TEST_MIRROR_FOR_CUSTOM": {
-    "record_in_processes": ["main"],
+    "record_in_processes": ["main", "content"],
     "products": ["firefox"],
     "alert_emails": ["chutten at mozilla.com"],
     "expires_in_version": "never",
@@ -9738,6 +9740,7 @@
     "high": 2147483646,
     "n_buckets": 10,
     "bug_numbers": [1716340],
+    "releaseChannelCollection": "opt-out",
     "description": "a testing histogram; not meant to be touched"
   },
   "TELEMETRY_TEST_BOOLEAN": {
diff --git a/toolkit/components/telemetry/Scalars.yaml b/toolkit/components/telemetry/Scalars.yaml
index 2b4b9a01914e9..449b21b3d6a9c 100644
--- a/toolkit/components/telemetry/Scalars.yaml
+++ b/toolkit/components/telemetry/Scalars.yaml
@@ -7704,7 +7704,7 @@ telemetry.test:
       - 'geckoview_streaming'
       - 'thunderbird'
     record_in_processes:
-      - 'main'
+      - 'main' # test_ChildScalars.js depends on this being main-only.
 
   string_kind:
     bug_numbers:
@@ -7865,12 +7865,32 @@ telemetry.test:
     notification_emails:
       - telemetry-client-dev at mozilla.com
     release_channel_collection: opt-out
+    products:
+      - 'firefox'
+      - 'fennec'
+      - 'thunderbird'
+    record_in_processes:
+      - 'main' # test_ChildScalars.js depends on this being main-only
+
+  mirror_for_labeled_counter:
+    bug_numbers:
+      - 1277806
+      - 1685406
+      - 1758795
+    description: A testing keyed uint scalar; not meant to be touched.
+    expires: never
+    kind: uint
+    keyed: true
+    notification_emails:
+      - telemetry-client-dev at mozilla.com
+    release_channel_collection: opt-out
     products:
       - 'firefox'
       - 'fennec'
       - 'thunderbird'
     record_in_processes:
       - 'main'
+      - 'content'
 
   keyed_with_keys:
     bug_numbers:
@@ -7926,6 +7946,7 @@ telemetry.test:
     record_in_processes:
       - 'main'
       - 'content'
+    release_channel_collection: opt-out
 
   content_only_uint:
     bug_numbers:
@@ -8214,6 +8235,7 @@ telemetry.test:
     notification_emails: [glean-team at mozilla.com]
     products: ["firefox", "thunderbird"]
     record_in_processes: ["all"]
+    release_channel_collection: opt-out
 
   mirror_for_timespan:
     bug_numbers: [1685406]
@@ -8223,6 +8245,7 @@ telemetry.test:
     notification_emails: [glean-team at mozilla.com]
     products: ["firefox", "thunderbird"]
     record_in_processes: ["all"]
+    release_channel_collection: opt-out
 
   mirror_for_timespan_nanos:
     bug_numbers: [1704106]
@@ -8232,6 +8255,7 @@ telemetry.test:
     notification_emails: [glean-team at mozilla.com]
     products: ["firefox", "thunderbird"]
     record_in_processes: ["all"]
+    release_channel_collection: opt-out
 
   mirror_for_labeled_bool:
     bug_numbers: [1685406]
@@ -8242,6 +8266,7 @@ telemetry.test:
     notification_emails: [glean-team at mozilla.com]
     products: ["firefox", "thunderbird"]
     record_in_processes: ["all"]
+    release_channel_collection: opt-out
 
   mirror_for_quantity:
     bug_numbers: [1704846]
@@ -8251,6 +8276,7 @@ telemetry.test:
     notification_emails: [glean-team at mozilla.com]
     products: ["firefox", "thunderbird"]
     record_in_processes: ["all"]
+    release_channel_collection: opt-out
 
   mirror_for_rate:
     bug_numbers: [1694496]
@@ -8263,6 +8289,31 @@ telemetry.test:
     notification_emails: [glean-team at mozilla.com]
     products: ["firefox", "thunderbird"]
     record_in_processes: ["all"]
+    release_channel_collection: opt-out
+
+  mirror_for_counter:
+    bug_numbers: [1758795]
+    description: >
+      Test only. This is a mirror probe for a Glean counter metric.
+    expires: never
+    kind: uint
+    notification_emails: [glean-team at mozilla.com]
+    products: ["firefox", "thunderbird"]
+    record_in_processes: ["all"]
+    release_channel_collection: opt-out
+
+  another_mirror_for_labeled_counter:
+    bug_numbers: [1758795]
+    description: >
+      Test only. This is a mirror probe for a Glean labeled_counter metric.
+      Keys are labels in the mirrored metric.
+    expires: never
+    kind: uint
+    keyed: true
+    notification_emails: [glean-team at mozilla.com]
+    products: ["firefox", "thunderbird"]
+    record_in_processes: ["all"]
+    release_channel_collection: opt-out
 
 
 # The following section contains counters for corruption of internal omni jar files.

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the tor-commits mailing list