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