1 /*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
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 #include "pbreader_cpu_data_parser.h"
16 #include "clock_filter_ex.h"
17 #include "process_filter.h"
18 #include "stat_filter.h"
19 namespace SysTuning {
20 namespace TraceStreamer {
PbreaderCpuDataParser(TraceDataCache * dataCache,const TraceStreamerFilters * ctx)21 PbreaderCpuDataParser::PbreaderCpuDataParser(TraceDataCache *dataCache, const TraceStreamerFilters *ctx)
22 : EventParserBase(dataCache, ctx)
23 {
24 }
25
~PbreaderCpuDataParser()26 PbreaderCpuDataParser::~PbreaderCpuDataParser()
27 {
28 TS_LOGI("cpuData ts MIN:%llu, MAX:%llu", static_cast<unsigned long long>(GetPluginStartTime()),
29 static_cast<unsigned long long>(GetPluginEndTime()));
30 }
Parse(ProtoReader::BytesView tracePacket,uint64_t ts)31 void PbreaderCpuDataParser::Parse(ProtoReader::BytesView tracePacket, uint64_t ts)
32 {
33 ProtoReader::CpuData_Reader cpuData(tracePacket.data_, tracePacket.size_);
34 if (!cpuData.has_cpu_usage_info() && !cpuData.has_thread_info()) {
35 return;
36 }
37 if (cpuData.has_cpu_usage_info()) {
38 auto userLoad = cpuData.user_load();
39 auto sysLoad = cpuData.sys_load();
40 auto process_num = cpuData.process_num();
41 ts = streamFilters_->clockFilter_->ToPrimaryTraceTime(TS_CLOCK_REALTIME, ts);
42 UpdatePluginTimeRange(TS_CLOCK_REALTIME, ts, ts);
43 auto cpuUsage = std::make_unique<TsCpuData>();
44 streamFilters_->statFilter_->IncreaseStat(TRACE_CPU_USAGE, STAT_EVENT_RECEIVED);
45 cpuUsage->SetCpuUsage(ts);
46 cpuUsage->SetExtInfo(cpuData.total_load(), userLoad, sysLoad, process_num);
47 cpuData_.push_back(std::move(cpuUsage));
48 }
49 }
Finish()50 void PbreaderCpuDataParser::Finish()
51 {
52 auto cmp = [](const std::unique_ptr<TsCpuData> &a, const std::unique_ptr<TsCpuData> &b) { return a->ts_ < b->ts_; };
53 std::stable_sort(cpuData_.begin(), cpuData_.end(), cmp);
54 bool firstTime = true;
55 uint64_t lastTs = 0;
56 for (auto itor = cpuData_.begin(); itor != cpuData_.end(); itor++) {
57 auto newTimeStamp = (*itor)->ts_;
58 if (firstTime) {
59 lastTs = newTimeStamp;
60 firstTime = false;
61 continue;
62 }
63 CpuUsageDetailRow row;
64 row.newTimeStamp = newTimeStamp;
65 row.dur = newTimeStamp - lastTs;
66 row.totalLoad = (*itor)->totalLoad_;
67 row.userLoad = (*itor)->userLoad_;
68 row.systemLoad = (*itor)->sysLoad_;
69 row.threads = (*itor)->processNum_;
70 traceDataCache_->GetCpuUsageInfoData()->AppendNewData(row);
71 lastTs = newTimeStamp;
72 }
73 cpuData_.clear();
74 traceDataCache_->MixTraceTime(GetPluginStartTime(), GetPluginEndTime());
75 }
76 } // namespace TraceStreamer
77 } // namespace SysTuning
78