1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.adservices.service.stats; 18 19 import static com.android.adservices.service.stats.AdServicesStatsLog.ADSERVICES_SHELL_COMMAND_CALLED; 20 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_COUNTER_HISTOGRAM_UPDATER_REPORTED; 21 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_FILTERING_PROCESS_AD_SELECTION_REPORTED; 22 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_FILTERING_PROCESS_JOIN_CA_REPORTED; 23 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED; 24 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_CLASS__UNKNOWN; 25 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_BACK_COMPAT_EPOCH_COMPUTATION_CLASSIFIER_REPORTED; 26 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_BACK_COMPAT_GET_TOPICS_REPORTED; 27 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_CONSENT_MIGRATED; 28 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ENCRYPTION_KEY_DB_TRANSACTION_ENDED; 29 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ENCRYPTION_KEY_FETCHED; 30 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ENROLLMENT_DATA_STORED; 31 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ENROLLMENT_FAILED; 32 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ENROLLMENT_FILE_DOWNLOADED; 33 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ENROLLMENT_MATCHED; 34 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ENROLLMENT_TRANSACTION_STATS; 35 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_EPOCH_COMPUTATION_CLASSIFIER_REPORTED; 36 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_EPOCH_COMPUTATION_GET_TOP_TOPICS_REPORTED; 37 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_GET_TOPICS_REPORTED; 38 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_MEASUREMENT_AD_ID_MATCH_FOR_DEBUG_KEYS; 39 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_MEASUREMENT_CLICK_VERIFICATION; 40 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_MEASUREMENT_DEBUG_KEYS; 41 import static com.android.adservices.service.stats.AdServicesStatsLog.APP_MANIFEST_CONFIG_HELPER_CALLED; 42 import static com.android.adservices.service.stats.AdServicesStatsLog.BACKGROUND_FETCH_PROCESS_REPORTED; 43 import static com.android.adservices.service.stats.AdServicesStatsLog.DESTINATION_REGISTERED_BEACONS; 44 import static com.android.adservices.service.stats.AdServicesStatsLog.ENCODING_JOB_RUN; 45 import static com.android.adservices.service.stats.AdServicesStatsLog.ENCODING_JS_EXECUTION; 46 import static com.android.adservices.service.stats.AdServicesStatsLog.ENCODING_JS_FETCH; 47 import static com.android.adservices.service.stats.AdServicesStatsLog.GET_AD_SELECTION_DATA_API_CALLED; 48 import static com.android.adservices.service.stats.AdServicesStatsLog.GET_AD_SELECTION_DATA_BUYER_INPUT_GENERATED; 49 import static com.android.adservices.service.stats.AdServicesStatsLog.INTERACTION_REPORTING_TABLE_CLEARED; 50 import static com.android.adservices.service.stats.AdServicesStatsLog.K_ANON_BACKGROUND_JOB_STATUS_REPORTED; 51 import static com.android.adservices.service.stats.AdServicesStatsLog.K_ANON_IMMEDIATE_SIGN_JOIN_STATUS_REPORTED; 52 import static com.android.adservices.service.stats.AdServicesStatsLog.K_ANON_INITIALIZE_STATUS_REPORTED; 53 import static com.android.adservices.service.stats.AdServicesStatsLog.K_ANON_JOIN_STATUS_REPORTED; 54 import static com.android.adservices.service.stats.AdServicesStatsLog.K_ANON_KEY_ATTESTATION_STATUS_REPORTED; 55 import static com.android.adservices.service.stats.AdServicesStatsLog.K_ANON_SIGN_STATUS_REPORTED; 56 import static com.android.adservices.service.stats.AdServicesStatsLog.NUMBER_OF_TYPES_OF_REPORTING_URL_RECEIVED; 57 import static com.android.adservices.service.stats.AdServicesStatsLog.PERSIST_AD_SELECTION_RESULT_CALLED; 58 import static com.android.adservices.service.stats.AdServicesStatsLog.REPORTING_WITH_DESTINATION_PERFORMED; 59 import static com.android.adservices.service.stats.AdServicesStatsLog.REPORT_IMPRESSION_API_CALLED; 60 import static com.android.adservices.service.stats.AdServicesStatsLog.REPORT_INTERACTION_API_CALLED; 61 import static com.android.adservices.service.stats.AdServicesStatsLog.RUN_AD_BIDDING_PER_CA_PROCESS_REPORTED; 62 import static com.android.adservices.service.stats.AdServicesStatsLog.RUN_AD_BIDDING_PROCESS_REPORTED; 63 import static com.android.adservices.service.stats.AdServicesStatsLog.RUN_AD_SCORING_PROCESS_REPORTED; 64 import static com.android.adservices.service.stats.AdServicesStatsLog.RUN_AD_SELECTION_PROCESS_REPORTED; 65 import static com.android.adservices.service.stats.AdServicesStatsLog.SCHEDULED_CUSTOM_AUDIENCE_UPDATE_BACKGROUND_JOB_RAN; 66 import static com.android.adservices.service.stats.AdServicesStatsLog.SCHEDULED_CUSTOM_AUDIENCE_UPDATE_PERFORMED; 67 import static com.android.adservices.service.stats.AdServicesStatsLog.SCHEDULED_CUSTOM_AUDIENCE_UPDATE_PERFORMED_ATTEMPTED_FAILURE_REPORTED; 68 import static com.android.adservices.service.stats.AdServicesStatsLog.SCHEDULED_CUSTOM_AUDIENCE_UPDATE_SCHEDULE_ATTEMPTED; 69 import static com.android.adservices.service.stats.AdServicesStatsLog.SELECT_ADS_FROM_OUTCOMES_API_CALLED; 70 import static com.android.adservices.service.stats.AdServicesStatsLog.SERVER_AUCTION_BACKGROUND_KEY_FETCH_ENABLED; 71 import static com.android.adservices.service.stats.AdServicesStatsLog.SERVER_AUCTION_KEY_FETCH_CALLED; 72 import static com.android.adservices.service.stats.AdServicesStatsLog.SIGNATURE_VERIFICATION; 73 import static com.android.adservices.service.stats.AdServicesStatsLog.TOPICS_ENCRYPTION_EPOCH_COMPUTATION_REPORTED; 74 import static com.android.adservices.service.stats.AdServicesStatsLog.TOPICS_ENCRYPTION_GET_TOPICS_REPORTED; 75 import static com.android.adservices.service.stats.AdServicesStatsLog.TOPICS_SCHEDULE_EPOCH_JOB_SETTING_REPORTED; 76 import static com.android.adservices.service.stats.AdServicesStatsLog.UPDATE_CUSTOM_AUDIENCE_PROCESS_REPORTED; 77 import static com.android.adservices.service.stats.AdServicesStatsLog.UPDATE_SIGNALS_API_CALLED; 78 import static com.android.adservices.service.stats.AdServicesStatsLog.UPDATE_SIGNALS_PROCESS_REPORTED; 79 80 import android.annotation.NonNull; 81 import android.annotation.Nullable; 82 import android.util.proto.ProtoOutputStream; 83 84 import com.android.adservices.service.Flags; 85 import com.android.adservices.service.FlagsFactory; 86 import com.android.adservices.service.common.AllowLists; 87 import com.android.adservices.service.common.AppManifestConfigCall; 88 import com.android.adservices.service.common.BinderFlagReader; 89 import com.android.adservices.service.stats.kanon.KAnonBackgroundJobStatusStats; 90 import com.android.adservices.service.stats.kanon.KAnonGetChallengeStatusStats; 91 import com.android.adservices.service.stats.kanon.KAnonImmediateSignJoinStatusStats; 92 import com.android.adservices.service.stats.kanon.KAnonInitializeStatusStats; 93 import com.android.adservices.service.stats.kanon.KAnonJoinStatusStats; 94 import com.android.adservices.service.stats.kanon.KAnonSignStatusStats; 95 import com.android.adservices.service.stats.pas.EncodingFetchStats; 96 import com.android.adservices.service.stats.pas.EncodingJobRunStats; 97 import com.android.adservices.service.stats.pas.EncodingJsExecutionStats; 98 import com.android.adservices.service.stats.pas.PersistAdSelectionResultCalledStats; 99 import com.android.adservices.service.stats.pas.UpdateSignalsApiCalledStats; 100 import com.android.adservices.service.stats.pas.UpdateSignalsProcessReportedStats; 101 import com.android.internal.annotations.GuardedBy; 102 import com.android.internal.annotations.VisibleForTesting; 103 import com.android.modules.utils.build.SdkLevel; 104 105 import java.util.Objects; 106 107 import javax.annotation.concurrent.ThreadSafe; 108 109 /** {@link AdServicesLogger} that log stats to StatsD. */ 110 @ThreadSafe 111 public class StatsdAdServicesLogger implements AdServicesLogger { 112 private static final int AD_SERVICES_TOPIC_IDS_FIELD_ID = 1; 113 114 @GuardedBy("SINGLETON_LOCK") 115 private static volatile StatsdAdServicesLogger sStatsdAdServicesLogger; 116 117 private static final Object SINGLETON_LOCK = new Object(); 118 119 @NonNull private final Flags mFlags; 120 121 @VisibleForTesting StatsdAdServicesLogger(@onNull Flags flags)122 StatsdAdServicesLogger(@NonNull Flags flags) { 123 this.mFlags = Objects.requireNonNull(flags); 124 } 125 126 /** Returns an instance of {@link StatsdAdServicesLogger}. */ getInstance()127 public static StatsdAdServicesLogger getInstance() { 128 if (sStatsdAdServicesLogger == null) { 129 synchronized (SINGLETON_LOCK) { 130 if (sStatsdAdServicesLogger == null) { 131 sStatsdAdServicesLogger = new StatsdAdServicesLogger(FlagsFactory.getFlags()); 132 } 133 } 134 } 135 return sStatsdAdServicesLogger; 136 } 137 getAllowlistedAppPackageName(String appPackageName)138 private String getAllowlistedAppPackageName(String appPackageName) { 139 if (!mFlags.getMeasurementEnableAppPackageNameLogging() 140 || !AllowLists.isPackageAllowListed( 141 mFlags.getMeasurementAppPackageNameLoggingAllowlist(), appPackageName)) { 142 return ""; 143 } 144 return appPackageName; 145 } 146 147 /** log method for measurement reporting. */ logMeasurementReports( MeasurementReportsStats measurementReportsStats, @Nullable String enrollmentId)148 public void logMeasurementReports( 149 MeasurementReportsStats measurementReportsStats, @Nullable String enrollmentId) { 150 AdServicesStatsLog.write( 151 measurementReportsStats.getCode(), 152 measurementReportsStats.getType(), 153 measurementReportsStats.getResultCode(), 154 measurementReportsStats.getFailureType(), 155 measurementReportsStats.getUploadMethod(), 156 measurementReportsStats.getReportingDelay(), 157 getAllowlistedAppPackageName(measurementReportsStats.getSourceRegistrant()), 158 measurementReportsStats.getRetryCount(), 159 /* httpResponseCode */ 0, 160 /* isMarkedForDeletion */ false, 161 /* isFakeReport */ measurementReportsStats.getIsFakeReport()); 162 } 163 164 /** log method for API call stats. */ logApiCallStats(ApiCallStats apiCallStats)165 public void logApiCallStats(ApiCallStats apiCallStats) { 166 AdServicesStatsLog.write( 167 apiCallStats.getCode(), 168 apiCallStats.getApiClass(), 169 apiCallStats.getApiName(), 170 apiCallStats.getAppPackageName(), 171 apiCallStats.getSdkPackageName(), 172 apiCallStats.getLatencyMillisecond(), 173 apiCallStats.getResultCode()); 174 } 175 176 /** log method for UI stats. */ logUIStats(UIStats uiStats)177 public void logUIStats(UIStats uiStats) { 178 AdServicesStatsLog.write( 179 uiStats.getCode(), 180 uiStats.getRegion(), 181 uiStats.getAction(), 182 uiStats.getDefaultConsent(), 183 uiStats.getDefaultAdIdState(), 184 /* @deprecated feature_type= */ 0, 185 uiStats.getUx(), 186 uiStats.getEnrollmentChannel()); 187 } 188 189 @Override logFledgeApiCallStats( int apiName, String appPackageName, int resultCode, int latencyMs)190 public void logFledgeApiCallStats( 191 int apiName, String appPackageName, int resultCode, int latencyMs) { 192 boolean enabled = BinderFlagReader.readFlag(mFlags::getFledgeAppPackageNameLoggingEnabled); 193 if (enabled && (appPackageName != null)) { 194 AdServicesStatsLog.write( 195 AD_SERVICES_API_CALLED, 196 AD_SERVICES_API_CALLED__API_CLASS__UNKNOWN, 197 apiName, 198 appPackageName, 199 "", 200 latencyMs, 201 resultCode); 202 } else { 203 logFledgeApiCallStats(apiName, resultCode, latencyMs); 204 } 205 } 206 207 @Override logFledgeApiCallStats(int apiName, int resultCode, int latencyMs)208 public void logFledgeApiCallStats(int apiName, int resultCode, int latencyMs) { 209 AdServicesStatsLog.write( 210 AD_SERVICES_API_CALLED, 211 AD_SERVICES_API_CALLED__API_CLASS__UNKNOWN, 212 apiName, 213 "", 214 "", 215 latencyMs, 216 resultCode); 217 } 218 219 @Override logMeasurementRegistrationsResponseSize( MeasurementRegistrationResponseStats stats, @Nullable String enrollmentId)220 public void logMeasurementRegistrationsResponseSize( 221 MeasurementRegistrationResponseStats stats, @Nullable String enrollmentId) { 222 AdServicesStatsLog.write( 223 stats.getCode(), 224 stats.getRegistrationType(), 225 stats.getResponseSize(), 226 stats.getAdTechDomain(), 227 stats.getInteractionType(), 228 stats.getSurfaceType(), 229 stats.getRegistrationStatus(), 230 stats.getFailureType(), 231 stats.getRegistrationDelay(), 232 getAllowlistedAppPackageName(stats.getSourceRegistrant()), 233 stats.getRetryCount(), 234 /* httpResponseCode */ 0, 235 stats.isRedirectOnly(), 236 stats.isPARequest(), 237 stats.getNumDeletedEntities(), 238 stats.isEventLevelEpsilonEnabled(), 239 stats.isTriggerAggregatableValueFiltersConfigured(), 240 stats.isTriggerFilteringIdConfigured(), 241 stats.isTriggerContextIdConfigured()); 242 } 243 244 @Override logRunAdSelectionProcessReportedStats(RunAdSelectionProcessReportedStats stats)245 public void logRunAdSelectionProcessReportedStats(RunAdSelectionProcessReportedStats stats) { 246 AdServicesStatsLog.write( 247 RUN_AD_SELECTION_PROCESS_REPORTED, 248 stats.getIsRemarketingAdsWon(), 249 stats.getDBAdSelectionSizeInBytes(), 250 stats.getPersistAdSelectionLatencyInMillis(), 251 stats.getPersistAdSelectionResultCode(), 252 stats.getRunAdSelectionLatencyInMillis(), 253 stats.getRunAdSelectionResultCode()); 254 } 255 256 @Override logRunAdBiddingProcessReportedStats(RunAdBiddingProcessReportedStats stats)257 public void logRunAdBiddingProcessReportedStats(RunAdBiddingProcessReportedStats stats) { 258 AdServicesStatsLog.write( 259 RUN_AD_BIDDING_PROCESS_REPORTED, 260 stats.getGetBuyersCustomAudienceLatencyInMills(), 261 stats.getGetBuyersCustomAudienceResultCode(), 262 stats.getNumBuyersRequested(), 263 stats.getNumBuyersFetched(), 264 stats.getNumOfAdsEnteringBidding(), 265 stats.getNumOfCasEnteringBidding(), 266 stats.getNumOfCasPostBidding(), 267 stats.getRatioOfCasSelectingRmktAds(), 268 stats.getRunAdBiddingLatencyInMillis(), 269 stats.getRunAdBiddingResultCode(), 270 stats.getTotalAdBiddingStageLatencyInMillis()); 271 } 272 273 @Override logRunAdScoringProcessReportedStats(RunAdScoringProcessReportedStats stats)274 public void logRunAdScoringProcessReportedStats(RunAdScoringProcessReportedStats stats) { 275 AdServicesStatsLog.write( 276 RUN_AD_SCORING_PROCESS_REPORTED, 277 stats.getGetAdSelectionLogicLatencyInMillis(), 278 stats.getGetAdSelectionLogicResultCode(), 279 stats.getGetAdSelectionLogicScriptType(), 280 stats.getFetchedAdSelectionLogicScriptSizeInBytes(), 281 stats.getGetTrustedScoringSignalsLatencyInMillis(), 282 stats.getGetTrustedScoringSignalsResultCode(), 283 stats.getFetchedTrustedScoringSignalsDataSizeInBytes(), 284 stats.getScoreAdsLatencyInMillis(), 285 stats.getGetAdScoresLatencyInMillis(), 286 stats.getGetAdScoresResultCode(), 287 stats.getNumOfCasEnteringScoring(), 288 stats.getNumOfRemarketingAdsEnteringScoring(), 289 stats.getNumOfContextualAdsEnteringScoring(), 290 stats.getRunAdScoringLatencyInMillis(), 291 stats.getRunAdScoringResultCode(), 292 stats.getScoreAdSellerAdditionalSignalsContainedDataVersion(), 293 stats.getScoreAdJsScriptResultCode()); 294 } 295 296 @Override logRunAdBiddingPerCAProcessReportedStats( RunAdBiddingPerCAProcessReportedStats stats)297 public void logRunAdBiddingPerCAProcessReportedStats( 298 RunAdBiddingPerCAProcessReportedStats stats) { 299 AdServicesStatsLog.write( 300 RUN_AD_BIDDING_PER_CA_PROCESS_REPORTED, 301 stats.getNumOfAdsForBidding(), 302 stats.getRunAdBiddingPerCaLatencyInMillis(), 303 stats.getRunAdBiddingPerCaResultCode(), 304 stats.getGetBuyerDecisionLogicLatencyInMillis(), 305 stats.getGetBuyerDecisionLogicResultCode(), 306 stats.getBuyerDecisionLogicScriptType(), 307 stats.getFetchedBuyerDecisionLogicScriptSizeInBytes(), 308 stats.getNumOfKeysOfTrustedBiddingSignals(), 309 stats.getFetchedTrustedBiddingSignalsDataSizeInBytes(), 310 stats.getGetTrustedBiddingSignalsLatencyInMillis(), 311 stats.getGetTrustedBiddingSignalsResultCode(), 312 stats.getGenerateBidsLatencyInMillis(), 313 stats.getRunBiddingLatencyInMillis(), 314 stats.getRunBiddingResultCode(), 315 stats.getRunAdBiddingPerCaReturnedAdCost(), 316 stats.getGenerateBidBuyerAdditionalSignalsContainedDataVersion(), 317 stats.getGenerateBidJsScriptResultCode()); 318 } 319 320 @Override logBackgroundFetchProcessReportedStats(BackgroundFetchProcessReportedStats stats)321 public void logBackgroundFetchProcessReportedStats(BackgroundFetchProcessReportedStats stats) { 322 AdServicesStatsLog.write( 323 BACKGROUND_FETCH_PROCESS_REPORTED, 324 stats.getLatencyInMillis(), 325 stats.getNumOfEligibleToUpdateCas(), 326 stats.getResultCode()); 327 } 328 329 @Override logUpdateCustomAudienceProcessReportedStats( UpdateCustomAudienceProcessReportedStats stats)330 public void logUpdateCustomAudienceProcessReportedStats( 331 UpdateCustomAudienceProcessReportedStats stats) { 332 AdServicesStatsLog.write( 333 UPDATE_CUSTOM_AUDIENCE_PROCESS_REPORTED, 334 stats.getLatencyInMills(), 335 stats.getResultCode(), 336 stats.getDataSizeOfAdsInBytes(), 337 stats.getNumOfAds()); 338 } 339 340 @Override logGetTopicsReportedStats(GetTopicsReportedStats stats)341 public void logGetTopicsReportedStats(GetTopicsReportedStats stats) { 342 int[] topicIds = new int[] {}; 343 if (stats.getTopicIds() != null) { 344 topicIds = stats.getTopicIds().stream().mapToInt(Integer::intValue).toArray(); 345 } 346 347 boolean isCompatLoggingEnabled = !mFlags.getCompatLoggingKillSwitch(); 348 if (isCompatLoggingEnabled) { 349 long modeBytesFieldId = 350 ProtoOutputStream.FIELD_COUNT_REPEATED // topic_ids field is repeated. 351 // topic_id is represented by int32 type. 352 | ProtoOutputStream.FIELD_TYPE_INT32 353 // Field ID of topic_ids field in AdServicesTopicIds proto. 354 | AD_SERVICES_TOPIC_IDS_FIELD_ID; 355 356 AdServicesStatsLog.write( 357 AD_SERVICES_BACK_COMPAT_GET_TOPICS_REPORTED, 358 // TODO(b/266626836) Add topic ids logging once long term solution is identified 359 stats.getDuplicateTopicCount(), 360 stats.getFilteredBlockedTopicCount(), 361 stats.getTopicIdsCount(), 362 toBytes(modeBytesFieldId, topicIds)); 363 } 364 365 // This atom can only be logged on T+ due to usage of repeated fields. See go/rbc-ww-logging 366 // for why we are temporarily double logging on T+.s 367 if (SdkLevel.isAtLeastT()) { 368 AdServicesStatsLog.write( 369 AD_SERVICES_GET_TOPICS_REPORTED, 370 topicIds, 371 stats.getDuplicateTopicCount(), 372 stats.getFilteredBlockedTopicCount(), 373 stats.getTopicIdsCount()); 374 } 375 } 376 377 @Override logEpochComputationGetTopTopicsStats(EpochComputationGetTopTopicsStats stats)378 public void logEpochComputationGetTopTopicsStats(EpochComputationGetTopTopicsStats stats) { 379 AdServicesStatsLog.write( 380 AD_SERVICES_EPOCH_COMPUTATION_GET_TOP_TOPICS_REPORTED, 381 stats.getTopTopicCount(), 382 stats.getPaddedRandomTopicsCount(), 383 stats.getAppsConsideredCount(), 384 stats.getSdksConsideredCount()); 385 } 386 387 @Override logEpochComputationClassifierStats(EpochComputationClassifierStats stats)388 public void logEpochComputationClassifierStats(EpochComputationClassifierStats stats) { 389 int[] topicIds = stats.getTopicIds().stream().mapToInt(Integer::intValue).toArray(); 390 391 boolean isCompatLoggingEnabled = !mFlags.getCompatLoggingKillSwitch(); 392 if (isCompatLoggingEnabled) { 393 long modeBytesFieldId = 394 ProtoOutputStream.FIELD_COUNT_REPEATED // topic_ids field is repeated. 395 // topic_id is represented by int32 type. 396 | ProtoOutputStream.FIELD_TYPE_INT32 397 // Field ID of topic_ids field in AdServicesTopicIds proto. 398 | AD_SERVICES_TOPIC_IDS_FIELD_ID; 399 400 AdServicesStatsLog.write( 401 AD_SERVICES_BACK_COMPAT_EPOCH_COMPUTATION_CLASSIFIER_REPORTED, 402 toBytes(modeBytesFieldId, topicIds), 403 stats.getBuildId(), 404 stats.getAssetVersion(), 405 stats.getClassifierType().getCompatLoggingValue(), 406 stats.getOnDeviceClassifierStatus().getCompatLoggingValue(), 407 stats.getPrecomputedClassifierStatus().getCompatLoggingValue()); 408 } 409 410 // This atom can only be logged on T+ due to usage of repeated fields. See go/rbc-ww-logging 411 // for why we are temporarily double logging on T+. 412 if (SdkLevel.isAtLeastT()) { 413 AdServicesStatsLog.write( 414 AD_SERVICES_EPOCH_COMPUTATION_CLASSIFIER_REPORTED, 415 topicIds, 416 stats.getBuildId(), 417 stats.getAssetVersion(), 418 stats.getClassifierType().getLoggingValue(), 419 stats.getOnDeviceClassifierStatus().getLoggingValue(), 420 stats.getPrecomputedClassifierStatus().getLoggingValue()); 421 } 422 } 423 424 @Override logMeasurementDebugKeysMatch(MsmtDebugKeysMatchStats stats)425 public void logMeasurementDebugKeysMatch(MsmtDebugKeysMatchStats stats) { 426 AdServicesStatsLog.write( 427 AD_SERVICES_MEASUREMENT_DEBUG_KEYS, 428 stats.getAdTechEnrollmentId(), 429 stats.getAttributionType(), 430 stats.isMatched(), 431 stats.getDebugJoinKeyHashedValue(), 432 stats.getDebugJoinKeyHashLimit(), 433 getAllowlistedAppPackageName(stats.getSourceRegistrant())); 434 } 435 436 @Override logMeasurementAdIdMatchForDebugKeysStats(MsmtAdIdMatchForDebugKeysStats stats)437 public void logMeasurementAdIdMatchForDebugKeysStats(MsmtAdIdMatchForDebugKeysStats stats) { 438 AdServicesStatsLog.write( 439 AD_SERVICES_MEASUREMENT_AD_ID_MATCH_FOR_DEBUG_KEYS, 440 stats.getAdTechEnrollmentId(), 441 stats.getAttributionType(), 442 stats.isMatched(), 443 stats.getNumUniqueAdIds(), 444 stats.getNumUniqueAdIdsLimit(), 445 getAllowlistedAppPackageName(stats.getSourceRegistrant())); 446 } 447 448 /** log method for measurement attribution. */ logMeasurementAttributionStats( MeasurementAttributionStats measurementAttributionStats, @Nullable String enrollmentId)449 public void logMeasurementAttributionStats( 450 MeasurementAttributionStats measurementAttributionStats, 451 @Nullable String enrollmentId) { 452 AdServicesStatsLog.write( 453 measurementAttributionStats.getCode(), 454 measurementAttributionStats.getSourceType(), 455 measurementAttributionStats.getSurfaceType(), 456 measurementAttributionStats.getResult(), 457 measurementAttributionStats.getFailureType(), 458 measurementAttributionStats.isSourceDerived(), 459 measurementAttributionStats.isInstallAttribution(), 460 measurementAttributionStats.getAttributionDelay(), 461 getAllowlistedAppPackageName(measurementAttributionStats.getSourceRegistrant()), 462 measurementAttributionStats.getAggregateReportCount(), 463 measurementAttributionStats.getAggregateDebugReportCount(), 464 measurementAttributionStats.getEventReportCount(), 465 measurementAttributionStats.getEventDebugReportCount(), 466 /* retryCount */ 0, 467 measurementAttributionStats.getNullAggregateReportCount()); 468 } 469 470 /** log method for measurement wipeout. */ logMeasurementWipeoutStats(MeasurementWipeoutStats measurementWipeoutStats)471 public void logMeasurementWipeoutStats(MeasurementWipeoutStats measurementWipeoutStats) { 472 AdServicesStatsLog.write( 473 measurementWipeoutStats.getCode(), 474 measurementWipeoutStats.getWipeoutType(), 475 getAllowlistedAppPackageName(measurementWipeoutStats.getSourceRegistrant())); 476 } 477 478 /** log method for measurement attribution. */ logMeasurementDelayedSourceRegistrationStats( MeasurementDelayedSourceRegistrationStats measurementDelayedSourceRegistrationStats)479 public void logMeasurementDelayedSourceRegistrationStats( 480 MeasurementDelayedSourceRegistrationStats measurementDelayedSourceRegistrationStats) { 481 AdServicesStatsLog.write( 482 measurementDelayedSourceRegistrationStats.getCode(), 483 measurementDelayedSourceRegistrationStats.getRegistrationStatus(), 484 measurementDelayedSourceRegistrationStats.getRegistrationDelay(), 485 getAllowlistedAppPackageName( 486 measurementDelayedSourceRegistrationStats.getRegistrant())); 487 } 488 489 /** Log method for measurement click verification. */ logMeasurementClickVerificationStats( MeasurementClickVerificationStats measurementClickVerificationStats)490 public void logMeasurementClickVerificationStats( 491 MeasurementClickVerificationStats measurementClickVerificationStats) { 492 AdServicesStatsLog.write( 493 AD_SERVICES_MEASUREMENT_CLICK_VERIFICATION, 494 measurementClickVerificationStats.getSourceType(), 495 measurementClickVerificationStats.isInputEventPresent(), 496 measurementClickVerificationStats.isSystemClickVerificationSuccessful(), 497 measurementClickVerificationStats.isSystemClickVerificationEnabled(), 498 measurementClickVerificationStats.getInputEventDelayMillis(), 499 measurementClickVerificationStats.getValidDelayWindowMillis(), 500 getAllowlistedAppPackageName( 501 measurementClickVerificationStats.getSourceRegistrant()), 502 measurementClickVerificationStats.isClickDeduplicationEnabled(), 503 measurementClickVerificationStats.isClickDeduplicationEnforced(), 504 measurementClickVerificationStats.getMaxSourcesPerClick(), 505 measurementClickVerificationStats 506 .isCurrentRegistrationUnderClickDeduplicationLimit()); 507 } 508 509 /** Logs measurement ODP registrations. */ logMeasurementOdpRegistrations(MeasurementOdpRegistrationStats stats)510 public void logMeasurementOdpRegistrations(MeasurementOdpRegistrationStats stats) { 511 AdServicesStatsLog.write( 512 stats.getCode(), stats.getRegistrationType(), stats.getRegistrationStatus()); 513 } 514 515 /** Logs measurement ODP API calls. */ logMeasurementOdpApiCall(MeasurementOdpApiCallStats stats)516 public void logMeasurementOdpApiCall(MeasurementOdpApiCallStats stats) { 517 AdServicesStatsLog.write(stats.getCode(), stats.getLatency(), stats.getApiCallStatus()); 518 } 519 520 /** log method for consent migrations. */ logConsentMigrationStats(ConsentMigrationStats stats)521 public void logConsentMigrationStats(ConsentMigrationStats stats) { 522 if (mFlags.getAdservicesConsentMigrationLoggingEnabled()) { 523 AdServicesStatsLog.write( 524 AD_SERVICES_CONSENT_MIGRATED, 525 stats.getMsmtConsent(), 526 stats.getTopicsConsent(), 527 stats.getFledgeConsent(), 528 true, 529 stats.getMigrationType().getMigrationTypeValue(), 530 stats.getRegion(), 531 stats.getMigrationStatus().getMigrationStatusValue()); 532 } 533 } 534 535 /** log method for read/write status of enrollment data. */ logEnrollmentDataStats(int mType, boolean mIsSuccessful, int mBuildId)536 public void logEnrollmentDataStats(int mType, boolean mIsSuccessful, int mBuildId) { 537 AdServicesStatsLog.write( 538 AD_SERVICES_ENROLLMENT_DATA_STORED, mType, mIsSuccessful, mBuildId); 539 } 540 541 /** log method for status of enrollment matching queries. */ logEnrollmentMatchStats(boolean mIsSuccessful, int mBuildId)542 public void logEnrollmentMatchStats(boolean mIsSuccessful, int mBuildId) { 543 AdServicesStatsLog.write(AD_SERVICES_ENROLLMENT_MATCHED, mIsSuccessful, mBuildId); 544 } 545 546 /** log method for status of enrollment downloads. */ logEnrollmentFileDownloadStats(boolean mIsSuccessful, int mBuildId)547 public void logEnrollmentFileDownloadStats(boolean mIsSuccessful, int mBuildId) { 548 AdServicesStatsLog.write(AD_SERVICES_ENROLLMENT_FILE_DOWNLOADED, mIsSuccessful, mBuildId); 549 } 550 551 /** log method for enrollment-related status_caller_not_found errors. */ logEnrollmentFailedStats( int mBuildId, int mDataFileGroupStatus, int mEnrollmentRecordCountInTable, String mQueryParameter, int mErrorCause)552 public void logEnrollmentFailedStats( 553 int mBuildId, 554 int mDataFileGroupStatus, 555 int mEnrollmentRecordCountInTable, 556 String mQueryParameter, 557 int mErrorCause) { 558 AdServicesStatsLog.write( 559 AD_SERVICES_ENROLLMENT_FAILED, 560 mBuildId, 561 mDataFileGroupStatus, 562 mEnrollmentRecordCountInTable, 563 mQueryParameter, 564 mErrorCause); 565 } 566 567 @Override logEnrollmentTransactionStats(AdServicesEnrollmentTransactionStats stats)568 public void logEnrollmentTransactionStats(AdServicesEnrollmentTransactionStats stats) { 569 AdServicesStatsLog.write( 570 AD_SERVICES_ENROLLMENT_TRANSACTION_STATS, 571 stats.transactionType().getValue(), 572 stats.transactionStatus().getValue(), 573 stats.transactionParameterCount(), 574 stats.transactionResultCount(), 575 stats.queryResultCount(), 576 stats.dataSourceRecordCountPre(), 577 stats.dataSourceRecordCountPost(), 578 stats.enrollmentFileBuildId(), 579 stats.latencyMs()); 580 } 581 582 /** Logs encryption key fetch stats. */ 583 @Override logEncryptionKeyFetchedStats(AdServicesEncryptionKeyFetchedStats stats)584 public void logEncryptionKeyFetchedStats(AdServicesEncryptionKeyFetchedStats stats) { 585 AdServicesStatsLog.write( 586 AD_SERVICES_ENCRYPTION_KEY_FETCHED, 587 stats.getFetchJobType().getValue(), 588 stats.getFetchStatus().getValue(), 589 stats.getIsFirstTimeFetch(), 590 stats.getAdtechEnrollmentId(), 591 "", 592 stats.getEncryptionKeyUrl()); 593 } 594 595 /** Logs encryption key datastore transaction ended stats. */ 596 @Override logEncryptionKeyDbTransactionEndedStats( AdServicesEncryptionKeyDbTransactionEndedStats stats)597 public void logEncryptionKeyDbTransactionEndedStats( 598 AdServicesEncryptionKeyDbTransactionEndedStats stats) { 599 AdServicesStatsLog.write( 600 AD_SERVICES_ENCRYPTION_KEY_DB_TRANSACTION_ENDED, 601 stats.getDbTransactionType().getValue(), 602 stats.getDbTransactionStatus().getValue(), 603 stats.getMethodName().getValue()); 604 } 605 606 /** Logs destinationRegisteredBeacon reported stats. */ 607 @Override logDestinationRegisteredBeaconsReportedStats( DestinationRegisteredBeaconsReportedStats stats)608 public void logDestinationRegisteredBeaconsReportedStats( 609 DestinationRegisteredBeaconsReportedStats stats) { 610 int[] attemptedKeySizesRangeType = new int[] {}; 611 if (stats.getAttemptedKeySizesRangeType() != null) { 612 attemptedKeySizesRangeType = 613 stats.getAttemptedKeySizesRangeType().stream() 614 .mapToInt( 615 DestinationRegisteredBeaconsReportedStats 616 .InteractionKeySizeRangeType 617 ::getValue) 618 .toArray(); 619 } 620 // TODO: b/325098723 - Add support for DestinationRegisteredBeacons for S- devices 621 if (SdkLevel.isAtLeastT()) { 622 AdServicesStatsLog.write( 623 DESTINATION_REGISTERED_BEACONS, 624 stats.getBeaconReportingDestinationType(), 625 stats.getAttemptedRegisteredBeacons(), 626 attemptedKeySizesRangeType, 627 stats.getTableNumRows(), 628 stats.getAdServicesStatusCode(), 629 // TODO: b/329720016 - implement and flag 630 0); 631 } 632 } 633 634 /** Logs beacon level reporting for ReportInteraction API called stats. */ 635 @Override logReportInteractionApiCalledStats(ReportInteractionApiCalledStats stats)636 public void logReportInteractionApiCalledStats(ReportInteractionApiCalledStats stats) { 637 AdServicesStatsLog.write( 638 REPORT_INTERACTION_API_CALLED, 639 stats.getBeaconReportingDestinationType(), 640 stats.getNumMatchingUris()); 641 } 642 643 /** Logs beacon level reporting for clearing interaction reporting table stats. */ 644 @Override logInteractionReportingTableClearedStats( InteractionReportingTableClearedStats stats)645 public void logInteractionReportingTableClearedStats( 646 InteractionReportingTableClearedStats stats) { 647 AdServicesStatsLog.write( 648 INTERACTION_REPORTING_TABLE_CLEARED, 649 stats.getNumUrisCleared(), 650 stats.getNumUnreportedUris()); 651 } 652 653 @Override logAppManifestConfigCall(AppManifestConfigCall call)654 public void logAppManifestConfigCall(AppManifestConfigCall call) { 655 AdServicesStatsLog.write( 656 APP_MANIFEST_CONFIG_HELPER_CALLED, call.packageName, call.api, call.result); 657 } 658 659 @Override logKAnonSignJoinStatus()660 public void logKAnonSignJoinStatus() { 661 // TODO(b/324564459): add logging for KAnon Sign Join 662 } 663 664 @Override logKAnonInitializeStats(KAnonInitializeStatusStats kAnonInitializeStatusStats)665 public void logKAnonInitializeStats(KAnonInitializeStatusStats kAnonInitializeStatusStats) { 666 AdServicesStatsLog.write( 667 K_ANON_INITIALIZE_STATUS_REPORTED, 668 kAnonInitializeStatusStats.getWasSuccessful(), 669 kAnonInitializeStatusStats.getKAnonAction(), 670 kAnonInitializeStatusStats.getKAnonActionFailureReason(), 671 kAnonInitializeStatusStats.getLatencyInMs()); 672 } 673 674 @Override logKAnonSignStats(KAnonSignStatusStats kAnonSignStatusStats)675 public void logKAnonSignStats(KAnonSignStatusStats kAnonSignStatusStats) { 676 AdServicesStatsLog.write( 677 K_ANON_SIGN_STATUS_REPORTED, 678 kAnonSignStatusStats.getWasSuccessful(), 679 kAnonSignStatusStats.getKAnonAction(), 680 kAnonSignStatusStats.getKAnonActionFailureReason(), 681 kAnonSignStatusStats.getBatchSize(), 682 kAnonSignStatusStats.getLatencyInMs()); 683 } 684 685 @Override logKAnonJoinStats(KAnonJoinStatusStats kAnonJoinStatusStats)686 public void logKAnonJoinStats(KAnonJoinStatusStats kAnonJoinStatusStats) { 687 AdServicesStatsLog.write( 688 K_ANON_JOIN_STATUS_REPORTED, 689 kAnonJoinStatusStats.getWasSuccessful(), 690 kAnonJoinStatusStats.getTotalMessages(), 691 kAnonJoinStatusStats.getNumberOfFailedMessages(), 692 kAnonJoinStatusStats.getLatencyInMs()); 693 } 694 695 @Override logKAnonBackgroundJobStats( KAnonBackgroundJobStatusStats kAnonBackgroundJobStatusStats)696 public void logKAnonBackgroundJobStats( 697 KAnonBackgroundJobStatusStats kAnonBackgroundJobStatusStats) { 698 AdServicesStatsLog.write( 699 K_ANON_BACKGROUND_JOB_STATUS_REPORTED, 700 kAnonBackgroundJobStatusStats.getKAnonJobResult(), 701 kAnonBackgroundJobStatusStats.getTotalMessagesAttempted(), 702 kAnonBackgroundJobStatusStats.getMessagesInDBLeft(), 703 kAnonBackgroundJobStatusStats.getMessagesFailedToJoin(), 704 kAnonBackgroundJobStatusStats.getMessagesFailedToSign(), 705 kAnonBackgroundJobStatusStats.getLatencyInMs()); 706 } 707 708 @Override logKAnonImmediateSignJoinStats( KAnonImmediateSignJoinStatusStats kAnonImmediateSignJoinStatusStats)709 public void logKAnonImmediateSignJoinStats( 710 KAnonImmediateSignJoinStatusStats kAnonImmediateSignJoinStatusStats) { 711 AdServicesStatsLog.write( 712 K_ANON_IMMEDIATE_SIGN_JOIN_STATUS_REPORTED, 713 kAnonImmediateSignJoinStatusStats.getKAnonJobResult(), 714 kAnonImmediateSignJoinStatusStats.getTotalMessagesAttempted(), 715 kAnonImmediateSignJoinStatusStats.getMessagesFailedToJoin(), 716 kAnonImmediateSignJoinStatusStats.getMessagesFailedToSign(), 717 kAnonImmediateSignJoinStatusStats.getLatencyInMs()); 718 } 719 720 @Override logKAnonGetChallengeJobStats( KAnonGetChallengeStatusStats kAnonGetChallengeStatusStats)721 public void logKAnonGetChallengeJobStats( 722 KAnonGetChallengeStatusStats kAnonGetChallengeStatusStats) { 723 AdServicesStatsLog.write( 724 K_ANON_KEY_ATTESTATION_STATUS_REPORTED, 725 kAnonGetChallengeStatusStats.getCertificateSizeInBytes(), 726 kAnonGetChallengeStatusStats.getResultCode(), 727 kAnonGetChallengeStatusStats.getLatencyInMs()); 728 } 729 730 @Override logGetAdSelectionDataApiCalledStats(GetAdSelectionDataApiCalledStats stats)731 public void logGetAdSelectionDataApiCalledStats(GetAdSelectionDataApiCalledStats stats) { 732 AdServicesStatsLog.write( 733 GET_AD_SELECTION_DATA_API_CALLED, 734 stats.getPayloadSizeKb(), 735 stats.getNumBuyers(), 736 stats.getStatusCode(), 737 stats.getServerAuctionCoordinatorSource(), 738 stats.getSellerMaxSizeKb(), 739 stats.getPayloadOptimizationResult().getValue(), 740 stats.getInputGenerationLatencyMs(), 741 stats.getCompressedBuyerInputCreatorVersion(), 742 stats.getNumReEstimations()); 743 } 744 745 @Override logGetAdSelectionDataBuyerInputGeneratedStats( GetAdSelectionDataBuyerInputGeneratedStats stats)746 public void logGetAdSelectionDataBuyerInputGeneratedStats( 747 GetAdSelectionDataBuyerInputGeneratedStats stats) { 748 AdServicesStatsLog.write( 749 GET_AD_SELECTION_DATA_BUYER_INPUT_GENERATED, 750 stats.getNumCustomAudiences(), 751 stats.getNumCustomAudiencesOmitAds(), 752 stats.getCustomAudienceSizeMeanB(), 753 stats.getCustomAudienceSizeVarianceB(), 754 stats.getTrustedBiddingSignalsKeysSizeMeanB(), 755 stats.getTrustedBiddingSignalsKeysSizeVarianceB(), 756 stats.getUserBiddingSignalsSizeMeanB(), 757 stats.getUserBiddingSignalsSizeVarianceB(), 758 stats.getNumEncodedSignals(), 759 stats.getEncodedSignalsSizeMean(), 760 stats.getEncodedSignalsSizeMax(), 761 stats.getEncodedSignalsSizeMin(), 762 stats.getNumCustomAudiencesWithComponentAds()); 763 } 764 765 @Override logEncodingJsFetchStats(EncodingFetchStats stats)766 public void logEncodingJsFetchStats(EncodingFetchStats stats) { 767 AdServicesStatsLog.write( 768 ENCODING_JS_FETCH, 769 stats.getJsDownloadTime(), 770 stats.getHttpResponseCode(), 771 stats.getFetchStatus(), 772 stats.getAdTechId()); 773 } 774 775 @Override logAdFilteringProcessJoinCAReportedStats( AdFilteringProcessJoinCAReportedStats stats)776 public void logAdFilteringProcessJoinCAReportedStats( 777 AdFilteringProcessJoinCAReportedStats stats) { 778 AdServicesStatsLog.write( 779 AD_FILTERING_PROCESS_JOIN_CA_REPORTED, 780 stats.getStatusCode(), 781 stats.getCountOfAdsWithKeysMuchSmallerThanLimitation(), 782 stats.getCountOfAdsWithKeysSmallerThanLimitation(), 783 stats.getCountOfAdsWithKeysEqualToLimitation(), 784 stats.getCountOfAdsWithKeysLargerThanLimitation(), 785 stats.getCountOfAdsWithEmptyKeys(), 786 stats.getCountOfAdsWithFiltersMuchSmallerThanLimitation(), 787 stats.getCountOfAdsWithFiltersSmallerThanLimitation(), 788 stats.getCountOfAdsWithFiltersEqualToLimitation(), 789 stats.getCountOfAdsWithFiltersLargerThanLimitation(), 790 stats.getCountOfAdsWithEmptyFilters(), 791 stats.getTotalNumberOfUsedKeys(), 792 stats.getTotalNumberOfUsedFilters()); 793 } 794 795 @Override logAdFilteringProcessAdSelectionReportedStats( AdFilteringProcessAdSelectionReportedStats stats)796 public void logAdFilteringProcessAdSelectionReportedStats( 797 AdFilteringProcessAdSelectionReportedStats stats) { 798 AdServicesStatsLog.write( 799 AD_FILTERING_PROCESS_AD_SELECTION_REPORTED, 800 stats.getLatencyInMillisOfAllAdFiltering(), 801 stats.getLatencyInMillisOfAppInstallFiltering(), 802 stats.getLatencyInMillisOfFcapFilters(), 803 stats.getStatusCode(), 804 stats.getNumOfAdsFilteredOutOfBidding(), 805 stats.getNumOfCustomAudiencesFilteredOutOfBidding(), 806 stats.getTotalNumOfAdsBeforeFiltering(), 807 stats.getTotalNumOfCustomAudiencesBeforeFiltering(), 808 stats.getNumOfPackageInAppInstallFilters(), 809 stats.getNumOfDbOperations(), 810 stats.getFilterProcessType(), 811 stats.getNumOfContextualAdsFiltered(), 812 stats.getNumOfAdCounterKeysInFcapFilters(), 813 stats.getNumOfContextualAdsFilteredOutOfBiddingInvalidSignatures(), 814 stats.getNumOfContextualAdsFilteredOutOfBiddingNoAds(), 815 stats.getTotalNumOfContextualAdsBeforeFiltering()); 816 } 817 818 @Override logAdCounterHistogramUpdaterReportedStats( AdCounterHistogramUpdaterReportedStats stats)819 public void logAdCounterHistogramUpdaterReportedStats( 820 AdCounterHistogramUpdaterReportedStats stats) { 821 AdServicesStatsLog.write( 822 AD_COUNTER_HISTOGRAM_UPDATER_REPORTED, 823 stats.getLatencyInMillis(), 824 stats.getStatusCode(), 825 stats.getTotalNumberOfEventsInDatabaseAfterInsert(), 826 stats.getNumberOfInsertedEvent(), 827 stats.getNumberOfEvictedEvent()); 828 } 829 830 @Override logTopicsEncryptionEpochComputationReportedStats( TopicsEncryptionEpochComputationReportedStats stats)831 public void logTopicsEncryptionEpochComputationReportedStats( 832 TopicsEncryptionEpochComputationReportedStats stats) { 833 AdServicesStatsLog.write( 834 TOPICS_ENCRYPTION_EPOCH_COMPUTATION_REPORTED, 835 stats.getCountOfTopicsBeforeEncryption(), 836 stats.getCountOfEmptyEncryptedTopics(), 837 stats.getCountOfEncryptedTopics(), 838 stats.getLatencyOfWholeEncryptionProcessMs(), 839 stats.getLatencyOfEncryptionPerTopicMs(), 840 stats.getLatencyOfPersistingEncryptedTopicsToDbMs()); 841 } 842 843 @Override logTopicsEncryptionGetTopicsReportedStats( TopicsEncryptionGetTopicsReportedStats stats)844 public void logTopicsEncryptionGetTopicsReportedStats( 845 TopicsEncryptionGetTopicsReportedStats stats) { 846 AdServicesStatsLog.write( 847 TOPICS_ENCRYPTION_GET_TOPICS_REPORTED, 848 stats.getCountOfEncryptedTopics(), 849 stats.getLatencyOfReadingEncryptedTopicsFromDbMs()); 850 } 851 852 @Override logShellCommandStats(ShellCommandStats stats)853 public void logShellCommandStats(ShellCommandStats stats) { 854 AdServicesStatsLog.write( 855 ADSERVICES_SHELL_COMMAND_CALLED, 856 stats.getCommand(), 857 stats.getResult(), 858 stats.getLatencyMillis()); 859 } 860 861 @Override logSignatureVerificationStats(SignatureVerificationStats stats)862 public void logSignatureVerificationStats(SignatureVerificationStats stats) { 863 AdServicesStatsLog.write( 864 SIGNATURE_VERIFICATION, 865 stats.getSerializationLatency(), 866 stats.getKeyFetchLatency(), 867 stats.getVerificationLatency(), 868 stats.getNumOfKeysFetched(), 869 stats.getSignatureVerificationStatus().getValue(), 870 stats.getFailedSignatureBuyerEnrollmentId(), 871 stats.getFailedSignatureSellerEnrollmentId(), 872 stats.getFailedSignatureCallerPackageName(), 873 stats.getFailureDetailUnknownError(), 874 stats.getFailureDetailNoEnrollmentDataForBuyer(), 875 stats.getFailureDetailNoKeysFetchedForBuyer(), 876 stats.getFailureDetailWrongSignatureFormat(), 877 stats.getFailureDetailCountOfKeysWithWrongFormat(), 878 stats.getFailureDetailCountOfKeysFailedToVerifySignature()); 879 } 880 881 @Override logUpdateSignalsApiCalledStats(UpdateSignalsApiCalledStats stats)882 public void logUpdateSignalsApiCalledStats(UpdateSignalsApiCalledStats stats) { 883 AdServicesStatsLog.write( 884 UPDATE_SIGNALS_API_CALLED, 885 stats.getHttpResponseCode(), 886 stats.getJsonSize(), 887 stats.getJsonProcessingStatus(), 888 stats.getPackageUid(), 889 stats.getAdTechId()); 890 } 891 892 @Override logEncodingJsExecutionStats(EncodingJsExecutionStats stats)893 public void logEncodingJsExecutionStats(EncodingJsExecutionStats stats) { 894 AdServicesStatsLog.write( 895 ENCODING_JS_EXECUTION, 896 stats.getJsLatency(), 897 stats.getEncodedSignalsSize(), 898 stats.getRunStatus(), 899 stats.getJsMemoryUsed(), 900 stats.getAdTechId()); 901 } 902 903 @Override logServerAuctionBackgroundKeyFetchScheduledStats( ServerAuctionBackgroundKeyFetchScheduledStats stats)904 public void logServerAuctionBackgroundKeyFetchScheduledStats( 905 ServerAuctionBackgroundKeyFetchScheduledStats stats) { 906 AdServicesStatsLog.write( 907 SERVER_AUCTION_BACKGROUND_KEY_FETCH_ENABLED, 908 stats.getStatus(), 909 stats.getCountAuctionUrls(), 910 stats.getCountJoinUrls()); 911 } 912 913 @Override logServerAuctionKeyFetchCalledStats(ServerAuctionKeyFetchCalledStats stats)914 public void logServerAuctionKeyFetchCalledStats(ServerAuctionKeyFetchCalledStats stats) { 915 AdServicesStatsLog.write( 916 SERVER_AUCTION_KEY_FETCH_CALLED, 917 stats.getSource(), 918 stats.getEncryptionKeySource(), 919 stats.getCoordinatorSource(), 920 stats.getNetworkStatusCode(), 921 stats.getNetworkLatencyMillis()); 922 } 923 924 @Override logEncodingJobRunStats(EncodingJobRunStats stats)925 public void logEncodingJobRunStats(EncodingJobRunStats stats) { 926 AdServicesStatsLog.write( 927 ENCODING_JOB_RUN, 928 stats.getSignalEncodingSuccesses(), 929 stats.getSignalEncodingFailures(), 930 stats.getSignalEncodingSkips(), 931 stats.getEncodingSourceType()); 932 } 933 934 @Override logPersistAdSelectionResultCalledStats(PersistAdSelectionResultCalledStats stats)935 public void logPersistAdSelectionResultCalledStats(PersistAdSelectionResultCalledStats stats) { 936 AdServicesStatsLog.write( 937 PERSIST_AD_SELECTION_RESULT_CALLED, 938 stats.getWinnerType(), 939 stats.getNumComponentAds()); 940 } 941 942 @Override logSelectAdsFromOutcomesApiCalledStats(SelectAdsFromOutcomesApiCalledStats stats)943 public void logSelectAdsFromOutcomesApiCalledStats(SelectAdsFromOutcomesApiCalledStats stats) { 944 AdServicesStatsLog.write( 945 SELECT_ADS_FROM_OUTCOMES_API_CALLED, 946 stats.getCountIds(), 947 stats.getCountNonExistingIds(), 948 stats.getUsedPrebuilt(), 949 stats.getDownloadResultCode(), 950 stats.getDownloadLatencyMillis(), 951 stats.getExecutionResultCode(), 952 stats.getExecutionLatencyMillis()); 953 } 954 955 @Override logReportImpressionApiCalledStats(ReportImpressionApiCalledStats stats)956 public void logReportImpressionApiCalledStats(ReportImpressionApiCalledStats stats) { 957 AdServicesStatsLog.write( 958 REPORT_IMPRESSION_API_CALLED, 959 stats.getReportWinBuyerAdditionalSignalsContainedAdCost(), 960 stats.getReportWinBuyerAdditionalSignalsContainedDataVersion(), 961 stats.getReportResultSellerAdditionalSignalsContainedDataVersion(), 962 stats.getReportWinJsScriptResultCode(), 963 stats.getReportResultJsScriptResultCode()); 964 } 965 966 @Override logUpdateSignalsProcessReportedStats(UpdateSignalsProcessReportedStats stats)967 public void logUpdateSignalsProcessReportedStats(UpdateSignalsProcessReportedStats stats) { 968 AdServicesStatsLog.write( 969 UPDATE_SIGNALS_PROCESS_REPORTED, 970 stats.getUpdateSignalsProcessLatencyMillis(), 971 stats.getAdservicesApiStatusCode(), 972 stats.getSignalsWrittenCount(), 973 stats.getKeysStoredCount(), 974 stats.getValuesStoredCount(), 975 stats.getEvictionRulesCount(), 976 stats.getPerBuyerSignalSize(), 977 stats.getMeanRawProtectedSignalsSizeBytes(), 978 stats.getMaxRawProtectedSignalsSizeBytes(), 979 stats.getMinRawProtectedSignalsSizeBytes()); 980 } 981 982 @Override logTopicsScheduleEpochJobSettingReportedStats( TopicsScheduleEpochJobSettingReportedStats stats)983 public void logTopicsScheduleEpochJobSettingReportedStats( 984 TopicsScheduleEpochJobSettingReportedStats stats) { 985 AdServicesStatsLog.write( 986 TOPICS_SCHEDULE_EPOCH_JOB_SETTING_REPORTED, 987 stats.getRescheduleEpochJobStatus(), 988 stats.getPreviousEpochJobSetting(), 989 stats.getCurrentEpochJobSetting(), 990 stats.getScheduleIfNeededEpochJobStatus()); 991 } 992 993 @Override logScheduledCustomAudienceUpdatePerformedStats( ScheduledCustomAudienceUpdatePerformedStats stats)994 public void logScheduledCustomAudienceUpdatePerformedStats( 995 ScheduledCustomAudienceUpdatePerformedStats stats) { 996 AdServicesStatsLog.write( 997 SCHEDULED_CUSTOM_AUDIENCE_UPDATE_PERFORMED, 998 stats.getNumberOfPartialCustomAudienceInRequest(), 999 stats.getNumberOfJoinCustomAudienceInResponse(), 1000 stats.getNumberOfCustomAudienceJoined(), 1001 stats.getNumberOfLeaveCustomAudienceInRequest(), 1002 stats.getNumberOfLeaveCustomAudienceInResponse(), 1003 stats.getNumberOfCustomAudienceLeft(), 1004 stats.getWasInitialHop(), 1005 stats.getNumberOfScheduleUpdatesInResponse(), 1006 stats.getNumberOfUpdatesScheduled()); 1007 } 1008 1009 @Override logScheduledCustomAudienceUpdateBackgroundJobStats( ScheduledCustomAudienceUpdateBackgroundJobStats stats)1010 public void logScheduledCustomAudienceUpdateBackgroundJobStats( 1011 ScheduledCustomAudienceUpdateBackgroundJobStats stats) { 1012 AdServicesStatsLog.write( 1013 SCHEDULED_CUSTOM_AUDIENCE_UPDATE_BACKGROUND_JOB_RAN, 1014 stats.getNumberOfUpdatesFound(), 1015 stats.getNumberOfSuccessfulUpdates()); 1016 } 1017 1018 @Override logScheduledCustomAudienceUpdateScheduleAttemptedStats( ScheduledCustomAudienceUpdateScheduleAttemptedStats stats)1019 public void logScheduledCustomAudienceUpdateScheduleAttemptedStats( 1020 ScheduledCustomAudienceUpdateScheduleAttemptedStats stats) { 1021 AdServicesStatsLog.write( 1022 SCHEDULED_CUSTOM_AUDIENCE_UPDATE_SCHEDULE_ATTEMPTED, 1023 stats.getNumberOfPartialCustomAudiences(), 1024 stats.getMinimumDelayInMinutes(), 1025 stats.getExistingUpdateStatus(), 1026 stats.getNumberOfLeaveCustomAudiences(), 1027 stats.isInitialHop()); 1028 } 1029 1030 @Override logScheduledCustomAudienceUpdatePerformedFailureStats( ScheduledCustomAudienceUpdatePerformedFailureStats stats)1031 public void logScheduledCustomAudienceUpdatePerformedFailureStats( 1032 ScheduledCustomAudienceUpdatePerformedFailureStats stats) { 1033 AdServicesStatsLog.write( 1034 SCHEDULED_CUSTOM_AUDIENCE_UPDATE_PERFORMED_ATTEMPTED_FAILURE_REPORTED, 1035 stats.getFailureType(), 1036 stats.getFailureAction()); 1037 } 1038 1039 @Override logNumberOfTypesOfReportingUrlsReceivedStats( NumberOfTypesOfReportingUrlsReceivedStats stats)1040 public void logNumberOfTypesOfReportingUrlsReceivedStats( 1041 NumberOfTypesOfReportingUrlsReceivedStats stats) { 1042 AdServicesStatsLog.write( 1043 NUMBER_OF_TYPES_OF_REPORTING_URL_RECEIVED, 1044 stats.getNumberOfTopLevelSellerReportingUrl(), 1045 stats.getNumberOfBuyerReportingUrl(), 1046 stats.getNumberOfComponentSellerReportingUrl(), 1047 stats.getNumberOfBuyerEventReportingUrl(), 1048 stats.getNumberOfTopLevelSellerEventReportingUrl(), 1049 stats.getNumberOfComponentSellerEventReportingUrl()); 1050 } 1051 1052 @Override logReportingWithDestinationPerformedStats( ReportingWithDestinationPerformedStats stats)1053 public void logReportingWithDestinationPerformedStats( 1054 ReportingWithDestinationPerformedStats stats) { 1055 AdServicesStatsLog.write( 1056 REPORTING_WITH_DESTINATION_PERFORMED, 1057 stats.getReportingType(), 1058 stats.getDestination(), 1059 stats.getStatus()); 1060 } 1061 1062 @NonNull toBytes(long fieldId, @NonNull int[] values)1063 private byte[] toBytes(long fieldId, @NonNull int[] values) { 1064 ProtoOutputStream protoOutputStream = new ProtoOutputStream(); 1065 for (int value : values) { 1066 protoOutputStream.write(fieldId, value); 1067 } 1068 return protoOutputStream.getBytes(); 1069 } 1070 } 1071