Skip to content
Snippets Groups Projects
LineProtocolGenerator.py 8.20 KiB
#!/usr/bin/python3

# line protocol

# Method to create a full InfluxDB request statement (based on partial statement from client)
import uuid
from random import randint


# Reports TX and RX, scaling on requested quality
def generate_network_report(recieved_bytes, sent_bytes, time):
    result = [{"measurement": "net_port_io",
               "tags": {
                   "port_id": "enps03"
               },
               "fields": {
                   "RX_BYTES_PORT_M": recieved_bytes,
                   "TX_BYTES_PORT_M": sent_bytes
               },
               "time": _getNSTime(time)
               }]

    return result


# Formats VM config
def generate_vm_config(state, cpu, mem, storage, time):
    result = [{"measurement": "vm_res_alloc",
               "tags": {
                   "vm_state": state
               },
               "fields": {
                   "cpu": cpu,
                   "memory": mem,
                   "storage": storage
               },
               "time": _getNSTime(time)
               }]

    return result


# Reports cpu usage, scaling on requests
def generate_cpu_report(cpu_usage, cpu_active_time, cpu_idle_time, time):
    result = [{"measurement": "cpu_usage",
              "fields": {
                  "cpu_usage": cpu_usage,
                  "cpu_active_time": cpu_active_time,
                  "cpu_idle_time": cpu_idle_time
              },
              "time": _getNSTime(time)
              }]

    return result


# Reports response times, scaling on number of requests
def generate_mpegdash_report(resource, requests, avg_response_time, peak_response_time, time):
    result = [{"measurement": "mpegdash_service",
               "tags": {
                   "cont_nav": resource
               },
               "fields": {
                   "requests": requests,
                   "avg_response_time": avg_response_time,
                   "peak_response_time": peak_response_time
               },
               "time": _getNSTime(time)
               }]

    return result


# ipendpoint_route,ipendpoint_id,cont_nav=FQDN HTTP_REQUESTS_FQDN_M, NETWORK_FQDN_LATENCY timestamp
def generate_ipendpoint_route(resource, requests, latency, time):
    result = [{"measurement": "ipendpoint_route",
               "tags": {
                   "cont_nav": str(resource)
               },
               "fields": {
                   "http_requests_fqdn_m": requests,
                   "network_fqdn_latency": latency
               },
               "time": _getNSTime(time)
               }]

    return result


# InfluxDB likes to have time-stamps in nanoseconds
def _getNSTime(time):
    # Convert to nano-seconds
    timestamp = int(1000000000*time)

    return timestamp


# DEPRECATED
# ____________________________________________________________________________

# DEPRECATED: old structure, not part of new spec

# Influx needs strings to be quoted, this provides a utility interface to do this
def quote_wrap(string):
    return "\"" + string + "\""


def _generateClientRequest(cReq, id, time):
    # Tags first
    result = 'sid="' + str(id) + '",' + cReq

    # Fields
    # No additional fields here yet

    # Timestamp
    result += ' ' + str(_getNSTime(time))

    # Measurement
    return 'request,' + result


# Method to create a full InfluxDB response statement
# DEPRECATED: old structure, not part of new spec
def _generateServerResponse(reqID, quality, time, cpuUsage, qualityDifference):
    # Tags first
    result = ' '

    # Fields
    result += 'quality=' + str(quality) + ','
    result += 'cpuUsage=' + str(cpuUsage) + ','
    result += 'qualityDifference=' + str(qualityDifference) + ','
    result += 'requestID="' + str(reqID) + '",'
    result += 'index="' + str(uuid.uuid4()) + '"'

    # Timestamp
    result += ' ' + str(_getNSTime(time))

    # Measurement
    # print('response'+result)
    return 'response' + result


# Formats server config
def _generateServerConfig(ID, location, cpu, mem, storage, time):
    # metric
    result = 'host_resource'
    # Tags
    result += ',slice_id=' + quote_wrap(ID)
    result += ',location=' + quote_wrap(location)
    result += ' '
    # Fields
    result += 'cpu=' + str(cpu)
    result += ',memory=' + quote_wrap(mem)
    result += ',storage=' + quote_wrap(storage)

    # Time
    result += ' ' + str(_getNSTime(time))

    print(result)
    return result


# Format port config
def _configure_port(port_id, state, rate, time):
    # metric
    result = 'net_port_config '
    # Fields
    result += 'port_id=' + quote_wrap('enps' + port_id)
    result += ',port_state=' + quote_wrap(state)
    result += ',tx_constraint=' + quote_wrap(rate)
    result += ' '

    # Time
    result += ' ' + str(_getNSTime(time))

    print(result)
    return result


# Format service function config
def _configure_service_function(state, max_connected_clients):
    # measurement
    result = 'mpegdash_service_config'
    # tags
    result += ',service_state='+quote_wrap(state)
    result += ' '
    # fields
    result += 'max_connected_clients='+str(max_connected_clients)

    return result


# Reports memory usage, scaling on requests
def generate_mem_report(requests, total_mem, time):
    # Measurement
    result = 'mem'
    result += ' '
    # field
    used = randint(0, min(100, 5*requests))
    available = 100-used
    result += 'available_percent='+str(available)
    result += ',used_percent='+str(used)
    result += ',total='+str(total_mem)
    result += ' '
    # Time
    result += str(_getNSTime(time))
    print(result)
    return result


# Formats compute node config
def generate_compute_node_config(slice_id, location, node_id, cpus, mem, storage, time):
    # Measurement
    result = 'compute_node_config'
    # CommonContext Tag
    result += ',slide_id='+quote_wrap(slice_id)
    # Tag
    result += ',location='+quote_wrap(location)
    result += ',comp_node_id='+quote_wrap(node_id)
    result += ' '
    # field
    result += 'cpus='+str(cpus)
    result += ',memory='+str(mem)
    result += ',storage='+str(storage)
    result += ' '
    # Time
    result += str(_getNSTime(time))
    print(result)
    return result


# Formats network resource config
def generate_network_resource_config(slice_id, network_id, bandwidth, time):
    # Measurement
    result = 'network_resource_config'
    # Meta Tag
    result += ',slice_id='+quote_wrap(slice_id)
    # Tag
    result += 'network_id='+quote_wrap(network_id)
    result += ' '
    # field
    result += 'bandwidth='+str(bandwidth)
    result += ' '
    # Time
    result += str(_getNSTime(time))
    print(result)
    return result


# Formats network interface config
def generate_network_interface_config(slice_id, comp_node_id, port_id, rx_constraint, tx_constraint, time):
    # Measurement
    result = 'network_interface_config'
    # Meta Tag
    result += ',slice_id'+quote_wrap(slice_id)
    # Tags
    result += ',comp_node_id='+quote_wrap(comp_node_id)
    result += ',port_id='+quote_wrap(port_id)
    result += ' '
    # field
    result += 'rx_constraint='+str(rx_constraint)
    result += ',tx_constraint='+str(tx_constraint)
    result += ' '
    # Time
    result += str(_getNSTime(time))
    print(result)
    return result


# Format SF instance config
def generate_sf_instance_surrogate_config(loc, sfc, sfc_i, sf_package, sf_i, cpus, mem, storage, time):
    # Measurement
    result = 'sf_instance_surrogate_config'
    # Meta Tag
    result += ',location'+quote_wrap(loc)
    result += ',sfc'+quote_wrap(sfc)
    result += ',sfc_i'+quote_wrap(sfc_i)
    result += ',sf_package'+quote_wrap(sf_package)
    result += ',sf_i'+quote_wrap(sf_i)
    result += ' '
    # field
    result += 'cpus='+str(cpus)
    result += ',memory='+str(mem)
    result += ',storage='+str(storage)
    result += ' '
    # Time
    result += str(_getNSTime(time))
    print(result)
    return result


# Formats context container as part of other line protocol generators
def service_function_measurement(measurement, service_function_context):
    result = measurement
    result += ',sfc'+quote_wrap(service_function_context.sfc)
    result += ',sfc_i'+quote_wrap(service_function_context.sfc_i)
    result += ',sf_package'+quote_wrap(service_function_context.sf_package)
    result += ',sf_i'+quote_wrap(service_function_context.sf_i)

    return result