Merge "ConnectivityMetricsLogger subclass for IpConnectivity" into nyc-mr1-dev

This commit is contained in:
Hugo Benichi
2016-06-09 05:08:39 +00:00
committed by Android (Google) Code Review
3 changed files with 103 additions and 29 deletions

View File

@@ -33,28 +33,39 @@ public class ConnectivityMetricsLogger {
// Component Tags
public static final int COMPONENT_TAG_CONNECTIVITY = 0;
public static final int COMPONENT_TAG_BLUETOOTH = 1;
public static final int COMPONENT_TAG_WIFI = 2;
public static final int COMPONENT_TAG_TELECOM = 3;
public static final int COMPONENT_TAG_TELEPHONY = 4;
public static final int NUMBER_OF_COMPONENTS = 5;
public static final int COMPONENT_TAG_BLUETOOTH = 1;
public static final int COMPONENT_TAG_WIFI = 2;
public static final int COMPONENT_TAG_TELECOM = 3;
public static final int COMPONENT_TAG_TELEPHONY = 4;
public static final int NUMBER_OF_COMPONENTS = 5;
// Event Tag
public static final int TAG_SKIPPED_EVENTS = -1;
public static final String DATA_KEY_EVENTS_COUNT = "count";
private IConnectivityMetricsLogger mService;
private long mServiceUnblockedTimestampMillis = 0;
private int mNumSkippedEvents = 0;
/** {@hide} */ protected final IConnectivityMetricsLogger mService;
/** {@hide} */ protected volatile long mServiceUnblockedTimestampMillis;
private int mNumSkippedEvents;
public ConnectivityMetricsLogger() {
mService = IConnectivityMetricsLogger.Stub.asInterface(ServiceManager.getService(
CONNECTIVITY_METRICS_LOGGER_SERVICE));
}
/**
* Log a ConnectivityMetricsEvent.
*
* This method keeps track of skipped events when MetricsLoggerService throttles input events.
* It skips logging when MetricsLoggerService is active. When throttling ends, it logs a
* meta-event containing the number of events dropped. It is not safe to call this method
* concurrently from different threads.
*
* @param timestamp is the epoch timestamp of the event in ms.
* @param componentTag is the COMPONENT_* constant the event belongs to.
* @param eventTag is an event type constant whose meaning is specific to the component tag.
* @param data is a Parcelable instance representing the event.
*/
public void logEvent(long timestamp, int componentTag, int eventTag, Parcelable data) {
if (mService == null) {
if (DBG) {
@@ -104,7 +115,7 @@ public class ConnectivityMetricsLogger {
}
}
} catch (RemoteException e) {
Log.e(TAG, "Error logging event " + e.getMessage());
Log.e(TAG, "Error logging event", e);
}
}
@@ -121,8 +132,8 @@ public class ConnectivityMetricsLogger {
public ConnectivityMetricsEvent[] getEvents(ConnectivityMetricsEvent.Reference reference) {
try {
return mService.getEvents(reference);
} catch (RemoteException ex) {
Log.e(TAG, "IConnectivityMetricsLogger.getEvents: " + ex);
} catch (RemoteException e) {
Log.e(TAG, "IConnectivityMetricsLogger.getEvents", e);
return null;
}
}
@@ -133,8 +144,8 @@ public class ConnectivityMetricsLogger {
public boolean register(PendingIntent newEventsIntent) {
try {
return mService.register(newEventsIntent);
} catch (RemoteException ex) {
Log.e(TAG, "IConnectivityMetricsLogger.register: " + ex);
} catch (RemoteException e) {
Log.e(TAG, "IConnectivityMetricsLogger.register", e);
return false;
}
}
@@ -142,8 +153,8 @@ public class ConnectivityMetricsLogger {
public boolean unregister(PendingIntent newEventsIntent) {
try {
mService.unregister(newEventsIntent);
} catch (RemoteException ex) {
Log.e(TAG, "IConnectivityMetricsLogger.unregister: " + ex);
} catch (RemoteException e) {
Log.e(TAG, "IConnectivityMetricsLogger.unregister", e);
return false;
}

View File

@@ -16,20 +16,13 @@
package android.net.metrics;
import android.net.ConnectivityMetricsLogger;
import android.os.Parcel;
import android.os.Parcelable;
/**
* {@hide}
*/
/** {@hide} */
public abstract class IpConnectivityEvent {
private static final int COMPONENT_TAG = ConnectivityMetricsLogger.COMPONENT_TAG_CONNECTIVITY;
private static final IpConnectivityLog sMetricsLog = new IpConnectivityLog();
private static final ConnectivityMetricsLogger sMetricsLogger = new ConnectivityMetricsLogger();
public static <T extends IpConnectivityEvent & Parcelable> void logEvent(T event) {
// TODO: consider using different component for DNS event.
sMetricsLogger.logEvent(System.currentTimeMillis(), COMPONENT_TAG, 0, event);
static <T extends IpConnectivityEvent & Parcelable> void logEvent(T event) {
sMetricsLog.log(System.currentTimeMillis(), event);
}
};
}

View File

@@ -0,0 +1,70 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.net.metrics;
import android.net.ConnectivityMetricsEvent;
import android.net.ConnectivityMetricsLogger;
import android.os.Parcelable;
import android.os.RemoteException;
import android.util.Log;
/**
* Specialization of the ConnectivityMetricsLogger class for recording IP connectivity events.
* {@hide}
*/
class IpConnectivityLog extends ConnectivityMetricsLogger {
private static String TAG = "IpConnectivityMetricsLogger";
private static final boolean DBG = false;
/**
* Log an IpConnectivity event. Contrary to logEvent(), this method does not
* keep track of skipped events and is thread-safe for callers.
*
* @param timestamp is the epoch timestamp of the event in ms.
* @param data is a Parcelable IpConnectivityEvent instance representing the event.
*
* @return true if the event was successfully logged.
*/
public <T extends IpConnectivityEvent & Parcelable> boolean log(long timestamp, T data) {
if (mService == null) {
if (DBG) {
Log.d(TAG, CONNECTIVITY_METRICS_LOGGER_SERVICE + " service not ready");
}
return false;
}
if (System.currentTimeMillis() < mServiceUnblockedTimestampMillis) {
if (DBG) {
Log.d(TAG, "skipping logging due to throttling for IpConnectivity component");
}
return false;
}
try {
final ConnectivityMetricsEvent event =
new ConnectivityMetricsEvent(timestamp, COMPONENT_TAG_CONNECTIVITY, 0, data);
final long result = mService.logEvent(event);
if (result >= 0) {
mServiceUnblockedTimestampMillis = result;
}
return (result == 0);
} catch (RemoteException e) {
Log.e(TAG, "Error logging event", e);
return false;
}
}
}