Enabling monitoring for Exampleservice as a reference for other services
Change-Id: I67801d07170dea267a22179e4f8a7fb1312b6521
diff --git a/xos/synchronizer/monitoring_agent/monitoring_agent.py b/xos/synchronizer/monitoring_agent/monitoring_agent.py
new file mode 100644
index 0000000..1839ed5
--- /dev/null
+++ b/xos/synchronizer/monitoring_agent/monitoring_agent.py
@@ -0,0 +1,111 @@
+#!/usr/bin/python
+from flask import request, Request, jsonify
+from flask import Flask
+from flask import make_response
+from kombu.connection import BrokerConnection
+from kombu.messaging import Exchange, Queue, Consumer, Producer
+import logging
+import logging.handlers
+import logging.config
+import exampleservice_stats as stats
+import threading
+import subprocess
+import six
+import uuid
+import datetime
+from urlparse import urlparse
+app = Flask(__name__)
+
+start_publish = False
+keystone_tenant_id='3a397e70f64e4e40b69b6266c634d9d0'
+keystone_user_id='1e3ce043029547f1a61c1996d1a531a2'
+rabbit_user='openstack'
+rabbit_password='80608318c273f348a7c3'
+rabbit_host='10.11.10.1'
+rabbit_exchange='cord'
+publisher_id='exampleservice_publisher'
+
+@app.route('/monitoring/agent/exampleservice/start',methods=['POST'])
+def exampleservice_start_monitoring_agent():
+ global start_publish, rabbit_user, rabbit_password, rabbit_host, rabbit_exchange
+ try:
+ # To do validation of user inputs for all the functions
+ target = request.json['target']
+ logging.debug("target:%s",target)
+ keystone_user_id = request.json['keystone_user_id']
+ keystone_tenant_id = request.json['keystone_tenant_id']
+ url = urlparse(target)
+ rabbit_user = url.username
+ rabbit_password = url.password
+ rabbit_host = url.hostname
+
+ setup_rabbit_mq_channel()
+
+ start_publish = True
+ periodic_publish()
+
+ logging.info("Exampleservice monitoring is enabled")
+ return "Exampleservice monitoring is enabled"
+ except Exception as e:
+ return e.__str__()
+
+@app.route('/monitoring/agent/exampleservice/stop',methods=['POST'])
+def openstack_stop():
+ global start_publish
+ start_publish = False
+ logging.info ("Exampleservice monitoring is stopped")
+ return "Exampleservice monitoring is stopped"
+
+
+producer = None
+def setup_rabbit_mq_channel():
+ global producer
+ global rabbit_user, rabbit_password, rabbit_host, rabbit_exchange,publisher_id
+ service_exchange = Exchange(rabbit_exchange, "topic", durable=False)
+ # connections/channels
+ connection = BrokerConnection(rabbit_host, rabbit_user, rabbit_password)
+ logging.info('Connection to RabbitMQ server successful')
+ channel = connection.channel()
+ # produce
+ producer = Producer(channel, exchange=service_exchange, routing_key='notifications.info')
+ p = subprocess.Popen('hostname', shell=True, stdout=subprocess.PIPE)
+ (hostname, error) = p.communicate()
+ publisher_id = publisher_id + '_on_' + hostname
+ logging.info('publisher_id=%s',publisher_id)
+
+def publish_exampleservice_stats(example_stats):
+ global producer
+ global keystone_tenant_id, keystone_user_id, publisher_id
+
+ for k,v in example_stats.iteritems():
+ msg = {'event_type': 'cord.'+k,
+ 'message_id':six.text_type(uuid.uuid4()),
+ 'publisher_id': publisher_id,
+ 'timestamp':datetime.datetime.now().isoformat(),
+ 'priority':'INFO',
+ 'payload': {'name':k,
+ 'unit':v['unit'],
+ 'result':v['val'],
+ 'type':v['metric_type'],
+ 'resource_id':'exampleservice',
+ 'user_id':keystone_user_id,
+ 'tenant_id':keystone_tenant_id
+ }
+ }
+ producer.publish(msg)
+ logging.debug('Publishing exampleservice event: %s', msg)
+
+def periodic_publish():
+ global start_publish
+ if not start_publish:
+ return
+ stats.retrieve_status_page()
+ resParse = stats.parse_status_page()
+ logging.debug ("publish:%(data)s" % {'data':resParse})
+ publish_exampleservice_stats(resParse)
+ threading.Timer(5, periodic_publish).start()
+
+if __name__ == "__main__":
+ logging.config.fileConfig('monitoring_agent.conf', disable_existing_loggers=False)
+ logging.info ("Exampleservice monitoring is listening on port 5004")
+ app.run(host="0.0.0.0",port=5004,debug=False)