Index: components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedService.java |
diff --git a/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedService.java b/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedService.java |
index 7b1c7bb843b959a492261f8f3dd15d33f44fe3f3..26957722001f66647fd6e2629dfad0bd2ed2b12d 100644 |
--- a/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedService.java |
+++ b/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedService.java |
@@ -6,15 +6,19 @@ package org.chromium.components.variations.firstrun; |
import android.app.IntentService; |
import android.content.Intent; |
+import android.os.SystemClock; |
import org.chromium.base.Log; |
+import org.chromium.base.metrics.CachedMetrics.SparseHistogramSample; |
+import org.chromium.base.metrics.CachedMetrics.TimesHistogramSample; |
import java.io.ByteArrayOutputStream; |
import java.io.IOException; |
import java.io.InputStream; |
import java.net.HttpURLConnection; |
-import java.net.MalformedURLException; |
+import java.net.SocketTimeoutException; |
import java.net.URL; |
+import java.util.concurrent.TimeUnit; |
/** |
* Background service that fetches the variations seed before the actual first run of Chrome. |
@@ -27,6 +31,12 @@ public class VariationsSeedService extends IntentService { |
private static final int READ_TIMEOUT = 10000; // time in ms |
private static final int REQUEST_TIMEOUT = 15000; // time in ms |
+ // Values for the "Variations.FirstRun.SeedFetchResult" sparse histogram, which also logs |
+ // HTTP result codes. These are negative so that they don't conflict with the HTTP codes. |
+ // These values should not be renumbered or re-used since they are logged to UMA. |
+ private static final int SEED_FETCH_RESULT_TIMEOUT = -2; |
+ private static final int SEED_FETCH_RESULT_IOEXCEPTION = -1; |
+ |
// Static variable that indicates a status of the variations seed fetch. If one request is in |
// progress, we do not start another fetch. |
private static boolean sFetchInProgress = false; |
@@ -45,9 +55,7 @@ public class VariationsSeedService extends IntentService { |
} |
setFetchInProgressFlagValue(true); |
try { |
- downloadContent(new URL(VARIATIONS_SERVER_URL)); |
- } catch (MalformedURLException e) { |
- Log.w(TAG, "Variations server URL is malformed.", e); |
+ downloadContent(); |
} finally { |
setFetchInProgressFlagValue(false); |
} |
@@ -59,16 +67,32 @@ public class VariationsSeedService extends IntentService { |
sFetchInProgress = value; |
} |
- private boolean downloadContent(URL variationsServerUrl) { |
+ private void recordFetchResultOrCode(int resultOrCode) { |
+ SparseHistogramSample histogram = |
+ new SparseHistogramSample("Variations.FirstRun.SeedFetchResult"); |
+ histogram.record(resultOrCode); |
+ } |
+ |
+ private void recordSeedFetchTime(long timeDeltaMillis) { |
+ Log.i(TAG, "Fetched first run seed in " + timeDeltaMillis + " ms"); |
+ TimesHistogramSample histogram = new TimesHistogramSample( |
+ "Variations.FirstRun.SeedFetchTime", TimeUnit.MILLISECONDS); |
+ histogram.record(timeDeltaMillis); |
+ } |
+ |
+ private boolean downloadContent() { |
HttpURLConnection connection = null; |
try { |
- connection = (HttpURLConnection) variationsServerUrl.openConnection(); |
+ long startTimeMillis = SystemClock.elapsedRealtime(); |
+ URL url = new URL(VARIATIONS_SERVER_URL); |
+ connection = (HttpURLConnection) url.openConnection(); |
connection.setReadTimeout(READ_TIMEOUT); |
connection.setConnectTimeout(REQUEST_TIMEOUT); |
connection.setDoInput(true); |
connection.setRequestProperty("A-IM", "gzip"); |
connection.connect(); |
int responseCode = connection.getResponseCode(); |
+ recordFetchResultOrCode(responseCode); |
if (responseCode != HttpURLConnection.HTTP_OK) { |
Log.w(TAG, "Non-OK response code = %d", responseCode); |
return false; |
@@ -82,8 +106,14 @@ public class VariationsSeedService extends IntentService { |
boolean isGzipCompressed = getHeaderFieldOrEmpty(connection, "IM").equals("gzip"); |
VariationsSeedBridge.setVariationsFirstRunSeed( |
getApplicationContext(), rawSeed, signature, country, date, isGzipCompressed); |
+ recordSeedFetchTime(SystemClock.elapsedRealtime() - startTimeMillis); |
return true; |
+ } catch (SocketTimeoutException e) { |
+ recordFetchResultOrCode(SEED_FETCH_RESULT_TIMEOUT); |
+ Log.w(TAG, "SocketTimeoutException fetching first run seed: ", e); |
+ return false; |
} catch (IOException e) { |
+ recordFetchResultOrCode(SEED_FETCH_RESULT_IOEXCEPTION); |
Log.w(TAG, "IOException fetching first run seed: ", e); |
return false; |
} finally { |