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.profiling; 18 19 import android.annotation.NonNull; 20 import android.os.Trace; 21 22 import com.android.adservices.LogUtil; 23 24 import java.io.IOException; 25 import java.util.concurrent.ThreadLocalRandom; 26 27 /** Utility class providing methods for using {@link android.os.Trace}. */ 28 public final class Tracing { 29 public static final String DB_CUSTOM_AUDIENCE_TO_JSON = "DBCustomAudience#toJson"; 30 public static final String DB_CUSTOM_AUDIENCE_FROM_JSON = "DBCustomAudience#fromJson"; 31 public static final String ROOM_CONVERT_INTEGER_SET_TO_JSON = 32 "FledgeRoomConverters#integerSetToJson"; 33 public static final String ROOM_CONVERT_INTEGER_SET_FROM_JSON = 34 "FledgeRoomConverters#integerSetFromJson"; 35 public static final String ROOM_CONVERT_STRING_SET_TO_JSON = 36 "FledgeRoomConverters#stringSetToJson"; 37 public static final String ROOM_CONVERT_STRING_SET_FROM_JSON = 38 "FledgeRoomConverters#stringSetFromJson"; 39 public static final String ROOM_CONVERT_INSTANT_TO_LONG = "FledgeRoomConverters#instantToLong"; 40 public static final String ROOM_CONVERT_INSTANT_FROM_LONG = 41 "FledgeRoomConverters#instantFromLong"; 42 public static final String ROOM_CONVERT_URI_TO_STRING = "FledgeRoomConverters#uriToString"; 43 public static final String ROOM_CONVERT_URI_FROM_STRING = "FledgeRoomConverters#uriFromString"; 44 public static final String ROOM_CONVERT_ADTECHIDENTIFIER_TO_STRING = 45 "FledgeRoomConverters#adTechIdentifierToString"; 46 public static final String ROOM_CONVERT_ADTECHIDENTIFIER_FROM_STRING = 47 "FledgeRoomConverters#adTechIdentifierFromString"; 48 public static final String ROOM_CONVERT_ADSELECTIONSIGNALS_TO_STRING = 49 "FledgeRoomConverters#adSelectionSignalsToString"; 50 public static final String ROOM_CONVERT_ADSELECTIONSIGNALS_FROM_STRING = 51 "FledgeRoomConverters#adSelectionSignalsFromString"; 52 public static final String ROOM_CONVERT_EVICTIONPRIORITY_TO_INT = 53 "FledgeRoomConverters#evictionPriorityToInt"; 54 public static final String ROOM_CONVERT_EVICTIONPRIORITY_FROM_INT = 55 "FledgeRoomConverters#evictionPriorityFromInt"; 56 public static final String AD_SELECTION_SERVICE_FILTER = 57 "AdSelectionServiceFilter#filterRequest"; 58 public static final String GET_AD_SELECTION_DATA_OFF_BINDER_THREAD = 59 "AdSelectionServiceImpl#getAdSelectionData_offBinder"; 60 public static final String GET_AD_SELECTION_ON_DATA_BINDER_THREAD = 61 "AdSelectionServiceImpl#getAdSelectionData_onBinder"; 62 public static final String COMPRESSED_INPUT_BUILD_SIGNALS_PROTO = 63 "CompressedInput_buildSignalsProto"; 64 public static final String COMPRESSED_INPUT_BUILD_CA_PROTO = "CompressedInput_buildCAProto"; 65 public static final String COMPRESSED_INPUT_SERIALIZE_AND_COMPRESS_INPUT = 66 "CompressedInput_serializeAndCompressInput"; 67 public static final String COMPRESSED_INPUT_SERIALIZE_INPUT = "CompressedInput_serializeInput"; 68 public static final String COMPRESSED_INPUT_COMPRESS_INPUT = "CompressedInput_compressInput"; 69 public static final String FILTERER_FILTER_CA = "FrequencyCapAdFilterer#FilterCustomAudiences"; 70 public static final String FILTERER_FOR_EACH_CA = 71 "FrequencyCapAdFilterer#ForEachCustomAudience"; 72 public static final String FILTERER_FOR_EACH_AD = "FrequencyCapAdFilterer#ForEachAd"; 73 public static final String FILTERER_FREQUENCY_CAP = 74 "FrequencyCapAdFilterer#doesAdPassFrequencyCapFilters"; 75 public static final String FILTERER_FREQUENCY_CAP_WIN = 76 "FrequencyCapAdFilterer#doesAdPassFrequencyCapFiltersForWinType"; 77 public static final String FREQUENCY_CAP_GET_NUM_EVENTS_CA = 78 "FrequencyCapDao#getNumEventsForCustomAudienceAfterTime"; 79 public static final String FREQUENCY_CAP_GET_NUM_EVENTS_BUYER = 80 "FrequencyCapDao#getNumEventsForBuyerAfterTime"; 81 public static final String FILTERER_FREQUENCY_CAP_NON_WIN = 82 "FrequencyCapAdFilterer#doesAdPassFrequencyCapFiltersForNonWinType"; 83 public static final String FILTERER_FILTER_CONTEXTUAL = 84 "FrequencyCapAdFilterer#FilterContextualAds"; 85 public static final String RUN_AD_SELECTION = "RunOnDeviceAdSelection"; 86 public static final String PERSIST_AD_SELECTION = "PersistOnDeviceAdSelection"; 87 public static final String GET_BUYERS_CUSTOM_AUDIENCE = "GetBuyersCustomAudience"; 88 public static final String VALIDATE_REQUEST = "ValidateRequest"; 89 public static final String GET_BUYER_DECISION_LOGIC = "GetBuyerDecisionLogic"; 90 public static final String GET_TRUSTED_BIDDING_SIGNALS = "GetTrustedBiddingSignals"; 91 public static final String RUN_BIDDING = "RunBidding"; 92 public static final String RUN_BIDDING_PER_CA = "RunBiddingPerCustomAudience"; 93 public static final String RUN_AD_SCORING = "RunAdScoring"; 94 public static final String GET_AD_SELECTION_LOGIC = "GetAdSelectionLogic"; 95 public static final String GET_TRUSTED_SCORING_SIGNALS = "GetTrustedScoringSignals"; 96 public static final String SCORE_AD = "ScoreAd"; 97 public static final String RUN_OUTCOME_SELECTION = "RunAdOutcomeSelection"; 98 public static final String GENERATE_BIDS = "GenerateBids"; 99 public static final String FETCH_PAYLOAD = "FetchPayload"; 100 public static final String CACHE_GET = "CacheGet"; 101 public static final String CACHE_PUT = "CachePut"; 102 public static final String HTTP_REQUEST = "HttpRequest"; 103 public static final String JSSCRIPTENGINE_CREATE_ISOLATE = "JSScriptEngine#createIsolate"; 104 public static final String JSSCRIPTENGINE_EVALUATE_ON_SANDBOX = 105 "JSScriptEngine#evaluateOnSandbox"; 106 public static final String JSSCRIPTENGINE_CLOSE_ISOLATE = "JSScriptEngine#closeIsolate"; 107 public static final String PERSIST_AD_SELECTION_RESULT = 108 "AdSelectionServiceImpl#persistAdSelectionResult"; 109 public static final String ORCHESTRATE_PERSIST_AD_SELECTION_RESULT = 110 "PersistAdSelectionResultRunner#orchestratePersistAdSelectionResultRunner"; 111 public static final String PERSIST_AUCTION_RESULTS = 112 "PersistAdSelectionResultRunner#persistAuctionResults"; 113 public static final String OHTTP_DECRYPT_BYTES = "PersistAdSelectionResultRunner#decryptBytes"; 114 public static final String PARSE_AD_SELECTION_RESULT = 115 "PersistAdSelectionResultRunner#parseAdSelectionResult"; 116 public static final String GET_AD_SELECTION_DATA = "AdSelectionServiceImpl#getAdSelectionData"; 117 public static final String GET_BUYERS_CA = "BuyerInputGenerator#getBuyersCustomAudience"; 118 public static final String GET_FILTERED_BUYERS_CA = 119 "BuyerInputGenerator#getFilteredCustomAudiences"; 120 public static final String GET_BUYERS_PS = "BuyerInputGenerator#getBuyersProtectedSignals"; 121 public static final String GET_COMPRESSED_BUYERS_INPUTS = 122 "BuyerInputGenerator#getCompressedBuyerInputs"; 123 public static final String AUCTION_SERVER_GZIP_COMPRESS = 124 "AuctionServerDataCompressorGzip#compress"; 125 public static final String FORMAT_PAYLOAD_V0 = "AuctionServerPayloadFormatterV0#apply"; 126 public static final String FORMAT_PAYLOAD_EXCESSIVE_MAX_SIZE = 127 "AuctionServerPayloadFormatterExcessiveMaxSize#apply"; 128 public static final String FORMAT_PAYLOAD_EXACT_SIZE = 129 "AuctionServerPayloadFormatterExactSize#apply"; 130 public static final String CREATE_BUYER_INPUTS = "BuyerInputGenerator#createBuyerInputs"; 131 public static final String CREATE_GET_AD_SELECTION_DATA_PAYLOAD = 132 "GetAdSelectionDataRunner#createPayload"; 133 public static final String ORCHESTRATE_GET_AD_SELECTION_DATA = 134 "GetAdSelectionDataRunner#orchestrateGetAdSelectionDataRunner"; 135 public static final String PERSIST_AD_SELECTION_ID_REQUEST = 136 "GetAdSelectionDataRunner#persistAdSelectionIdRequest"; 137 public static final String GET_LATEST_OHTTP_KEY_CONFIG = 138 "AdSelectionEncryptionKeyManager#getLatestOhttpKeyConfigOfType"; 139 public static final String CREATE_AND_SERIALIZE_REQUEST = 140 "ObliviousHttpEncryptorImpl#createAndSerializeRequest"; 141 public static final String OHTTP_ENCRYPT_BYTES = "ObliviousHttpEncryptorImpl#encryptBytes"; 142 public static final String RUN_ENCODING_PER_BUYER = 143 "PeriodicEncodingJobWorker#runEncodingPerBuyer"; 144 public static final String VALIDATE_AND_PERSIST_PAYLOAD = 145 "PeriodicEncodingJobWorker#validateAndPersistPayload"; 146 public static final String UPDATE_ENCODERS_FOR_BUYERS = 147 "PeriodicEncodingJobWorker#doUpdateEncodersForBuyers"; 148 public static final String DO_ENCODING_FOR_REGISTERED_BUYERS = 149 "PeriodicEncodingJobWorker#doEncodingForRegisteredBuyers"; 150 public static final String RUN_WORKER = "PeriodicEncodingJobWorker#doRun"; 151 public static final String START_JOB = "PeriodicEncodingJobService#onStartJob"; 152 public static final String MARSHAL_TO_JSON = "ProtectedSignalsArgumentUtil#marshalToJson"; 153 public static final String SERIALIZE_TO_JSON = 154 "ProtectedSignalsArgumentUtil#serializeEntryToJson"; 155 public static final String SERIALIZE_BASE_64 = 156 "ProtectedSignalsArgumentUtil#validateAndSerializeBase64"; 157 public static final String GET_BUYER_SIGNALS = "SignalsProviderImpl#getSignals"; 158 public static final String ENCODE_SIGNALS = "SignalsScriptEngine#encodeSignals"; 159 public static final String CONVERT_JS_OUTPUT_TO_BINARY = 160 "SignalsScriptEngine#handleEncodingOutput"; 161 public static final String JS_ARRAY_ARG = "JSScriptArgument#jsonArrayArg"; 162 public static final String JS_ARRAY_ARG_NO_VALIDATION = 163 "JSScriptArgument#jsonArrayArgNoValidation"; 164 public static final String GET_ALL_ENCODERS = "EncoderLogicHandler#getAllRegisteredEncoders"; 165 public static final String GET_ENCODER_FOR_BUYER = "EncoderLogicHandler#getEncoder"; 166 public static final String UPDATE_FAILED_ENCODING = 167 "EncoderLogicHandler#updateEncoderFailedCount"; 168 public static final String SAVE_BUYERS_ENCODER = "EncoderLogicHandler#extractAndPersistEncoder"; 169 public static final String DOWNLOAD_AND_UPDATE_ENCODER = 170 "EncoderLogicHandler#downloadAndUpdate"; 171 172 private static final String PERFETTO_TRIGGER_COMMAND = "/system/bin/trigger_perfetto"; 173 174 /** 175 * Begins an asynchronous trace and generates random cookie. 176 * 177 * @param sectionName used to identify trace type. 178 * @return unique cookie for identifying trace. 179 */ beginAsyncSection(@onNull String sectionName)180 public static int beginAsyncSection(@NonNull String sectionName) { 181 if (!Trace.isEnabled()) { 182 return -1; 183 } 184 int traceCookie = ThreadLocalRandom.current().nextInt(); 185 Trace.beginAsyncSection(sectionName, traceCookie); 186 return traceCookie; 187 } 188 189 /** 190 * Ends an asynchronous trace section. 191 * 192 * @param sectionName used to identify trace type. 193 * @param traceCookie unique cookie for identifying trace. 194 */ endAsyncSection(@onNull String sectionName, int traceCookie)195 public static void endAsyncSection(@NonNull String sectionName, int traceCookie) { 196 Trace.endAsyncSection(sectionName, traceCookie); 197 } 198 199 /** 200 * Notifies perfetto to start AOT given a trace event. This can be an expensive operation so 201 * only use it to record failures but not general trace events. 202 * 203 * @param triggerEvent name of Perfetto trigger event. 204 */ triggerPerfetto(String triggerEvent)205 public static void triggerPerfetto(String triggerEvent) { 206 try { 207 ProcessBuilder pb = new ProcessBuilder(PERFETTO_TRIGGER_COMMAND, triggerEvent); 208 LogUtil.d("Triggering perfetto with " + triggerEvent); 209 pb.start(); 210 } catch (IOException e) { 211 LogUtil.e("Failed to trigger perfetto with " + triggerEvent, e); 212 } 213 } 214 } 215