prom 2/2. Add prometheus output.
(also part 2/2 for the presentPower bugfix)
This commit is contained in:
parent
896dced5eb
commit
fd7c4d4458
|
@ -1 +1,2 @@
|
||||||
__pycache__
|
__pycache__
|
||||||
|
scraperMain.out
|
6
prom.py
6
prom.py
|
@ -24,6 +24,10 @@ app = Flask(__name__)
|
||||||
@app.route('/', methods=['GET'])
|
@app.route('/', methods=['GET'])
|
||||||
def parse_request(): # If somebody accesses us
|
def parse_request(): # If somebody accesses us
|
||||||
data = scraperMain.scraperMain(hostname, enc, sshkeypath) # Gather up, we're going to wait a few minutes on the data.
|
data = scraperMain.scraperMain(hostname, enc, sshkeypath) # Gather up, we're going to wait a few minutes on the data.
|
||||||
|
|
||||||
|
#with open("prom_servers.out", "a") as f: # DO NOT UNCOMMENT IN PROD
|
||||||
|
# print(data, file=f)
|
||||||
|
|
||||||
response_list = prom_servers.prom_servers(PREFIX, data[0], data[1]) # Convert our python lists to prometheus format whatever.
|
response_list = prom_servers.prom_servers(PREFIX, data[0], data[1]) # Convert our python lists to prometheus format whatever.
|
||||||
response = '\n'.join(response_list) # Oh you still don't want a list? Fine, newlines!
|
response = '\n'.join(response_list) # Oh you still don't want a list? Fine, newlines!
|
||||||
return response # The pizza is already cold.
|
return '<pre>' + response + '</pre>' # The pizza is already cold.
|
|
@ -94,7 +94,8 @@ def prom_servers(PREFIX, baysInUseCount, servers):
|
||||||
prom_disp_servers = prom_disp_servers + prom_header('Number of errors or warnings encountered during the gathering of data see logs of promServers in blade-ssh-scraper', [PREFIX + 'errors ' + str(errors)], 'counter')
|
prom_disp_servers = prom_disp_servers + prom_header('Number of errors or warnings encountered during the gathering of data see logs of promServers in blade-ssh-scraper', [PREFIX + 'errors ' + str(errors)], 'counter')
|
||||||
|
|
||||||
#prom_disp_servers = '\n'.join(prom_disp_servers)
|
#prom_disp_servers = '\n'.join(prom_disp_servers)
|
||||||
breakpoint()
|
#breakpoint()
|
||||||
|
|
||||||
return(prom_disp_servers)
|
return(prom_disp_servers)
|
||||||
|
|
||||||
# Test data
|
# Test data
|
||||||
|
|
|
@ -12,28 +12,11 @@ import listServers, relativeUsage
|
||||||
#logging.basicConfig()
|
#logging.basicConfig()
|
||||||
#logging.getLogger("paramiko").setLevel(logging.DEBUG)
|
#logging.getLogger("paramiko").setLevel(logging.DEBUG)
|
||||||
|
|
||||||
"""
|
|
||||||
ENV VARIABLES AVAILABLE:
|
|
||||||
- hostname
|
|
||||||
- sshkeylocation
|
|
||||||
- sshuser (optional)
|
|
||||||
"""
|
|
||||||
# Creds
|
|
||||||
hostname = str(os.environ['hostname'])
|
|
||||||
sshuser = str(os.getenv('sshuser', 'Administrator'))
|
|
||||||
sshkeylocation = os.getenv('sshkeypath')
|
|
||||||
|
|
||||||
paramiko.transport.Transport._preferred_keys += ('ssh-dss',) # Allow the insecurities
|
|
||||||
ssh = paramiko.SSHClient() # Alias
|
|
||||||
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # Ignore host key REMOVE ME (though it doesn't kind of matter anyways)
|
|
||||||
|
|
||||||
ssh.connect(hostname, username=sshuser, key_filename=sshkeylocation) # Attempt to connect
|
|
||||||
channel = ssh.invoke_shell() # Get a new shell(, and keep it open, since we need to exec multiple commands depending on the last command being executed successfully.)
|
|
||||||
|
|
||||||
def ssh_runcmd(command): # Some abstraction to run ssh commands.
|
def ssh_runcmd(command): # Some abstraction to run ssh commands.
|
||||||
# Input validation
|
# Input validation
|
||||||
if not type(command) is str:
|
if not type(command) is str:
|
||||||
raise TypeError("ssh_runcmd: command must be a string, '" + command + "' is not.")
|
raise TypeError("ssh_runcmd: command must be a string, '" + command + "' is not.")
|
||||||
|
#TODO: valiate channel, though not really
|
||||||
|
|
||||||
channel.send(command + '\n') # Execute command.
|
channel.send(command + '\n') # Execute command.
|
||||||
|
|
||||||
|
@ -66,9 +49,30 @@ def ssh_runcmd(command): # Some abstraction to run ssh commands.
|
||||||
#cmdout = '\n'.join(cmdout) # DO NOT UNCOMMENT THIS, HERE FOR ONLY REFERENCE TO JOIN THE LINES BACK.
|
#cmdout = '\n'.join(cmdout) # DO NOT UNCOMMENT THIS, HERE FOR ONLY REFERENCE TO JOIN THE LINES BACK.
|
||||||
return(cmdout) # Return list of output stuff.
|
return(cmdout) # Return list of output stuff.
|
||||||
|
|
||||||
### MAIN ###
|
def scraperMain(hostname, enc, sshkeypath):
|
||||||
|
global channel # needed for ssh_runcmd
|
||||||
|
# Input validation
|
||||||
|
if not type(hostname) is str:
|
||||||
|
raise TypeError("scraperMain: hostname must be a string, '" + str(hostname) + "' is not.")
|
||||||
|
if not type(enc) is str:
|
||||||
|
raise TypeError("scraperMain: enc must be a string, '" + str(enc) + "' is not.")
|
||||||
|
if not type(sshkeypath) is str:
|
||||||
|
raise TypeError("scraperMain: sshkeypath must be a string, '" + str(sshkeypath) + "' is not.")
|
||||||
|
|
||||||
logging.debug(ssh_runcmd('show date')) # Get rid of motd, init for next cmds. This is better than indefinitely reading buffer before any command as to counter this.
|
|
||||||
|
# ssh_init() # it takes more lines to put it in a function than to dump it here.
|
||||||
|
sshuser = 'Administrator' # Admin is hardcoded in to the enc.
|
||||||
|
|
||||||
|
paramiko.transport.Transport._preferred_keys += ('ssh-dss',) # Allow the insecurities
|
||||||
|
ssh = paramiko.SSHClient() # Alias
|
||||||
|
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # Ignore host key REMOVE ME (though it doesn't kind of matter anyways)
|
||||||
|
|
||||||
|
ssh.connect(hostname, username=sshuser, key_filename=sshkeypath) # Attempt to connect
|
||||||
|
channel = ssh.invoke_shell() # Get a new shell(, and keep it open, since we need to exec multiple commands depending on the last command being executed successfully.)
|
||||||
|
|
||||||
|
|
||||||
|
## MAIN ##
|
||||||
|
logging.debug(ssh_runcmd('show date')) # Get rid of motd, init for next cmds. This is better than indefinitely reading buffer before any command as to counter this. Reading buffer before each command isn't a good idea and doesn't work either, trust me.
|
||||||
|
|
||||||
|
|
||||||
## Get list of blades with some added info ##
|
## Get list of blades with some added info ##
|
||||||
|
@ -94,7 +98,7 @@ for n in range(baysInUseCount):
|
||||||
warn('presentPower for bay ' + bay + 'was corrected to 0 from it\'s abnormal state: ' + presentPower)
|
warn('presentPower for bay ' + bay + 'was corrected to 0 from it\'s abnormal state: ' + presentPower)
|
||||||
presentPower = 0
|
presentPower = 0
|
||||||
servers[n].append(int(presentPower)) # And push it to our miniDB of the servers list.
|
servers[n].append(int(presentPower)) # And push it to our miniDB of the servers list.
|
||||||
logging.info("UsageRawDC: " + presentPower)
|
logging.info("UsageRawDC: " + str(presentPower))
|
||||||
|
|
||||||
logging.debug(ssh_runcmd('exit')) # Exit the blade's iLO, return to the enc's iLO SSH interface.
|
logging.debug(ssh_runcmd('exit')) # Exit the blade's iLO, return to the enc's iLO SSH interface.
|
||||||
#breakpoint()
|
#breakpoint()
|
||||||
|
@ -116,12 +120,17 @@ ssh.close()
|
||||||
## Calculating blade usage by percentage. ##
|
## Calculating blade usage by percentage. ##
|
||||||
# Keep in mind the querying of the data took a while, a minute or so.
|
# Keep in mind the querying of the data took a while, a minute or so.
|
||||||
serversAverageACAndServers = relativeUsage.relativeUsage(encPowerUsageAC, baysInUseCount, servers)
|
serversAverageACAndServers = relativeUsage.relativeUsage(encPowerUsageAC, baysInUseCount, servers)
|
||||||
serversAverageAC = serversAverageACAndServers[0]
|
#serversAverageAC = serversAverageACAndServers[0] # I guess you don't want any stonks by me, but prom instead…
|
||||||
servers = serversAverageACAndServers[1]
|
servers = serversAverageACAndServers[1]
|
||||||
|
|
||||||
# Fields: [BayNumber "Server Name", "Serial Number", "Status", "Power", "UID Partner", presentPowerDirectDC, relativeUsageAC]
|
# Fields: [BayNumber "Server Name", "Serial Number", "Status", "Power", "UID Partner", presentPowerDirectDC, relativeUsageAC]
|
||||||
|
|
||||||
print("Enclosure usage AC: " + str(encPowerUsageAC))
|
for n in range(baysInUseCount):
|
||||||
print("Average blade relative usage AC: " + str(serversAverageAC))
|
servers[n].append( enc ) # Add what enc was used.
|
||||||
print('[BayNumber "Server Name", "Serial Number", "Status", "Power", "UID Partner", presentPowerDirectDC, relativeUsageAC]')
|
# Fields: [BayNumber "Server Name", "Serial Number", "Status", "Power", "UID Partner", presentPowerDirectDC, relativeUsageAC, "enc"]
|
||||||
print(servers)
|
|
||||||
|
return(baysInUseCount, servers) # we could return more, but nobody wants our data :/
|
||||||
|
|
||||||
|
#print("Enclosure usage AC: " + str(encPowerUsageAC))
|
||||||
|
#print("Average blade relative usage AC: " + str(serversAverageAC))
|
||||||
|
#print('[BayNumber "Server Name", "Serial Number", "Status", "Power", "UID Partner", presentPowerDirectDC, relativeUsageAC, "enc"]')
|
||||||
|
#print(servers)
|
||||||
|
|
Loading…
Reference in New Issue