]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/dnsdistdist/html/local.js
Merge pull request #12639 from rgacogne/ddist-fix-race-ioerrors
[thirdparty/pdns.git] / pdns / dnsdistdist / html / local.js
1 "use strict";
2
3 var gdata={}
4
5 $(document).ready(function() {
6 $.ajaxSetup({ cache: false });
7
8 var qpsgraph = new Rickshaw.Graph( {
9 element: document.getElementById("qpschart"),
10 width: 400,
11 height: 200,
12 renderer: 'line',
13 series: new Rickshaw.Series.FixedDuration([{ name: 'servfailps' }, {name: 'qps'}], undefined, {
14 timeInterval: 1000,
15 maxDataPoints: 100,
16 timeBase: new Date().getTime() / 1000
17 })
18 } );
19 var y_ticks = new Rickshaw.Graph.Axis.Y( {
20 graph: qpsgraph,
21 orientation: 'left',
22 tickFormat: Rickshaw.Fixtures.Number.formatKMBT,
23 element: document.getElementById('qpsy_axis')
24 } );
25
26 qpsgraph.render();
27
28 var cpugraph = new Rickshaw.Graph( {
29 element: document.getElementById("cpuchart"),
30 width: 400,
31 height: 200,
32 renderer: 'line',
33 series: new Rickshaw.Series.FixedDuration([{ name: 'one' }, {name: 'two'}], undefined, {
34 timeInterval: 1000,
35 maxDataPoints: 100,
36 timeBase: new Date().getTime() / 1000
37 })
38 } );
39 var y_ticks = new Rickshaw.Graph.Axis.Y( {
40 graph: cpugraph,
41 orientation: 'left',
42 tickFormat: Rickshaw.Fixtures.Number.formatKMBT,
43 element: document.getElementById('cpuy_axis')
44 } );
45
46 cpugraph.render();
47 var intervalcount=0;
48
49 function updateRingBuffers()
50 {
51 var filtered=$("#filter1").is(':checked')
52 var qstring='jsonstat?command=get-query-ring&name=queries';
53 if(filtered)
54 qstring=qstring+"&public-filtered=1";
55
56 $.getJSON(qstring,
57 function(data) {
58 console.log(data);
59 var bouw="<table><tr><th>Number</th><th>Domain</th><th>Type</th></tr>";
60 var num=0;
61 var total=0, rest=0;
62 $.each(data["entries"], function(a,b) {
63 total+=b[0];
64 if(num++ > 10) {
65 rest+=b[0];
66 return;
67 }
68 if(b[1].length > 25)
69 b[1]=b[1].substring(0,25);
70
71 bouw=bouw+("<tr><td>"+b[0]+"</td><td>"+b[1]+"</td><td>"+b[2]+"</td></tr>");
72 });
73 bouw+="<tr><td>"+rest+"</td><td>Rest</td></tr>";
74 bouw=bouw+"</table>";
75 $("#queryring").html(bouw);
76
77 });
78
79 filtered=$("#filter2").is(':checked')
80 qstring='jsonstat?command=get-query-ring&name=servfail-queries';
81 if(filtered)
82 qstring=qstring+"&public-filtered=1";
83
84 $.getJSON(qstring,
85 function(data) {
86 var bouw="<table><tr><th>Number</th><th>Servfail domain</th><th>Type</th></tr>";
87 var num=0, total=0, rest=0;
88 $.each(data["entries"], function(a,b) {
89 total+=b[0];
90 if(num++ > 10) {
91 rest+=b[0];
92 return;
93 }
94 if(b[1].length > 25)
95 b[1]=b[1].substring(0,25);
96 bouw=bouw+("<tr><td>"+b[0]+"</td><td>"+b[1]+"</td><td>"+b[2]+"</td></tr>");
97 });
98 bouw+="<tr><td>"+rest+"</td><td>Rest</td></tr>";
99 bouw=bouw+"</table>";
100 $("#servfailqueryring").html(bouw);
101
102 });
103
104 $.getJSON('jsonstat?command=get-remote-ring&name=remotes',
105 function(data) {
106 var bouw="<table><tr><th>Number</th><th>Remote</th></tr>";
107 var num=0, total=0, rest=0;
108 $.each(data["entries"], function(a,b) {
109 total+=b[0];
110 if(num++ > 10) {
111 rest +=b[0];
112 return;
113 }
114 bouw=bouw+("<tr><td>"+b[0]+"</td><td>"+b[1]+"</td></tr>");
115 });
116 bouw+="<tr><td>"+rest+"</td><td>Rest</td></tr>";
117 bouw=bouw+"</table>";
118 $("#remotering").html(bouw);
119
120 });
121
122 $.getJSON('jsonstat?command=get-remote-ring&name=servfail-remotes',
123 function(data) {
124 var bouw="<table><tr><th>Number</th><th>Servfail Remote</th></tr>";
125 var num=0, total=0, rest=0;
126 $.each(data["entries"], function(a,b) {
127 total+=b[0];
128 if(num++ > 10) {
129 rest += b[0];
130 return;
131 }
132 bouw=bouw+("<tr><td>"+b[0]+"</td><td>"+b[1]+"</td></tr>");
133 });
134 bouw+="<tr><td>"+rest+"</td><td>Rest</td></tr>";
135 bouw=bouw+"</table>";
136 $("#servfailremotering").html(bouw);
137 });
138 }
139
140 function update()
141 {
142 $.ajax({
143 url: 'jsonstat?command=stats',
144 type: 'GET',
145 dataType: 'json',
146 jsonp: false,
147 success: function(data, x, y) {
148 $("#questions").text(data["queries"]);
149 $("#acl-drops").text(data["acl-drops"]);
150 $("#dyn-drops").text(data["dyn-blocked"]);
151 $("#rule-drops").text(data["rule-drop"]);
152 $("#uptime").text(moment.duration(data["uptime"]*1000.0).humanize());
153 $("#latency").text((data["latency-avg10000"]/1000.0).toFixed(2));
154 $("#latency-tcp").text((data["latency-tcp-avg10000"]/1000.0).toFixed(2));
155 $("#latency-dot").text((data["latency-dot-avg10000"]/1000.0).toFixed(2));
156 $("#latency-doh").text((data["latency-doh-avg10000"]/1000.0).toFixed(2));
157 if(!gdata["cpu-sys-msec"])
158 gdata=data;
159
160 var cpu=((1.0*data["cpu-sys-msec"]+1.0*data["cpu-user-msec"] - 1.0*gdata["cpu-sys-msec"]-1.0*gdata["cpu-user-msec"])/10.0);
161
162 $("#cpu").text(cpu.toFixed(2));
163 var qps=1.0*data["queries"]-1.0*gdata["queries"];
164 $("#qps").text(qps.toFixed(2));
165 $("#server-policy").text(data["server-policy"]);
166
167 var servfailps=1.0*data["servfail-responses"]-1.0*gdata["servfail-responses"];
168
169 var totpcache=1.0*data["cache-hits"]-1.0*gdata["cache-hits"]+1.0*data["cache-misses"]-1.0*gdata["cache-misses"];
170 var hitrate=0;
171 if(totpcache > 0) {
172 hitrate=100.0*(data["cache-hits"]-1.0*gdata["cache-hits"])/totpcache;
173 $("#phitrate").text(hitrate.toFixed(2));
174 }
175 else
176 $("#phitrate").text(0);
177
178 qpsgraph.series.addData({ qps: qps, servfailps: servfailps});
179 qpsgraph.render();
180
181 cpugraph.series.addData({ one: cpu, two: hitrate});
182 cpugraph.render();
183
184 gdata=data;
185 },
186 error: function() {
187
188 },
189 });
190
191 $.ajax({ url: 'api/v1/servers/localhost', type: 'GET', dataType: 'json', jsonp: false,
192 success: function(data) {
193 $("#version").text(data["daemon_type"]+" "+data["version"]);
194 $("#acl").text(data["acl"]);
195 $("#local").text(data["local"]);
196 var bouw='<table width="100%"><tr align=right><th>#</th><th align=left>Name</th><th align=left>Address</th><th>Status</th><th>Latency</th><th>Queries</th><th>Drops</th><th>QPS</th><th>Out</th><th>Weight</th><th>Order</th><th align=left>Pools</th></tr>';
197 $.each(data["servers"], function(a,b) {
198 bouw = bouw + ("<tr align=right><td>"+b["id"]+"</td><td align=left>"+b["name"]+"</td><td align=left>"+b["address"]+"</td><td>"+b["state"]+"</td>");
199 var latency = (b["latency"] === null) ? 0.0 : b["latency"];
200 bouw = bouw + ("<td>"+latency.toFixed(2)+"</td><td>"+b["queries"]+"</td><td>"+b["reuseds"]+"</td><td>"+(b["qps"]).toFixed(2)+"</td><td>"+b["outstanding"]+"</td>");
201 bouw = bouw + ("<td>"+b["weight"]+"</td><td>"+b["order"]+"</td><td align=left>"+b["pools"]+"</td></tr>");
202 });
203 bouw = bouw + "</table>";
204 $("#downstreams").html(bouw);
205
206 bouw='<table width="100%"><tr align=left><th>#</th><th align=left>Rule</th><th>Action</th><th>Matches</th></tr>';
207 if(data["rules"].length) {
208 $.each(data["rules"], function(a,b) {
209 bouw = bouw + ("<tr align=left><td>"+b["id"]+"</td><td align=left>"+b["rule"]+"</td><td>"+b["action"]+"</td>");
210 bouw = bouw + ("<td>"+b["matches"]+"</td></tr>");
211 });
212 }
213 else
214 bouw = bouw + '<tr><td align="center" colspan="4"><font color="#aaaaaa">No rules defined</font></td></tr>';
215 bouw = bouw + "</table>";
216 $("#rules").html(bouw);
217
218 bouw='<table width="100%"><tr align=left><th>#</th><th align=left>Response Rule</th><th>Action</th><th>Matches</th></tr>';
219 if(data["response-rules"].length) {
220 $.each(data["response-rules"], function(a,b) {
221 bouw = bouw + ("<tr align=left><td>"+b["id"]+"</td><td align=left>"+b["rule"]+"</td><td>"+b["action"]+"</td>");
222 bouw = bouw + ("<td>"+b["matches"]+"</td></tr>");
223 });
224 }
225 else
226 bouw = bouw + '<tr><td align="center" colspan="4"><font color="#aaaaaa">No response rules defined</font></td></tr>';
227 bouw = bouw + "</table>";
228 $("#response-rules").html(bouw);
229 }
230 });
231
232
233 // if((intervalcount++)%5)
234 // return;
235 // updateRingBuffers();
236
237 $.ajax({ url: 'jsonstat?command=dynblocklist', type: 'GET', dataType: 'json', jsonp: false,
238 success: function(data) {
239 var bouw='<table width="100%"><tr align=left><th>Dyn blocked netmask</th><th>Seconds</th><th>Blocks</th><th align=left>Reason</th></tr>';
240 var gotsome=false;
241 $.each(data, function(a,b) {
242 bouw=bouw+("<tr><td>"+a+"</td><td>"+b.seconds+"</td><td>"+b.blocks+"</td><td>"+b.reason+"</td></tr>");
243 gotsome=true;
244 });
245
246 if(!gotsome)
247 bouw = bouw + '<tr><td align="center" colspan="4"><font color="#aaaaaa">No dynamic blocks active</font></td></tr>';
248
249 bouw=bouw+"</table>";
250 $("#dynblock").html(bouw);
251
252 }});
253
254 $.ajax({ url: 'jsonstat?command=ebpfblocklist', type: 'GET', dataType: 'json', jsonp: false,
255 success: function(data) {
256 var bouw='<table width="100%"><tr align=left><th>Kernel-based dyn blocked netmask</th><th>Seconds</th></th><th>Blocks</th></tr>';
257 var gotsome=false;
258 $.each(data, function(a,b) {
259 bouw=bouw+("<tr><td>"+a+"</td><td>"+b.seconds+"</td><td>"+b.blocks+"</td></tr>");
260 gotsome=true;
261 });
262
263 if(!gotsome)
264 bouw = bouw + '<tr><td align="center" colspan="4"><font color="#aaaaaa">No eBPF blocks active</font></td></tr>';
265
266 bouw=bouw+"</table>";
267 $("#ebpfblock").html(bouw);
268
269 }});
270
271 };
272
273 $("#filter1").click(updateRingBuffers);
274 $("#filter2").click(updateRingBuffers);
275
276 update();
277 setInterval(update, 1000);
278 });