forked from vozlt/nginx-module-vts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstatus.template.html
846 lines (736 loc) · 69.1 KB
/
status.template.html
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
<!doctype html>
<!--==== This html comes from http://demo.nginx.com/status.html of old version ====-->
<html lang="en">
<head>
<meta charset="utf-8">
<title>nginx vhost traffic status monitor</title>
<style>
body {
background: white;
color: black;
font-family: Helvetica, Arial, sans-serif;
}
h1 {
margin: .5em 0 0 0;
}
h2 {
margin: .8em 0 .3em 0;
}
h3 {
margin: .5em 0 .3em 0;
}
table {
font-size: .8em;
margin: .5em 0;
border-collapse: collapse;
border-bottom: 1px #DED solid;
}
thead th {
font-size: 1em;
background: #DED;
padding: .1em .3em;
border: .2em solid #FFF;
}
tbody tr.odd {
background: #F5F5F5;
}
tbody th {
text-align: left;
}
tbody td {
height: 1.2em;
text-align: right;
}
tbody td.key {
font-size: 1em;
background: #DED;
padding: .1em .3em;
border: .2em solid #FFF;
}
div.update {
margin-top: 32px;
color: #696969;
}
div.footer {
margin-top: 16px;
}
a:link {
color: #6666ff;
font-size: 0.7em;
}
a:visited {
color: #6666ff;
font-size: 0.7em;
}
a:active {
color: #222222;
font-size: 0.7em;
}
a:hover {
color: #000000;
background-color: #e0e8ff;
font-size: 0.7em;
}
/* from https://www.flag-sprites.com */
.flag {
width: 16px;
height: 11px;
background: url("data:image/png;base64,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") no-repeat;
}
.flag.flag-ad {background-position: -16px 0}
.flag.flag-ae {background-position: -32px 0}
.flag.flag-af {background-position: -48px 0}
.flag.flag-ag {background-position: -64px 0}
.flag.flag-ai {background-position: -80px 0}
.flag.flag-al {background-position: -96px 0}
.flag.flag-am {background-position: -112px 0}
.flag.flag-an {background-position: -128px 0}
.flag.flag-ao {background-position: -144px 0}
.flag.flag-ar {background-position: -160px 0}
.flag.flag-as {background-position: -176px 0}
.flag.flag-at {background-position: -192px 0}
.flag.flag-au {background-position: -208px 0}
.flag.flag-aw {background-position: -224px 0}
.flag.flag-az {background-position: -240px 0}
.flag.flag-ba {background-position: 0 -11px}
.flag.flag-bb {background-position: -16px -11px}
.flag.flag-bd {background-position: -32px -11px}
.flag.flag-be {background-position: -48px -11px}
.flag.flag-bf {background-position: -64px -11px}
.flag.flag-bg {background-position: -80px -11px}
.flag.flag-bh {background-position: -96px -11px}
.flag.flag-bi {background-position: -112px -11px}
.flag.flag-bj {background-position: -128px -11px}
.flag.flag-bm {background-position: -144px -11px}
.flag.flag-bn {background-position: -160px -11px}
.flag.flag-bo {background-position: -176px -11px}
.flag.flag-br {background-position: -192px -11px}
.flag.flag-bs {background-position: -208px -11px}
.flag.flag-bt {background-position: -224px -11px}
.flag.flag-bv {background-position: -240px -11px}
.flag.flag-bw {background-position: 0 -22px}
.flag.flag-by {background-position: -16px -22px}
.flag.flag-bz {background-position: -32px -22px}
.flag.flag-ca {background-position: -48px -22px}
.flag.flag-catalonia {background-position: -64px -22px}
.flag.flag-cd {background-position: -80px -22px}
.flag.flag-cf {background-position: -96px -22px}
.flag.flag-cg {background-position: -112px -22px}
.flag.flag-ch {background-position: -128px -22px}
.flag.flag-ci {background-position: -144px -22px}
.flag.flag-ck {background-position: -160px -22px}
.flag.flag-cl {background-position: -176px -22px}
.flag.flag-cm {background-position: -192px -22px}
.flag.flag-cn {background-position: -208px -22px}
.flag.flag-co {background-position: -224px -22px}
.flag.flag-cr {background-position: -240px -22px}
.flag.flag-cu {background-position: 0 -33px}
.flag.flag-cv {background-position: -16px -33px}
.flag.flag-cw {background-position: -32px -33px}
.flag.flag-cy {background-position: -48px -33px}
.flag.flag-cz {background-position: -64px -33px}
.flag.flag-de {background-position: -80px -33px}
.flag.flag-dj {background-position: -96px -33px}
.flag.flag-dk {background-position: -112px -33px}
.flag.flag-dm {background-position: -128px -33px}
.flag.flag-do {background-position: -144px -33px}
.flag.flag-dz {background-position: -160px -33px}
.flag.flag-ec {background-position: -176px -33px}
.flag.flag-ee {background-position: -192px -33px}
.flag.flag-eg {background-position: -208px -33px}
.flag.flag-eh {background-position: -224px -33px}
.flag.flag-england {background-position: -240px -33px}
.flag.flag-er {background-position: 0 -44px}
.flag.flag-es {background-position: -16px -44px}
.flag.flag-et {background-position: -32px -44px}
.flag.flag-eu {background-position: -48px -44px}
.flag.flag-fi {background-position: -64px -44px}
.flag.flag-fj {background-position: -80px -44px}
.flag.flag-fk {background-position: -96px -44px}
.flag.flag-fm {background-position: -112px -44px}
.flag.flag-fo {background-position: -128px -44px}
.flag.flag-fr {background-position: -144px -44px}
.flag.flag-ga {background-position: -160px -44px}
.flag.flag-gb {background-position: -176px -44px}
.flag.flag-gd {background-position: -192px -44px}
.flag.flag-ge {background-position: -208px -44px}
.flag.flag-gf {background-position: -224px -44px}
.flag.flag-gg {background-position: -240px -44px}
.flag.flag-gh {background-position: 0 -55px}
.flag.flag-gi {background-position: -16px -55px}
.flag.flag-gl {background-position: -32px -55px}
.flag.flag-gm {background-position: -48px -55px}
.flag.flag-gn {background-position: -64px -55px}
.flag.flag-gp {background-position: -80px -55px}
.flag.flag-gq {background-position: -96px -55px}
.flag.flag-gr {background-position: -112px -55px}
.flag.flag-gs {background-position: -128px -55px}
.flag.flag-gt {background-position: -144px -55px}
.flag.flag-gu {background-position: -160px -55px}
.flag.flag-gw {background-position: -176px -55px}
.flag.flag-gy {background-position: -192px -55px}
.flag.flag-hk {background-position: -208px -55px}
.flag.flag-hm {background-position: -224px -55px}
.flag.flag-hn {background-position: -240px -55px}
.flag.flag-hr {background-position: 0 -66px}
.flag.flag-ht {background-position: -16px -66px}
.flag.flag-hu {background-position: -32px -66px}
.flag.flag-ic {background-position: -48px -66px}
.flag.flag-id {background-position: -64px -66px}
.flag.flag-ie {background-position: -80px -66px}
.flag.flag-il {background-position: -96px -66px}
.flag.flag-im {background-position: -112px -66px}
.flag.flag-in {background-position: -128px -66px}
.flag.flag-io {background-position: -144px -66px}
.flag.flag-iq {background-position: -160px -66px}
.flag.flag-ir {background-position: -176px -66px}
.flag.flag-is {background-position: -192px -66px}
.flag.flag-it {background-position: -208px -66px}
.flag.flag-je {background-position: -224px -66px}
.flag.flag-jm {background-position: -240px -66px}
.flag.flag-jo {background-position: 0 -77px}
.flag.flag-jp {background-position: -16px -77px}
.flag.flag-ke {background-position: -32px -77px}
.flag.flag-kg {background-position: -48px -77px}
.flag.flag-kh {background-position: -64px -77px}
.flag.flag-ki {background-position: -80px -77px}
.flag.flag-km {background-position: -96px -77px}
.flag.flag-kn {background-position: -112px -77px}
.flag.flag-kp {background-position: -128px -77px}
.flag.flag-kr {background-position: -144px -77px}
.flag.flag-kurdistan {background-position: -160px -77px}
.flag.flag-kw {background-position: -176px -77px}
.flag.flag-ky {background-position: -192px -77px}
.flag.flag-kz {background-position: -208px -77px}
.flag.flag-la {background-position: -224px -77px}
.flag.flag-lb {background-position: -240px -77px}
.flag.flag-lc {background-position: 0 -88px}
.flag.flag-li {background-position: -16px -88px}
.flag.flag-lk {background-position: -32px -88px}
.flag.flag-lr {background-position: -48px -88px}
.flag.flag-ls {background-position: -64px -88px}
.flag.flag-lt {background-position: -80px -88px}
.flag.flag-lu {background-position: -96px -88px}
.flag.flag-lv {background-position: -112px -88px}
.flag.flag-ly {background-position: -128px -88px}
.flag.flag-ma {background-position: -144px -88px}
.flag.flag-mc {background-position: -160px -88px}
.flag.flag-md {background-position: -176px -88px}
.flag.flag-me {background-position: -192px -88px}
.flag.flag-mg {background-position: -208px -88px}
.flag.flag-mh {background-position: -224px -88px}
.flag.flag-mk {background-position: -240px -88px}
.flag.flag-ml {background-position: 0 -99px}
.flag.flag-mm {background-position: -16px -99px}
.flag.flag-mn {background-position: -32px -99px}
.flag.flag-mo {background-position: -48px -99px}
.flag.flag-mp {background-position: -64px -99px}
.flag.flag-mq {background-position: -80px -99px}
.flag.flag-mr {background-position: -96px -99px}
.flag.flag-ms {background-position: -112px -99px}
.flag.flag-mt {background-position: -128px -99px}
.flag.flag-mu {background-position: -144px -99px}
.flag.flag-mv {background-position: -160px -99px}
.flag.flag-mw {background-position: -176px -99px}
.flag.flag-mx {background-position: -192px -99px}
.flag.flag-my {background-position: -208px -99px}
.flag.flag-mz {background-position: -224px -99px}
.flag.flag-na {background-position: -240px -99px}
.flag.flag-nc {background-position: 0 -110px}
.flag.flag-ne {background-position: -16px -110px}
.flag.flag-nf {background-position: -32px -110px}
.flag.flag-ng {background-position: -48px -110px}
.flag.flag-ni {background-position: -64px -110px}
.flag.flag-nl {background-position: -80px -110px}
.flag.flag-no {background-position: -96px -110px}
.flag.flag-np {background-position: -112px -110px}
.flag.flag-nr {background-position: -128px -110px}
.flag.flag-nu {background-position: -144px -110px}
.flag.flag-nz {background-position: -160px -110px}
.flag.flag-om {background-position: -176px -110px}
.flag.flag-pa {background-position: -192px -110px}
.flag.flag-pe {background-position: -208px -110px}
.flag.flag-pf {background-position: -224px -110px}
.flag.flag-pg {background-position: -240px -110px}
.flag.flag-ph {background-position: 0 -121px}
.flag.flag-pk {background-position: -16px -121px}
.flag.flag-pl {background-position: -32px -121px}
.flag.flag-pm {background-position: -48px -121px}
.flag.flag-pn {background-position: -64px -121px}
.flag.flag-pr {background-position: -80px -121px}
.flag.flag-ps {background-position: -96px -121px}
.flag.flag-pt {background-position: -112px -121px}
.flag.flag-pw {background-position: -128px -121px}
.flag.flag-py {background-position: -144px -121px}
.flag.flag-qa {background-position: -160px -121px}
.flag.flag-re {background-position: -176px -121px}
.flag.flag-ro {background-position: -192px -121px}
.flag.flag-rs {background-position: -208px -121px}
.flag.flag-ru {background-position: -224px -121px}
.flag.flag-rw {background-position: -240px -121px}
.flag.flag-sa {background-position: 0 -132px}
.flag.flag-sb {background-position: -16px -132px}
.flag.flag-sc {background-position: -32px -132px}
.flag.flag-scotland {background-position: -48px -132px}
.flag.flag-sd {background-position: -64px -132px}
.flag.flag-se {background-position: -80px -132px}
.flag.flag-sg {background-position: -96px -132px}
.flag.flag-sh {background-position: -112px -132px}
.flag.flag-si {background-position: -128px -132px}
.flag.flag-sk {background-position: -144px -132px}
.flag.flag-sl {background-position: -160px -132px}
.flag.flag-sm {background-position: -176px -132px}
.flag.flag-sn {background-position: -192px -132px}
.flag.flag-so {background-position: -208px -132px}
.flag.flag-somaliland {background-position: -224px -132px}
.flag.flag-sr {background-position: -240px -132px}
.flag.flag-ss {background-position: 0 -143px}
.flag.flag-st {background-position: -16px -143px}
.flag.flag-sv {background-position: -32px -143px}
.flag.flag-sx {background-position: -48px -143px}
.flag.flag-sy {background-position: -64px -143px}
.flag.flag-sz {background-position: -80px -143px}
.flag.flag-tc {background-position: -96px -143px}
.flag.flag-td {background-position: -112px -143px}
.flag.flag-tf {background-position: -128px -143px}
.flag.flag-tg {background-position: -144px -143px}
.flag.flag-th {background-position: -160px -143px}
.flag.flag-tibet {background-position: -176px -143px}
.flag.flag-tj {background-position: -192px -143px}
.flag.flag-tk {background-position: -208px -143px}
.flag.flag-tl {background-position: -224px -143px}
.flag.flag-tm {background-position: -240px -143px}
.flag.flag-tn {background-position: 0 -154px}
.flag.flag-to {background-position: -16px -154px}
.flag.flag-tr {background-position: -32px -154px}
.flag.flag-tt {background-position: -48px -154px}
.flag.flag-tv {background-position: -64px -154px}
.flag.flag-tw {background-position: -80px -154px}
.flag.flag-tz {background-position: -96px -154px}
.flag.flag-ua {background-position: -112px -154px}
.flag.flag-ug {background-position: -128px -154px}
.flag.flag-um {background-position: -144px -154px}
.flag.flag-us {background-position: -160px -154px}
.flag.flag-uy {background-position: -176px -154px}
.flag.flag-uz {background-position: -192px -154px}
.flag.flag-va {background-position: -208px -154px}
.flag.flag-vc {background-position: -224px -154px}
.flag.flag-ve {background-position: -240px -154px}
.flag.flag-vg {background-position: 0 -165px}
.flag.flag-vi {background-position: -16px -165px}
.flag.flag-vn {background-position: -32px -165px}
.flag.flag-vu {background-position: -48px -165px}
.flag.flag-wales {background-position: -64px -165px}
.flag.flag-wf {background-position: -80px -165px}
.flag.flag-ws {background-position: -96px -165px}
.flag.flag-xk {background-position: -112px -165px}
.flag.flag-ye {background-position: -128px -165px}
.flag.flag-yt {background-position: -144px -165px}
.flag.flag-za {background-position: -160px -165px}
.flag.flag-zanzibar {background-position: -176px -165px}
.flag.flag-zm {background-position: -192px -165px}
.flag.flag-zw {background-position: -208px -165px}
</style>
</head>
<body>
<h1>
Nginx Vhost Traffic Status
</h1>
<div id="monitor"></div>
<div id="update" class="update">
<strong>update interval:</strong>
<select id="refresh" onchange="vtsSetInterval(this.value * 1000)">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
</select>
<strong>sec</strong>
</div>
<div id="footer" class="footer">
<a href="{{uri}}/format/json" id="jsonUri"><strong>JSON</strong></a>
| <a href="https://github.com/vozlt/nginx-module-vts"><strong>GITHUB</strong></a>
</div>
<script>
String.prototype.format = function () {
var i = 0, args = arguments;
return this.replace(/{}/g, function () {
return typeof args[i] != 'undefined' ? args[i++] : '';
});
};
var vtsStatusURI = "{{uri}}/format/json", vtsUpdateInterval = 1000, vtsUpdate;
var vtsStatusVars = {
titles: {
main:"Server main",
server:"Server zones",
filter:"Filters",
upstream:"Upstreams",
cache:"Caches"
},
ids: {
main:"mainZones",
server:"serverZones",
filter:"filterZones",
upstream:"upstreamZones",
cache:"cacheZones"
}
};
var aPs = (function() {
var data = [];
var msec = {
last: undefined,
period: undefined
};
return {
getValue: function(key, value) {
if (typeof data[key] === 'undefined') {
data[key] = value;
return 'n/a';
} else {
var increase = value - data[key];
data[key] = value;
return Math.floor(increase * 1000 / msec.period);
}
},
refresh: function(time) {
msec.period = time - msec.last;
msec.last = time;
}
};
})();
function mTh(msec) {
var ms = 1000, m = 60, h = m * m, d = h * 24, s = '';
if (msec < ms) {
return msec + 'ms';
}
if (msec < (ms * m)) {
return Math.floor(msec / ms) + '.' + Math.floor((msec % ms) / 10) + 's';
}
var days = Math.floor(msec / (d * ms));
if (days) {
s += days + "d ";
}
var hours = Math.floor((msec % (d * ms)) / (h * ms));
if (days || hours) {
s += hours + "h ";
}
var minutes = Math.floor(((msec % (d * ms)) % (h * ms)) / (m * ms));
if (days || hours || minutes) {
s += minutes + "m ";
}
var seconds = Math.floor((((msec % (d * ms)) % (h * ms)) % (m * ms)) / ms);
return s + seconds + "s";
}
function bTh(b) {
var kb = 1024;
if (typeof b !== 'number') {
return b;
}
if (b < kb) {
return b + ' B';
}
if (b < (kb * kb)) {
return (b / kb).toFixed(1) + ' KiB';
}
if (b < (kb * kb * kb)) {
return (b / (kb * kb)).toFixed(1) + ' MiB';
}
if (b < (kb * kb * kb * kb)) {
return (b / (kb * kb * kb)).toFixed(2) + ' GiB';
}
return (b / (kb * kb * kb * kb)).toFixed(6) + ' TiB';
}
function sTh(b,d) {
var s;
if (!b && !d) {
s = "up";
} else if (d) {
s = "down";
} else {
s = "backup";
}
return s;
}
function sHe(t, v) {
var ts = t.split(' ');
return '<' + t + '>' + (v) + '</' + ts[0] + '>';
}
function aHe(t, v) {
var i;
var o = '';
if (Object.prototype.toString.call(v) === '[object Array]') {
for (i = 0; i < v.length; i++) {
o += sHe(t, v[i]);
}
} else {
o = sHe(t, v);
}
return o;
}
function templateServerHeader(cache) {
var heads = [];
heads[0] = '{}{}{}{}'.format(aHe('th rowspan="2"', 'Zone'),
aHe('th colspan="3"', 'Requests'),
aHe('th colspan="6"', 'Responses'),
aHe('th colspan="4"', 'Traffic'));
if (cache) {
heads[0] = '{}{}'.format(heads[0], aHe('th colspan="9"', 'Cache'));
}
heads[1] = aHe('th', ['Total', 'Req/s', 'Time', '1xx', '2xx', '3xx', '4xx', '5xx',
'Total', 'Sent', 'Rcvd', 'Sent/s', 'Rcvd/s']);
if (cache) {
heads[1] = '{}{}'.format(heads[1], aHe('th', ['Miss', 'Bypass', 'Expired', 'Stale',
'Updating', 'Revalidated', 'Hit',
'Scarce', 'Total']));
}
return aHe('thead', '{}{}'.format(aHe('tr', heads[0]), aHe('tr', heads[1])));
}
function templateUpstreamHeader() {
var heads = [];
heads[0] = '{}{}{}{}{}{}{}{}{}'.format(aHe('th rowspan="2"', 'Server'),
aHe('th rowspan="2"', 'State'),
aHe('th rowspan="2"', 'Response Time'),
aHe('th rowspan="2"', 'Weight'),
aHe('th rowspan="2"', 'MaxFails'),
aHe('th rowspan="2"', 'FailTimeout'),
aHe('th colspan="3"', 'Requests'),
aHe('th colspan="6"', 'Responses'),
aHe('th colspan="4"', 'Traffic'));
heads[1] = aHe('th', ['Total', 'Req/s', 'Time', '1xx', '2xx', '3xx', '4xx', '5xx',
'Total', 'Sent', 'Rcvd', 'Sent/s', 'Rcvd/s']);
return aHe('thead', '{}{}'.format(aHe('tr', heads[0]), aHe('tr', heads[1])));
}
function templateCacheHeader() {
var heads = [];
heads[0] = '{}{}{}{}'.format(aHe('th rowspan="2"', 'Zone'),
aHe('th colspan="2"', 'Size'),
aHe('th colspan="4"', 'Traffic'),
aHe('th colspan="9"', 'Cache'));
heads[1] = aHe('th', ['Capacity', 'Used', 'Sent', 'Rcvd', 'Sent/s', 'Rcvd/s',
'Miss', 'Bypass', 'Expired', 'Stale', 'Updating',
'Revalidated', 'Hit', 'Scarce', 'Total']);
return aHe('thead', '{}{}'.format(aHe('tr', heads[0]), aHe('tr', heads[1])));
}
function templateMainZone(it) {
var o = '';
var head = '';
var body = '';
var heads = [];
var bodys = [];
heads[0] = '{}{}{}{}{}{}'.format(aHe('th rowspan="2"', 'Host'),
aHe('th rowspan="2"', 'Version'),
aHe('th rowspan="2"', 'Uptime'),
aHe('th colspan="4"', 'Connections'),
aHe('th colspan="4"', 'Requests'),
aHe('th colspan="4"', 'Shared memory'));
heads[1] = aHe('th', ['active', 'reading', 'writing', 'waiting', 'accepted',
'handled', 'Total', 'Req/s', 'name', 'maxSize', 'usedSize', 'usedNode']);
head = aHe('thead', '{}{}'.format(aHe('tr', heads[0]), aHe('tr', heads[1])));
bodys[0] = aHe('td', [ aHe('strong', it.hostName), it.nginxVersion, mTh(it.nowMsec - it.loadMsec),
it.connections.active, it.connections.reading, it.connections.writing,
it.connections.waiting, it.connections.accepted, it.connections.handled,
it.connections.requests, aPs.getValue('main.connections.requests', it.connections.requests),
aHe('strong', it.sharedZones.name), bTh(it.sharedZones.maxSize), bTh(it.sharedZones.usedSize),
it.sharedZones.usedNode]);
body = aHe('tbody', aHe('tr', bodys[0]));
o = '{}{}'.format(aHe('h2', vtsStatusVars.titles.main), aHe('table', '{}{}'.format(head, body)));
o = aHe('div id="{}"'.format(vtsStatusVars.ids.main), o);
return o;
}
function templateServerZone(filter, group, id, cache) {
var n = 0;
var s = '';
var o = '';
for(var name in filter) {
var zone = filter[name];
var uniq = '{}.{}.{}'.format(id, group, name);
var clas = '';
var flag = '';
var responseCount = 0;
var responseTotal = 0;
var cacheCount = 0;
var cacheTotal = 0;
clas = (n++ % 2) ? 'odd' : '';
flag = (group.indexOf("country") != -1 && name.length == 2)
? '<img class="flag flag-{}" />'.format(name.toLowerCase())
: '';
s = '{}{}'.format(aHe('th', '{}{}'.format(flag, name)),
aHe('td', [(zone.requestCounter + zone.overCounts['maxIntegerSize'] * zone.overCounts['requestCounter']),
aPs.getValue('{}.{}'.format(uniq, 'requestCounter'), zone.requestCounter), mTh(zone.requestMsec)
]));
for(var code in zone.responses) {
responseCount = zone.responses[code] + zone.overCounts['maxIntegerSize'] * zone.overCounts[code];
responseTotal += responseCount;
s = '{}{}'.format(s, aHe('td', responseCount));
if(code == '5xx') break;
}
s = '{}{}'.format(s, aHe('td', [responseTotal,
bTh(zone.outBytes + zone.overCounts['maxIntegerSize'] * zone.overCounts['outBytes']),
bTh(zone.inBytes + zone.overCounts['maxIntegerSize'] * zone.overCounts['inBytes']),
bTh(aPs.getValue('{}.{}'.format(uniq, 'outBytes'), zone.outBytes)),
bTh(aPs.getValue('{}.{}'.format(uniq, 'inBytes'), zone.inBytes))
]));
if (cache) {
var i = 0;
for(var code in zone.responses) {
if(i++ < 5) continue;
cacheCount = (zone.responses[code] + zone.overCounts['maxIntegerSize'] * zone.overCounts[code]);
cacheTotal += cacheCount;
s = '{}{}'.format(s, aHe('td', cacheCount));
}
s = '{}{}'.format(s, aHe('td', cacheTotal));
}
o = '{}{}'.format(o, aHe('tr class="{}"'.format(clas), s));
}
return o;
}
function templateUpstreamZone(filter, group, id) {
var n = 0;
var s = '';
var o = '';
while (n < filter.length) {
var peer = filter[n];
var uniq = '{}.{}.{}'.format(id, group, peer.server);
var clas = '';
var responseCount = 0;
var responseTotal = 0;
clas = (n++ % 2) ? 'odd' : '';
s = '{}{}'.format(aHe('th', peer.server),
aHe('td', [sTh(peer.backup, peer.down), mTh(peer.responseMsec),
peer.weight, peer.maxFails, peer.failTimeout,
(peer.requestCounter + peer.overCounts['maxIntegerSize'] * peer.overCounts['requestCounter']),
aPs.getValue('{}.{}'.format(uniq, 'requestCounter'), peer.requestCounter),
mTh(peer.requestMsec)
]));
for(var code in peer.responses) {
responseCount = peer.responses[code] + peer.overCounts['maxIntegerSize'] * peer.overCounts[code];
responseTotal += responseCount;
s = '{}{}'.format(s, aHe('td', responseCount));
}
s = '{}{}'.format(s, aHe('td', [responseTotal,
bTh(peer.outBytes + peer.overCounts['maxIntegerSize'] * peer.overCounts['outBytes']),
bTh(peer.inBytes + peer.overCounts['maxIntegerSize'] * peer.overCounts['inBytes']),
bTh(aPs.getValue('{}.{}'.format(uniq, 'outBytes'), peer.outBytes)),
bTh(aPs.getValue('{}.{}'.format(uniq, 'inBytes'), peer.inBytes))
]));
o = '{}{}'.format(o, aHe('tr class="{}"'.format(clas), s));
}
return o;
}
function templateCacheZone(filter, group, id) {
var n = 0;
var s = '';
var o = '';
for(var name in filter) {
var zone = filter[name];
var uniq = '{}.{}.{}'.format(id, group, name);
var clas = '';
var cacheCount = 0;
var cacheTotal = 0;
clas = (n++ % 2) ? 'odd' : '';
s = '{}{}'.format(aHe('th', name),
aHe('td', [bTh(zone.maxSize),
bTh(zone.usedSize),
bTh(zone.outBytes + zone.overCounts['maxIntegerSize'] * zone.overCounts['outBytes']),
bTh(zone.inBytes + zone.overCounts['maxIntegerSize'] * zone.overCounts['inBytes']),
bTh(aPs.getValue('{}.{}'.format(uniq, 'outBytes'), zone.outBytes)),
bTh(aPs.getValue('{}.{}'.format(uniq, 'inBytes'), zone.inBytes))
]));
for(var code in zone.responses) {
cacheCount = zone.responses[code] + zone.overCounts['maxIntegerSize'] * zone.overCounts[code];
cacheTotal += cacheCount;
s = '{}{}'.format(s, aHe('td', cacheCount));
}
s = '{}{}'.format(s, aHe('td', cacheTotal));
o = '{}{}'.format(o, aHe('tr class="{}"'.format(clas), s));
}
return o;
}
function haveCache(it) {
var key = "*";
if (typeof it.serverZones[key] == "undefined") {
return true;
}
return Object.keys(it.serverZones[key].responses).length > 5 ? true : false;
}
function template(it) {
aPs.refresh(it.nowMsec);
var out = '';
var tmp = '';
var head = '';
var body = '';
var bodys = [];
var cache = true;
/* main */
out = templateMainZone(it);
/* serverZones */
cache = haveCache(it);
head = templateServerHeader(cache);
bodys[0] = templateServerZone(it.serverZones, 'server', vtsStatusVars.ids.server, cache);
body = aHe('tbody', bodys[0]);
out = '{}{}'.format(out, aHe('div id="{}"'.format(vtsStatusVars.ids.server),
'{}{}'.format(aHe('h2', vtsStatusVars.titles.server),
aHe('table', '{}{}'.format(head, body)))));
/* filterZones */
if (vtsStatusVars.ids.filter in it) {
tmp = '';
for (var group in it.filterZones) {
var filter = it.filterZones[group];
head = templateServerHeader(cache);
bodys[0] = templateServerZone(filter, group, vtsStatusVars.ids.filter, cache);
body = aHe('tbody', bodys[0]);
tmp = '{}{}{}'.format(tmp, aHe('h3', group), aHe('table', '{}{}'.format(head, body)));
}
out = '{}{}'.format(out, aHe('div id="{}"'.format(vtsStatusVars.ids.filter),
'{}{}'.format(aHe('h2', vtsStatusVars.titles.filter), tmp)));
}
/* upstreamZones */
if (vtsStatusVars.ids.upstream in it) {
tmp = '';
for (var group in it.upstreamZones) {
var filter = it.upstreamZones[group];
head = templateUpstreamHeader();
bodys[0] = templateUpstreamZone(filter, group, vtsStatusVars.ids.upstream);
body = aHe('tbody', bodys[0]);
tmp = '{}{}{}'.format(tmp, aHe('h3', group), aHe('table', '{}{}'.format(head, body)));
}
out = '{}{}'.format(out, aHe('div id="{}"'.format(vtsStatusVars.ids.upstream),
'{}{}'.format(aHe('h2', vtsStatusVars.titles.upstream), tmp)));
}
/* cacheZones */
if (vtsStatusVars.ids.cache in it) {
head = templateCacheHeader();
bodys[0] = templateCacheZone(it.cacheZones, 'cache', vtsStatusVars.ids.cache);
body = aHe('tbody', bodys[0]);
out = '{}{}'.format(out, aHe('div id="{}"'.format(vtsStatusVars.ids.cache),
'{}{}'.format(aHe('h2', vtsStatusVars.titles.cache),
aHe('table', '{}{}'.format(head, body)))));
}
return out;
}
function vtsGetData() {
var monitor = document.getElementById('monitor');
var request = new XMLHttpRequest;
request.onload = function() {
if (this.status != 200) {
return;
}
monitor.innerHTML = template(JSON.parse(this.responseText));
}
request.open('GET', vtsStatusURI);
request.send();
};
function vtsSetInterval(msec) {
clearInterval(vtsUpdate);
vtsUpdate = setInterval(vtsGetData, msec);
}
document.getElementById('jsonUri').href = vtsStatusURI;
vtsGetData();
vtsSetInterval(vtsUpdateInterval);
</script>
</body>
</html>