Skip to content
Snippets Groups Projects
Select Git revision
  • 10aff4406f1c1313b8a2e18f7342056f264d6808
  • master default
  • feat/331-bitnami-kafka-moved-to-bitnamilegacy-kafka
  • feat/330-tid-pcep-component
  • feat/tid-newer-pcep-component
  • feat/policy-refactor
  • feat/314-tid-new-service-for-ipowdm-configuration-fron-orchestrator-to-ipowdm-controller
  • feat/329-ecoc-2025-hack-your-research
  • develop protected
  • feat/116-ubi-updates-in-telemetry-backend-to-support-p4-in-band-network-telemetry
  • feat/320-cttc-ietf-simap-basic-support-with-kafka-yang-push
  • feat/310-cttc-implement-nbi-connector-to-interface-with-osm-client
  • feat/307-update-python-version-service
  • feat/292-cttc-implement-integration-test-for-ryu-openflow
  • cnit_tapi
  • feat/327-tid-new-service-to-ipowdm-controller-to-manage-transceivers-configuration-on-external-agent
  • cnit-p2mp-premerge
  • feat/325-tid-nbi-e2e-to-manage-e2e-path-computation
  • feat/326-tid-external-management-of-devices-telemetry-nbi
  • openroadm-flex-grid
  • CTTC-IMPLEMENT-NBI-CONNECTOR-NOS-ZTP
  • feat/324-tid-nbi-ietf_l3vpn-deploy-fail
  • v5.0.0 protected
  • v4.0.0 protected
  • demo-dpiab-eucnc2024
  • v3.0.0 protected
  • v2.1.0 protected
  • v2.0.0 protected
  • v1.0.0 protected
29 results

Component_RPC_Methods.py

Blame
  • gifrerenom's avatar
    Lluis Gifre Renom authored
    - Add experiment KPI collection definitions
    - Add experiment output data
    d560e29f
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    Component_RPC_Methods.py 5.19 KiB
    # Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
    #
    # 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.
    
    import re
    from typing import Dict, List, Optional, Tuple
    from .tools.FileSystem import create_folders
    from .tools.HistogramData import HistogramData
    from .tools.Plotter import plot_histogram
    from .tools.Prometheus import get_prometheus_range, get_prometheus_series_names
    from .tools.Histogram import results_to_histograms, save_histograms, unaccumulate_histograms
    
    ##### EXPERIMENT SETTINGS ##############################################################################################
    
    from .experiments.Emu_Onboard import EXPERIMENT_NAME, EXPERIMENT_ID, TIME_START, TIME_END
    #from .experiments.L2NM_EMU_Service import EXPERIMENT_NAME, EXPERIMENT_ID, TIME_START, TIME_END
    #from .experiments.L3NM_EMU_Service import EXPERIMENT_NAME, EXPERIMENT_ID, TIME_START, TIME_END
    TIME_STEP       = '1m'
    LABEL_FILTERS   = {}
    
    ##### ENVIRONMENT SETTINGS #############################################################################################
    
    PROM_ADDRESS = '127.0.0.1'
    PROM_PORT    = 9090
    OUT_FOLDER   = 'data/perf/'
    
    ##### PLOT-SPECIFIC CUSTOMIZATIONS #####################################################################################
    
    EXPERIMENT_ID  += '/component-rpcs'
    SERIES_MATCH   = 'tfs_.+_rpc_.+_histogram_duration_bucket'
    RE_SERIES_NAME = re.compile(r'^tfs_(.+)_rpc_(.+)_histogram_duration_bucket$')
    SERIES_LABELS  = []
    
    SUBSYSTEMS_MAPPING = {
        'context': {
            'context'   : 'context',
            'topolog'   : 'topology',
            'device'    : 'device',
            'endpoint'  : 'device',
            'link'      : 'link',
            'service'   : 'service',
            'slice'     : 'slice',
            'policyrule': 'policyrule',
            'connection': 'connection',
        }
    }
    
    def get_subsystem(component : str, rpc_method : str) -> Optional[str]:
        return next(iter([
            subsystem
            for pattern,subsystem in SUBSYSTEMS_MAPPING.get(component, {}).items()
            if pattern in rpc_method
        ]), None)
    
    def update_keys(component : str, rpc_method : str) -> Tuple[Tuple, Tuple]:
        subsystem = get_subsystem(component, rpc_method)
        collection_keys = (component, subsystem)
        histogram_keys = (rpc_method,)
        return collection_keys, histogram_keys
    
    def get_plot_specs(folders : Dict[str, str], component : str, subsystem : Optional[str]) -> Tuple[str, str]:
        if subsystem is None:
            title = '{:s} - RPC Methods [{:s}]'.format(component.title(), EXPERIMENT_NAME)
            filepath = '{:s}/{:s}.png'.format(folders['png'], component)
        else:
            title = '{:s} - RPC Methods - {:s} [{:s}]'.format(component.title(), subsystem.title(), EXPERIMENT_NAME)
            filepath = '{:s}/{:s}-{:s}.png'.format(folders['png'], component, subsystem)
        return title, filepath
    
    ##### AUTOMATED CODE ###################################################################################################
    
    def get_series_names(folders : Dict[str, str]) -> List[str]:
        series_names = get_prometheus_series_names(
            PROM_ADDRESS, PROM_PORT, SERIES_MATCH, TIME_START, TIME_END,
            raw_json_filepath='{:s}/_series.json'.format(folders['json'])
        )
        return series_names
    
    def get_histogram_data(series_name : str, folders : Dict[str, str]) -> Dict[Tuple, HistogramData]:
        m = RE_SERIES_NAME.match(series_name)
        if m is None:
            # pylint: disable=broad-exception-raised
            raise Exception('Unparsable series name: {:s}'.format(str(series_name)))
        extra_labels = m.groups()
        results = get_prometheus_range(
            PROM_ADDRESS, PROM_PORT, series_name, LABEL_FILTERS, TIME_START, TIME_END, TIME_STEP,
            raw_json_filepath='{:s}/_raw_{:s}.json'.format(folders['json'], series_name)
        )
        histograms = results_to_histograms(results, SERIES_LABELS, extra_labels=extra_labels)
        unaccumulate_histograms(histograms, process_bins=True, process_timestamps=False)
        save_histograms(histograms, folders['csv'])
        return histograms
    
    def main() -> None:
        histograms_collection : Dict[Tuple, Dict[Tuple, HistogramData]] = dict()
    
        folders = create_folders(OUT_FOLDER, EXPERIMENT_ID)
        series_names = get_series_names(folders)
    
        for series_name in series_names:
            histograms = get_histogram_data(series_name, folders)
            for histogram_keys, histogram_data in histograms.items():
                collection_keys,histogram_keys = update_keys(*histogram_keys)
                histograms = histograms_collection.setdefault(collection_keys, dict())
                histograms[histogram_keys] = histogram_data
    
        for histogram_keys,histograms in histograms_collection.items():
            title, filepath = get_plot_specs(folders, *histogram_keys)
            plot_histogram(histograms, filepath, title=title)
    
    if __name__ == '__main__':
        main()