1 /* 2 * Copyright (c) 2021 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 #ifndef IO_STATS_H 17 #define IO_STATS_H 18 19 #include <deque> 20 #include <array> 21 #include <cinttypes> 22 #include <cstdio> 23 #include <fstream> 24 #include <inttypes.h> 25 #include <iostream> 26 #include <memory> 27 #include <string> 28 #include <sys/mman.h> 29 30 #include "diskio_plugin_config.pb.h" 31 #include "diskio_plugin_result.pb.h" 32 #include "logging.h" 33 34 class ProcStats { 35 public: 36 std::string name_; 37 uint64_t user_; 38 uint64_t nice_; 39 uint64_t system_; 40 uint64_t idle_; 41 uint64_t iowait_; 42 uint64_t steal_; 43 uint64_t hardirq_; 44 uint64_t softirq_; 45 uint64_t guest_; 46 uint64_t guestNice_; 47 ProcStats()48 ProcStats() 49 : name_(""), 50 user_(0), 51 nice_(0), 52 system_(0), 53 idle_(0), 54 iowait_(0), 55 steal_(0), 56 hardirq_(0), 57 softirq_(0), 58 guest_(0), 59 guestNice_(0) 60 { 61 } 62 ~ProcStats()63 ~ProcStats() {} 64 GetTotalTime()65 uint64_t GetTotalTime() 66 { 67 return user_ + nice_ + system_ + idle_ + iowait_ + steal_ + hardirq_ + softirq_; 68 } 69 }; 70 71 class DiskStats { 72 public: 73 std::string deviceName_; 74 uint64_t major_; 75 uint64_t minor_; 76 77 uint64_t rSucc_; // 成功完成读的总次数 rd_ios 78 uint64_t rMerged_; // 合并读次数 rd_merges 79 uint64_t rSectors_; // 读扇区的次数 rd_sectors 80 uint64_t timeOfRead_; // 读花的时间(ms) rd_ticks 81 82 uint64_t wSucc_; // 成功完成写的总次数 wr_ios 83 uint64_t wMerged_; // 合并写次数 wr_merges 84 uint64_t wSectors_; // 写扇区的次数 wr_sectors 85 uint64_t timeOfWrite_; // 写花的时间(ms) wr_ticks 86 87 uint64_t dSucc_; 88 uint64_t dMerged_; 89 uint64_t dSectors_; 90 uint64_t timeOfd_; 91 92 uint64_t flushSucc_; 93 uint64_t timeOfFlush_; 94 95 uint64_t ios_; // I/O的当前进度 ios_pgr 96 uint64_t timeOfIo_; // I/O操作上的毫秒数 tot_ticks ? 97 uint64_t weighted_; // 输入/输出操作花费的加权毫秒数 rq_ticks ? 98 DiskStats()99 DiskStats() 100 : deviceName_(""), 101 major_(0), 102 minor_(0), 103 rSucc_(0), 104 rMerged_(0), 105 rSectors_(0), 106 timeOfRead_(0), 107 wSucc_(0), 108 wMerged_(0), 109 wSectors_(0), 110 timeOfWrite_(0), 111 dSucc_(0), 112 dMerged_(0), 113 dSectors_(0), 114 timeOfd_(0), 115 flushSucc_(0), 116 timeOfFlush_(0), 117 ios_(0), 118 timeOfIo_(0), 119 weighted_(0) 120 { 121 } 122 ~DiskStats()123 ~DiskStats() {} 124 }; 125 126 using CpuDatasPtr = std::shared_ptr<ProcStats>; 127 using DiskDatasPtr = std::shared_ptr<DiskStats>; 128 class IoStats { 129 public: 130 IoStats(DiskioConfig::IoReportType type = DiskioConfig::UNSPECIFIED); ~IoStats()131 ~IoStats() {} 132 bool GetIoData(); 133 bool PutPluginStatsData(StatsData* pluginStats); 134 private: 135 bool ParseCpuStats(); 136 bool GetCpuStats(std::string& line); 137 bool ParseIoStats(); 138 bool GetIoStats(std::string& line); 139 uint32_t PutCpuStatsData(StatsData* pluginStats); 140 void CalcCpuStats(const CpuDatasPtr& cpuData, CpuStats* cpuInfo); 141 double KeepTowDigits(const uint64_t& data, uint64_t div); 142 uint32_t PutIoStatsData(StatsData* pluginStats); 143 void CalcIoStats(const DiskDatasPtr& ioData, IoStatData* ioInfo); 144 uint32_t OutputCpuData(); 145 bool OutputIoData(); 146 uint64_t GetSystime(); 147 bool ParseIoStatsEx(); 148 bool FindFirstNum(char** p); 149 bool RemoveSpaces(char** p); 150 uint32_t ParseLineFields(const std::string& line); 151 uint32_t ParseLineFields(const std::string& line, std::string& name); 152 153 private: 154 std::mutex mutex_; 155 DiskioConfig::IoReportType type_; 156 uint64_t sysTime_; 157 std::deque<CpuDatasPtr> cpuDatas_; 158 std::deque<DiskDatasPtr> ioDatas_; 159 std::vector<uint64_t> fields_; 160 }; 161 162 #endif // #ifndef IO_STATS_H 163