|
13 | 13 | let queryByClientCounter = $state([]); |
14 | 14 | let refreshInterval = null; |
15 | 15 |
|
16 | | - const REFRESH_RATE = 30000; // Refresh every 30 seconds |
| 16 | + const REFRESH_RATE = 30000; |
17 | 17 |
|
18 | 18 | const metricsService = new PrometheusMetricsService(); |
19 | 19 |
|
|
22 | 22 | loading = true; |
23 | 23 | error = null; |
24 | 24 |
|
25 | | - // Fetch histogram for DNS request time |
26 | 25 | dnsRequestTime = await metricsService.getHistogram("dns_req_time"); |
27 | 26 |
|
28 | | - // Fetch counter vectors |
29 | 27 | queryCounters = await metricsService.getCounterVec("dns_query_count"); |
30 | 28 | cacheHitCounters = await metricsService.getCounterVec( |
31 | 29 | "dns_cache_hit_count", |
|
47 | 45 | onMount(() => { |
48 | 46 | fetchDNSMetrics(); |
49 | 47 |
|
50 | | - // Set up automatic refresh |
51 | 48 | refreshInterval = setInterval(fetchDNSMetrics, REFRESH_RATE); |
52 | 49 |
|
53 | 50 | return () => { |
|
57 | 54 | }; |
58 | 55 | }); |
59 | 56 |
|
60 | | - // Prepare histogram chart data |
61 | 57 | const histogramChartData = $derived.by(() => { |
62 | 58 | if (!dnsRequestTime?.buckets) { |
63 | 59 | return { series: [], categories: [] }; |
64 | 60 | } |
65 | 61 |
|
66 | 62 | const buckets = dnsRequestTime.buckets; |
67 | 63 |
|
68 | | - // Calculate incremental counts for each bucket |
69 | 64 | const incrementalCounts = []; |
70 | 65 | for (let i = 0; i < buckets.length; i++) { |
71 | 66 | const current = buckets[i].count; |
|
84 | 79 | }; |
85 | 80 | }); |
86 | 81 |
|
87 | | - // Aggregate query counters by domain (summing across upstreams and results) |
88 | 82 | const queryByDomain = $derived.by(() => { |
89 | 83 | if (!queryCounters || queryCounters.length === 0) return []; |
90 | 84 |
|
|
99 | 93 | return Array.from(domainMap.entries()) |
100 | 94 | .map(([domain, count]) => ({ domain, count })) |
101 | 95 | .sort((a, b) => b.count - a.count) |
102 | | - .slice(0, 10); // Top 10 domains |
| 96 | + .slice(0, 10); |
103 | 97 | }); |
104 | 98 |
|
105 | 99 | const countByUpstream = $derived.by(() => { |
|
128 | 122 | count: counter.value, |
129 | 123 | })) |
130 | 124 | .sort((a, b) => b.count - a.count) |
131 | | - .slice(0, 10); // Top 10 blocked domains |
| 125 | + .slice(0, 10); |
132 | 126 | }); |
133 | 127 |
|
134 | 128 | const clientDomains = $derived.by(() => { |
135 | 129 | if (!queryByClientCounter || queryByClientCounter.length === 0) return []; |
136 | 130 |
|
137 | | - // Group by IP and sum all queries regardless of result |
138 | 131 | const ipMap = new Map(); |
139 | 132 |
|
140 | 133 | for (const counter of queryByClientCounter) { |
|
148 | 141 | .sort((a, b) => b.count - a.count); |
149 | 142 | }); |
150 | 143 |
|
151 | | - // Prepare top domains chart |
152 | 144 | const topDomainsChartData = $derived.by(() => { |
153 | 145 | if (!queryByDomain || queryByDomain.length === 0) { |
154 | 146 | return { series: [], categories: [] }; |
|
165 | 157 | }; |
166 | 158 | }); |
167 | 159 |
|
168 | | - // Prepare blocked domains chart |
169 | 160 | const blockedDomainsChartData = $derived.by(() => { |
170 | 161 | if (!blockedDomains || blockedDomains.length === 0) { |
171 | 162 | return { series: [], categories: [] }; |
|
0 commit comments