summaryrefslogtreecommitdiff
path: root/java/com/google/android/libraries/mobiledatadownload/internal/logging/MddEventLogger.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/google/android/libraries/mobiledatadownload/internal/logging/MddEventLogger.java')
-rw-r--r--java/com/google/android/libraries/mobiledatadownload/internal/logging/MddEventLogger.java320
1 files changed, 182 insertions, 138 deletions
diff --git a/java/com/google/android/libraries/mobiledatadownload/internal/logging/MddEventLogger.java b/java/com/google/android/libraries/mobiledatadownload/internal/logging/MddEventLogger.java
index 264a1a9..620421c 100644
--- a/java/com/google/android/libraries/mobiledatadownload/internal/logging/MddEventLogger.java
+++ b/java/com/google/android/libraries/mobiledatadownload/internal/logging/MddEventLogger.java
@@ -23,14 +23,13 @@ import android.content.Intent;
import android.content.IntentFilter;
import com.google.android.libraries.mobiledatadownload.Flags;
import com.google.android.libraries.mobiledatadownload.Logger;
+import com.google.android.libraries.mobiledatadownload.tracing.PropagatedFluentFuture;
import com.google.android.libraries.mobiledatadownload.tracing.PropagatedFutures;
import com.google.common.base.Optional;
import com.google.common.util.concurrent.AsyncCallable;
-import com.google.common.util.concurrent.FluentFuture;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.mobiledatadownload.LogEnumsProto.MddClientEvent;
-import com.google.mobiledatadownload.LogEnumsProto.MddClientEvent.Code;
import com.google.mobiledatadownload.LogEnumsProto.MddDownloadResult;
import com.google.mobiledatadownload.LogProto.AndroidClientInfo;
import com.google.mobiledatadownload.LogProto.DataDownloadFileGroupStats;
@@ -60,7 +59,7 @@ public final class MddEventLogger implements EventLogger {
private Optional<LoggingStateStore> loggingStateStore = Optional.absent();
public MddEventLogger(
- Context context, Logger logger, int moduleVersion, LogSampler logSampler, Flags flags) {
+ Context context, Logger logger, int moduleVersion, LogSampler logSampler, Flags flags) {
this.context = context;
this.logger = logger;
this.moduleVersion = moduleVersion;
@@ -84,135 +83,164 @@ public final class MddEventLogger implements EventLogger {
}
@Override
- public void logEventSampled(int eventCode) {}
+ public void logEventSampled(MddClientEvent.Code eventCode) {
+ sampleAndSendLogEvent(eventCode, MddLogData.newBuilder(), flags.mddDefaultSampleInterval());
+ }
@Override
public void logEventSampled(
- int eventCode,
- String fileGroupName,
- int fileGroupVersionNumber,
- long buildId,
- String variantId) {
+ MddClientEvent.Code eventCode,
+ String fileGroupName,
+ int fileGroupVersionNumber,
+ long buildId,
+ String variantId) {
+
+ DataDownloadFileGroupStats dataDownloadFileGroupStats =
+ DataDownloadFileGroupStats.newBuilder()
+ .setFileGroupName(fileGroupName)
+ .setFileGroupVersionNumber(fileGroupVersionNumber)
+ .setBuildId(buildId)
+ .setVariantId(variantId)
+ .build();
- Void dataDownloadFileGroupStats = null;
+ sampleAndSendLogEvent(
+ eventCode,
+ MddLogData.newBuilder().setDataDownloadFileGroupStats(dataDownloadFileGroupStats),
+ flags.mddDefaultSampleInterval());
}
@Override
- public void logEventAfterSample(int eventCode, int sampleInterval) {
+ public void logEventAfterSample(MddClientEvent.Code eventCode, int sampleInterval) {
// TODO(b/138392640): delete this method once the pds migration is complete. If it's necessary
// for other use cases, we can establish a pattern where this class is still responsible for
// sampling.
- Void logData = null;
+ MddLogData.Builder logData = MddLogData.newBuilder();
processAndSendEventWithoutStableSampling(eventCode, logData, sampleInterval);
}
@Override
- public void logMddApiCallStats(Void fileGroupDetails, Void apiCallStats) {
+ public void logMddApiCallStats(DataDownloadFileGroupStats fileGroupDetails, Void apiCallStats) {
// TODO(b/144684763): update this to use stable sampling. Leaving it as is for now since it is
// fairly high volume.
long sampleInterval = flags.apiLoggingSampleInterval();
if (!LogUtil.shouldSampleInterval(sampleInterval)) {
return;
}
- Void logData = null;
- processAndSendEventWithoutStableSampling(0, logData, sampleInterval);
+ MddLogData.Builder logData =
+ MddLogData.newBuilder().setDataDownloadFileGroupStats(fileGroupDetails);
+ processAndSendEventWithoutStableSampling(
+ MddClientEvent.Code.EVENT_CODE_UNSPECIFIED, logData, sampleInterval);
+ }
+
+ @Override
+ public void logMddLibApiResultLog(Void mddLibApiResultLog) {
+ MddLogData.Builder logData = MddLogData.newBuilder();
+
+ sampleAndSendLogEvent(
+ MddClientEvent.Code.EVENT_CODE_UNSPECIFIED, logData, flags.apiLoggingSampleInterval());
}
@Override
public ListenableFuture<Void> logMddFileGroupStats(
- AsyncCallable<List<EventLogger.FileGroupStatusWithDetails>> buildFileGroupStats) {
+ AsyncCallable<List<EventLogger.FileGroupStatusWithDetails>> buildFileGroupStats) {
return lazySampleAndSendLogEvent(
- Code.DATA_DOWNLOAD_FILE_GROUP_STATUS,
- () ->
- PropagatedFutures.transform(
- buildFileGroupStats.call(),
- fileGroupStatusAndDetailsList -> {
- List<MddLogData> allMddLogData = new ArrayList<>();
-
- for (FileGroupStatusWithDetails fileGroupStatusAndDetails :
- fileGroupStatusAndDetailsList) {
- allMddLogData.add(
- MddLogData.newBuilder()
- .setMddFileGroupStatus(fileGroupStatusAndDetails.fileGroupStatus())
- .setDataDownloadFileGroupStats(
- fileGroupStatusAndDetails.fileGroupDetails())
- .build());
- }
- return allMddLogData;
- },
- directExecutor()),
- flags.groupStatsLoggingSampleInterval());
+ MddClientEvent.Code.DATA_DOWNLOAD_FILE_GROUP_STATUS,
+ () ->
+ PropagatedFutures.transform(
+ buildFileGroupStats.call(),
+ fileGroupStatusAndDetailsList -> {
+ List<MddLogData> allMddLogData = new ArrayList<>();
+
+ for (FileGroupStatusWithDetails fileGroupStatusAndDetails :
+ fileGroupStatusAndDetailsList) {
+ allMddLogData.add(
+ MddLogData.newBuilder()
+ .setMddFileGroupStatus(fileGroupStatusAndDetails.fileGroupStatus())
+ .setDataDownloadFileGroupStats(
+ fileGroupStatusAndDetails.fileGroupDetails())
+ .build());
+ }
+ return allMddLogData;
+ },
+ directExecutor()),
+ flags.groupStatsLoggingSampleInterval());
}
@Override
public ListenableFuture<Void> logMddStorageStats(
- AsyncCallable<MddStorageStats> buildStorageStats) {
+ AsyncCallable<MddStorageStats> buildStorageStats) {
return lazySampleAndSendLogEvent(
- Code.DATA_DOWNLOAD_STORAGE_STATS,
- () ->
- PropagatedFutures.transform(
- buildStorageStats.call(),
- storageStats ->
- Arrays.asList(MddLogData.newBuilder().setMddStorageStats(storageStats).build()),
- directExecutor()),
- flags.storageStatsLoggingSampleInterval());
+ MddClientEvent.Code.DATA_DOWNLOAD_STORAGE_STATS,
+ () ->
+ PropagatedFutures.transform(
+ buildStorageStats.call(),
+ storageStats ->
+ Arrays.asList(MddLogData.newBuilder().setMddStorageStats(storageStats).build()),
+ directExecutor()),
+ flags.storageStatsLoggingSampleInterval());
}
@Override
public ListenableFuture<Void> logMddNetworkStats(AsyncCallable<Void> buildNetworkStats) {
return lazySampleAndSendLogEvent(
- Code.EVENT_CODE_UNSPECIFIED,
- () ->
- PropagatedFutures.transform(
- buildNetworkStats.call(), networkStats -> Arrays.asList(), directExecutor()),
- flags.networkStatsLoggingSampleInterval());
+ MddClientEvent.Code.EVENT_CODE_UNSPECIFIED,
+ () ->
+ PropagatedFutures.transform(
+ buildNetworkStats.call(), networkStats -> Arrays.asList(), directExecutor()),
+ flags.networkStatsLoggingSampleInterval());
}
@Override
public void logMddDataDownloadFileExpirationEvent(int eventCode, int count) {
- MddLogData.Builder logData = null;
- sampleAndSendLogEvent(Code.EVENT_CODE_UNSPECIFIED, logData, flags.mddDefaultSampleInterval());
+ MddLogData.Builder logData = MddLogData.newBuilder();
+ sampleAndSendLogEvent(
+ MddClientEvent.Code.EVENT_CODE_UNSPECIFIED, logData, flags.mddDefaultSampleInterval());
}
@Override
public void logMddNetworkSavings(
- Void fileGroupDetails,
- int code,
- long fullFileSize,
- long downloadedFileSize,
- String fileId,
- int deltaIndex) {
- MddLogData.Builder logData = null;
-
- sampleAndSendLogEvent(Code.EVENT_CODE_UNSPECIFIED, logData, flags.mddDefaultSampleInterval());
+ DataDownloadFileGroupStats fileGroupDetails,
+ int code,
+ long fullFileSize,
+ long downloadedFileSize,
+ String fileId,
+ int deltaIndex) {
+ MddLogData.Builder logData = MddLogData.newBuilder();
+
+ sampleAndSendLogEvent(
+ MddClientEvent.Code.EVENT_CODE_UNSPECIFIED, logData, flags.mddDefaultSampleInterval());
}
@Override
- public void logMddQueryStats(Void fileGroupDetails) {
- MddLogData.Builder logData = null;
+ public void logMddQueryStats(DataDownloadFileGroupStats fileGroupDetails) {
+ MddLogData.Builder logData = MddLogData.newBuilder();
- sampleAndSendLogEvent(Code.EVENT_CODE_UNSPECIFIED, logData, flags.mddDefaultSampleInterval());
+ sampleAndSendLogEvent(
+ MddClientEvent.Code.EVENT_CODE_UNSPECIFIED, logData, flags.mddDefaultSampleInterval());
}
@Override
- public void logMddDownloadLatency(Void fileGroupDetails, Void downloadLatency) {
- MddLogData.Builder logData = null;
+ public void logMddDownloadLatency(
+ DataDownloadFileGroupStats fileGroupDetails, Void downloadLatency) {
+ MddLogData.Builder logData =
+ MddLogData.newBuilder().setDataDownloadFileGroupStats(fileGroupDetails);
- sampleAndSendLogEvent(Code.EVENT_CODE_UNSPECIFIED, logData, flags.mddDefaultSampleInterval());
+ sampleAndSendLogEvent(
+ MddClientEvent.Code.EVENT_CODE_UNSPECIFIED, logData, flags.mddDefaultSampleInterval());
}
@Override
public void logMddDownloadResult(
- MddDownloadResult.Code code, DataDownloadFileGroupStats fileGroupDetails) {
+ MddDownloadResult.Code code, DataDownloadFileGroupStats fileGroupDetails) {
MddLogData.Builder logData =
- MddLogData.newBuilder()
- .setMddDownloadResultLog(
- MddDownloadResultLog.newBuilder()
- .setResult(code)
- .setDataDownloadFileGroupStats(fileGroupDetails));
+ MddLogData.newBuilder()
+ .setMddDownloadResultLog(
+ MddDownloadResultLog.newBuilder()
+ .setResult(code)
+ .setDataDownloadFileGroupStats(fileGroupDetails));
sampleAndSendLogEvent(
- Code.DATA_DOWNLOAD_RESULT_LOG, logData, flags.mddDefaultSampleInterval());
+ MddClientEvent.Code.DATA_DOWNLOAD_RESULT_LOG, logData, flags.mddDefaultSampleInterval());
}
@Override
@@ -222,15 +250,27 @@ public final class MddEventLogger implements EventLogger {
if (!LogUtil.shouldSampleInterval(sampleInterval)) {
return;
}
- Void logData = null;
- processAndSendEventWithoutStableSampling(0, logData, sampleInterval);
+ MddLogData.Builder logData = MddLogData.newBuilder();
+ processAndSendEventWithoutStableSampling(
+ MddClientEvent.Code.EVENT_CODE_UNSPECIFIED, logData, sampleInterval);
}
@Override
- public void logMddUsageEvent(Void fileGroupDetails, Void usageEventLog) {
- MddLogData.Builder logData = null;
+ public void logMddUsageEvent(DataDownloadFileGroupStats fileGroupDetails, Void usageEventLog) {
+ MddLogData.Builder logData =
+ MddLogData.newBuilder().setDataDownloadFileGroupStats(fileGroupDetails);
+
+ sampleAndSendLogEvent(
+ MddClientEvent.Code.EVENT_CODE_UNSPECIFIED, logData, flags.mddDefaultSampleInterval());
+ }
- sampleAndSendLogEvent(Code.EVENT_CODE_UNSPECIFIED, logData, flags.mddDefaultSampleInterval());
+ @Override
+ public void logNewConfigReceived(
+ DataDownloadFileGroupStats fileGroupDetails, Void newConfigReceivedInfo) {
+ MddLogData.Builder logData =
+ MddLogData.newBuilder().setDataDownloadFileGroupStats(fileGroupDetails);
+ sampleAndSendLogEvent(
+ MddClientEvent.Code.EVENT_CODE_UNSPECIFIED, logData, flags.mddDefaultSampleInterval());
}
/**
@@ -239,82 +279,86 @@ public final class MddEventLogger implements EventLogger {
* constructs the log event lazy. This is useful if constructing the log event is expensive.
*/
private ListenableFuture<Void> lazySampleAndSendLogEvent(
- Code eventCode, AsyncCallable<List<MddLogData>> buildStats, int sampleInterval) {
+ MddClientEvent.Code eventCode,
+ AsyncCallable<List<MddLogData>> buildStats,
+ int sampleInterval) {
return PropagatedFutures.transformAsync(
- logSampler.shouldLog(sampleInterval, loggingStateStore),
- samplingInfoOptional -> {
- if (!samplingInfoOptional.isPresent()) {
- return immediateVoidFuture();
- }
-
- return FluentFuture.from(buildStats.call())
- .transform(
- icingLogDataList -> {
- if (icingLogDataList != null) {
- for (MddLogData icingLogData : icingLogDataList) {
- processAndSendEvent(
- eventCode,
- icingLogData.toBuilder(),
- sampleInterval,
- samplingInfoOptional.get());
- }
- }
- return null;
- },
- directExecutor());
- },
- directExecutor());
+ logSampler.shouldLog(sampleInterval, loggingStateStore),
+ samplingInfoOptional -> {
+ if (!samplingInfoOptional.isPresent()) {
+ return immediateVoidFuture();
+ }
+
+ return PropagatedFluentFuture.from(buildStats.call())
+ .transform(
+ icingLogDataList -> {
+ if (icingLogDataList != null) {
+ for (MddLogData icingLogData : icingLogDataList) {
+ processAndSendEvent(
+ eventCode,
+ icingLogData.toBuilder(),
+ sampleInterval,
+ samplingInfoOptional.get());
+ }
+ }
+ return null;
+ },
+ directExecutor());
+ },
+ directExecutor());
}
private void sampleAndSendLogEvent(
- MddClientEvent.Code eventCode, MddLogData.Builder logData, long sampleInterval) {
+ MddClientEvent.Code eventCode, MddLogData.Builder logData, long sampleInterval) {
+ // NOTE: When using a single-threaded executor, logging may be delayed since other
+ // work will come before the log sampler check.
PropagatedFutures.addCallback(
- logSampler.shouldLog(sampleInterval, loggingStateStore),
- new FutureCallback<Optional<StableSamplingInfo>>() {
- @Override
- public void onSuccess(Optional<StableSamplingInfo> stableSamplingInfo) {
- if (stableSamplingInfo.isPresent()) {
- processAndSendEvent(eventCode, logData, sampleInterval, stableSamplingInfo.get());
- }
- }
-
- @Override
- public void onFailure(Throwable t) {
- LogUtil.e(t, "%s: failure when sampling log!", TAG);
- }
- },
- directExecutor());
+ logSampler.shouldLog(sampleInterval, loggingStateStore),
+ new FutureCallback<Optional<StableSamplingInfo>>() {
+ @Override
+ public void onSuccess(Optional<StableSamplingInfo> stableSamplingInfo) {
+ if (stableSamplingInfo.isPresent()) {
+ processAndSendEvent(eventCode, logData, sampleInterval, stableSamplingInfo.get());
+ }
+ }
+
+ @Override
+ public void onFailure(Throwable t) {
+ LogUtil.e(t, "%s: failure when sampling log!", TAG);
+ }
+ },
+ directExecutor());
}
/** Adds all transforms common to all logs and sends the event to Logger. */
private void processAndSendEventWithoutStableSampling(
- int eventCode, Void logData, long sampleInterval) {
+ MddClientEvent.Code eventCode, MddLogData.Builder logData, long sampleInterval) {
processAndSendEvent(
- Code.EVENT_CODE_UNSPECIFIED,
- MddLogData.newBuilder(),
- sampleInterval,
- StableSamplingInfo.newBuilder().setStableSamplingUsed(false).build());
+ eventCode,
+ logData,
+ sampleInterval,
+ StableSamplingInfo.newBuilder().setStableSamplingUsed(false).build());
}
/** Adds all transforms common to all logs and sends the event to Logger. */
private void processAndSendEvent(
- Code eventCode,
- MddLogData.Builder logData,
- long sampleInterval,
- StableSamplingInfo stableSamplingInfo) {
- if (eventCode.equals(Code.EVENT_CODE_UNSPECIFIED)) {
+ MddClientEvent.Code eventCode,
+ MddLogData.Builder logData,
+ long sampleInterval,
+ StableSamplingInfo stableSamplingInfo) {
+ if (eventCode.equals(MddClientEvent.Code.EVENT_CODE_UNSPECIFIED)) {
LogUtil.e("%s: unspecified code used, skipping event log", TAG);
// return early for unspecified codes.
return;
}
logData
- .setSamplingInterval(sampleInterval)
- .setDeviceInfo(MddDeviceInfo.newBuilder().setDeviceStorageLow(isDeviceStorageLow(context)))
- .setAndroidClientInfo(
- AndroidClientInfo.newBuilder()
- .setHostPackageName(hostPackageName)
- .setModuleVersion(moduleVersion))
- .setStableSamplingInfo(stableSamplingInfo);
+ .setSamplingInterval(sampleInterval)
+ .setDeviceInfo(MddDeviceInfo.newBuilder().setDeviceStorageLow(isDeviceStorageLow(context)))
+ .setAndroidClientInfo(
+ AndroidClientInfo.newBuilder()
+ .setHostPackageName(hostPackageName)
+ .setModuleVersion(moduleVersion))
+ .setStableSamplingInfo(stableSamplingInfo);
logger.log(logData.build(), eventCode.getNumber());
}
@@ -322,6 +366,6 @@ public final class MddEventLogger implements EventLogger {
private static boolean isDeviceStorageLow(Context context) {
// Check if the system says storage is low, by reading the sticky intent.
return context.registerReceiver(null, new IntentFilter(Intent.ACTION_DEVICE_STORAGE_LOW))
- != null;
+ != null;
}
-} \ No newline at end of file
+}