Bug 1180324 - Basic Fennec Sync health telemetry. r=liuche
--- a/mobile/android/base/fxa/sync/FxAccountSyncAdapter.java
+++ b/mobile/android/base/fxa/sync/FxAccountSyncAdapter.java
@@ -11,16 +11,17 @@ import java.util.Collections;
import java.util.EnumSet;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import org.mozilla.gecko.AppConstants;
import org.mozilla.gecko.background.common.log.Logger;
+import org.mozilla.gecko.background.common.telemetry.TelemetryWrapper;
import org.mozilla.gecko.background.fxa.FxAccountUtils;
import org.mozilla.gecko.background.fxa.SkewHandler;
import org.mozilla.gecko.browserid.JSONWebTokenUtils;
import org.mozilla.gecko.fxa.FirefoxAccounts;
import org.mozilla.gecko.fxa.FxAccountConstants;
import org.mozilla.gecko.fxa.authenticator.AccountPickler;
import org.mozilla.gecko.fxa.authenticator.AndroidFxAccount;
import org.mozilla.gecko.fxa.authenticator.FxADefaultLoginStateMachineDelegate;
@@ -38,16 +39,17 @@ import org.mozilla.gecko.sync.SyncConfig
import org.mozilla.gecko.sync.ThreadPool;
import org.mozilla.gecko.sync.Utils;
import org.mozilla.gecko.sync.crypto.KeyBundle;
import org.mozilla.gecko.sync.delegates.BaseGlobalSessionCallback;
import org.mozilla.gecko.sync.delegates.ClientsDataDelegate;
import org.mozilla.gecko.sync.net.AuthHeaderProvider;
import org.mozilla.gecko.sync.net.HawkAuthHeaderProvider;
import org.mozilla.gecko.sync.stage.GlobalSyncStage.Stage;
+import org.mozilla.gecko.sync.telemetry.TelemetryContract;
import org.mozilla.gecko.tokenserver.TokenServerClient;
import org.mozilla.gecko.tokenserver.TokenServerClientDelegate;
import org.mozilla.gecko.tokenserver.TokenServerException;
import org.mozilla.gecko.tokenserver.TokenServerToken;
import android.accounts.Account;
import android.content.AbstractThreadedSyncAdapter;
import android.content.ContentProviderClient;
@@ -83,22 +85,24 @@ public class FxAccountSyncAdapter extend
this.notificationManager = new FxAccountNotificationManager(NOTIFICATION_ID);
}
protected static class SyncDelegate extends FxAccountSyncDelegate {
@Override
public void handleSuccess() {
Logger.info(LOG_TAG, "Sync succeeded.");
super.handleSuccess();
+ TelemetryWrapper.addToHistogram(TelemetryContract.SYNC_COMPLETED, 1);
}
@Override
public void handleError(Exception e) {
Logger.error(LOG_TAG, "Got exception syncing.", e);
super.handleError(e);
+ TelemetryWrapper.addToHistogram(TelemetryContract.SYNC_FAILED, 1);
}
@Override
public void handleCannotSync(State finalState) {
Logger.warn(LOG_TAG, "Cannot sync from state: " + finalState.getStateLabel());
super.handleCannotSync(finalState);
}
@@ -398,16 +402,17 @@ public class FxAccountSyncAdapter extend
final EnumSet<FirefoxAccounts.SyncHint> syncHints = FirefoxAccounts.getHintsToSyncFromBundle(extras);
FirefoxAccounts.logSyncHints(syncHints);
// This applies even to forced syncs, but only on success.
if (this.lastSyncRealtimeMillis > 0L &&
(this.lastSyncRealtimeMillis + MINIMUM_SYNC_DELAY_MILLIS) > SystemClock.elapsedRealtime()) {
Logger.info(LOG_TAG, "Not syncing FxAccount " + Utils.obfuscateEmail(account.name) +
": minimum interval not met.");
+ TelemetryWrapper.addToHistogram(TelemetryContract.SYNC_FAILED_BACKOFF, 1);
return;
}
// Pickle in a background thread to avoid strict mode warnings.
ThreadPool.run(new Runnable() {
@Override
public void run() {
try {
@@ -476,16 +481,18 @@ public class FxAccountSyncAdapter extend
try {
state = fxAccount.getState();
} catch (Exception e) {
fxAccount.releaseSharedAccountStateLock();
syncDelegate.handleError(e);
return;
}
+ TelemetryWrapper.addToHistogram(TelemetryContract.SYNC_STARTED, 1);
+
final FxAccountLoginStateMachine stateMachine = new FxAccountLoginStateMachine();
stateMachine.advance(state, StateLabel.Married, new FxADefaultLoginStateMachineDelegate(context, fxAccount) {
@Override
public void handleNotMarried(State notMarried) {
Logger.info(LOG_TAG, "handleNotMarried: in " + notMarried.getStateLabel());
schedulePolicy.onHandleFinal(notMarried.getNeededAction());
syncDelegate.handleCannotSync(notMarried);
}
--- a/mobile/android/base/sync/telemetry/TelemetryContract.java
+++ b/mobile/android/base/sync/telemetry/TelemetryContract.java
@@ -40,9 +40,17 @@ public class TelemetryContract {
/**
* We are (now) a Sync 1.5 (Firefox Accounts-based) client that migrated from
* Sync 1.1. We have presented the user the "complete upgrade" notification
* and they have successfully completed the upgrade process by entering their
* Firefox Account credentials.
*/
public static final String SYNC11_MIGRATIONS_COMPLETED = "FENNEC_SYNC11_MIGRATIONS_COMPLETED";
+
+ public static final String SYNC_STARTED = "FENNEC_SYNC_NUMBER_OF_SYNCS_STARTED";
+
+ public static final String SYNC_COMPLETED = "FENNEC_SYNC_NUMBER_OF_SYNCS_COMPLETED";
+
+ public static final String SYNC_FAILED = "FENNEC_SYNC_NUMBER_OF_SYNCS_FAILED";
+
+ public static final String SYNC_FAILED_BACKOFF = "FENNEC_SYNC_NUMBER_OF_SYNCS_FAILED_BACKOFF";
}
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -8454,16 +8454,36 @@
"n_buckets": 5,
"description": "The number of Sync 1.5 'complete upgrade/migration' notifications offered by Android Sync."
},
"FENNEC_SYNC11_MIGRATIONS_COMPLETED": {
"expires_in_version": "45",
"kind": "count",
"description": "The number of Sync 1.5 migrations completed by Android Sync."
},
+ "FENNEC_SYNC_NUMBER_OF_SYNCS_STARTED": {
+ "expires_in_version": "45",
+ "kind": "count",
+ "description": "Counts the number of times that a sync has started."
+ },
+ "FENNEC_SYNC_NUMBER_OF_SYNCS_COMPLETED": {
+ "expires_in_version": "45",
+ "kind": "count",
+ "description": "Counts the number of times that a sync has completed with no errors."
+ },
+ "FENNEC_SYNC_NUMBER_OF_SYNCS_FAILED": {
+ "expires_in_version": "45",
+ "kind": "count",
+ "description": "Counts the number of times that a sync has failed with errors."
+ },
+ "FENNEC_SYNC_NUMBER_OF_SYNCS_FAILED_BACKOFF": {
+ "expires_in_version": "45",
+ "kind": "count",
+ "description": "Counts the number of times that a sync has failed because of trying to sync before server backoff interval has passed."
+ },
"SLOW_SCRIPT_NOTICE_COUNT": {
"alert_emails": ["perf-telemetry-alerts@mozilla.com"],
"expires_in_version": "never",
"kind": "count",
"description": "Count slow script notices"
},
"PLUGIN_HANG_NOTICE_COUNT": {
"alert_emails": ["perf-telemetry-alerts@mozilla.com"],