#!/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