• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "base/log/event_report.h"
17 
18 #include <ctime>
19 #include <string>
20 #include <unistd.h>
21 
22 #include "hisysevent.h"
23 
24 #include "base/json/json_util.h"
25 #include "core/common/ace_application_info.h"
26 #include "core/common/ace_engine.h"
27 
28 namespace OHOS::Ace {
29 namespace {
30 
31 constexpr char EVENT_KEY_ERROR_TYPE[] = "ERROR_TYPE";
32 constexpr char EVENT_KEY_UID[] = "UID";
33 constexpr char EVENT_KEY_PID[] = "PID";
34 constexpr char EVENT_KEY_SESSIONID[] = "SESSION_ID";
35 constexpr char EVENT_KEY_PACKAGE_NAME[] = "PACKAGE_NAME";
36 constexpr char EVENT_KEY_PROCESS_NAME[] = "PROCESS_NAME";
37 constexpr char EVENT_KEY_MESSAGE[] = "MSG";
38 constexpr char EVENT_KEY_CMD[] = "CMD";
39 constexpr char EVENT_KEY_REASON[] = "REASON";
40 constexpr char EVENT_KEY_SUMMARY[] = "SUMMARY";
41 constexpr char EVENT_NAME_JS_ERROR[] = "JS_ERROR";
42 constexpr char STATISTIC_DURATION[] = "DURATION";
43 constexpr char EVENT_KEY_STARTTIME[] = "STARTTIME";
44 constexpr char EVENT_KEY_VERSION_CODE[] = "VERSION_CODE";
45 constexpr char EVENT_KEY_VERSION_NAME[] = "VERSION_NAME";
46 constexpr char EVENT_KEY_BUNDLE_NAME[] = "BUNDLE_NAME";
47 constexpr char EVENT_KEY_ABILITY_NAME[] = "ABILITY_NAME";
48 constexpr char EVENT_KEY_PAGE_URL[] = "PAGE_URL";
49 constexpr char EVENT_KEY_JANK_STATS[] = "JANK_STATS";
50 constexpr char EVENT_KEY_JANK_STATS_VER[] = "JANK_STATS_VER";
51 constexpr char EVENT_KEY_APP_PID[] = "APP_PID";
52 constexpr char EVENT_KEY_SCENE_ID[] = "SCENE_ID";
53 constexpr char EVENT_KEY_INPUT_TIME[] = "INPUT_TIME";
54 constexpr char EVENT_KEY_ANIMATION_START_LATENCY[] = "ANIMATION_START_LATENCY";
55 constexpr char EVENT_KEY_ANIMATION_END_LATENCY[] = "ANIMATION_END_LATENCY";
56 constexpr char EVENT_KEY_E2E_LATENCY[] = "E2E_LATENCY";
57 constexpr char EVENT_KEY_UNIQUE_ID[] = "UNIQUE_ID";
58 constexpr char EVENT_KEY_MODULE_NAME[] = "MODULE_NAME";
59 constexpr char EVENT_KEY_DURITION[] = "DURITION";
60 constexpr char EVENT_KEY_TOTAL_FRAMES[] = "TOTAL_FRAMES";
61 constexpr char EVENT_KEY_TOTAL_MISSED_FRAMES[] = "TOTAL_MISSED_FRAMES";
62 constexpr char EVENT_KEY_MAX_FRAMETIME[] = "MAX_FRAMETIME";
63 constexpr char EVENT_KEY_MAX_SEQ_MISSED_FRAMES[] = "MAX_SEQ_MISSED_FRAMES";
64 constexpr char EVENT_KEY_SOURCE_TYPE[] = "SOURCE_TYPE";
65 constexpr char EVENT_KEY_NOTE[] = "NOTE";
66 
67 constexpr int32_t MAX_PACKAGE_NAME_LENGTH = 128;
68 
69 constexpr char DUMP_LOG_COMMAND[] = "B";
70 
StrTrim(std::string & str)71 void StrTrim(std::string& str)
72 {
73     if (str.size() > MAX_PACKAGE_NAME_LENGTH) {
74         str = str.substr(0, MAX_PACKAGE_NAME_LENGTH);
75     }
76 }
77 
78 } // namespace
79 
SendEvent(const EventInfo & eventInfo)80 void EventReport::SendEvent(const EventInfo& eventInfo)
81 {
82     auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
83     if (packageName.size() > MAX_PACKAGE_NAME_LENGTH) {
84         StrTrim(packageName);
85     }
86     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventInfo.eventType,
87         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
88         EVENT_KEY_ERROR_TYPE, eventInfo.errorType,
89         EVENT_KEY_PACKAGE_NAME, packageName);
90 }
91 
SendJsCardRenderTimeEvent(const std::string & sessionID,const std::string & timeType,uint64_t timeDelay)92 void EventReport::SendJsCardRenderTimeEvent(
93     const std::string& sessionID,
94     const std::string& timeType,
95     uint64_t timeDelay)
96 {
97     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, timeType,
98         OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
99         EVENT_KEY_SESSIONID, sessionID,
100         STATISTIC_DURATION, timeDelay);
101 }
102 
SendAppStartException(AppStartExcepType type)103 void EventReport::SendAppStartException(AppStartExcepType type)
104 {
105     EventInfo eventInfo = {
106         .eventType = EXCEPTION_FRAMEWORK_APP_START,
107         .errorType = static_cast<int32_t>(type),
108     };
109 
110     SendEventInner(eventInfo);
111 }
112 
SendPageRouterException(PageRouterExcepType type,const std::string & pageUrl)113 void EventReport::SendPageRouterException(PageRouterExcepType type, const std::string& pageUrl)
114 {
115     EventInfo eventInfo = {
116         .eventType = EXCEPTION_FRAMEWORK_PAGE_ROUTER,
117         .errorType = static_cast<int32_t>(type),
118         .pageUrl = pageUrl,
119     };
120 
121     SendEventInner(eventInfo);
122 }
123 
SendComponentException(ComponentExcepType type)124 void EventReport::SendComponentException(ComponentExcepType type)
125 {
126     EventInfo eventInfo = {
127         .eventType = EXCEPTION_COMPONENT,
128         .errorType = static_cast<int32_t>(type),
129     };
130 
131     SendEventInner(eventInfo);
132 }
133 
SendAPIChannelException(APIChannelExcepType type)134 void EventReport::SendAPIChannelException(APIChannelExcepType type)
135 {
136     EventInfo eventInfo = {
137         .eventType = EXCEPTION_API_CHANNEL,
138         .errorType = static_cast<int32_t>(type),
139     };
140 
141     SendEventInner(eventInfo);
142 }
143 
SendRenderException(RenderExcepType type)144 void EventReport::SendRenderException(RenderExcepType type)
145 {
146     EventInfo eventInfo = {
147         .eventType = EXCEPTION_RENDER,
148         .errorType = static_cast<int32_t>(type),
149     };
150 
151     SendEventInner(eventInfo);
152 }
153 
SendJsException(JsExcepType type)154 void EventReport::SendJsException(JsExcepType type)
155 {
156     EventInfo eventInfo = {
157         .eventType = EXCEPTION_JS,
158         .errorType = static_cast<int32_t>(type),
159     };
160 
161     SendEventInner(eventInfo);
162 }
163 
SendAnimationException(AnimationExcepType type)164 void EventReport::SendAnimationException(AnimationExcepType type)
165 {
166     EventInfo eventInfo = {
167         .eventType = EXCEPTION_ANIMATION,
168         .errorType = static_cast<int32_t>(type),
169     };
170 
171     SendEventInner(eventInfo);
172 }
173 
SendEventException(EventExcepType type)174 void EventReport::SendEventException(EventExcepType type)
175 {
176     EventInfo eventInfo = {
177         .eventType = EXCEPTION_EVENT,
178         .errorType = static_cast<int32_t>(type),
179     };
180 
181     SendEventInner(eventInfo);
182 }
183 
SendInternalException(InternalExcepType type)184 void EventReport::SendInternalException(InternalExcepType type)
185 {
186     EventInfo eventInfo = {
187         .eventType = EXCEPTION_INTERNATIONALIZATION,
188         .errorType = static_cast<int32_t>(type),
189     };
190 
191     SendEventInner(eventInfo);
192 }
193 
SendAccessibilityException(AccessibilityExcepType type)194 void EventReport::SendAccessibilityException(AccessibilityExcepType type)
195 {
196     EventInfo eventInfo = {
197         .eventType = EXCEPTION_ACCESSIBILITY,
198         .errorType = static_cast<int32_t>(type),
199     };
200 
201     SendEventInner(eventInfo);
202 }
203 
SendFormException(FormExcepType type)204 void EventReport::SendFormException(FormExcepType type)
205 {
206     EventInfo eventInfo = {
207         .eventType = EXCEPTION_FORM,
208         .errorType = static_cast<int32_t>(type),
209     };
210 
211     SendEventInner(eventInfo);
212 }
213 
JsEventReport(int32_t eventType,const std::string & jsonStr)214 void EventReport::JsEventReport(int32_t eventType, const std::string& jsonStr)
215 {
216     if (!JsonUtil::ParseJsonString(jsonStr)) {
217         LOGE("jsonStr is not a JsonArray.");
218         return;
219     }
220 }
221 
JsErrReport(const std::string & packageName,const std::string & reason,const std::string & summary)222 void EventReport::JsErrReport(
223     const std::string& packageName, const std::string& reason, const std::string& summary)
224 {
225     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_NAME_JS_ERROR,
226         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
227         EVENT_KEY_PACKAGE_NAME, packageName,
228         EVENT_KEY_REASON, reason,
229         EVENT_KEY_SUMMARY, summary);
230 }
231 
ANRRawReport(RawEventType type,int32_t uid,const std::string & packageName,const std::string & processName,const std::string & msg)232 void EventReport::ANRRawReport(RawEventType type, int32_t uid, const std::string& packageName,
233     const std::string& processName, const std::string& msg)
234 {
235     int32_t pid = getpid();
236     std::string cmd = " ";
237     std::string eventName = "";
238     if (type == RawEventType::WARNING) {
239         eventName = "UI_BLOCK_3S";
240         cmd = "p=" + std::to_string(pid);
241     } else if (type == RawEventType::FREEZE) {
242         eventName = "UI_BLOCK_6S";
243         cmd = DUMP_LOG_COMMAND;
244     } else {
245         eventName = "UI_BLOCK_RECOVERED";
246     }
247     std::string uidStr = std::to_string(uid);
248     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
249         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
250         EVENT_KEY_UID, uidStr,
251         EVENT_KEY_PACKAGE_NAME, packageName,
252         EVENT_KEY_PROCESS_NAME, processName,
253         EVENT_KEY_MESSAGE, msg,
254         EVENT_KEY_CMD, cmd);
255 }
256 
ANRShowDialog(int32_t uid,const std::string & packageName,const std::string & processName,const std::string & msg)257 void EventReport::ANRShowDialog(int32_t uid, const std::string& packageName,
258     const std::string& processName, const std::string& msg)
259 {
260     int32_t pid = getpid();
261     std::string eventName = "UI_BLOCK_DIALOG";
262     std::string uidStr = std::to_string(uid);
263     std::string pidStr = std::to_string(pid);
264     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
265         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
266         EVENT_KEY_UID, uidStr,
267         EVENT_KEY_PID, pidStr,
268         EVENT_KEY_PACKAGE_NAME, packageName,
269         EVENT_KEY_PROCESS_NAME, processName,
270         EVENT_KEY_MESSAGE, msg);
271 }
272 
JankFrameReport(int64_t startTime,int64_t duration,const std::vector<uint16_t> & jank,const std::string & pageUrl,uint32_t jankStatusVersion)273 void EventReport::JankFrameReport(int64_t startTime, int64_t duration, const std::vector<uint16_t>& jank,
274     const std::string& pageUrl, uint32_t jankStatusVersion)
275 {
276     std::string eventName = "JANK_STATS_APP";
277     auto app_version_code = AceApplicationInfo::GetInstance().GetAppVersionCode();
278     auto app_version_name = AceApplicationInfo::GetInstance().GetAppVersionName();
279     auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
280     auto abilityName = AceApplicationInfo::GetInstance().GetAbilityName();
281     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
282         OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
283         EVENT_KEY_STARTTIME, startTime,
284         STATISTIC_DURATION, duration,
285         EVENT_KEY_VERSION_CODE, app_version_code,
286         EVENT_KEY_VERSION_NAME, app_version_name,
287         EVENT_KEY_BUNDLE_NAME, packageName,
288         EVENT_KEY_ABILITY_NAME, abilityName,
289         EVENT_KEY_PAGE_URL, pageUrl,
290         EVENT_KEY_JANK_STATS, jank,
291         EVENT_KEY_JANK_STATS_VER, jankStatusVersion);
292 }
293 
SendEventInner(const EventInfo & eventInfo)294 void EventReport::SendEventInner(const EventInfo& eventInfo)
295 {
296     auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
297     StrTrim(packageName);
298     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventInfo.eventType,
299             OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
300             EVENT_KEY_ERROR_TYPE, eventInfo.errorType,
301             EVENT_KEY_PACKAGE_NAME, packageName);
302 }
303 
ReportEventComplete(DataBase & data)304 void EventReport::ReportEventComplete(DataBase& data)
305 {
306     std::string eventName = "INTERACTION_COMPLETED_LATENCY";
307     const auto& appPid = data.baseInfo.pid;
308     const auto& bundleName = data.baseInfo.bundleName;
309     const auto& processName = data.baseInfo.processName;
310     const auto& abilityName = data.baseInfo.abilityName;
311     const auto& pageUrl = data.baseInfo.pageUrl;
312     const auto& versionCode = data.baseInfo.versionCode;
313     const auto& versionName = data.baseInfo.versionName;
314     const auto& sceneId = data.sceneId;
315     const auto& sourceType = GetSourceTypeName(data.sourceType);
316     auto inputTime = data.inputTime;
317     ConvertRealtimeToSystime(data.inputTime, inputTime);
318     const auto& animationStartLantency = (data.beginVsyncTime - data.inputTime) / NS_TO_MS;
319     const auto& animationEndLantency = (data.endVsyncTime - data.beginVsyncTime) / NS_TO_MS;
320     const auto& e2eLatency = animationStartLantency + animationEndLantency;
321     const auto& note = data.baseInfo.note;
322     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
323         OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
324         EVENT_KEY_APP_PID, appPid,
325         EVENT_KEY_BUNDLE_NAME, bundleName,
326         EVENT_KEY_PROCESS_NAME, processName,
327         EVENT_KEY_ABILITY_NAME, abilityName,
328         EVENT_KEY_PAGE_URL, pageUrl,
329         EVENT_KEY_VERSION_CODE, versionCode,
330         EVENT_KEY_VERSION_NAME, versionName,
331         EVENT_KEY_SCENE_ID, sceneId,
332         EVENT_KEY_SOURCE_TYPE, sourceType,
333         EVENT_KEY_INPUT_TIME, static_cast<uint64_t>(inputTime),
334         EVENT_KEY_ANIMATION_START_LATENCY, static_cast<uint64_t>(animationStartLantency),
335         EVENT_KEY_ANIMATION_END_LATENCY, static_cast<uint64_t>(animationEndLantency),
336         EVENT_KEY_E2E_LATENCY, static_cast<uint64_t>(e2eLatency),
337         EVENT_KEY_NOTE, note);
338 }
339 
ReportEventJankFrame(DataBase & data)340 void EventReport::ReportEventJankFrame(DataBase& data)
341 {
342     std::string eventName = "INTERACTION_APP_JANK";
343     const auto& uniqueId = data.beginVsyncTime / NS_TO_MS;
344     const auto& sceneId = data.sceneId;
345     const auto& bundleName = data.baseInfo.bundleName;
346     const auto& processName = data.baseInfo.processName;
347     const auto& abilityName = data.baseInfo.abilityName;
348     const auto& pageUrl = data.baseInfo.pageUrl;
349     const auto& versionCode = data.baseInfo.versionCode;
350     const auto& versionName = data.baseInfo.versionName;
351     auto startTime = data.beginVsyncTime;
352     ConvertRealtimeToSystime(data.beginVsyncTime, startTime);
353     const auto& durition = (data.endVsyncTime - data.beginVsyncTime) / NS_TO_MS;
354     const auto& totalFrames = data.totalFrames;
355     const auto& totalMissedFrames = data.totalMissed;
356     const auto& maxFrameTime = data.maxFrameTime / NS_TO_MS;
357     const auto& maxSeqMissedFrames = data.maxSuccessiveFrames;
358     const auto& note = data.baseInfo.note;
359     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
360         OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
361         EVENT_KEY_UNIQUE_ID, static_cast<int32_t>(uniqueId),
362         EVENT_KEY_SCENE_ID, sceneId,
363         EVENT_KEY_PROCESS_NAME, processName,
364         EVENT_KEY_MODULE_NAME, bundleName,
365         EVENT_KEY_ABILITY_NAME, abilityName,
366         EVENT_KEY_PAGE_URL, pageUrl,
367         EVENT_KEY_VERSION_CODE, versionCode,
368         EVENT_KEY_VERSION_NAME, versionName,
369         EVENT_KEY_STARTTIME, static_cast<uint64_t>(startTime),
370         EVENT_KEY_DURITION, static_cast<uint64_t>(durition),
371         EVENT_KEY_TOTAL_FRAMES, totalFrames,
372         EVENT_KEY_TOTAL_MISSED_FRAMES, totalMissedFrames,
373         EVENT_KEY_MAX_FRAMETIME, static_cast<uint64_t>(maxFrameTime),
374         EVENT_KEY_MAX_SEQ_MISSED_FRAMES, maxSeqMissedFrames,
375         EVENT_KEY_NOTE, note);
376 }
377 } // namespace OHOS::Ace
378