import streamlit as st import psutil import speedtest import plotly.graph_objects as go import time # Function to get CPU and memory usage def get_system_metrics(): cpu_usage = psutil.cpu_percent(interval=1) memory_info = psutil.virtual_memory() memory_usage = memory_info.percent return cpu_usage, memory_usage # Function to get internet speed def get_internet_speed(): try: st = speedtest.Speedtest() st.get_best_server() download_speed = st.download() / 1_000_000 # Convert to Mbps upload_speed = st.upload() / 1_000_000 # Convert to Mbps return download_speed, upload_speed except: return None, None # Function to create a gauge chart def create_gauge_chart(value, title, min_value=0, max_value=100): fig = go.Figure(go.Indicator( mode="gauge+number", value=value, title={'text': title}, gauge={'axis': {'range': [min_value, max_value]}, 'bar': {'color': "lightblue"}, 'bgcolor': "white", 'steps': [{'range': [min_value, max_value], 'color': "lightgrey"}], 'threshold': {'line': {'color': "red", 'width': 4}, 'thickness': 0.75, 'value': max_value}})) return fig # Streamlit layout st.title("System Monitoring Dashboard") # Create placeholders for each gauge cpu_placeholder = st.empty() memory_placeholder = st.empty() download_placeholder = st.empty() upload_placeholder = st.empty() # Update the metrics in real-time while True: cpu_usage, memory_usage = get_system_metrics() download_speed, upload_speed = get_internet_speed() # Create gauge charts with cpu_placeholder: st.plotly_chart(create_gauge_chart(cpu_usage, "CPU Usage"), use_container_width=True) with memory_placeholder: st.plotly_chart(create_gauge_chart(memory_usage, "Memory Usage"), use_container_width=True) with download_placeholder: if download_speed is not None: st.plotly_chart(create_gauge_chart(download_speed, "Download Speed (Mbps)", 0, 1000), use_container_width=True) else: st.write("Error retrieving download speed") with upload_placeholder: if upload_speed is not None: st.plotly_chart(create_gauge_chart(upload_speed, "Upload Speed (Mbps)", 0, 1000), use_container_width=True) else: st.write("Error retrieving upload speed") # Refresh the metrics every 10 seconds time.sleep(10)