For each web environment we usually want to real time monitor our web link is down or not, here comes the solution:
1. build the url list
2. check the web link status
3. display the status on dashboard
STEP 1. Build the url list
We create load_urls.py to import list from csv file to sqlite db
run python3 load_list.py to import list
import sqlite3 import pandas as pd # Import CSV data = pd.read_csv('list.csv', engine='python') df = pd.DataFrame(data) print(df) conn = sqlite3.connect('db.sqlite') c = conn.cursor() # delete all rows from table c.execute('DELETE FROM User;',); print('We have deleted', c.rowcount, 'records from the table.') # Insert DataFrame to Table for row in df.itertuples(): c.execute("INSERT INTO User (app_name, app_url, app_status) VALUES (?,?,?)", (row.app_name, row.app_url, row.app_status)) conn.commit() #close the connection conn.close()
STEP 2. check the url status with curl command
setup cron job as below to do status check every 5 minutes:
*/5 * * * * /root/monitor/daily_check.sh >/dev/null 2>&1
import subprocess from bootstrap_table import db, User import pandas as pd def api(cmd): p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) stdout, stderr = p.communicate() return stdout def remote_bash(app_url): curl_cmd = "curl -kIs " + app_url + " --connect-timeout 5 | head -1" return curl_cmd def status_check(app_output): substring = "200" if app_output.find(substring) != -1: return "UP" else: return "DOWN" for row in User.query.all(): curl_cmd = remote_bash(row.app_url) curl_out = api(curl_cmd) if status_check(curl_out) != row.app_status: # send alerts to TEAMS channel JSON = "curl -H \'Content-Type: application/json\' -d \'{\"text\": \"%s %s is %s\"}\' https://labcorp.webhook.office.com/webhookb2/f3c6c02d-d1a-46cb-b304-84f4460b98b0@cdc1229-ac2a-4b97-b78a-0e5cacb5865c/IncomingWebhook/57b24246ed804247a2f60841256c6d5e/d8062d41-34c8-475d-81b2-04465b429007" % (row.app_name, row.app_url, status_check(curl_out)) api(JSON) row.app_status = status_check(curl_out) db.session.commit()
STEP 3. display the status on dashboard (bootstrap_table.py)
from flask import Flask, render_template from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) app_name = db.Column(db.String(100), index=True) app_url = db.Column(db.String(200), index=True) app_status = db.Column(db.String(20), index=True) db.create_all() @app.route('/') def index(): users = User.query return render_template('bootstrap_table.html', title='Application Status Monitor', users=users) if __name__ == '__main__': app.run(host='0.0.0.0')
bootstrap_table.html
{% extends "base.html" %} {% block content %} <table id="data" class="table table-striped"> <thead> <tr> <th>app_name</th> <th>app_url</th> <th>app_status</th> </tr> </thead> <tbody> {% for user in users %} <tr> <td>{{ user.app_name }}</td> <td>{{ user.app_url }}</td> {% if user.app_status == "UP" %} <td style="color:#00FF00"><strong>{{ user.app_status }}</strong></td> {% else %} <td style="color:#FF0000"><strong>{{ user.app_status }}</strong></td> {% endif %} </tr> {% endfor %} </tbody> </table> {% endblock %}
and base.html
<!doctype html> <html> <head> <title>{{ title }}</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous"> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.25/css/dataTables.bootstrap5.css"> </head> <body> <div class="container"> <h1>{{ title }}</h1> <hr> {% block content %}{% endblock %} </div> <script type="text/javascript" charset="utf8" src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.25/js/jquery.dataTables.js"></script> <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.25/js/dataTables.bootstrap5.js"></script> {% block scripts %}{% endblock %} </body> </html>