from flask import Flask, session, g, render_template_string from loguru import logger import json import plotly.express as px import plotly.graph_objects as po import pandas as pd import psycopg import sqlalchemy import time from app import app from app import oidc @app.route('/ntpserver') def ntpserver(): try: dbh = psycopg.connect() engine = sqlalchemy.create_engine("postgresql+psycopg://", creator=lambda: dbh) query = """ select time_bucket('5 minutes', time) as bucket, device, avg(cast(values->'rootdisp'->>'value' as float)) as rootdisp, max(cast(values->'stratum'->>'value' as int)) as stratum from measurements where time >= date_trunc('day', now()) AND time < date_trunc('day', now()) + '1 day'::interval and application = 'TSM' and attributes->>'Label' = 'david' group by bucket, device order by bucket, device """ df = pd.read_sql(query, con=engine) fig = po.Figure() fig.add_trace(po.Scatter(x=df['bucket'], y=df['rootdisp'], mode='lines', name='Root Dispersion', yaxis='y1', line=dict(color='red'))) fig.add_trace(po.Scatter(x=df['bucket'], y=df['stratum'], mode='lines', name='Stratum', yaxis='y2', line=dict(color='blue'))) fig.update_layout( title='NTP Server Numbers', # Linke Y-Achse yaxis=dict( title='Root Dispersion', ticksuffix=' ms' ), # Rechte Y-Achse yaxis2=dict( title='Stratum', overlaying='y', # Legt die zweite Y-Achse über die erste side='right', # Setzt sie auf die rechte Seite tickmode='linear', # Stellt sicher, dass die Ticks in festen Intervallen sind dtick=1, # Zeigt nur ganzzahlige Ticks ), legend=dict(x=0.05, y=1) # Position der Legende ) graph_html_1 = fig.to_html(full_html=False, default_height='30%') query = """ select time_bucket('5 minutes', time) as bucket, device, avg(cast(values->'time-req-pkts'->>'value' as float)) as packets from measurements where time >= date_trunc('day', now()) AND time < date_trunc('day', now()) + '1 day'::interval and application = 'SNMP' and attributes->>'Label' = 'david' group by bucket, device order by bucket, device """ df = pd.read_sql(query, con=engine) fig_2 = px.line(df, x='bucket', y='packets') fig_2.update_layout( xaxis_title="", yaxis_title="", yaxis_ticksuffix="p/s", title=f"Time Requests" ) graph_html_2 = fig_2.to_html(full_html=False, default_height='30%') query = """ select time_bucket('5 minutes', time) as bucket, device, avg(cast(values->'load1'->>'value' as float)) as loadaverage1min from measurements where time >= date_trunc('day', now()) AND time < date_trunc('day', now()) + '1 day'::interval and application = 'SNMP' and attributes->>'Label' = 'david' group by bucket, device order by bucket, device """ df = pd.read_sql(query, con=engine) fig_3 = px.line(df, x='bucket', y='loadaverage1min') fig_3.update_layout( xaxis_title="", yaxis_title="", title=f"CPU Load" ) graph_html_3 = fig_3.to_html(full_html=False, default_height='30%') return render_template_string(f"""