--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -5081,16 +5081,23 @@
"kind": "flag",
"description": "a testing histogram; not meant to be touched"
},
"TELEMETRY_TEST_COUNT": {
"expires_in_version": "never",
"kind": "count",
"description": "a testing histogram; not meant to be touched"
},
+ "TELEMETRY_TEST_COUNT2": {
+ "alert_emails": ["telemetry-client-dev@mozilla.com"],
+ "expires_in_version": "never",
+ "kind": "count",
+ "bug_numbers": [1288745],
+ "description": "a testing histogram; not meant to be touched"
+ },
"TELEMETRY_TEST_COUNT_INIT_NO_RECORD": {
"expires_in_version": "never",
"kind": "count",
"description": "a testing histogram; not meant to be touched - initially not recording"
},
"TELEMETRY_TEST_CATEGORICAL": {
"alert_emails": ["telemetry-client-dev@mozilla.com"],
"bug_numbers": [1188888],
@@ -5156,16 +5163,43 @@
},
"TELEMETRY_TEST_KEYED_RELEASE_OPTOUT": {
"expires_in_version": "never",
"kind": "flag",
"keyed": true,
"releaseChannelCollection": "opt-out",
"description": "a testing histogram; not meant to be touched"
},
+ "TELEMETRY_TEST_EXPONENTIAL": {
+ "alert_emails": ["telemetry-client-dev@mozilla.com"],
+ "expires_in_version": "never",
+ "kind": "exponential",
+ "low": 1,
+ "high": 2147483646,
+ "n_buckets": 10,
+ "bug_numbers": [1288745],
+ "description": "a testing histogram; not meant to be touched"
+ },
+ "TELEMETRY_TEST_LINEAR": {
+ "alert_emails": ["telemetry-client-dev@mozilla.com"],
+ "expires_in_version": "never",
+ "kind": "linear",
+ "low": 1,
+ "high": 2147483646,
+ "n_buckets": 10,
+ "bug_numbers": [1288745],
+ "description": "a testing histogram; not meant to be touched"
+ },
+ "TELEMETRY_TEST_BOOLEAN": {
+ "alert_emails": ["telemetry-client-dev@mozilla.com"],
+ "expires_in_version" : "never",
+ "kind": "boolean",
+ "bug_numbers": [1288745],
+ "description": "a testing histogram; not meant to be touched"
+ },
"STARTUP_CRASH_DETECTED": {
"expires_in_version": "never",
"kind": "flag",
"description": "Whether there was a crash during the last startup"
},
"SAFE_MODE_USAGE": {
"expires_in_version": "never",
"kind": "enumerated",
--- a/toolkit/components/telemetry/Telemetry.cpp
+++ b/toolkit/components/telemetry/Telemetry.cpp
@@ -1024,26 +1024,16 @@ TelemetryImpl::~TelemetryImpl() {
}
void
TelemetryImpl::InitMemoryReporter() {
RegisterWeakMemoryReporter(this);
}
NS_IMETHODIMP
-TelemetryImpl::NewHistogram(const nsACString &name, const nsACString &expiration, uint32_t histogramType,
- uint32_t min, uint32_t max, uint32_t bucketCount, JSContext *cx,
- uint8_t optArgCount, JS::MutableHandle<JS::Value> ret)
-{
- return TelemetryHistogram::NewHistogram(name, expiration, histogramType,
- min, max, bucketCount,
- cx, optArgCount, ret);
-}
-
-NS_IMETHODIMP
TelemetryImpl::NewKeyedHistogram(const nsACString &name, const nsACString &expiration, uint32_t histogramType,
uint32_t min, uint32_t max, uint32_t bucketCount, JSContext *cx,
uint8_t optArgCount, JS::MutableHandle<JS::Value> ret)
{
return TelemetryHistogram::NewKeyedHistogram(name, expiration, histogramType,
min, max, bucketCount,
cx, optArgCount, ret);
}
--- a/toolkit/components/telemetry/TelemetryHistogram.cpp
+++ b/toolkit/components/telemetry/TelemetryHistogram.cpp
@@ -2008,45 +2008,16 @@ const char*
TelemetryHistogram::GetHistogramName(mozilla::Telemetry::ID id)
{
StaticMutexAutoLock locker(gTelemetryHistogramMutex);
const HistogramInfo& h = gHistograms[id];
return h.id();
}
nsresult
-TelemetryHistogram::NewHistogram(const nsACString &name,
- const nsACString &expiration,
- uint32_t histogramType,
- uint32_t min, uint32_t max,
- uint32_t bucketCount, JSContext *cx,
- uint8_t optArgCount,
- JS::MutableHandle<JS::Value> ret)
-{
- Histogram *h = nullptr;
- {
- StaticMutexAutoLock locker(gTelemetryHistogramMutex);
- if (!internal_IsValidHistogramName(name)) {
- return NS_ERROR_INVALID_ARG;
- }
-
- nsresult rv = internal_HistogramGet(PromiseFlatCString(name).get(),
- PromiseFlatCString(expiration).get(),
- histogramType, min, max, bucketCount,
- optArgCount == 3, &h);
- if (NS_FAILED(rv))
- return rv;
- h->ClearFlags(Histogram::kUmaTargetedHistogramFlag);
- }
-
- // Runs without protection from |gTelemetryHistogramMutex|
- return internal_WrapAndReturnHistogram(h, cx, ret);
-}
-
-nsresult
TelemetryHistogram::NewKeyedHistogram(const nsACString &name,
const nsACString &expiration,
uint32_t histogramType,
uint32_t min, uint32_t max,
uint32_t bucketCount, JSContext *cx,
uint8_t optArgCount,
JS::MutableHandle<JS::Value> ret)
{
--- a/toolkit/components/telemetry/TelemetryHistogram.h
+++ b/toolkit/components/telemetry/TelemetryHistogram.h
@@ -52,22 +52,16 @@ GetHistogramById(const nsACString &name,
nsresult
GetKeyedHistogramById(const nsACString &name, JSContext *cx,
JS::MutableHandle<JS::Value> ret);
const char*
GetHistogramName(mozilla::Telemetry::ID id);
nsresult
-NewHistogram(const nsACString &name, const nsACString &expiration,
- uint32_t histogramType, uint32_t min, uint32_t max,
- uint32_t bucketCount, JSContext *cx,
- uint8_t optArgCount, JS::MutableHandle<JS::Value> ret);
-
-nsresult
NewKeyedHistogram(const nsACString &name, const nsACString &expiration,
uint32_t histogramType, uint32_t min, uint32_t max,
uint32_t bucketCount, JSContext *cx,
uint8_t optArgCount, JS::MutableHandle<JS::Value> ret);
nsresult
HistogramFrom(const nsACString &name, const nsACString &existing_name,
JSContext *cx, JS::MutableHandle<JS::Value> ret);
--- a/toolkit/components/telemetry/nsITelemetry.idl
+++ b/toolkit/components/telemetry/nsITelemetry.idl
@@ -175,52 +175,39 @@ interface nsITelemetry : nsISupports
*
* @param dataset - DATASET_RELEASE_CHANNEL_OPTOUT or DATASET_RELEASE_CHANNEL_OPTIN
*/
void registeredHistograms(in uint32_t dataset,
out uint32_t count,
[retval, array, size_is(count)] out string histograms);
/**
- * Create and return a histogram. Parameters:
+ * Create a histogram using the current state of an existing histogram. The
+ * existing histogram must be registered in TelemetryHistograms.h.
*
* @param name Unique histogram name
- * @param expiration Expiration version
- * @param type - HISTOGRAM_EXPONENTIAL, HISTOGRAM_LINEAR or HISTOGRAM_BOOLEAN
- * @param min - Minimal bucket size
- * @param max - Maximum bucket size
- * @param bucket_count - number of buckets in the histogram.
+ * @param existing_name Existing histogram name
* The returned object has the following functions:
* add(int) - Adds an int value to the appropriate bucket
* snapshot() - Returns a snapshot of the histogram with the same data fields as in histogramSnapshots()
* clear() - Zeros out the histogram's buckets and sum
* dataset() - identifies what dataset this is in: DATASET_RELEASE_CHANNEL_OPTOUT or ...OPTIN
*/
- [implicit_jscontext, optional_argc]
- jsval newHistogram(in ACString name, in ACString expiration,
- in unsigned long histogram_type,
- [optional] in uint32_t min,
- [optional] in uint32_t max,
- [optional] in uint32_t bucket_count);
-
- /**
- * Create a histogram using the current state of an existing histogram. The
- * existing histogram must be registered in TelemetryHistograms.h.
- *
- * @param name Unique histogram name
- * @param existing_name Existing histogram name
- * The returned object has the same functions as a histogram returned from newHistogram.
- */
[implicit_jscontext]
jsval histogramFrom(in ACString name, in ACString existing_name);
/**
- * Same as newHistogram above, but for histograms registered in TelemetryHistograms.h.
+ * Create and return a histogram registered in TelemetryHistograms.h.
*
* @param id - unique identifier from TelemetryHistograms.h
+ * The returned object has the following functions:
+ * add(int) - Adds an int value to the appropriate bucket
+ * snapshot() - Returns a snapshot of the histogram with the same data fields as in histogramSnapshots()
+ * clear() - Zeros out the histogram's buckets and sum
+ * dataset() - identifies what dataset this is in: DATASET_RELEASE_CHANNEL_OPTOUT or ...OPTIN
*/
[implicit_jscontext]
jsval getHistogramById(in ACString id);
/*
* An object containing a snapshot from all of the currently registered keyed histograms.
* { name1: {histogramData1}, name2:{histogramData2}...}
* where the histogramData is as described in histogramSnapshots.
@@ -321,18 +308,16 @@ interface nsITelemetry : nsISupports
/**
* Return a histogram previously registered via
* registerAddonHistogram. Throws an error if the id/name combo has
* not been registered via registerAddonHistogram.
*
* @param addon_id - Unique ID of the addon
* @param name - Registered histogram name
*
- * The returned object has the same functions as a histogram returned
- * from newHistogram.
*/
[implicit_jscontext]
jsval getAddonHistogram(in ACString addon_id, in ACString name);
/**
* Delete all histograms associated with the given addon id.
*
* @param addon_id - Unique ID of the addon
--- a/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js
@@ -34,17 +34,16 @@ const REASON_TEST_PING = "test-ping";
const REASON_DAILY = "daily";
const REASON_ENVIRONMENT_CHANGE = "environment-change";
const PLATFORM_VERSION = "1.9.2";
const APP_VERSION = "1";
const APP_ID = "xpcshell@tests.mozilla.org";
const APP_NAME = "XPCShell";
-const IGNORE_HISTOGRAM = "test::ignore_me";
const IGNORE_HISTOGRAM_TO_CLONE = "MEMORY_HEAP_ALLOCATED";
const IGNORE_CLONED_HISTOGRAM = "test::ignore_me_also";
const ADDON_NAME = "Telemetry test addon";
const ADDON_HISTOGRAM = "addon-histogram";
// Add some unicode characters here to ensure that sending them works correctly.
const SHUTDOWN_TIME = 10000;
const FAILED_PROFILE_LOCK_ATTEMPTS = 2;
@@ -104,17 +103,17 @@ function fakeGenerateUUID(sessionFunc, s
}
function fakeIdleNotification(topic) {
let session = Cu.import("resource://gre/modules/TelemetrySession.jsm");
return session.TelemetryScheduler.observe(null, topic, null);
}
function setupTestData() {
- Telemetry.newHistogram(IGNORE_HISTOGRAM, "never", Telemetry.HISTOGRAM_BOOLEAN);
+
Telemetry.histogramFrom(IGNORE_CLONED_HISTOGRAM, IGNORE_HISTOGRAM_TO_CLONE);
Services.startup.interrupted = true;
Telemetry.registerAddonHistogram(ADDON_NAME, ADDON_HISTOGRAM,
Telemetry.HISTOGRAM_LINEAR,
1, 5, 6);
let h1 = Telemetry.getAddonHistogram(ADDON_NAME, ADDON_HISTOGRAM);
h1.add(1);
let h2 = Telemetry.getHistogramById("TELEMETRY_TEST_COUNT");
@@ -310,17 +309,17 @@ function checkPayload(payload, reason, s
let rh = Telemetry.registeredHistograms(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, []);
for (let name of rh) {
if (/SQLITE/.test(name) && name in payload.histograms) {
let histogramName = ("STARTUP_" + name);
Assert.ok(histogramName in payload.histograms, histogramName + " must be available.");
}
}
- Assert.ok(!(IGNORE_HISTOGRAM in payload.histograms));
+
Assert.ok(!(IGNORE_CLONED_HISTOGRAM in payload.histograms));
// Flag histograms should automagically spring to life.
const expected_flag = {
range: [1, 2],
bucket_count: 3,
histogram_type: 3,
values: {0:1, 1:0},
@@ -480,22 +479,21 @@ function run_test() {
add_task(function* asyncSetup() {
yield TelemetryController.testSetup();
// Load the client ID from the client ID provider to check for pings sanity.
gClientID = yield ClientID.getClientID();
});
// Ensures that expired histograms are not part of the payload.
add_task(function* test_expiredHistogram() {
- let histogram_id = "FOOBAR";
- let dummy = Telemetry.newHistogram(histogram_id, "30", Telemetry.HISTOGRAM_EXPONENTIAL, 1, 2, 3);
+
+ let dummy = Telemetry.getHistogramById("TELEMETRY_TEST_EXPIRED");
dummy.add(1);
- do_check_eq(TelemetrySession.getPayload()["histograms"][histogram_id], undefined);
do_check_eq(TelemetrySession.getPayload()["histograms"]["TELEMETRY_TEST_EXPIRED"], undefined);
});
// Sends a ping to a non existing server. If we remove this test, we won't get
// all the histograms we need in the main ping.
add_task(function* test_noServerPing() {
yield sendPing();
// We need two pings in order to make sure STARTUP_MEMORY_STORAGE_SQLIE histograms
--- a/toolkit/components/telemetry/tests/unit/test_TelemetryStopwatch.js
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetryStopwatch.js
@@ -1,17 +1,15 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
var tmpScope = {};
Cu.import("resource://gre/modules/TelemetryStopwatch.jsm", tmpScope);
var TelemetryStopwatch = tmpScope.TelemetryStopwatch;
-// We can't create a histogram here since the ones created with
-// newHistogram are not seen by getHistogramById that the module uses.
const HIST_NAME = "TELEMETRY_PING";
const HIST_NAME2 = "RANGE_CHECKSUM_ERRORS";
const KEYED_HIST = { id: "TELEMETRY_INVALID_PING_TYPE_SUBMITTED", key: "TEST" };
var refObj = {}, refObj2 = {};
var originalCount1, originalCount2;
--- a/toolkit/components/telemetry/tests/unit/test_nsITelemetry.js
+++ b/toolkit/components/telemetry/tests/unit/test_nsITelemetry.js
@@ -52,17 +52,17 @@ function compareHistograms(h1, h2) {
do_check_eq(s1.counts[i], s2.counts[i]);
do_check_eq(s1.ranges.length, s2.ranges.length);
for (let i = 0; i < s1.ranges.length; i++)
do_check_eq(s1.ranges[i], s2.ranges[i]);
}
function check_histogram(histogram_type, name, min, max, bucket_count) {
- var h = Telemetry.newHistogram(name, "never", histogram_type, min, max, bucket_count);
+ var h = Telemetry.getHistogramById(name);
var r = h.snapshot().ranges;
var sum = 0;
for (let i=0;i<r.length;i++) {
var v = r[i];
sum += v;
h.add(v);
}
var s = h.snapshot();
@@ -119,35 +119,34 @@ function* test_instantiate() {
Assert.equal(snapshot.sum, subsession[ID].sum,
"Histogram and subsession histogram sum must match.");
// Clear the histogram, so we don't void the assumptions from the other tests.
h.clear();
});
add_task(function* test_parameterChecks() {
let kinds = [Telemetry.HISTOGRAM_EXPONENTIAL, Telemetry.HISTOGRAM_LINEAR]
- for (let histogram_type of kinds) {
+ let testNames = ["TELEMETRY_TEST_EXPONENTIAL", "TELEMETRY_TEST_LINEAR"]
+ for (let i = 0; i < kinds.length; i++) {
+ let histogram_type = kinds[i];
+ let test_type = testNames[i];
let [min, max, bucket_count] = [1, INT_MAX - 1, 10]
- check_histogram(histogram_type, "test::"+histogram_type, min, max, bucket_count);
-
- const nh = Telemetry.newHistogram;
- expect_fail(() => nh("test::min", "never", histogram_type, 0, max, bucket_count));
- expect_fail(() => nh("test::bucket_count", "never", histogram_type, min, max, 1));
+ check_histogram(histogram_type, test_type, min, max, bucket_count);
}
});
add_task(function* test_noSerialization() {
// Instantiate the storage for this histogram and make sure it doesn't
// get reflected into JS, as it has no interesting data in it.
Telemetry.getHistogramById("NEWTAB_PAGE_PINNED_SITES_COUNT");
do_check_false("NEWTAB_PAGE_PINNED_SITES_COUNT" in Telemetry.histogramSnapshots);
});
add_task(function* test_boolean_histogram() {
- var h = Telemetry.newHistogram("test::boolean histogram", "never", Telemetry.HISTOGRAM_BOOLEAN);
+ var h = Telemetry.getHistogramById("TELEMETRY_TEST_BOOLEAN");
var r = h.snapshot().ranges;
// boolean histograms ignore numeric parameters
do_check_eq(uneval(r), uneval([0, 1, 2]))
var sum = 0
for (var i=0;i<r.length;i++) {
var v = r[i];
sum += v;
h.add(v);
@@ -158,17 +157,17 @@ add_task(function* test_boolean_histogra
do_check_eq(s.histogram_type, Telemetry.HISTOGRAM_BOOLEAN);
// last bucket should always be 0 since .add parameters are normalized to either 0 or 1
do_check_eq(s.counts[2], 0);
do_check_eq(s.sum, 3);
do_check_eq(s.counts[0], 2);
});
add_task(function* test_flag_histogram() {
- var h = Telemetry.newHistogram("test::flag histogram", "never", Telemetry.HISTOGRAM_FLAG);
+ var h = Telemetry.getHistogramById("TELEMETRY_TEST_FLAG");
var r = h.snapshot().ranges;
// Flag histograms ignore numeric parameters.
do_check_eq(uneval(r), uneval([0, 1, 2]));
// Should already have a 0 counted.
var c = h.snapshot().counts;
var s = h.snapshot().sum;
do_check_eq(uneval(c), uneval([1, 0, 0]));
do_check_eq(s, 0);
@@ -183,17 +182,17 @@ add_task(function* test_flag_histogram()
var c3 = h.snapshot().counts;
var s3 = h.snapshot().sum;
do_check_eq(uneval(c3), uneval([0, 1, 0]));
do_check_eq(s3, 1);
do_check_eq(h.snapshot().histogram_type, Telemetry.HISTOGRAM_FLAG);
});
add_task(function* test_count_histogram() {
- let h = Telemetry.newHistogram("test::count histogram", "never", Telemetry.HISTOGRAM_COUNT, 1, 2, 3);
+ let h = Telemetry.getHistogramById("TELEMETRY_TEST_COUNT2");
let s = h.snapshot();
do_check_eq(uneval(s.ranges), uneval([0, 1, 2]));
do_check_eq(uneval(s.counts), uneval([0, 0, 0]));
do_check_eq(s.sum, 0);
h.add();
s = h.snapshot();
do_check_eq(uneval(s.counts), uneval([1, 0, 0]));
do_check_eq(s.sum, 1);
@@ -284,17 +283,17 @@ add_task(function* test_getWebrtc() {
var webrtc = Telemetry.webrtcStats;
do_check_true("IceCandidatesStats" in webrtc);
var icestats = webrtc.IceCandidatesStats;
do_check_true(("webrtc" in icestats) && ("loop" in icestats));
});
// Check that telemetry doesn't record in private mode
add_task(function* test_privateMode() {
- var h = Telemetry.newHistogram("test::private_mode_boolean", "never", Telemetry.HISTOGRAM_BOOLEAN);
+ var h = Telemetry.getHistogramById("TELEMETRY_TEST_BOOLEAN");
var orig = h.snapshot();
Telemetry.canRecordExtended = false;
h.add(1);
do_check_eq(uneval(orig), uneval(h.snapshot()));
Telemetry.canRecordExtended = true;
h.add(1);
do_check_neq(uneval(orig), uneval(h.snapshot()));
});
@@ -320,17 +319,17 @@ add_task(function* test_histogramRecordi
// Extended histograms should not be recorded.
h = Telemetry.getHistogramById("TELEMETRY_TEST_RELEASE_OPTIN");
orig = h.snapshot();
h.add(1);
Assert.equal(orig.sum, h.snapshot().sum,
"Histograms should be equal after recording.");
// Runtime created histograms should not be recorded.
- h = Telemetry.newHistogram("test::runtime_created_boolean", "never", Telemetry.HISTOGRAM_BOOLEAN);
+ h = Telemetry.getHistogramById("TELEMETRY_TEST_BOOLEAN");
orig = h.snapshot();
h.add(1);
Assert.equal(orig.sum, h.snapshot().sum,
"Histograms should be equal after recording.");
// Check that extended histograms are recorded when required.
Telemetry.canRecordExtended = true;
@@ -437,29 +436,27 @@ add_task(function* test_addons() {
Telemetry.unregisterAddonHistograms(addon_id);
snapshots = Telemetry.addonHistogramSnapshots;
do_check_false(addon_id in snapshots);
// Make sure other addons are unaffected.
do_check_true(extra_addon in snapshots);
});
add_task(function* test_expired_histogram() {
- var histogram_id = "FOOBAR";
var test_expired_id = "TELEMETRY_TEST_EXPIRED";
var clone_id = "ExpiredClone";
- var dummy = Telemetry.newHistogram(histogram_id, "28.0a1", Telemetry.HISTOGRAM_EXPONENTIAL, 1, 2, 3);
+ var dummy = Telemetry.getHistogramById(test_expired_id);
var dummy_clone = Telemetry.histogramFrom(clone_id, test_expired_id);
var rh = Telemetry.registeredHistograms(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, []);
Assert.ok(!!rh);
dummy.add(1);
dummy_clone.add(1);
do_check_eq(Telemetry.histogramSnapshots["__expired__"], undefined);
- do_check_eq(Telemetry.histogramSnapshots[histogram_id], undefined);
do_check_eq(Telemetry.histogramSnapshots[test_expired_id], undefined);
do_check_eq(Telemetry.histogramSnapshots[clone_id], undefined);
do_check_eq(rh[test_expired_id], undefined);
});
add_task(function* test_keyed_histogram() {
// Check that invalid names get rejected.