зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
2c8cb57da2
Коммит
24751c0dde
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче