• 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.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