• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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