VOM: stats fixes
[vpp.git] / extras / vom / vom / stat_client.cpp
1 /*
2  * Copyright (c) 2018 Cisco and/or its affiliates.
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 "vom/stat_client.hpp"
17
18 namespace VOM {
19
20 stat_client::stat_data_t::stat_data_t(const stat_segment_data_t& stat_seg_data)
21   : m_name(stat_seg_data.name)
22   , m_type(stat_seg_data.type)
23 {
24   switch (m_type) {
25     case STAT_DIR_TYPE_SCALAR_INDEX:
26       m_scalar_value = stat_seg_data.scalar_value;
27       break;
28     case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE:
29       m_simple_counter_vec = stat_seg_data.simple_counter_vec;
30       break;
31     case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED:
32       m_combined_counter_vec = stat_seg_data.combined_counter_vec;
33       break;
34     case STAT_DIR_TYPE_ERROR_INDEX:
35       m_error_value = stat_seg_data.error_value;
36       break;
37     case STAT_DIR_TYPE_ILLEGAL:
38       break;
39   }
40 }
41
42 const std::string&
43 stat_client::stat_data_t::name() const
44 {
45   return m_name;
46 }
47
48 const stat_directory_type_t&
49 stat_client::stat_data_t::type() const
50 {
51   return m_type;
52 }
53
54 double
55 stat_client::stat_data_t::get_stat_segment_scalar_data() const
56 {
57   return m_scalar_value;
58 }
59
60 uint64_t
61 stat_client::stat_data_t::get_stat_segment_error_data() const
62 {
63   return m_error_value;
64 }
65
66 uint64_t**
67 stat_client::stat_data_t::get_stat_segment_simple_counter_data() const
68 {
69   return m_simple_counter_vec;
70 }
71
72 vlib_counter_t**
73 stat_client::stat_data_t::get_stat_segment_combined_counter_data() const
74 {
75   return m_combined_counter_vec;
76 }
77
78 stat_client::stat_client(std::string& socket_name)
79   : m_socket_name(socket_name)
80   , m_patterns()
81   , m_stat_connect(0)
82   , m_counter_vec()
83   , m_stat_seg_data(nullptr)
84   , m_stat_data()
85 {
86   m_patterns.push_back("/if");
87 }
88
89 stat_client::stat_client(std::vector<std::string>& pattern)
90   : m_socket_name("/run/vpp/stats.sock")
91   , m_patterns(pattern)
92   , m_stat_connect(0)
93   , m_counter_vec()
94   , m_stat_seg_data(nullptr)
95   , m_stat_data()
96 {
97 }
98
99 stat_client::stat_client(std::string socket_name,
100                          std::vector<std::string> patterns)
101   : m_socket_name(socket_name)
102   , m_patterns(patterns)
103   , m_stat_connect(0)
104   , m_counter_vec()
105   , m_stat_seg_data(nullptr)
106   , m_stat_data()
107 {
108 }
109
110 stat_client::stat_client()
111   : m_socket_name("/run/vpp/stats.sock")
112   , m_patterns()
113   , m_stat_connect(0)
114   , m_counter_vec()
115   , m_stat_seg_data(nullptr)
116   , m_stat_data()
117 {
118   m_patterns.push_back("/if");
119 }
120
121 stat_client::~stat_client()
122 {
123   stat_segment_vec_free(m_counter_vec);
124   data_free();
125   if (m_stat_connect)
126     stat_segment_disconnect();
127 }
128
129 stat_client::stat_client(const stat_client& o)
130   : m_socket_name(o.m_socket_name)
131   , m_patterns(o.m_patterns)
132 {
133 }
134
135 int
136 stat_client::connect()
137 {
138   if (stat_segment_connect(m_socket_name.c_str()) == 0) {
139     m_stat_connect = 1;
140     ls();
141   }
142   return m_stat_connect;
143 }
144
145 void
146 stat_client::disconnect()
147 {
148   if (m_stat_connect)
149     stat_segment_disconnect();
150 }
151
152 int
153 stat_client::vec_len(void* vec)
154 {
155   return stat_segment_vec_len(vec);
156 }
157
158 void
159 stat_client::vec_free(void* vec)
160 {
161   stat_segment_vec_free(vec);
162 }
163
164 void
165 stat_client::ls()
166 {
167   uint8_t** string_vec = { 0 };
168   for (auto& pattern : m_patterns) {
169     string_vec = stat_segment_string_vector(string_vec, pattern.c_str());
170   }
171   m_counter_vec = stat_segment_ls(string_vec);
172   stat_segment_vec_free(string_vec);
173 }
174
175 const stat_client::stat_data_vec_t&
176 stat_client::dump()
177 {
178   stat_segment_data_free(m_stat_seg_data);
179   if (m_stat_data.size()) {
180     m_stat_data.clear();
181   }
182   m_stat_seg_data = stat_segment_dump(m_counter_vec);
183   if (!m_stat_seg_data) {
184     ls();
185     return m_stat_data;
186   }
187   for (int i = 0; i < stat_segment_vec_len(m_stat_seg_data); i++) {
188     stat_data_t sd(m_stat_seg_data[i]);
189     m_stat_data.push_back(sd);
190   }
191   return m_stat_data;
192 }
193
194 const stat_client::stat_data_vec_t&
195 stat_client::dump_entry(uint32_t index)
196 {
197   stat_segment_data_free(m_stat_seg_data);
198   if (m_stat_data.size()) {
199     m_stat_data.clear();
200   }
201   m_stat_seg_data = stat_segment_dump_entry(index);
202   if (!m_stat_seg_data) {
203     ls();
204     return m_stat_data;
205   }
206   for (int i = 0; i < stat_segment_vec_len(m_stat_seg_data); i++) {
207     stat_data_t sd(m_stat_seg_data[i]);
208     m_stat_data.push_back(sd);
209   }
210   return m_stat_data;
211 }
212
213 void
214 stat_client::data_free()
215 {
216   stat_segment_data_free(m_stat_seg_data);
217 }
218
219 double
220 stat_client::heartbeat()
221 {
222   return stat_segment_heartbeat();
223 }
224
225 std::string
226 stat_client::index_to_name(uint32_t index)
227 {
228   return stat_segment_index_to_name(index);
229 }
230
231 } // namespace VOM
232
233 /*
234  * fd.io coding-style-patch-verification: ON
235  *
236  * Local Variables:
237  * eval: (c-set-style "mozilla")
238  * End:
239  */