Fixes bugs regarding alarm deletion
[osm/MON.git] / osm_mon / cmd / mon_healthcheck.py
diff --git a/osm_mon/cmd/mon_healthcheck.py b/osm_mon/cmd/mon_healthcheck.py
new file mode 100644 (file)
index 0000000..412410b
--- /dev/null
@@ -0,0 +1,85 @@
+# Copyright 2018 Whitestack, LLC
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Whitestack, LLC
+
+# 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.
+
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact: bdiaz@whitestack.com or glavado@whitestack.com
+##
+
+import logging
+import subprocess
+import sys
+import uuid
+
+import requests
+
+from osm_mon.core.message_bus.consumer import Consumer
+
+log = logging.getLogger(__name__)
+
+
+def main():
+    # Check Kafka
+    if not _processes_running():
+        sys.exit(1)
+    if not _is_kafka_ok():
+        sys.exit(1)
+    if not _is_prometheus_exporter_ok():
+        sys.exit(1)
+    sys.exit(0)
+
+
+def _processes_running():
+    def _contains_process(processes, process_name):
+        for row in processes:
+            if process_name in row:
+                return True
+        return False
+    processes_to_check = ['osm-mon-collector', 'osm-mon-evaluator', 'osm-mon-server']
+    ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]
+    processes_running = ps.split('\n')
+    for p in processes_to_check:
+        if not _contains_process(processes_running, p):
+            return False
+    return True
+
+
+def _is_prometheus_exporter_ok():
+    try:
+        r = requests.get('http://localhost:8000')
+        r.raise_for_status()
+        return True
+    except Exception:
+        log.exception("MON Prometheus exporter is not running")
+        return False
+
+
+def _is_kafka_ok():
+    try:
+        common_consumer = Consumer("mon-healthcheck-" + str(uuid.uuid4()))
+        topics = ['alarm_request', 'vim_account']
+        common_consumer.subscribe(topics)
+        common_consumer.poll()
+        common_consumer.close(autocommit=False)
+        return True
+    except Exception:
+        log.exception("MON can not connect to Kafka")
+        return False
+
+
+if __name__ == '__main__':
+    main()