[25.11-RELEASE][[email protected]]/root: sh -c 'unbound-control -c /var/unbound/unbound.conf stats | awk '\''BEGIN { c_h="\033[1;34m"; c_k="\033[0;36m"; c_v="\033[0;33m"; c_r="\033[0m"; sec["System Overview"]="^(time\\.up|total\\.num\\.queries|total\\.recursion\\.time\\.avg|total\\.requestlist\\.(avg|max))"; sec["Performance & Cache"]="^total\\.num\\.(cachehits|cachemiss|prefetch|recursivereplies|queries_discard_timeout)"; sec["Transport Protocols"]="^num\\.query\\.(tcp|tcpout|udp|tls|https|ipv6)"; sec["Query Types"]="^num\\.query\\.type\\."; sec["Response Codes"]="^num\\.answer\\.rcode"; sec["Security & Threats"]="^(num\\.rpz\\.action\\.rpz-local-data|unwanted|num\\.query\\.ratelimited|total\\.num\\.queries_ip_ratelimited)"; sec["Memory & Stats"]="^mem\\.|^(msg\\.cache|rrset\\.cache|infra\\.cache)\\.count"; } { if($0 in seen_lines) next; seen_lines[$0]=1; split($0, kv, "="); k=kv[1]; v=kv[2]+0; d[k]=kv[2]; if(k ~ /^histogram\./ && v>0) { split(k, h, "[.=]"); s=h[2]*1000000+h[3]; e=h[5]*1000000+h[6]; rec_total_hist += v; if(s>=8192) { hc++; hist[hc,"s"]=int(s/1000); hist[hc,"e"]=int(e/1000); hist[hc,"v"]=v; } else { fast_hist += v; } } for(s in sec) { if(k ~ sec[s] && (v>0 || k~/time\\.up/)) { if(!(s in seen)) { printf "\n%s== %s ==%s\n", c_h, s, c_r; seen[s]=1; } if(k == "time.up") { days=int(v/86400); hours=int((v%86400)/3600); mins=int((v%3600)/60); secs=int(v%60); printf "%s%-35s:%s %dd %dh %dm %ds%s\n", c_k, k, c_v, days, hours, mins, secs, c_r; } else if(k ~ /recursion\.time\.avg/) printf "%s%-35s:%s %.2f ms%s\n", c_k, k, c_v, v*1000, c_r; else if(k ~ /^mem\./) { unit="B"; val=v; if(val > 1048576) { val/=1048576; unit="MiB"; } else if(val > 1024) { val/=1024; unit="KiB"; } printf "%s%-35s:%s %.2f %s%s\n", c_k, k, c_v, val, unit, c_r; } else printf "%s%-35s:%s %-10s%s\n", c_k, k, c_v, kv[2], c_r; } } } END { tq=d["total.num.queries"]+0; rec=d["total.num.recursivereplies"]+0; ch=d["total.num.cachehits"]+0; cm=d["total.num.cachemiss"]+0; pf=d["total.num.prefetch"]+0; ne=d["num.answer.rcode.NOERROR"]+0; nx=d["num.answer.rcode.NXDOMAIN"]+0; sf=d["num.answer.rcode.SERVFAIL"]+0; nd=d["num.answer.rcode.nodata"]+0; printf "\n%s== Response Summary ==%s\n", c_h, c_r; tr=ne+nx+sf+nd; printf "%sTotal responses (User+Internal):%s %s%s\n", c_k, c_v, tr, c_r; if(tr>0) { printf "%sSuccess (NOERROR):%s %.2f%%%s\n", c_k, c_v, (ne*100/tr), c_r; printf "%sNXDOMAIN:%s %.2f%%%s\n", c_k, c_v, (nx*100/tr), c_r; printf "%sFailures (SERVFAIL):%s %.2f%%%s\n", c_k, c_v, (sf*100/tr), c_r; } printf "\n%s== Derived Analysis ==%s\n", c_h, c_r; if(tq>0) { printf "%sRecursive (Miss) Rate:%s %.2f%%%s\n", c_k, c_v, (rec*100/tq), c_r; printf "%sCache Hit Rate:%s %.2f%%%s\n", c_k, c_v, (ch*100/tq), c_r; printf "%sPrefetch Ratio (Prefetch/Queries):%s %.2f%%%s\n", c_k, c_v, (pf*100/tq), c_r; } printf "\n%s== Latency Breakdown (Recursive Queries) ==%s\n", c_h, c_r; cum=0; if (rec_total_hist > 0) { fast_pct = (fast_hist / rec_total_hist) * 100; printf "%s%4d-%4d ms:%s %6d %squeries%s (%s%.2f%%%s)\n", c_k, 0, 8, c_r, fast_hist, c_k, c_r, c_v, fast_pct, c_r; cum += fast_pct; for(i=1; i<=hc; i++) { v=hist[i,"v"]; if(rec_total_hist>0) { p=(v/rec_total_hist)*100; cum+=p; printf "%s%4d-%4d ms:%s %6d %squeries%s (%s%.2f%%%s, %scum%s: %s%.2f%%%s)\n", c_k, hist[i,"s"], hist[i,"e"], c_r, v, c_k, c_r, c_v, p, c_r, c_k, c_r, c_v, cum, c_r; } } } else { printf "No recursive latency data available.\n"; } }'\'''

== System Overview ==
total.num.queries                  : 18293

== Performance & Cache ==
total.num.queries_discard_timeout  : 27
total.num.queries_discard_timeout  : 27
total.num.cachehits                : 14852
total.num.cachemiss                : 3441
total.num.prefetch                 : 7871
total.num.recursivereplies         : 3414
total.requestlist.avg              : 6.56462
total.requestlist.max              : 67
total.recursion.time.avg           : 18.00 ms
time.up                            : 0d 3h 44m 9s

== Memory & Stats ==
mem.cache.rrset                    : 699.37 KiB
mem.cache.message                  : 650.66 KiB
mem.mod.iterator                   : 16.32 KiB
mem.mod.validator                  : 16.37 KiB

== Query Types ==
num.query.type.A                   : 10238
num.query.type.PTR                 : 35
num.query.type.HINFO               : 1
num.query.type.MX                  : 40
num.query.type.TXT                 : 14
num.query.type.AAAA                : 6008
num.query.type.SRV                 : 8
num.query.type.SVCB                : 15
num.query.type.HTTPS               : 1934

== Transport Protocols ==
num.query.tcpout                   : 60

== Response Codes ==
num.answer.rcode.NOERROR           : 17530
num.answer.rcode.SERVFAIL          : 324
num.answer.rcode.NXDOMAIN          : 412
num.answer.rcode.nodata            : 4281
msg.cache.count                    : 2482
rrset.cache.count                  : 2442
infra.cache.count                  : 2

== Security & Threats ==
num.rpz.action.rpz-local-data      : 24

== Response Summary ==
Total responses (User+Internal): 22547
Success (NOERROR): 77.75%
NXDOMAIN: 1.83%
Failures (SERVFAIL): 1.44%

== Derived Analysis ==
Recursive (Miss) Rate: 18.66%
Cache Hit Rate: 81.19%
Prefetch Ratio (Prefetch/Queries): 43.03%

== Latency Breakdown (Recursive Queries) ==
   0-   8 ms:   1736 queries (50.85%)
   8-  16 ms:    628 queries (18.39%, cum: 69.24%)
  16-  32 ms:    596 queries (17.46%, cum: 86.70%)
  32-  65 ms:    334 queries (9.78%, cum: 96.49%)
  65- 131 ms:     58 queries (1.70%, cum: 98.18%)
 131- 262 ms:     32 queries (0.94%, cum: 99.12%)
 262- 524 ms:     22 queries (0.64%, cum: 99.77%)
 524-1000 ms:      7 queries (0.21%, cum: 99.97%)
1000-2000 ms:      1 queries (0.03%, cum: 100.00%)