VOM: stats
[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(false)
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(false)
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(false)
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(false)
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 = true;
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   m_stat_connect = false;
151 }
152
153 int
154 stat_client::vec_len(void* vec)
155 {
156   return stat_segment_vec_len(vec);
157 }
158
159 void
160 stat_client::vec_free(void* vec)
161 {
162   stat_segment_vec_free(vec);
163 }
164
165 void
166 stat_client::ls()
167 {
168   uint8_t** string_vec = { 0 };
169   for (auto& pattern : m_patterns) {
170     string_vec = stat_segment_string_vector(string_vec, pattern.c_str());
171   }
172   m_counter_vec = stat_segment_ls(string_vec);
173   stat_segment_vec_free(string_vec);
174 }
175
176 const stat_client::stat_data_vec_t&
177 stat_client::dump()
178 {
179   stat_segment_data_free(m_stat_seg_data);
180   m_stat_seg_data = NULL;
181   if (m_stat_data.size()) {
182     m_stat_data.clear();
183   }
184   if (m_stat_connect) {
185     m_stat_seg_data = stat_segment_dump(m_counter_vec);
186     if (!m_stat_seg_data) {
187       ls();
188       return m_stat_data;
189     }
190     for (int i = 0; i < stat_segment_vec_len(m_stat_seg_data); i++) {
191       stat_data_t sd(m_stat_seg_data[i]);
192       m_stat_data.push_back(sd);
193     }
194   }
195   return m_stat_data;
196 }
197
198 const stat_client::stat_data_vec_t&
199 stat_client::dump_entry(uint32_t index)
200 {
201   stat_segment_data_free(m_stat_seg_data);
202   m_stat_seg_data = NULL;
203   if (m_stat_data.size()) {
204     m_stat_data.clear();
205   }
206   if (m_stat_connect) {
207     m_stat_seg_data = stat_segment_dump_entry(index);
208     if (!m_stat_seg_data) {
209       ls();
210       return m_stat_data;
211     }
212     for (int i = 0; i < stat_segment_vec_len(m_stat_seg_data); i++) {
213       stat_data_t sd(m_stat_seg_data[i]);
214       m_stat_data.push_back(sd);
215     }
216   }
217   return m_stat_data;
218 }
219
220 void
221 stat_client::data_free()
222 {
223   stat_segment_data_free(m_stat_seg_data);
224 }
225
226 double
227 stat_client::heartbeat()
228 {
229   return stat_segment_heartbeat();
230 }
231
232 std::string
233 stat_client::index_to_name(uint32_t index)
234 {
235   return stat_segment_index_to_name(index);
236 }
237
238 } // namespace VOM
239
240 /*
241  * fd.io coding-style-patch-verification: ON
242  *
243  * Local Variables:
244  * eval: (c-set-style "mozilla")
245  * End:
246  */