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_wrapper.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 "MARK_REASON", longGCStats->GetMarkReason(),
44 "GC_IS_SENSITIVE", static_cast<int>(longGCStats->GetGCIsSensitive()),
45 "GC_IS_INBACKGROUND", static_cast<int>(longGCStats->GetGCIsInBackground()),
46 "GC_TOTAL_TIME", longGCStats->GetGCTotalTime(),
47 "GC_MARK_TIME", longGCStats->GetGCMarkTime(),
48 "GC_EVACUATE_TIME", longGCStats->GetGCEvacuateTime(),
49 "GC_UPDATE_ROOT_TIME", longGCStats->GetGCUpdateRootTime(),
50 "GC_UPDATE_WEEKREF_TIME", longGCStats->GetGCUpdateWeekRefTime(),
51 "GC_UPDATE_REFERENCE_TIME", longGCStats->GetGCUpdateReferenceTime(),
52 "GC_SWEEPNEWTOOLD_TIME", longGCStats->GetGCSweepNewToOldTime(),
53 "GC_FINALIZE_TIME", longGCStats->GetGCFinalizeTime(),
54 "GC_INVOKE_CALLBACK_TIME", longGCStats->GetGCInvokeCallbackTime(),
55 "BEFORE_GC_TOTAL_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCTotalMemUsed()),
56 "BEFORE_GC_TOTAL_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCTotalMemCommitted()),
57 "BEFORE_GC_ACTIVE_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCActiveMemUsed()),
58 "BEFORE_GC_ACTIVE_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCActiveMemCommitted()),
59 "BEFORE_GC_OLD_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCOldMemUsed()),
60 "BEFORE_GC_OLD_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCOldMemCommitted()),
61 "BEFORE_GC_HUGE_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCHugeMemUsed()),
62 "BEFORE_GC_HUGE_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCHugeMemCommitted()),
63 "BEFORE_GC_NATIVE_BINDING_SIZE", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCNativeBindingSize()),
64 "BEFORE_GC_NATIVE_LIMIT", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCNativeLimit()),
65 "AFTER_GC_TOTAL_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCTotalMemUsed()),
66 "AFTER_GC_TOTAL_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCTotalMemCommitted()),
67 "AFTER_GC_ACTIVE_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCActiveMemUsed()),
68 "AFTER_GC_ACTIVE_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCActiveMemCommitted()),
69 "AFTER_GC_OLD_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCOldMemUsed()),
70 "AFTER_GC_OLD_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCOldMemCommitted()),
71 "AFTER_GC_HUGE_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCHugeMemUsed()),
72 "AFTER_GC_HUGE_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCHugeMemCommitted()),
73 "AFTER_GC_NATIVE_BINDING_SIZE", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCNativeBindingSize()),
74 "AFTER_GC_NATIVE_LIMIT", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCNativeLimit()),
75 "CPU_LOAD", longGCStats->GetCpuLoad());
76 if (ret != 0) {
77 LOG_GC(ERROR) << "GCKeyStats HiSysEventWrite ARK_GC_LONG_TIME Failed! ret = " << ret;
78 }
79 #endif
80 }
81
IsEnableDFXHiSysEvent()82 bool DFXHiSysEvent::IsEnableDFXHiSysEvent()
83 {
84 return true;
85 }
86
GetCpuUsage()87 double DFXHiSysEvent::GetCpuUsage()
88 {
89 #ifdef ENABLE_UCOLLECTION
90 auto collector = OHOS::HiviewDFX::UCollectClient::CpuCollector::Create();
91 auto collectResult = collector->GetSysCpuUsage();
92 if (collectResult.retCode == OHOS::HiviewDFX::UCollect::UcError::SUCCESS) {
93 LOG_GC(DEBUG) << "GCKeyStats cpu usage: " << collectResult.data;
94 return collectResult.data;
95 }
96 LOG_GC(ERROR) << "GCKeyStats get cpu usage failed, error code: " << collectResult.retCode;
97 return -1.0;
98 #else
99 return -1.0;
100 #endif
101 }
102 } // namespace panda::ecmascript
103