1 /*
2 * Copyright (c) 2022 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 #include "statistics_event.h"
16
17 #include <iomanip>
18 #include <iostream>
19 #include <map>
20 #include <sstream>
21
22 namespace OHOS {
23 namespace WuKong {
24 namespace {
25 const uint32_t DECIMAL_LENGTH = 2;
26 const float PERCENTAGE = 100.0;
27 } // namespace
28
StatisticsDetail(std::vector<std::map<std::string,std::string>> srcDatas,std::map<std::string,std::shared_ptr<Table>> & destTables)29 void StatisticsEvent::StatisticsDetail(std::vector<std::map<std::string, std::string>> srcDatas,
30 std::map<std::string, std::shared_ptr<Table>> &destTables)
31 {
32 SrcDatasPretreatment(srcDatas);
33 // loop bundle store event statistics msg
34 for (auto bundle : eventStatisticsMsg_) {
35 DEBUG_LOG_STR("start bundlename{%s}", bundle.first.c_str());
36 std::shared_ptr<EventStatisticsMsg> curEventStatisticsMsgPtr = bundle.second;
37 uint32_t curElementTypeLength = curEventStatisticsMsgPtr->eventTypes_.size();
38 std::vector<std::string> line;
39 std::shared_ptr<EventStatisticsRecord> curEventStatisticsRecordPtr = nullptr;
40 std::shared_ptr<EventStatisticsRecord> curBundleAllStatisticsPtr =
41 std::make_shared<EventStatisticsRecord>();
42 curBundleAllStatisticsPtr->eventType_ = "total";
43 for (uint32_t i = 0; i < curElementTypeLength; i++) {
44 curEventStatisticsRecordPtr = curEventStatisticsMsgPtr->eventTypeRecord_[i];
45 UpdateLine(curEventStatisticsRecordPtr, curEventStatisticsMsgPtr->eventTypeTotal_, line);
46 record_.push_back(line);
47 curBundleAllStatisticsPtr->execTimes_ += curEventStatisticsRecordPtr->execTimes_;
48 }
49
50 UpdateLine(curBundleAllStatisticsPtr, curEventStatisticsMsgPtr->eventTypeTotal_, line);
51 record_.push_back(line);
52 std::shared_ptr<Table> table = std::make_shared<Table>(headers_, record_);
53 table->SetName(bundle.first);
54 table->SetDetail("event");
55 destTables[bundle.first] = table;
56 record_.clear();
57 }
58
59 GlobalElementTypesStatistics();
60 std::shared_ptr<Table> globalTable = std::make_shared<Table>(headers_, record_);
61 globalTable->SetName("all");
62 globalTable->SetDetail("event");
63 destTables["all"] = globalTable;
64 record_.clear();
65 }
66
SrcDatasPretreatment(std::vector<std::map<std::string,std::string>> srcDatas)67 void StatisticsEvent::SrcDatasPretreatment(std::vector<std::map<std::string, std::string>> srcDatas)
68 {
69 for (auto srcData : srcDatas) {
70 DEBUG_LOG_STR("bundlename{%s} | eventType{%s}", srcData["bundleName"].c_str(), srcData["event"].c_str());
71 std::vector<std::string>::iterator globalElementTypesIter =
72 find(globalElementTypes_.begin(), globalElementTypes_.end(), srcData["event"]);
73 if (globalElementTypesIter == globalElementTypes_.end()) {
74 DEBUG_LOG_STR("push event{%s} to globalElementTypes_", srcData["event"].c_str());
75 globalElementTypes_.push_back(srcData["event"]);
76 }
77
78 // check whether bundle is entered resolve create or reuse already exist StatisticsMsgPtr
79 std::shared_ptr<EventStatisticsMsg> curStatisticsMsgPtr = std::make_shared<EventStatisticsMsg>();
80 std::map<std::string, std::shared_ptr<EventStatisticsMsg>>::iterator eventStatisticsMsgIter =
81 eventStatisticsMsg_.find(srcData["bundleName"]);
82 if (eventStatisticsMsgIter != eventStatisticsMsg_.end()) {
83 DEBUG_LOG_STR("use inited curStatisticsMsgPtr by bundleName{%s}", srcData["bundleName"].c_str());
84 curStatisticsMsgPtr = eventStatisticsMsg_[srcData["bundleName"]];
85 }
86 // check whether eventType is entered resolve create or reuse already exist EventStatisticsRecordPtr
87 std::shared_ptr<EventStatisticsRecord> curEventStatisticsRecordPtr =
88 std::make_shared<EventStatisticsRecord>();
89 uint32_t index = curStatisticsMsgPtr->ElementTypesIndex(srcData["event"]);
90 uint32_t curElementTypeTotal = curStatisticsMsgPtr->eventTypeTotal_;
91 if (index != curStatisticsMsgPtr->eventTypes_.size()) {
92 curEventStatisticsRecordPtr = curStatisticsMsgPtr->eventTypeRecord_[index];
93 DEBUG_LOG_STR("use inited curEventStatisticsRecordPtr in index{%d} | event{%s}", index,
94 srcData["event"].c_str());
95 }
96 // update record msg
97 curEventStatisticsRecordPtr->eventType_ = srcData["event"];
98 curEventStatisticsRecordPtr->execTimes_++;
99
100 if (curStatisticsMsgPtr->eventTypeRecord_.size() > index) {
101 curStatisticsMsgPtr->eventTypeRecord_[index] = curEventStatisticsRecordPtr;
102 curStatisticsMsgPtr->eventTypes_[index] = srcData["event"];
103 } else {
104 curStatisticsMsgPtr->eventTypeRecord_.push_back(curEventStatisticsRecordPtr);
105 curStatisticsMsgPtr->eventTypes_.push_back(srcData["event"]);
106 }
107
108 curElementTypeTotal++;
109 DEBUG_LOG_STR("curElementTypeTotal{%d}", curElementTypeTotal);
110 curStatisticsMsgPtr->eventTypeTotal_ = curElementTypeTotal;
111 eventStatisticsMsg_[srcData["bundleName"]] = curStatisticsMsgPtr;
112 execCount_++;
113 }
114 }
UpdateLine(std::shared_ptr<EventStatisticsRecord> EventStatisticsRecordPtr,uint32_t eventTypeTotal,std::vector<std::string> & line)115 void StatisticsEvent::UpdateLine(std::shared_ptr<EventStatisticsRecord> EventStatisticsRecordPtr,
116 uint32_t eventTypeTotal, std::vector<std::string> &line)
117 {
118 std::stringstream bufferStream;
119 std::string curElementType = EventStatisticsRecordPtr->eventType_;
120 std::string curExecTimes = std::to_string(EventStatisticsRecordPtr->execTimes_);
121 std::string curProportionStr = "";
122 if (eventTypeTotal > 0) {
123 float proportion = (EventStatisticsRecordPtr->execTimes_ * PERCENTAGE) / eventTypeTotal;
124 bufferStream.str("");
125 bufferStream << std::setiosflags(std::ios::fixed) << std::setprecision(DECIMAL_LENGTH) << proportion;
126 curProportionStr = bufferStream.str() + "%";
127 }
128
129 DEBUG_LOG_STR("line content curElementType{%s} | curExecTimes{%s}", curElementType.c_str(), curExecTimes.c_str());
130 line = {curElementType, curExecTimes, curProportionStr};
131 }
132
GlobalElementTypesStatistics()133 void StatisticsEvent::GlobalElementTypesStatistics()
134 {
135 std::vector<std::string> line;
136 std::shared_ptr<EventStatisticsRecord> globalAllStatisticsPtr = std::make_shared<EventStatisticsRecord>();
137 globalAllStatisticsPtr->eventType_ = "total";
138 for (auto eventType : globalElementTypes_) {
139 std::shared_ptr<EventStatisticsRecord> eventStatisticsRecordPtr = std::make_shared<EventStatisticsRecord>();
140 eventStatisticsRecordPtr->eventType_ = eventType;
141 for (auto bundle : eventStatisticsMsg_) {
142 std::shared_ptr<EventStatisticsMsg> curEventStatisticsMsgPtr = bundle.second;
143 uint32_t index = curEventStatisticsMsgPtr->ElementTypesIndex(eventType);
144 if (curEventStatisticsMsgPtr->eventTypeRecord_.size() > index) {
145 std::shared_ptr<EventStatisticsRecord> curEventStatisticsRecordPtr =
146 curEventStatisticsMsgPtr->eventTypeRecord_[index];
147 eventStatisticsRecordPtr->execTimes_ += curEventStatisticsRecordPtr->execTimes_;
148 }
149 }
150 globalAllStatisticsPtr->execTimes_ += eventStatisticsRecordPtr->execTimes_;
151 UpdateLine(eventStatisticsRecordPtr, execCount_, line);
152 record_.push_back(line);
153 }
154 UpdateLine(globalAllStatisticsPtr, execCount_, line);
155 record_.push_back(line);
156 }
157 } // namespace WuKong
158 } // namespace OHOS
159