1 /*
2 * Copyright (c) 2024 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 "ecmascript/platform/dfx_hisys_event.h"
17 #ifdef ENABLE_HISYSEVENT
18 #include "hisysevent.h"
19 #endif
20 #ifdef ENABLE_UCOLLECTION
21 #include "cpu_collector_client.h"
22 #endif
23 #include "ecmascript/pgo_profiler/pgo_profiler_manager.h"
24 #include "ecmascript/log.h"
25
26 namespace panda::ecmascript {
27 using PGOProfilerManager = pgo::PGOProfilerManager;
28
SendLongGCEvent(LongGCStats * longGCStats)29 void DFXHiSysEvent::SendLongGCEvent([[maybe_unused]] LongGCStats *longGCStats)
30 {
31 #ifdef ENABLE_HISYSEVENT
32 LOG_GC(DEBUG) << "SendLongGCEvent: GC_TYPE" << longGCStats->GetGCType()
33 << ";GC_REASON" << longGCStats->GetGCReason()
34 << ";GC_IS_SENSITIVE" << longGCStats->GetGCIsSensitive()
35 << ";GC_TOTAL_TIME" << longGCStats->GetGCTotalTime();
36 int32_t ret = HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ARKTS_RUNTIME,
37 "ARK_GC_LONG_TIME", OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
38 "BUNDLE_NAME", PGOProfilerManager::GetInstance()->GetBundleName(),
39 "PID", getpid(),
40 "TID", syscall(SYS_gettid),
41 "GC_TYPE", longGCStats->GetGCType(),
42 "GC_REASON", longGCStats->GetGCReason(),
43 "GC_IS_SENSITIVE", static_cast<int>(longGCStats->GetGCIsSensitive()),
44 "GC_IS_INBACKGROUND", static_cast<int>(longGCStats->GetGCIsInBackground()),
45 "GC_TOTAL_TIME", longGCStats->GetGCTotalTime(),
46 "GC_MARK_TIME", longGCStats->GetGCMarkTime(),
47 "GC_EVACUATE_TIME", longGCStats->GetGCEvacuateTime(),
48 "GC_UPDATE_ROOT_TIME", longGCStats->GetGCUpdateRootTime(),
49 "GC_UPDATE_WEEKREF_TIME", longGCStats->GetGCUpdateWeekRefTime(),
50 "GC_UPDATE_REFERENCE_TIME", longGCStats->GetGCUpdateReferenceTime(),
51 "GC_SWEEPNEWTOOLD_TIME", longGCStats->GetGCSweepNewToOldTime(),
52 "GC_FINALIZE_TIME", longGCStats->GetGCFinalizeTime(),
53 "GC_INVOKE_CALLBACK_TIME", longGCStats->GetGCInvokeCallbackTime(),
54 "BEFORE_GC_TOTAL_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCTotalMemUsed()),
55 "BEFORE_GC_TOTAL_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCTotalMemCommitted()),
56 "BEFORE_GC_ACTIVE_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCActiveMemUsed()),
57 "BEFORE_GC_ACTIVE_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCActiveMemCommitted()),
58 "BEFORE_GC_OLD_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCOldMemUsed()),
59 "BEFORE_GC_OLD_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCOldMemCommitted()),
60 "BEFORE_GC_HUGE_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCHugeMemUsed()),
61 "BEFORE_GC_HUGE_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCHugeMemCommitted()),
62 "BEFORE_GC_NATIVE_BINDING_SIZE", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCNativeBindingSize()),
63 "BEFORE_GC_NATIVE_LIMIT", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCNativeLimit()),
64 "AFTER_GC_TOTAL_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCTotalMemUsed()),
65 "AFTER_GC_TOTAL_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCTotalMemCommitted()),
66 "AFTER_GC_ACTIVE_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCActiveMemUsed()),
67 "AFTER_GC_ACTIVE_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCActiveMemCommitted()),
68 "AFTER_GC_OLD_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCOldMemUsed()),
69 "AFTER_GC_OLD_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCOldMemCommitted()),
70 "AFTER_GC_HUGE_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCHugeMemUsed()),
71 "AFTER_GC_HUGE_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCHugeMemCommitted()),
72 "AFTER_GC_NATIVE_BINDING_SIZE", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCNativeBindingSize()),
73 "AFTER_GC_NATIVE_LIMIT", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCNativeLimit()),
74 "CPU_LOAD", longGCStats->GetCpuLoad());
75 if (ret != 0) {
76 LOG_GC(ERROR) << "GCKeyStats HiSysEventWrite ARK_GC_LONG_TIME Failed! ret = " << ret;
77 }
78 #endif
79 }
80
IsEnableDFXHiSysEvent()81 bool DFXHiSysEvent::IsEnableDFXHiSysEvent()
82 {
83 return true;
84 }
85
GetCpuUsage()86 double DFXHiSysEvent::GetCpuUsage()
87 {
88 #ifdef ENABLE_UCOLLECTION
89 auto collector = OHOS::HiviewDFX::UCollectClient::CpuCollector::Create();
90 auto collectResult = collector->GetSysCpuUsage();
91 if (collectResult.retCode == OHOS::HiviewDFX::UCollect::UcError::SUCCESS) {
92 LOG_GC(DEBUG) << "GCKeyStats cpu usage: " << collectResult.data;
93 return collectResult.data;
94 }
95 LOG_GC(ERROR) << "GCKeyStats get cpu usage failed, error code: " << collectResult.retCode;
96 return -1.0;
97 #else
98 return -1.0;
99 #endif
100 }
101 } // namespace panda::ecmascript
102