| Title: Realtime bandwidth terminal graph visualization | |
| Author: Solène | |
| Date: 19 July 2019 | |
| Tags: openbsd ttyplot | |
| Description: | |
| If for some reasons you want to visualize your bandwidth traffic on an | |
| interface (in or out) in a terminal with a nice graph, here is a small | |
| script | |
| to do so, involving **ttyplot**, a nice software making graphics in a | |
| terminal. | |
| The following will works on OpenBSD. | |
| You can install ttyplot by `pkg_add ttyplot` as root, ttyplot package | |
| appeared | |
| since OpenBSD 6.5. | |
| For Linux, the [ttyplot official | |
| website](https://github.com/tenox7/ttyplot) | |
| contains tons of examples. | |
| ### Example | |
| Output example while updating my packages: | |
| IN Bandwidth in KB/s | |
| ↑ 1499.2 KB/s# | |
| │ # | |
| │ # | |
| │ # | |
| │ ## | |
| │ ## | |
| │ 1124.4 KB/s## | |
| │ ## | |
| │ ## | |
| │ ## | |
| │ ## | |
| │ ## | |
| │ 749.6 KB/s ## | |
| │ ## | |
| │ ## | |
| │ ## | |
| # | |
| │ ## # # # # | |
| ## | |
| │ ## # ### # ## # # # ## | |
| ## # # ## | |
| │ 374.8 KB/s ## ## #### # # ## # # ### ## ## ### # | |
| ## ### # # # # ## # ## | |
| │ ## ### ##### ########## ############# ### # ## | |
| ### ##### #### ## ## ###### ## ## | |
| │ ## ### ##### ########## ############# ### #### | |
| ### ##### #### ## ## ## ###### ## ### | |
| │ ## ### ##### ########## ############## ### #### | |
| ### ##### #### ## ## ######### ## #### | |
| │ ## ### ##### ############################## | |
| ######### ##### #### ## ## ############ #### | |
| │ ## ### | |
| #################################################### #### ## | |
| ##################### | |
| │ ## ### | |
| #################################################### | |
| ############################# | |
| └──────────────────────� | |
| �───────────────────────� | |
| ��─────────────────────── | |
| ───────────────────────� | |
| �──────→ | |
| # last=422.0 min=1.3 max=1499.2 avg=352.8 KB/s | |
| Fri Jul 19 08:30:25 2019 | |
| github.com/tenox7/ttyplot 1.4 | |
| In the following command, we will use **trunk0** with INBOUND traffic | |
| as the | |
| interface to monitor. | |
| At the end of the article, there is a command for displaying both in | |
| and out at | |
| the same time, and also instructions for customizing to your need. | |
| **Article update:** the following command is extremely long and | |
| complicated, at | |
| the end of the article you can find a shorter and more efficient | |
| version, | |
| removing most of the awk code. | |
| You can copy/paste this command in your OpenBSD system shell, this will | |
| produce | |
| a graph of trunk0 inbound traffic. | |
| { while :; do netstat -i -b -n ; sleep 1 ; done } | awk | |
| 'BEGIN{old=-1} /^trunk0/ { if(!index($4,":") && old>=0) { print | |
| ($5-old)/1024 ; fflush ; old = $5 } if(old==-1) { old=$5 } }' | | |
| ttyplot -t "IN Bandwidth in KB/s" -u "KB/s" -c "#" | |
| The script will do an infinite loop doing `netstat -ibn` every second | |
| and | |
| sending that output to awk. | |
| You can quit it with **Ctrl+C**. | |
| ## Explanations | |
| Netstat output contains total bytes (in or out) since system has | |
| started so awk | |
| needs to remember last value and will display the difference between | |
| two | |
| output, avoiding first value because it would make a huge spike (aka | |
| the total | |
| network transfered since boot time). | |
| If I decompose the awk script, this is a lot more readable. | |
| Awk is very readable if you take care to format it properly as any | |
| source code! | |
| #!/bin/sh | |
| { while :; | |
| do | |
| netstat -i -b -n | |
| sleep 1 | |
| done | |
| } | awk ' | |
| BEGIN { | |
| old=-1 | |
| } | |
| /^trunk0/ { | |
| if(!index($4,":") && old>=0) { | |
| print ($5-old)/1024 | |
| fflush | |
| old = $5 | |
| } | |
| if(old==-1) { | |
| old = $5 | |
| } | |
| }' | ttyplot -t "IN Bandwidth in KB/s" -u "KB/s" -c "#" | |
| ### Customization | |
| + replace **trunk0** by your interface name | |
| + replace both instances of **$5** by **$6** for **OUT** traffic | |
| + replace **/1024** by **/1048576** for MB/s values | |
| + remove **/1024** for B/s values | |
| + replace 1 in **sleep 1** by another value if you want to have the | |
| value every | |
| n seconds | |
| ### IN/OUT version for both data on the same graph + simpler | |
| Thanks to leot on IRC, netstat can be used in a lot more efficient way | |
| and remove all the awk parsing! | |
| ttyplot supports having two graphs at the same time, one being in | |
| opposite color. | |
| netstat -b -w 1 -I trunk0 | awk 'NR>3 { print $1/1024; print | |
| $2/1024; fflush }' | ttyplot -2 -t "IN/OUT Bandwidth in KB/s" -u "KB/s" | |
| -c "#" |