• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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