]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/dnsdistdist/html/local.js
Merge pull request #8192 from MaxWichern/patch-1
[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 if(!gdata["cpu-sys-msec"])
155 gdata=data;
156
157 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);
158
159 $("#cpu").text(cpu.toFixed(2));
160 var qps=1.0*data["queries"]-1.0*gdata["queries"];
161 $("#qps").text(qps.toFixed(2));
162 $("#server-policy").text(data["server-policy"]);
163
164 var servfailps=1.0*data["servfail-responses"]-1.0*gdata["servfail-responses"];
165
166 var totpcache=1.0*data["cache-hits"]-1.0*gdata["cache-hits"]+1.0*data["cache-misses"]-1.0*gdata["cache-misses"];
167 var hitrate=0;
168 if(totpcache > 0) {
169 hitrate=100.0*(data["cache-hits"]-1.0*gdata["cache-hits"])/totpcache;
170 $("#phitrate").text(hitrate.toFixed(2));
171 }
172 else
173 $("#phitrate").text(0);
174
175 qpsgraph.series.addData({ qps: qps, servfailps: servfailps});
176 qpsgraph.render();
177
178 cpugraph.series.addData({ one: cpu, two: hitrate});
179 cpugraph.render();
180
181 gdata=data;
182 },
183 error: function() {
184
185 },
186 });
187
188 $.ajax({ url: 'api/v1/servers/localhost', type: 'GET', dataType: 'json', jsonp: false,
189 success: function(data) {
190 $("#version").text(data["daemon_type"]+" "+data["version"]);
191 $("#acl").text(data["acl"]);
192 $("#local").text(data["local"]);
193 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>';
194 $.each(data["servers"], function(a,b) {
195 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>");
196 var latency = (b["latency"] === null) ? 0.0 : b["latency"];
197 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>");
198 bouw = bouw + ("<td>"+b["weight"]+"</td><td>"+b["order"]+"</td><td align=left>"+b["pools"]+"</td></tr>");
199 });
200 bouw = bouw + "</table>";
201 $("#downstreams").html(bouw);
202
203 bouw='<table width="100%"><tr align=left><th>#</th><th align=left>Rule</th><th>Action</th><th>Matches</th></tr>';
204 if(data["rules"].length) {
205 $.each(data["rules"], function(a,b) {
206 bouw = bouw + ("<tr align=left><td>"+b["id"]+"</td><td align=left>"+b["rule"]+"</td><td>"+b["action"]+"</td>");
207 bouw = bouw + ("<td>"+b["matches"]+"</td></tr>");
208 });
209 }
210 else
211 bouw = bouw + '<tr><td align="center" colspan="4"><font color="#aaaaaa">No rules defined</font></td></tr>';
212 bouw = bouw + "</table>";
213 $("#rules").html(bouw);
214
215 bouw='<table width="100%"><tr align=left><th>#</th><th align=left>Response Rule</th><th>Action</th><th>Matches</th></tr>';
216 if(data["response-rules"].length) {
217 $.each(data["response-rules"], function(a,b) {
218 bouw = bouw + ("<tr align=left><td>"+b["id"]+"</td><td align=left>"+b["rule"]+"</td><td>"+b["action"]+"</td>");
219 bouw = bouw + ("<td>"+b["matches"]+"</td></tr>");
220 });
221 }
222 else
223 bouw = bouw + '<tr><td align="center" colspan="4"><font color="#aaaaaa">No response rules defined</font></td></tr>';
224 bouw = bouw + "</table>";
225 $("#response-rules").html(bouw);
226 }
227 });
228
229
230 // if((intervalcount++)%5)
231 // return;
232 // updateRingBuffers();
233
234 $.ajax({ url: 'jsonstat?command=dynblocklist', type: 'GET', dataType: 'json', jsonp: false,
235 success: function(data) {
236 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>';
237 var gotsome=false;
238 $.each(data, function(a,b) {
239 bouw=bouw+("<tr><td>"+a+"</td><td>"+b.seconds+"</td><td>"+b.blocks+"</td><td>"+b.reason+"</td></tr>");
240 gotsome=true;
241 });
242
243 if(!gotsome)
244 bouw = bouw + '<tr><td align="center" colspan="4"><font color="#aaaaaa">No dynamic blocks active</font></td></tr>';
245
246 bouw=bouw+"</table>";
247 $("#dynblock").html(bouw);
248
249 }});
250
251 $.ajax({ url: 'jsonstat?command=ebpfblocklist', type: 'GET', dataType: 'json', jsonp: false,
252 success: function(data) {
253 var bouw='<table width="100%"><tr align=left><th>Kernel-based dyn blocked netmask</th><th>Seconds</th></th><th>Blocks</th></tr>';
254 var gotsome=false;
255 $.each(data, function(a,b) {
256 bouw=bouw+("<tr><td>"+a+"</td><td>"+b.seconds+"</td><td>"+b.blocks+"</td></tr>");
257 gotsome=true;
258 });
259
260 if(!gotsome)
261 bouw = bouw + '<tr><td align="center" colspan="4"><font color="#aaaaaa">No eBPF blocks active</font></td></tr>';
262
263 bouw=bouw+"</table>";
264 $("#ebpfblock").html(bouw);
265
266 }});
267
268 };
269
270 $("#filter1").click(updateRingBuffers);
271 $("#filter2").click(updateRingBuffers);
272
273 update();
274 setInterval(update, 1000);
275 });