File size: 4,476 Bytes
31ff22c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5ca5e6d
 
31ff22c
 
 
 
 
 
 
5ca5e6d
 
 
 
 
 
 
 
31ff22c
 
 
 
 
 
 
 
7fa4d7a
 
 
31ff22c
7fa4d7a
 
 
 
 
 
 
 
 
 
 
31ff22c
 
 
 
7fa4d7a
31ff22c
7fa4d7a
31ff22c
 
 
7fa4d7a
5ca5e6d
 
31ff22c
 
 
 
 
 
7fa4d7a
 
 
31ff22c
 
 
 
7fa4d7a
5ca5e6d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31ff22c
 
 
5ca5e6d
31ff22c
5ca5e6d
31ff22c
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>API Monitoring Dashboard</title>
    <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <style>
        body { font-family: Arial, sans-serif; margin: 0; padding: 20px; }
        h1 { text-align: center; }
        #charts { display: flex; flex-wrap: wrap; justify-content: space-around; }
        .chart { width: 100%; max-width: 600px; margin-bottom: 20px; }
        #logs { margin-top: 40px; }
        table { width: 100%; border-collapse: collapse; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
        #logFilter { margin-top: 20px; margin-bottom: 20px; }
        #logFilter input, #logFilter select, #logFilter button { margin-right: 10px; }
    </style>
</head>
<body>
    <h1>API Monitoring Dashboard</h1>
    <div id="charts"></div>
    <div id="logs">
        <h2>Logs</h2>
        <div id="logFilter">
            <select id="modelSelect">
                <option value="">All Models</option>
            </select>
            <input type="datetime-local" id="startTime">
            <input type="datetime-local" id="endTime">
            <button onclick="filterLogs()">Filter Logs</button>
        </div>
    </div>

    <script>
        function updateCharts() {
            $.getJSON('/api/chart-data', function(data) {
                $('#charts').empty();
                for (let model in data) {
                    let div = $('<div>').addClass('chart').appendTo('#charts');
                    let successTrace = {
                        x: data[model].success.x,
                        y: data[model].success.y,
                        type: 'scatter',
                        mode: 'markers',
                        name: 'Success',
                        marker: { color: 'blue' }
                    };
                    let failureTrace = {
                        x: data[model].failure.x,
                        y: data[model].failure.y,
                        type: 'scatter',
                        mode: 'markers',
                        name: 'Failure',
                        marker: { color: 'red' }
                    };
                    let layout = {
                        title: 'API Status: ' + model,
                        xaxis: { title: 'Timestamp' },
                        yaxis: { title: 'Status', range: [-0.1, 1.1], tickvals: [0, 1], ticktext: ['Failure', 'Success'] }
                    };
                    Plotly.newPlot(div[0], [successTrace, failureTrace], layout);
                }
            });
        }

        function updateLogs(filterModel = '', startTime = '', endTime = '') {
            $.getJSON('/api/logs', { model: filterModel, start: startTime, end: endTime }, function(data) {
                let tbody = $('#logTable tbody');
                tbody.empty();
                data.forEach(function(log) {
                    let row = $('<tr>');
                    $('<td>').text(log.timestamp).appendTo(row);
                    $('<td>').text(log.model).appendTo(row);
                    $('<td>').text(log.success ? 'Success' : 'Failure')
                             .css('color', log.success ? 'blue' : 'red')
                             .appendTo(row);
                    tbody.append(row);
                });
            });
        }

        function updateModelSelect() {
            $.getJSON('/api/models', function(models) {
                let select = $('#modelSelect');
                models.forEach(function(model) {
                    $('<option>').val(model).text(model).appendTo(select);
                });
            });
        }

        function filterLogs() {
            let model = $('#modelSelect').val();
            let startTime = $('#startTime').val();
            let endTime = $('#endTime').val();
            updateLogs(model, startTime, endTime);
        }

        $(document).ready(function() {
            updateCharts();
            updateLogs();
            updateModelSelect();
            setInterval(updateCharts, 60000);  // Update every minute
            setInterval(function() { updateLogs($('#modelSelect').val(), $('#startTime').val(), $('#endTime').val()); }, 60000);
        });
    </script>
</body>
</html>