Skip to content

Commit 7d1f05d

Browse files
committed
made all required changes from PR comment including parameterizing sql queries, change dict key names for displaying data, removing hard coded warehouse_id, etc
1 parent 2c23033 commit 7d1f05d

File tree

3 files changed

+50
-36
lines changed

3 files changed

+50
-36
lines changed
Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,29 @@
99
import os
1010
import json
1111
import time
12+
import re
1213
import paho.mqtt.client as mqtt_client
1314

15+
# Configure logging
16+
logging.basicConfig(
17+
level=logging.INFO,
18+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
19+
)
1420

15-
log = logging.getLogger('werkzeug')
16-
log.setLevel(logging.ERROR)
21+
# Create logger for this application
22+
logger = logging.getLogger(__name__)
23+
24+
# Suppress werkzeug logging to reduce noise
25+
werkzeug_log = logging.getLogger('werkzeug')
26+
werkzeug_log.setLevel(logging.ERROR)
1727

1828
flask_app = Flask(__name__)
1929

2030

2131
client = WorkspaceClient()
2232

2333
# Database connection function
24-
def get_data(query, warehouse_id):
34+
def get_data(query, warehouse_id, params=None):
2535
"""Execute query with fallback to demo data"""
2636
try:
2737
cfg = Config()
@@ -31,19 +41,19 @@ def get_data(query, warehouse_id):
3141
http_path=f"/sql/1.0/warehouses/{warehouse_id}",
3242
credentials_provider=lambda: cfg.authenticate
3343
) as connection:
34-
df = pandas.read_sql(query, connection)
44+
if params:
45+
df = pandas.read_sql(query, connection, params=params)
46+
else:
47+
df = pandas.read_sql(query, connection)
3548
# Convert DataFrame to list of dictionaries
3649
return df.to_dict('records')
3750
except Exception as e:
38-
print(f"Database query failed: {e}")
51+
logger.error(f"Database query failed: {e}")
3952
# Return empty list on error so we can show a message
4053
return []
4154

4255

4356
def create_job(client, notebook_path, cluster_id):
44-
# cluster_id = (
45-
# w.clusters.ensure_cluster_is_running(os.environ["DATABRICKS_CLUSTER_ID"]) and os.environ["DATABRICKS_CLUSTER_ID"]
46-
# )
4757

4858
created_job = client.jobs.create(
4959
name=f"mqtt_{time.time_ns()}",
@@ -91,9 +101,9 @@ def mqtt_remote_client(mqtt_server_config):
91101
# Callback function for when the client connects
92102
def on_connect(client, userdata, flags, rc):
93103
if rc == 0:
94-
print("Connected successfully to MQTT Broker!")
104+
logger.info("Connected successfully to MQTT Broker!")
95105
else:
96-
print(f"Failed to connect, return code {rc}\n")
106+
logger.error(f"Failed to connect, return code {rc}")
97107

98108
client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION1, client_id="mqtt_connection_test", clean_session=True)
99109

@@ -163,10 +173,10 @@ def get_mqtt_stats():
163173
"""Get MQTT message statistics from data"""
164174
if not curr_data or len(curr_data) == 0:
165175
return {
166-
'critical': 0,
167-
'in_progress': 0,
168-
'resolved_today': 0,
169-
'avg_response_time': 0
176+
'duplicated_messages': 0,
177+
'qos2_messages': 0,
178+
'unique_topics': 0,
179+
'total_messages': 0
170180
}
171181

172182
# Count duplicated messages
@@ -179,10 +189,10 @@ def get_mqtt_stats():
179189
row_count = len(curr_data)
180190

181191
return {
182-
'critical': duplicated,
183-
'in_progress': qos2_messages,
184-
'resolved_today': unique_topics,
185-
'avg_response_time': row_count
192+
'duplicated_messages': duplicated,
193+
'qos2_messages': qos2_messages,
194+
'unique_topics': unique_topics,
195+
'total_messages': row_count
186196
}
187197

188198

@@ -250,8 +260,8 @@ def start_mqtt_job():
250260
}), 400
251261

252262
# Get notebook_path and cluster_id from config
253-
notebook_path = mqtt_config.get('notebook_path', '/Workspace/Users/[email protected]/mqtt/MQTT_data_source_v0')
254-
cluster_id = mqtt_config.get('cluster_id', '0709-132523-cnhxf2p6')
263+
notebook_path = mqtt_config.get('notebook_path')
264+
cluster_id = mqtt_config.get('cluster_id')
255265

256266
# Create the job
257267
created_job = create_job(client, notebook_path, cluster_id)
@@ -286,7 +296,7 @@ def refresh_data():
286296
catalog = data.get('catalog')
287297
schema = data.get('schema')
288298
table = data.get('table')
289-
# warehouse_id = data.get('warehouse_id', DEFAULT_WAREHOUSE_ID)
299+
warehouse_id = data.get('warehouse_id', '4b9b953939869799') # Default fallback
290300

291301
# Validate required fields
292302
if not catalog or not schema or not table:
@@ -295,11 +305,11 @@ def refresh_data():
295305
'error': 'Catalog, Schema, and Table name are required'
296306
}), 400
297307

298-
# Build the query
299-
query = f"SELECT message, is_duplicate, qos, topic, received_time FROM {catalog}.{schema}.{table} ORDER BY received_time DESC LIMIT 100"
308+
# Build the query with parameterized values
309+
query = "SELECT message, is_duplicate, qos, topic, received_time FROM %s.%s.%s ORDER BY received_time DESC LIMIT %s"
300310

301-
# Fetch data using get_data function
302-
curr_data = get_data(query, "4b9b953939869799")
311+
# Fetch data using get_data function with parameters
312+
curr_data = get_data(query, warehouse_id, (catalog, schema, table, 100))
303313

304314
# Calculate stats from refreshed data
305315
stats = get_mqtt_stats()
@@ -358,7 +368,7 @@ def get_severity_color(severity):
358368
return 'bg-gray-100 text-gray-800'
359369

360370
if __name__ == '__main__':
361-
print("🚀 Starting MQTT Data Monitor Dashboard")
362-
print("📡 MQTT Message Processing & Analytics Platform")
363-
print("=" * 50)
371+
logger.info("Starting MQTT Data Monitor Dashboard")
372+
logger.info("MQTT Message Processing & Analytics Platform")
373+
logger.info("=" * 50)
364374
flask_app.run(debug=True, host='0.0.0.0', port=8001)

mqtt/apps/MQTT Data Monitor/static/js/app.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,25 @@ function updateStatsCards(stats) {
88
// Update Duplicated Messages
99
const duplicatedElement = document.querySelector('.text-2xl.font-semibold.text-mqtt-error');
1010
if (duplicatedElement) {
11-
duplicatedElement.textContent = stats.critical || 0;
11+
duplicatedElement.textContent = stats.duplicated_messages || 0;
1212
}
1313

1414
// Update QOS=2 Messages
1515
const qos2Element = document.querySelector('.text-2xl.font-semibold.text-mqtt-warning');
1616
if (qos2Element) {
17-
qos2Element.textContent = stats.in_progress || 0;
17+
qos2Element.textContent = stats.qos2_messages || 0;
1818
}
1919

2020
// Update Unique Topics
2121
const topicsElement = document.querySelector('.text-2xl.font-semibold.text-mqtt-success');
2222
if (topicsElement) {
23-
topicsElement.textContent = stats.resolved_today || 0;
23+
topicsElement.textContent = stats.unique_topics || 0;
2424
}
2525

2626
// Update Total Messages
2727
const totalElement = document.querySelector('.text-2xl.font-semibold.text-mqtt-azure');
2828
if (totalElement) {
29-
totalElement.textContent = stats.avg_response_time || 0;
29+
totalElement.textContent = stats.total_messages || 0;
3030
}
3131
}
3232

@@ -439,6 +439,7 @@ document.addEventListener('DOMContentLoaded', function() {
439439

440440
try {
441441
console.log('Sending refresh request...');
442+
const warehouseId = document.getElementById('warehouse_id').value;
442443
const response = await fetch('/api/refresh-data', {
443444
method: 'POST',
444445
headers: {
@@ -448,6 +449,7 @@ document.addEventListener('DOMContentLoaded', function() {
448449
catalog: catalog,
449450
schema: schema,
450451
table: table,
452+
warehouse_id: warehouseId,
451453
})
452454
});
453455

@@ -490,6 +492,7 @@ document.addEventListener('DOMContentLoaded', function() {
490492
const catalog = document.getElementById('catalog').value;
491493
const schema = document.getElementById('schema').value;
492494
const table = document.getElementById('table').value;
495+
const warehouseId = document.getElementById('warehouse_id').value;
493496

494497
// Only refresh if all fields are filled
495498
if (!catalog || !schema || !table) {
@@ -507,6 +510,7 @@ document.addEventListener('DOMContentLoaded', function() {
507510
catalog: catalog,
508511
schema: schema,
509512
table: table,
513+
warehouse_id: warehouseId,
510514
})
511515
});
512516

mqtt/apps/MQTT Data Monitor/templates/dashboard.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ <h3 class="text-lg font-medium text-mqtt-text mb-4">Job Settings</h3>
267267
</div>
268268
<div class="ml-4">
269269
<p class="text-sm font-medium text-mqtt-text-light">Duplicated Messages</p>
270-
<p class="text-2xl font-semibold text-mqtt-error">{{ stats.critical }}</p>
270+
<p class="text-2xl font-semibold text-mqtt-error">{{ stats.duplicated_messages }}</p>
271271
</div>
272272
</div>
273273
</div>
@@ -281,7 +281,7 @@ <h3 class="text-lg font-medium text-mqtt-text mb-4">Job Settings</h3>
281281
</div>
282282
<div class="ml-4">
283283
<p class="text-sm font-medium text-mqtt-text-light">QOS=2 Messages</p>
284-
<p class="text-2xl font-semibold text-mqtt-warning">{{ stats.in_progress }}</p>
284+
<p class="text-2xl font-semibold text-mqtt-warning">{{ stats.qos2_messages }}</p>
285285
</div>
286286
</div>
287287
</div>
@@ -295,7 +295,7 @@ <h3 class="text-lg font-medium text-mqtt-text mb-4">Job Settings</h3>
295295
</div>
296296
<div class="ml-4">
297297
<p class="text-sm font-medium text-mqtt-text-light">Unique Topics</p>
298-
<p class="text-2xl font-semibold text-mqtt-success">{{ stats.resolved_today }}</p>
298+
<p class="text-2xl font-semibold text-mqtt-success">{{ stats.unique_topics }}</p>
299299
</div>
300300
</div>
301301
</div>
@@ -309,7 +309,7 @@ <h3 class="text-lg font-medium text-mqtt-text mb-4">Job Settings</h3>
309309
</div>
310310
<div class="ml-4">
311311
<p class="text-sm font-medium text-mqtt-text-light">Total Messages</p>
312-
<p class="text-2xl font-semibold text-mqtt-azure">{{ stats.avg_response_time }}</p>
312+
<p class="text-2xl font-semibold text-mqtt-azure">{{ stats.total_messages }}</p>
313313
</div>
314314
</div>
315315
</div>

0 commit comments

Comments
 (0)