diff options
Diffstat (limited to 'resources/tools/telemetry')
-rw-r--r-- | resources/tools/telemetry/bundle_vpp.py | 38 | ||||
-rw-r--r-- | resources/tools/telemetry/constants.py | 37 | ||||
-rw-r--r-- | resources/tools/telemetry/metrics.py | 10 |
3 files changed, 70 insertions, 15 deletions
diff --git a/resources/tools/telemetry/bundle_vpp.py b/resources/tools/telemetry/bundle_vpp.py index 64c4c5e4f8..315360f63b 100644 --- a/resources/tools/telemetry/bundle_vpp.py +++ b/resources/tools/telemetry/bundle_vpp.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021 Cisco and/or its affiliates. +# Copyright (c) 2022 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -20,7 +20,7 @@ import struct import sys from vpp_papi.vpp_papi import VPPApiClient as vpp_class - +from .constants import Constants M_RUN_THREAD = ( r"Thread\s" @@ -209,8 +209,8 @@ class BundleVpp: try: self.obj.connect(name=u"telemetry") except (ConnectionRefusedError, OSError): - getLogger(__name__).error(u"Cannot connect to VPP!") - sys.exit(1) + getLogger("console_stderr").error(u"Could not connect to VPP!") + sys.exit(Constants.err_vpp_connect) for command in self.code.splitlines(): api_name = u"cli_inband" @@ -223,7 +223,11 @@ class BundleVpp: """ Detach from VPP. """ - self.obj.disconnect() + try: + self.obj.disconnect() + except (ConnectionRefusedError, OSError): + getLogger("console_stderr").error(u"Could not disconnect from VPP!") + sys.exit(Constants.err_vpp_disconnect) def fetch_data(self): """ @@ -234,8 +238,12 @@ class BundleVpp: papi_fn = getattr(self.obj.api, command[u"api_name"]) getLogger(__name__).info(command[u"api_args"][u"cmd"]) replies = papi_fn(**command[u"api_args"]) - except (AttributeError, IOError, struct.error) as err: - raise AssertionError(err) + except (AssertionError, AttributeError, IOError, struct.error): + getLogger("console_stderr").error( + f"Failed when executing command: " + f"{command['api_args']['cmd']}" + ) + sys.exit(Constants.err_vpp_execute) if not isinstance(replies, list): replies = [replies] @@ -253,12 +261,22 @@ class BundleVpp: Post process command reply. """ for command in zip(self.api_command_list, self.api_replies_list): - self_fn = command[0][u"api_args"][u"cmd"] + self_fn = command[0][u"api_args"][u"cmd"].replace(u" ", u"_") + self_method_list = [meth for meth in dir(self) + if callable(getattr(self, meth)) and + meth.startswith('__') is False] + if self_fn not in self_method_list: + continue try: - self_fn = getattr(self, self_fn.replace(u" ", u"_")) + self_fn = getattr(self, self_fn) self_fn(command[1].reply) except AttributeError: pass + except (KeyError, ValueError, TypeError) as e: + getLogger("console_stderr").error( + f"Failed when processing data. Error message {e}" + ) + sys.exit(Constants.err_telemetry_process) def show_interface(self, reply): """ @@ -441,7 +459,7 @@ class BundleVpp: item[u"name"] = metric labels[u"version"] = version item[u"labels"] = labels - item[u"value"] = 1.0 + item[u"value"] = {} self.serializer.serialize( metric=metric, labels=labels, item=item ) diff --git a/resources/tools/telemetry/constants.py b/resources/tools/telemetry/constants.py new file mode 100644 index 0000000000..fda558b0b4 --- /dev/null +++ b/resources/tools/telemetry/constants.py @@ -0,0 +1,37 @@ +# Copyright (c) 2022 Cisco and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Constants used in telemetry. + +"Constant" means a value that keeps its value since initialization. The value +does not need to be hard coded here, but can be read from environment variables. +""" + +class Constants: + """Constants used in telemetry. + 1-10: Telemetry errors + 11-50: VPP bundle error + 51-100: Linux bundle errors""" + + # Failed when processing data + err_telemetry_process = 1 + + # Could not connect to VPP + err_vpp_connect = 11 + + # Could not disconnect from VPP + err_vpp_disconnect = 12 + + # Failed when executing command + err_vpp_execute = 13 + diff --git a/resources/tools/telemetry/metrics.py b/resources/tools/telemetry/metrics.py index 281760183b..7a22acfd1b 100644 --- a/resources/tools/telemetry/metrics.py +++ b/resources/tools/telemetry/metrics.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021 Cisco and/or its affiliates. +# Copyright (c) 2022 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -340,7 +340,7 @@ class MetricBase: def samples(self): """ - Returns samples wheter an object is parent or child. + Returns samples whether an object is parent or child. :returns: List of Metric objects with values. :rtype: list @@ -602,9 +602,9 @@ class Info(MetricBase): """ Set info to the given value. - :param amount: Value to set. - :type amount: int or float - :raises ValueError: If lables are overlapping. + :param value: Value to set. + :type value: int or float + :raises ValueError: If labels are overlapping. """ if self._labelname_set.intersection(value.keys()): raise ValueError( |