Bug 1734262 - Hoist standalone telemetry ping helper from PingCentre to TelemetrySend. r=nanj

I ended up writing more or less exactly this before discovering it.

Differential Revision: https://phabricator.services.mozilla.com/D127715
This commit is contained in:
Bobby Holley 2021-10-12 17:31:19 +00:00
Родитель 2c8cb57da2
Коммит 24751c0dde
3 изменённых файлов: 44 добавлений и 71 удалений

Просмотреть файл

@ -21,15 +21,14 @@ ChromeUtils.defineModuleGetter(
);
ChromeUtils.defineModuleGetter(
this,
"ServiceRequest",
"resource://gre/modules/ServiceRequest.jsm"
"TelemetrySend",
"resource://gre/modules/TelemetrySend.jsm"
);
const PREF_BRANCH = "browser.ping-centre.";
const TELEMETRY_PREF = `${PREF_BRANCH}telemetry`;
const LOGGING_PREF = `${PREF_BRANCH}log`;
const STRUCTURED_INGESTION_SEND_TIMEOUT = 30 * 1000; // 30 seconds
const FHR_UPLOAD_ENABLED_PREF = "datareporting.healthreport.uploadEnabled";
@ -108,69 +107,9 @@ class PingCentre {
return payload;
}
static _gzipCompressString(string) {
let observer = {
buffer: "",
onStreamComplete(loader, context, status, length, result) {
this.buffer = String.fromCharCode(...result);
},
};
let scs = Cc["@mozilla.org/streamConverters;1"].getService(
Ci.nsIStreamConverterService
);
let listener = Cc["@mozilla.org/network/stream-loader;1"].createInstance(
Ci.nsIStreamLoader
);
listener.init(observer);
let converter = scs.asyncConvertData(
"uncompressed",
"gzip",
listener,
null
);
let stringStream = Cc[
"@mozilla.org/io/string-input-stream;1"
].createInstance(Ci.nsIStringInputStream);
stringStream.data = string;
converter.onStartRequest(null, null);
converter.onDataAvailable(null, stringStream, 0, string.length);
converter.onStopRequest(null, null, null);
return observer.buffer;
}
static _sendInGzip(endpoint, payload) {
return new Promise((resolve, reject) => {
let request = new ServiceRequest({ mozAnon: true });
request.mozBackgroundRequest = true;
request.timeout = STRUCTURED_INGESTION_SEND_TIMEOUT;
request.open("POST", endpoint, true);
request.overrideMimeType("text/plain");
request.setRequestHeader(
"Content-Type",
"application/json; charset=UTF-8"
);
request.setRequestHeader("Content-Encoding", "gzip");
request.setRequestHeader("Date", new Date().toUTCString());
request.onload = event => {
if (request.status !== 200) {
reject(event);
} else {
resolve(event);
}
};
request.onerror = reject;
request.onabort = reject;
request.ontimeout = reject;
let payloadStream = Cc[
"@mozilla.org/io/string-input-stream;1"
].createInstance(Ci.nsIStringInputStream);
payloadStream.data = PingCentre._gzipCompressString(payload);
request.sendInputStream(payloadStream);
});
// We route through this helper because it gets hooked in testing.
static _sendStandalonePing(endpoint, payload) {
return TelemetrySend.sendStandalonePing(endpoint, payload);
}
/**
@ -198,7 +137,7 @@ class PingCentre {
);
}
return PingCentre._sendInGzip(endpoint, payload).catch(event => {
return PingCentre._sendStandalonePing(endpoint, payload).catch(event => {
Cu.reportError(
`Structured Ingestion ping failure with error: ${event.type}`
);

Просмотреть файл

@ -128,17 +128,17 @@ add_task(function test_createStructuredIngestionPing() {
add_task(function test_sendStructuredIngestionPing_disabled() {
_setUp();
sandbox.stub(PingCentre, "_sendInGzip").resolves();
sandbox.stub(PingCentre, "_sendStandalonePing").resolves();
Services.prefs.setBoolPref(PingCentreConstants.TELEMETRY_PREF, false);
pingCentre.sendStructuredIngestionPing(FAKE_PING, FAKE_ENDPOINT);
Assert.ok(PingCentre._sendInGzip.notCalled, "Should not be sent");
Assert.ok(PingCentre._sendStandalonePing.notCalled, "Should not be sent");
});
add_task(function test_sendStructuredIngestionPing_success() {
_setUp();
sandbox.stub(PingCentre, "_sendInGzip").resolves();
sandbox.stub(PingCentre, "_sendStandalonePing").resolves();
pingCentre.sendStructuredIngestionPing(FAKE_PING, FAKE_ENDPOINT);
Assert.equal(PingCentre._sendInGzip.callCount, 1, "Should be sent");
Assert.equal(PingCentre._sendStandalonePing.callCount, 1, "Should be sent");
});

Просмотреть файл

@ -17,6 +17,7 @@ var EXPORTED_SYMBOLS = [
"SendScheduler",
"TelemetrySendImpl",
"PING_SUBMIT_TIMEOUT_MS",
"sendStandalonePing",
"gzipCompressString",
];
@ -195,6 +196,39 @@ function gzipCompressString(string) {
return observer.buffer;
}
const STANDALONE_PING_TIMEOUT = 30 * 1000; // 30 seconds
function sendStandalonePing(endpoint, payload) {
return new Promise((resolve, reject) => {
let request = new ServiceRequest({ mozAnon: true });
request.mozBackgroundRequest = true;
request.timeout = STANDALONE_PING_TIMEOUT;
request.open("POST", endpoint, true);
request.overrideMimeType("text/plain");
request.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
request.setRequestHeader("Content-Encoding", "gzip");
request.setRequestHeader("Date", new Date().toUTCString());
request.onload = event => {
if (request.status !== 200) {
reject(event);
} else {
resolve(event);
}
};
request.onerror = reject;
request.onabort = reject;
request.ontimeout = reject;
let payloadStream = Cc[
"@mozilla.org/io/string-input-stream;1"
].createInstance(Ci.nsIStringInputStream);
payloadStream.data = gzipCompressString(payload);
request.sendInputStream(payloadStream);
});
}
var TelemetrySend = {
get pendingPingCount() {
return TelemetrySendImpl.pendingPingCount;