|
| 1 | +/* This Source Code Form is subject to the terms of the Mozilla Public |
| 2 | + * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 3 | + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ |
| 4 | + |
| 5 | +package ui |
| 6 | + |
| 7 | +import ( |
| 8 | + "fmt" |
| 9 | + "github.com/jroimartin/gocui" |
| 10 | + "pktvisor/pkg/client" |
| 11 | + "time" |
| 12 | +) |
| 13 | + |
| 14 | +func (u *ui) updateHeader(v *gocui.View, window5m *client.StatSnapshot) { |
| 15 | + v.Clear() |
| 16 | + pcounts := window5m.Packets |
| 17 | + // there may be some unknown |
| 18 | + inOutDiff := pcounts.Total - (pcounts.In + pcounts.Out) |
| 19 | + _, _ = fmt.Fprintf(v, "Pkts %d | UDP %d (%3.1f%%) | TCP %d (%3.1f%%) | Other %d (%3.1f%%) | IPv4 %d (%3.1f%%) | IPv6 %d (%3.1f%%) | In %d (%3.1f%%) | Out %d (%3.1f%%) | Deep Samples %d (%3.1f%%)\n", |
| 20 | + pcounts.Total, |
| 21 | + pcounts.UDP, |
| 22 | + (float64(pcounts.UDP)/float64(pcounts.Total))*100, |
| 23 | + pcounts.TCP, |
| 24 | + (float64(pcounts.TCP)/float64(pcounts.Total))*100, |
| 25 | + pcounts.OtherL4, |
| 26 | + (float64(pcounts.OtherL4)/float64(pcounts.Total))*100, |
| 27 | + pcounts.Ipv4, |
| 28 | + (float64(pcounts.Ipv4)/float64(pcounts.Total))*100, |
| 29 | + pcounts.Ipv6, |
| 30 | + (float64(pcounts.Ipv6)/float64(pcounts.Total))*100, |
| 31 | + pcounts.In, |
| 32 | + (float64(pcounts.In)/float64(pcounts.Total-inOutDiff))*100, |
| 33 | + pcounts.Out, |
| 34 | + (float64(pcounts.Out)/float64(pcounts.Total-inOutDiff))*100, |
| 35 | + pcounts.DeepSamples, |
| 36 | + (float64(pcounts.DeepSamples)/float64(pcounts.Total))*100, |
| 37 | + ) |
| 38 | + _, _ = fmt.Fprintf(v, "Pkt Rates Total %d/s %d/%d/%d/%d pps | In %d/s %d/%d/%d/%d pps | Out %d/s %d/%d/%d/%d pps | IP Card. In: %d | Out: %d | TCP Errors %d | OS Drops %d | IF Drops %d\n\n", |
| 39 | + pcounts.Rates.Pps_total.Live, |
| 40 | + pcounts.Rates.Pps_total.P50, |
| 41 | + pcounts.Rates.Pps_total.P90, |
| 42 | + pcounts.Rates.Pps_total.P95, |
| 43 | + pcounts.Rates.Pps_total.P99, |
| 44 | + pcounts.Rates.Pps_in.Live, |
| 45 | + pcounts.Rates.Pps_in.P50, |
| 46 | + pcounts.Rates.Pps_in.P90, |
| 47 | + pcounts.Rates.Pps_in.P95, |
| 48 | + pcounts.Rates.Pps_in.P99, |
| 49 | + pcounts.Rates.Pps_out.Live, |
| 50 | + pcounts.Rates.Pps_out.P50, |
| 51 | + pcounts.Rates.Pps_out.P90, |
| 52 | + pcounts.Rates.Pps_out.P95, |
| 53 | + pcounts.Rates.Pps_out.P99, |
| 54 | + pcounts.Cardinality.SrcIpsIn, |
| 55 | + pcounts.Cardinality.DstIpsOut, |
| 56 | + window5m.Pcap.TcpReassemblyErrors, |
| 57 | + window5m.Pcap.OsDrops, |
| 58 | + window5m.Pcap.IfDrops, |
| 59 | + ) |
| 60 | + dnsc := window5m.DNS.WirePackets |
| 61 | + _, _ = fmt.Fprintf(v, "DNS Wire Pkts %d (%3.1f%%) | Rates Total %d/s %d/%d/%d/%d | UDP %d (%3.1f%%) | TCP %d (%3.1f%%) | IPv4 %d (%3.1f%%) | IPv6 %d (%3.1f%%) | Query %d (%3.1f%%) | Response %d (%3.1f%%)\n", |
| 62 | + dnsc.Total, |
| 63 | + (float64(dnsc.Total)/float64(pcounts.Total))*100, |
| 64 | + dnsc.Rates.Total.Live, |
| 65 | + dnsc.Rates.Total.P50, |
| 66 | + dnsc.Rates.Total.P90, |
| 67 | + dnsc.Rates.Total.P95, |
| 68 | + dnsc.Rates.Total.P99, |
| 69 | + dnsc.UDP, |
| 70 | + (float64(dnsc.UDP)/float64(dnsc.Total))*100, |
| 71 | + dnsc.TCP, |
| 72 | + (float64(dnsc.TCP)/float64(dnsc.Total))*100, |
| 73 | + dnsc.Ipv4, |
| 74 | + (float64(dnsc.Ipv4)/float64(dnsc.Total))*100, |
| 75 | + dnsc.Ipv6, |
| 76 | + (float64(dnsc.Ipv6)/float64(dnsc.Total))*100, |
| 77 | + dnsc.Queries, |
| 78 | + (float64(dnsc.Queries)/float64(dnsc.Total))*100, |
| 79 | + dnsc.Replies, |
| 80 | + (float64(dnsc.Replies)/float64(dnsc.Total))*100, |
| 81 | + ) |
| 82 | + xact := window5m.DNS.Xact |
| 83 | + _, _ = fmt.Fprintf(v, "DNS Xacts %d | Timed Out %d | In %d (%3.1f%%) | Out %d (%3.1f%%) | In %3.1f/%3.1f/%3.1f/%3.1f ms | Out %3.1f/%3.1f/%3.1f/%3.1f ms | Qname Card. %d\n", |
| 84 | + xact.Counts.Total, |
| 85 | + xact.Counts.TimedOut, |
| 86 | + xact.In.Total, |
| 87 | + (float64(xact.In.Total)/float64(xact.Counts.Total))*100, |
| 88 | + xact.Out.Total, |
| 89 | + (float64(xact.Out.Total)/float64(xact.Counts.Total))*100, |
| 90 | + float64(xact.In.QuantilesUS.P50)/1000, |
| 91 | + float64(xact.In.QuantilesUS.P90)/1000, |
| 92 | + float64(xact.In.QuantilesUS.P95)/1000, |
| 93 | + float64(xact.In.QuantilesUS.P99)/1000, |
| 94 | + float64(xact.Out.QuantilesUS.P50)/1000, |
| 95 | + float64(xact.Out.QuantilesUS.P90)/1000, |
| 96 | + float64(xact.Out.QuantilesUS.P95)/1000, |
| 97 | + float64(xact.Out.QuantilesUS.P99)/1000, |
| 98 | + window5m.DNS.Cardinality.Qname, |
| 99 | + ) |
| 100 | + startTime := time.Unix(window5m.Packets.Period.StartTS, 0) |
| 101 | + endTime := time.Unix(window5m.Packets.Period.StartTS+window5m.Packets.Period.Length, 0) |
| 102 | + _, _ = fmt.Fprintf(v, "DNS NOERROR %d (%3.1f%%) | SRVFAIL %d (%3.1f%%) | NXDOMAIN %d (%3.1f%%) | REFUSED %d (%3.1f%%) | Time Window %v to %v, Period %ds\n", |
| 103 | + dnsc.NoError, |
| 104 | + (float64(dnsc.NoError)/float64(dnsc.Replies))*100, |
| 105 | + dnsc.SrvFail, |
| 106 | + (float64(dnsc.SrvFail)/float64(dnsc.Replies))*100, |
| 107 | + dnsc.NxDomain, |
| 108 | + (float64(dnsc.NxDomain)/float64(dnsc.Replies))*100, |
| 109 | + dnsc.Refused, |
| 110 | + (float64(dnsc.Refused)/float64(dnsc.Replies))*100, |
| 111 | + startTime.Format(time.Kitchen), |
| 112 | + endTime.Format(time.Kitchen), |
| 113 | + window5m.Packets.Period.Length, |
| 114 | + ) |
| 115 | + |
| 116 | +} |
0 commit comments