def run(self, registry): import copy from liota.dccs.graphite import Graphite from liota.dcc_comms.socket_comms import SocketDccComms from liota.lib.utilities.offline_buffering import BufferingParams # Acquire resources from registry # Creating a copy of system object to keep original object "clean" edge_system = copy.copy(registry.get("edge_system")) # Get values from configuration file config_path = registry.get("package_conf") config = read_user_config(config_path + '/sampleProp.conf') # Initialize DCC object with transport offline_buffering = BufferingParams(persistent_storage=True, queue_size=-1, data_drain_size=10, draining_frequency=1) self.graphite = Graphite(SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort']), buffering_params=offline_buffering) # Register gateway system graphite_edge_system = self.graphite.register(edge_system) registry.register("graphite", self.graphite) registry.register("graphite_edge_system", graphite_edge_system)
def test_graphite_dcc_init_fail_without_DCCComms(self): with self.assertRaises(Exception): g = Graphite("asd") assert not isinstance(g, Graphite) with self.assertRaises(Exception): # noinspection PyArgumentList g = Graphite() assert g is None
class PackageClass(LiotaPackage): """ This package creates a Graphite DCC object and registers system on Graphite to acquire "registered edge system", i.e. graphite_edge_system. """ def run(self, registry): import copy from liota.dccs.graphite import Graphite from liota.dcc_comms.socket_comms import SocketDccComms # Acquire resources from registry # Creating a copy of system object to keep original object "clean" edge_system = copy.copy(registry.get("edge_system")) # Get values from configuration file config_path = registry.get("package_conf") config = {} execfile(config_path + '/sampleProp.conf', config) # Initialize DCC object with transport self.graphite = Graphite( SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) # Register gateway system graphite_edge_system = self.graphite.register(edge_system) registry.register("graphite", self.graphite) registry.register("graphite_edge_system", graphite_edge_system) def clean_up(self): self.graphite.comms.sock.close()
def run(self, registry): import copy from liota.dccs.graphite import Graphite from liota.dcc_comms.socket_comms import Socket # Acquire resources from registry # Creating a copy of system object to keep original object "clean" edge_system = copy.copy(registry.get("edge_system")) # Get values from configuration file config_path = registry.get("package_conf") config = {} execfile(config_path + '/sampleProp.conf', config) # Initialize DCC object with transport self.graphite = Graphite( Socket(ip=config['GraphiteIP'], port=config['GraphitePort']) ) # Register gateway system graphite_edge_system = self.graphite.register(edge_system) registry.register("graphite", self.graphite) registry.register("graphite_edge_system", graphite_edge_system)
class PackageClass(LiotaPackage): """ This package creates a Graphite DCC object and registers system on Graphite to acquire "registered edge system", i.e. graphite_edge_system. """ def run(self, registry): import copy from liota.dccs.graphite import Graphite from liota.dcc_comms.socket_comms import Socket # Acquire resources from registry # Creating a copy of system object to keep original object "clean" edge_system = copy.copy(registry.get("edge_system")) # Get values from configuration file config_path = registry.get("package_conf") config = {} execfile(config_path + '/sampleProp.conf', config) # Initialize DCC object with transport self.graphite = Graphite( Socket(ip=config['GraphiteIP'], port=config['GraphitePort']) ) # Register gateway system graphite_edge_system = self.graphite.register(edge_system) registry.register("graphite", self.graphite) registry.register("graphite_edge_system", graphite_edge_system) def clean_up(self): self.graphite.comms.sock.close()
def run(self, registry): import copy from liota.dccs.graphite import Graphite from liota.dcc_comms.socket_comms import SocketDccComms # Acquire resources from registry # Creating a copy of system object to keep original object "clean" edge_system = copy.copy(registry.get("edge_system")) # Get values from configuration file config_path = registry.get("package_conf") config = read_user_config(config_path + '/sampleProp.conf') # Initialize DCC object with transport self.graphite = Graphite( SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) # Register gateway system graphite_edge_system = self.graphite.register(edge_system) registry.register("graphite", self.graphite) registry.register("graphite_edge_system", graphite_edge_system)
def udm1(): return comms_channel.get(block=True) #--------------------------------------------------------------------------- # In this example, we demonstrate how an event stream of data can be directed to graphite # data center component using Liota by setting sampling_interval_sec parameter to zero. if __name__ == '__main__': edge_system = Dk300EdgeSystem(config['EdgeSystemName']) # Sending data to Graphite data center component # Socket is the underlying transport used to connect to the Graphite # instance graphite = Graphite(SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_edge_system = graphite.register(edge_system) metric_name = config['MetricName'] content_metric = Metric( name=metric_name, unit=None, interval=0, aggregation_size=6, sampling_function=udm1 ) reg_content_metric = graphite.register(content_metric) graphite.create_relationship(graphite_reg_edge_system, reg_content_metric) reg_content_metric.start_collecting()
#--------------------------------------------------------------------------- # In this example, we demonstrate how data from a simulated device generating # random physical variables can be directed to graphite data center component # using Liota. if __name__ == '__main__': edge_system = Dell5KEdgeSystem(config['EdgeSystemName']) # initialize and run the physical model (simulated device) bike_model = BikeSimulated(name=config['DeviceName'], ureg=ureg) # Sending data to Graphite data center component # Socket is the underlying transport used to connect to the Graphite # instance graphite = Graphite( SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_dev = graphite.register(bike_model) metric_name = "model.bike.speed" bike_speed = Metric(name=metric_name, unit=(ureg.m / ureg.sec), interval=5, sampling_function=get_bike_speed) reg_bike_speed = graphite.register(bike_speed) graphite.create_relationship(graphite_reg_dev, reg_bike_speed) reg_bike_speed.start_collecting() metric_name = "model.bike.power" bike_power = Metric(name=metric_name, unit=ureg.watt, interval=5,
reg_mem_free_metric.start_collecting() swap_mem_free_metric = Metric(name="Swap Memory Free", unit=None, interval=8, aggregation_size=5, sampling_function=read_swap_mem_free) reg_swap_mem_free_metric = iotcc.register(swap_mem_free_metric) iotcc.create_relationship(reg_ram_device, reg_swap_mem_free_metric) reg_swap_mem_free_metric.start_collecting() except RegistrationFailure: print "Registration to IOTCC failed" # Multiple DCC support # Sending data to an alternate data center component (e.g. data lake for analytics) # Graphite is a data center component # Socket is the transport which the agent uses to connect to the graphite instance graphite = Graphite( SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_edge_system = graphite.register(edge_system) simulated_metric = Metric(name="edge.simulated.metric", unit=None, interval=10, aggregation_size=5, sampling_function=simulated_value) reg_simulated_metric = graphite.register(simulated_metric) graphite.create_relationship(graphite_reg_edge_system, reg_simulated_metric) reg_simulated_metric.start_collecting()
return random.randint(10, 25) def get_vibration(): return round(random.uniform(0.480, 0.7), 3) # --------------------------------------------------------------------------------------- # In this example, we demonstrate how metrics collected from a SensorTag device over BLE # can be directed to graphite data center component using Liota. # The program illustrates the ease of use Liota brings to IoT application developers. if __name__ == '__main__': # create a data center object, graphite in this case, using websocket as a transport layer graphite = Graphite(SocketDccComms(ip=config['GraphiteIP'], port=8080)) try: # create a System object encapsulating the particulars of a IoT System # argument is the name of this IoT System edge_system = Dell5KEdgeSystem(config['EdgeSystemName']) # resister the IoT System with the graphite instance # this call creates a representation (a Resource) in graphite for this IoT System with the name given reg_edge_system = graphite.register(edge_system) tf_rpm_metric = Metric(name="windmill.RPM", unit=None, interval=1, aggregation_size=1, sampling_function=get_rpm)
return round((100 - cpu_pcts['idle']), 2) # --------------------------------------------------------------------------- # In this example, we demonstrate how a Dell5000 Gateway metric (e.g., # CPU utilization) can be directed to graphite data center component # using Liota. The program illustrates the ease of use Liota brings # to IoT application developers. if __name__ == '__main__': edge_system = Dell5KEdgeSystem(config['EdgeSystemName']) # Sending data to Graphite data center component # Socket is the underlying transport used to connect to the Graphite # instance graphite = Graphite(SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_edge_system = graphite.register(edge_system) metric_name = config['MetricName'] cpu_utilization = Metric( name=metric_name, unit=None, interval=10, aggregation_size=2, sampling_function=read_cpu_utilization ) reg_cpu_utilization = graphite.register(cpu_utilization) graphite.create_relationship(graphite_reg_edge_system, reg_cpu_utilization) reg_cpu_utilization.start_collecting()
print value if __name__ == '__main__': rpm_limit = 45 vib_limit = 0.500 ModelRule = lambda rpm, vib: 1 if (rpm >= rpm_limit and vib >= vib_limit ) else 0 exceed_limit = 2 #number of consecutive times a limit can be exceeded edge_component = RuleEdgeComponent(ModelRule, exceed_limit, actuator_udm=action_actuator) graphite = Graphite(SocketDccComms(ip=config['GraphiteIP'], port=8080), edge_component) # create a System object encapsulating the particulars of a IoT System # argument is the name of this IoT System edge_system = Dell5KEdgeSystem(config['EdgeSystemName']) # resister the IoT System with the graphite instance # this call creates a representation (a Resource) in graphite for this IoT System with the name given rule_rpm_metric = Metric(name="rpm", unit=None, interval=1, aggregation_size=1, sampling_function=get_rpm) rule_reg_rpm_metric = graphite.register(rule_rpm_metric)
# In this example, we demonstrate how data from a simulated device generating # random physical variables can be directed to graphite data center component # using Liota. if __name__ == '__main__': edge_system = Dell5KEdgeSystem(config['EdgeSystemName']) # initialize and run the physical model (simulated device) thermistor_model = ThermistorSimulated(name=config['DeviceName'], ureg=ureg) # Sending data to a data center component # Graphite is a data center component # Socket is the transport which the agent uses to connect to the graphite # instance graphite = Graphite(SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_dev = graphite.register(thermistor_model) metric_name = "model.thermistor.temperature" thermistor_temper = Metric( name=metric_name, unit=ureg.degC, interval=5, sampling_function=get_thermistor_temperature ) reg_thermistor_temper = graphite.register(thermistor_temper) graphite.create_relationship(graphite_reg_dev, reg_thermistor_temper) reg_thermistor_temper.start_collecting()
def udm1(): return comms_channel.get(block=True) #--------------------------------------------------------------------------- # In this example, we demonstrate how an event stream of data can be directed to graphite # data center component using Liota by setting sampling_interval_sec parameter to zero. if __name__ == '__main__': edge_system = Dk300EdgeSystem(config['EdgeSystemName']) # Sending data to Graphite data center component # Socket is the underlying transport used to connect to the Graphite # instance graphite = Graphite( Socket(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_edge_system = graphite.register(edge_system) metric_name = config['MetricName'] content_metric = Metric(name=metric_name, unit=None, interval=0, aggregation_size=6, sampling_function=udm1) reg_content_metric = graphite.register(content_metric) graphite.create_relationship(graphite_reg_edge_system, reg_content_metric) reg_content_metric.start_collecting()
def test_graphite_dcc_init_takes_DCCComms(self): mock_dccc = mock.create_autospec(DCCComms) g = Graphite(mock_dccc) assert isinstance(g, Graphite)
# random numbers can be directed to graphite data center component using Liota. # The program illustrates the ease of use Liota brings to IoT application # developers. def xmpp_subscribe(): xmpp_conn = XmppDeviceComms("[email protected]", "m1ndst1x", "127.0.0.1", "5222") xmpp_conn.subscribe("pubsub.127.0.0.1", "/vmware11", callback_openfire_data) if __name__ == '__main__': xmpp_subscribe() edge_system = SimulatedEdgeSystem('EdgeSystemName') # Sending data to Graphite data center component # Socket is the underlying transport used to connect to the Graphite # instance graphite = Graphite(SocketDccComms(ip='127.0.0.1', port=80)) graphite_reg_edge_system = graphite.register(edge_system) metric_name = 'OpenfireData' openfire_metric = Metric( name=metric_name, interval=0, sampling_function=lambda: get_value(openfire_data)) reg_openfire_metric = graphite.register(openfire_metric) graphite.create_relationship(graphite_reg_edge_system, reg_openfire_metric) reg_openfire_metric.start_collecting()
return round((100 - cpu_pcts['idle']), 2) # --------------------------------------------------------------------------- # In this example, we demonstrate how a Dell5000 Gateway metric (e.g., # CPU utilization) can be directed to graphite data center component # using Liota. The program illustrates the ease of use Liota brings # to IoT application developers. if __name__ == '__main__': edge_system = Dell5KEdgeSystem(config['EdgeSystemName']) # Sending data to Graphite data center component # Socket is the underlying transport used to connect to the Graphite # instance graphite = Graphite(SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_edge_system = graphite.register(edge_system) metric_name = config['MetricName'] cpu_utilization = Metric( name=metric_name, unit=None, interval=10, aggregation_size=2, sampling_function=read_cpu_utilization ) reg_cpu_utilization = graphite.register(cpu_utilization) graphite.create_relationship(graphite_reg_edge_system, reg_cpu_utilization) reg_cpu_utilization.start_collecting()
# --------------------------------------------------------------------------- # In this example, we demonstrate how a Raspberry Pi Gateway metric (e.g., # CPU utilization) can be directed to graphite data center component # using Liota. The program illustrates the ease of use Liota brings # to IoT application developers. if __name__ == '__main__': edge_system = RaspberrypiEdgeSystem(config['EdgeSystemName']) # Sending data to Graphite data center component # Socket is the underlying transport used to connect to the Graphite # instance graphite = Graphite( SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_edge_system = graphite.register(edge_system) metric_name_t = config['MetricName_temperature'] temperature = Metric(name=metric_name_t, interval=3, sampling_function=get_temperature) reg_temperature = graphite.register(temperature) graphite.create_relationship(graphite_reg_edge_system, reg_temperature) reg_temperature.start_collecting() metric_name_p = config['MetricName_pressure'] pressure = Metric(name=metric_name_p, interval=3, sampling_function=get_pressure)
rule_rpm_metric = Metric(name="rpm", unit=None, interval=1, aggregation_size=1, sampling_function=get_rpm) rpm_limit = 45 vib_limit = 0.500 ModelRule = lambda rpm, vib: 1 if (rpm >= rpm_limit and vib >= vib_limit) else 0 exceed_limit = 1 #number of consecutive times a limit can be exceeded edge_component = RuleEdgeComponent(ModelRule, exceed_limit, actuator_udm=action_actuator) graphite = Graphite(SocketDccComms(ip=config['GraphiteIP'], port=8080), edge_component) reg_edge_system = graphite.register(edge_system) rule_reg_rpm_metric = graphite.register(rule_rpm_metric) rule_reg_rpm_metric.start_collecting() rule_vib_metric = Metric(name="vib", unit=None, interval=2, aggregation_size=1, sampling_function=get_vibration) rule_reg_vib_metric = graphite.register(rule_vib_metric) rule_reg_vib_metric.start_collecting() except RegistrationFailure:
def random_function(): return 3 def on_message(client, data, msg): d = eval(msg.payload) print(d) # getting values from conf file config = {} execfile('sampleProp.conf', config) if __name__ == '__main__': edge_system = Dell5KEdgeSystem(config['EdgeSystemName']) graphite = Graphite( SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_dev = graphite.register(edge_system) mqtt = MqttDeviceComms(url="test.mosquitto.org", port=1883, clean_session=True, conn_disconn_timeout=1000) print('Connection to broker established...') mqtt.subscribe("random_data", callback=on_message, qos=2) print('Subscribed to random_data') metric_name = "model.device_data" random_metric = Metric(name=metric_name, interval=5, sampling_function=random_function) reg_metric = graphite.register(random_metric) graphite.create_relationship(graphite_reg_dev, reg_metric) reg_metric.start_collecting()
return rpm_model_queue.get(block=True) def action_actuator(value): print value # --------------------------------------------------------------------------------------- # In this example, we demonstrate how metrics collected from a SensorTag device over BLE # can be directed to graphite data center component using Liota. # The program illustrates the ease of use Liota brings to IoT application developers. if __name__ == '__main__': # create a data center object, graphite in this case, using websocket as a transport layer graphite = Graphite( SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) try: # create a System object encapsulating the particulars of a IoT System # argument is the name of this IoT System edge_system = Dell5KEdgeSystem(config['EdgeSystemName']) # resister the IoT System with the graphite instance # this call creates a representation (a Resource) in graphite for this IoT System with the name given reg_edge_system = graphite.register(edge_system) # Operational metrics of EdgeSystem cpu_utilization_metric = Metric(name="windmill.CPU_Utilization", unit=None, interval=10, aggregation_size=2,
return list_of_timestamp_value_tuples # --------------------------------------------------------------------------- # In this example, we demonstrate how data for a simulated metric generating # random numbers can be directed to graphite data center component using Liota. # The program illustrates the ease of use Liota brings to IoT application # developers. if __name__ == '__main__': edge_system = SimulatedEdgeSystem(config['EdgeSystemName']) # Sending data to Graphite data center component # Socket is the underlying transport used to connect to the Graphite # instance graphite = Graphite(Socket(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_edge_system = graphite.register(edge_system) # A simple simulated metric which generates metric value every 10 seconds simple_metric_name = config['MetricName'] simple_metric = Metric(name=simple_metric_name, interval=10, sampling_function=simulated_value_sampling_function) reg_simple_metric = graphite.register(simple_metric) graphite.create_relationship(graphite_reg_edge_system, reg_simple_metric) reg_simple_metric.start_collecting() # A simulated metric producing sample value along with timestamp when the sample was generated metric_with_own_ts_name = config['MetricWithOwnTsName'] metric_with_own_ts = Metric(name=metric_with_own_ts_name, interval=10, sampling_function=simulated_timestamp_value_sampling_function) reg_metric_with_own_ts = graphite.register(metric_with_own_ts)
name="Swap Memory Free", unit=None, interval=8, aggregation_size=5, sampling_function=read_swap_mem_free ) reg_swap_mem_free_metric = iotcc.register(swap_mem_free_metric) iotcc.create_relationship(reg_ram_device, reg_swap_mem_free_metric) reg_swap_mem_free_metric.start_collecting() except RegistrationFailure: print "Registration to IOTCC failed" # Multiple DCC support # Sending data to an alternate data center component (e.g. data lake for analytics) # Graphite is a data center component # Socket is the transport which the agent uses to connect to the graphite instance graphite = Graphite(SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_edge_system = graphite.register(edge_system) simulated_metric = Metric( name="edge.simulated.metric", unit=None, interval=10, aggregation_size=5, sampling_function=simulated_value ) reg_simulated_metric = graphite.register(simulated_metric) graphite.create_relationship(graphite_reg_edge_system, reg_simulated_metric) reg_simulated_metric.start_collecting()
#--------------------------------------------------------------------------- # In this example, we demonstrate how data from a simulated device generating # random physical variables can be directed to graphite data center component # using Liota. if __name__ == '__main__': edge_system = Dell5KEdgeSystem(config['EdgeSystemName']) # initialize and run the physical model (simulated device) bike_model = BikeSimulated(name=config['DeviceName'], ureg=ureg) # Sending data to Graphite data center component # Socket is the underlying transport used to connect to the Graphite # instance graphite = Graphite(Socket(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_dev = graphite.register(bike_model) metric_name = "model.bike.speed" bike_speed = Metric( name=metric_name, unit=(ureg.m / ureg.sec), interval=5, sampling_function=get_bike_speed ) reg_bike_speed = graphite.register(bike_speed) graphite.create_relationship(graphite_reg_dev, reg_bike_speed) reg_bike_speed.start_collecting() metric_name = "model.bike.power" bike_power = Metric(
return temp_kelvin.magnitude # -------------------------------------------------------------------------- # In this example, we demonstrate how data from a simulated device generating # random numbers can be directed to graphite data center component using Liota. # The program illustrates the ease of use Liota brings to IoT application developers. if __name__ == '__main__': edge_system = Dk300EdgeSystem(config['EdgeSystemName']) # Sending data to Graphite data center component # Socket is the underlying transport used to connect to the Graphite # instance graphite = Graphite( Socket(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_edge_system = graphite.register(edge_system) metric_name_temp_degC = config['MetricNameTempDegC'] temp_metric_degC = Metric(name=metric_name_temp_degC, unit=ureg.degC, interval=33, aggregation_size=6, sampling_function=getTempDegC) reg_temp_metric_degC = graphite.register(temp_metric_degC) graphite.create_relationship(graphite_reg_edge_system, reg_temp_metric_degC) reg_temp_metric_degC.start_collecting() metric_name_temp_degF = config['MetricNameTempDegF'] temp_metric_degF = Metric(name=metric_name_temp_degF,
# In this example, we demonstrate how data from a simulated device generating # random physical variables can be directed to graphite data center component # using Liota. if __name__ == '__main__': edge_system = Dell5KEdgeSystem(config['EdgeSystemName']) # initialize and run the physical model (simulated device) thermistor_model = ThermistorSimulated(name=config['DeviceName'], ureg=ureg) # Sending data to a data center component # Graphite is a data center component # Socket is the transport which the agent uses to connect to the graphite # instance graphite = Graphite(SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_dev = graphite.register(thermistor_model) metric_name = "model.thermistor.temperature" thermistor_temper = Metric( name=metric_name, unit=ureg.degC, interval=5, sampling_function=get_thermistor_temperature ) reg_thermistor_temper = graphite.register(thermistor_temper) graphite.create_relationship(graphite_reg_dev, reg_thermistor_temper) reg_thermistor_temper.start_collecting()
temp_kelvin = temp.to('kelvin') return temp_kelvin.magnitude # -------------------------------------------------------------------------- # In this example, we demonstrate how data from a simulated device generating # random numbers can be directed to graphite data center component using Liota. # The program illustrates the ease of use Liota brings to IoT application developers. if __name__ == '__main__': edge_system = Dk300EdgeSystem(config['EdgeSystemName']) # Sending data to Graphite data center component # Socket is the underlying transport used to connect to the Graphite # instance graphite = Graphite(SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) graphite_reg_edge_system = graphite.register(edge_system) metric_name_temp_degC = config['MetricNameTempDegC'] temp_metric_degC = Metric( name=metric_name_temp_degC, unit=ureg.degC, interval=33, aggregation_size=6, sampling_function=getTempDegC ) reg_temp_metric_degC = graphite.register(temp_metric_degC) graphite.create_relationship(graphite_reg_edge_system, reg_temp_metric_degC) reg_temp_metric_degC.start_collecting() metric_name_temp_degF = config['MetricNameTempDegF']
return rpm_model_queue.get(block=True) def action_actuator(value): print value # --------------------------------------------------------------------------------------- # In this example, we demonstrate how metrics collected from a SensorTag device over BLE # can be directed to graphite data center component using Liota. # The program illustrates the ease of use Liota brings to IoT application developers. if __name__ == '__main__': # create a data center object, graphite in this case, using websocket as a transport layer graphite = Graphite( SocketDccComms(ip=config['GraphiteIP'], port=config['GraphitePort'])) try: # create a System object encapsulating the particulars of a IoT System # argument is the name of this IoT System edge_system = Dell5KEdgeSystem(config['EdgeSystemName']) # resister the IoT System with the graphite instance # this call creates a representation (a Resource) in graphite for this IoT System with the name given reg_edge_system = graphite.register(edge_system) # Operational metrics of EdgeSystem cpu_utilization_metric = Metric(name="windmill.CPU_Utilization", unit=None, interval=10, aggregation_size=2,