]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/dnsdistdist/html/local.js
Merge pull request #13082 from jacobbunk/doc-send-recv-latencies
[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>UDP Latency</th><th>TCP 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 || b["latency"] === 0.0) ? "-" : b["latency"].toFixed(2);
200 var tcpLatency = (b["tcpLatency"] === null || b["tcpLatency"] === 0.0) ? "-" : b["tcpLatency"].toFixed(2);
201 bouw = bouw + ("<td>"+latency+"</td><td>"+tcpLatency+"</td><td>"+b["queries"]+"</td><td>"+b["reuseds"]+"</td><td>"+(b["qps"]).toFixed(2)+"</td><td>"+b["outstanding"]+"</td>");
202 bouw = bouw + ("<td>"+b["weight"]+"</td><td>"+b["order"]+"</td><td align=left>"+b["pools"]+"</td></tr>");
203 });
204 bouw = bouw + "</table>";
205 $("#downstreams").html(bouw);
206
207 bouw='<table width="100%"><tr align=left><th>#</th><th align=left>Name</th><th align=left>Rule</th><th>Action</th><th>Matches</th></tr>';
208 if(data["rules"].length) {
209 $.each(data["rules"], function(a,b) {
210 bouw = bouw + ("<tr align=left><td>"+b["id"]+"</td><td align=left>"+b["name"]+"</td><td align=left>"+b["rule"]+"</td><td>"+b["action"]+"</td>");
211 bouw = bouw + ("<td>"+b["matches"]+"</td></tr>");
212 });
213 }
214 else
215 bouw = bouw + '<tr><td align="center" colspan="4"><font color="#aaaaaa">No rules defined</font></td></tr>';
216 bouw = bouw + "</table>";
217 $("#rules").html(bouw);
218
219 bouw='<table width="100%"><tr align=left><th>#</th><th align=left>Name</th><th align=left>Response Rule</th><th>Action</th><th>Matches</th></tr>';
220 if(data["response-rules"].length) {
221 $.each(data["response-rules"], function(a,b) {
222 bouw = bouw + ("<tr align=left><td>"+b["id"]+"</td><td align=left>"+b["name"]+"</td><td align=left>"+b["rule"]+"</td><td>"+b["action"]+"</td>");
223 bouw = bouw + ("<td>"+b["matches"]+"</td></tr>");
224 });
225 }
226 else
227 bouw = bouw + '<tr><td align="center" colspan="4"><font color="#aaaaaa">No response rules defined</font></td></tr>';
228 bouw = bouw + "</table>";
229 $("#response-rules").html(bouw);
230 }
231 });
232
233
234 // if((intervalcount++)%5)
235 // return;
236 // updateRingBuffers();
237
238 $.ajax({ url: 'jsonstat?command=dynblocklist', type: 'GET', dataType: 'json', jsonp: false,
239 success: function(data) {
240 var bouw='<table width="100%"><tr align=left><th>Dyn blocked netmask</th><th>Seconds</th><th>Blocks</th><th>eBPF</th><th align=left>Reason</th></tr>';
241 var gotsome=false;
242 $.each(data, function(a,b) {
243 bouw=bouw+("<tr><td>"+a+"</td><td>"+b.seconds+"</td><td>"+b.blocks+"</td><td>"+b.ebpf+"</td><td>"+b.reason+"</td></tr>");
244 gotsome=true;
245 });
246
247 if(!gotsome)
248 bouw = bouw + '<tr><td align="center" colspan="4"><font color="#aaaaaa">No dynamic blocks active</font></td></tr>';
249
250 bouw=bouw+"</table>";
251 $("#dynblock").html(bouw);
252
253 }});
254
255 $.ajax({ url: 'jsonstat?command=ebpfblocklist', type: 'GET', dataType: 'json', jsonp: false,
256 success: function(data) {
257 var bouw='<table width="100%"><tr align=left><th>Kernel-based dyn blocked netmask</th><th>Seconds</th></th><th>Blocks</th></tr>';
258 var gotsome=false;
259 $.each(data, function(a,b) {
260 bouw=bouw+("<tr><td>"+a+"</td><td>"+b.seconds+"</td><td>"+b.blocks+"</td></tr>");
261 gotsome=true;
262 });
263
264 if(!gotsome)
265 bouw = bouw + '<tr><td align="center" colspan="4"><font color="#aaaaaa">No eBPF blocks active</font></td></tr>';
266
267 bouw=bouw+"</table>";
268 $("#ebpfblock").html(bouw);
269
270 }});
271
272 };
273
274 $("#filter1").click(updateRingBuffers);
275 $("#filter2").click(updateRingBuffers);
276
277 update();
278 setInterval(update, 1000);
279 });