Collect all partition pool member stats with tmsh
Code is community submitted, community supported, and recognized as ‘Use At Your Own Risk’.
Short Description
This solution resulted from a question on how to get all the stats from pool members of all partitions in one iControl REST method call. I couldn't figure out a solution to that just with iControl REST, so I created a tmsh script to collect the stats and a python script to run that script and download the stats.
Problem solved by this Code Snippet
Eliminates the need to make a lot of REST calls to get the pool member data
How to use this Code Snippet
python poolstats.py admin <username>
Code Snippet Meta Information
- Version: tested with tmos 15.1.8.1 and python 3.11
- Coding Language: tmsh / python
Full Code Snippet
TMSH script (latest here)
proc script::run {} {
# where to store the data - /shared/images
set fp [open "/shared/images/poolstats.csv" w+]
tmsh::cd /
# CSV HEADER
puts $fp "pool,member,ss.bits-in,ss.bits-out,ss.pkts-in,ss.pkts-out"
# iterate through pools
foreach pool [tmsh::get_config /ltm pool recursive] {
set pl [tmsh::get_name $pool]
foreach obj [tmsh::get_status /ltm pool $pl detail] {
foreach member [tmsh::get_field_value $obj members] {
set mbr [tmsh::get_name $member]
set ss_bit_in [tmsh::get_field_value $member serverside.bits-in]
set ss_bit_out [tmsh::get_field_value $member serverside.bits-out]
set ss_pkts_in [tmsh::get_field_value $member serverside.pkts-in]
set ss_pkts_out [tmsh::get_field_value $member serverside.pkts-out]
puts $fp "$pl,$mbr,$ss_bit_in,$ss_bit_out,$ss_pkts_in,$ss_pkts_out"
}
}
}
# close file
close $fp
}
Python script (latest here)
from bigrest.bigip import BIGIP
from time import sleep
import argparse
import getpass
import sys
def build_parser():
parser = argparse.ArgumentParser()
parser.add_argument("host", help="BIG-IP IP/FQDN")
parser.add_argument("user", help="BIG-IP Username")
return parser.parse_args()
def instantiate_bigip(host, user):
pw = getpass.getpass(prompt=f"\n\tWell hello {user}, please enter your password: ")
try:
obj = BIGIP(host, user, pw, session_verify=False)
except Exception as e:
print(f"Failed to connect to {args.host} due to {type(e).__name__}:\n")
print(f"{e}")
sys.exit()
return obj
def deploy_script():
# slurp the file
with open('poolstats.tcl') as f:
tmsh_script = f.read()
try:
cli_script = {'name': 'poolstats.tcl', 'apiAnonymous': tmsh_script}
b.create('/mgmt/tm/cli/script', cli_script)
except Exception as e:
print(f'{e}')
sys.exit()
def run_poolstats(b):
try:
data = {'command': 'run', 'name': '/Common/poolstats.tcl', 'utilCmdArgs': ''}
b.command('/mgmt/tm/cli/script', data)
except Exception as e:
print(f'{e}')
def download_poolstats_data(b):
try:
b.download('/mgmt/cm/autodeploy/software-image-downloads', 'poolstats.csv')
except Exception as e:
print(f'{e}')
if __name__ == "__main__":
args = build_parser()
b = instantiate_bigip(args.host, args.user)
if not b.exist('/mgmt/tm/cli/script/poolstats.tcl'):
deploy_script()
run_poolstats(b)
# might need to add a delay here if the file write takes a long time with big configs
# sleep(30)
download_poolstats_data(b)
Published May 26, 2023
Version 1.0JRahm
Admin
Christ Follower, Husband, Father, Technologist. I love community and I especially love THIS community. My background is networking, but I've dabbled in all the F5 iStuff, I'm a recovering Perl guy, and am very much a python enthusiast. Learning alongside all of you in this accelerating industry toward modern apps and architectures.No CommentsBe the first to comment
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)