more commits

This commit is contained in:
2023-01-05 00:42:20 +00:00
parent aa4f5f5069
commit f73bc74a65
6 changed files with 200 additions and 3334 deletions
-22
View File
@@ -1,22 +0,0 @@
vpg_storage_used_in_mb{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 45753
vpg_actual_rpo{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 6
vpg_throughput_in_mb{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 0.828125
vpg_iops{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 16
vpg_provisioned_storage_in_mb{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 122966
vpg_vms_count{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 1
vpg_configured_rpo_seconds{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 300
vpg_actual_history_in_minutes{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 1064
vpg_configured_history_in_minutes{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 1440
vm_actualrpo{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18",VmName="cmh-linux-1"} 6
vm_throughput_in_mb{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18",VmName="cmh-linux-1"} 0.0
vm_iops{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18",VmName="cmh-linux-1"} 16
vm_journal_hard_limit{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18",VmName="cmh-linux-1"} 153600
vm_journal_used_storage_mb{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18",VmName="cmh-linux-1"} 7036
vm_outgoing_bandwidth_in_mbps{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18",VmName="cmh-linux-1"} 0.2041015625
vm_IoOperationsCounter{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 136594
vm_WriteCounterInMBs{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 19129
vm_SyncCounterInMBs{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 118784
vm_NetworkTrafficCounterInMBs{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 11503
vm_SampleTime{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 2022-11-21T21:57:06.590Z
vm_EncryptedDataInLBs{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 11427300
vm_UnencryptedDataInLBs{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 6271800
-22
View File
@@ -1,22 +0,0 @@
vpg_storage_used_in_mb{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 45751
vpg_actual_rpo{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 9
vpg_throughput_in_mb{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 0.03955078125
vpg_iops{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 6
vpg_provisioned_storage_in_mb{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 122966
vpg_vms_count{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 1
vpg_configured_rpo_seconds{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 300
vpg_actual_history_in_minutes{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 1057
vpg_configured_history_in_minutes{VpgIdentifier="0c956d5b-f142-42e5-bb58-04e2fe7cc685",VpgName="RansomTest"} 1440
vm_actualrpo{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18",VmName="cmh-linux-1"} 9
vm_throughput_in_mb{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18",VmName="cmh-linux-1"} 0.0
vm_iops{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18",VmName="cmh-linux-1"} 6
vm_journal_hard_limit{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18",VmName="cmh-linux-1"} 153600
vm_journal_used_storage_mb{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18",VmName="cmh-linux-1"} 7031
vm_outgoing_bandwidth_in_mbps{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18",VmName="cmh-linux-1"} 0.00634765625
vm_IoOperationsCounter{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 132857
vm_WriteCounterInMBs{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 19021
vm_SyncCounterInMBs{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 118784
vm_NetworkTrafficCounterInMBs{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 11464
vm_SampleTime{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 2022-11-21T21:49:46.529Z
vm_EncryptedDataInLBs{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 11426400
vm_UnencryptedDataInLBs{VmIdentifier="5da9d183-f3f9-4ea9-bf46-eca5c06aec73.vm-18"} 6051600
+191 -77
View File
@@ -3,109 +3,223 @@ import http.server
import socketserver import socketserver
import time import time
import os import os
import logging
from threading import Thread from threading import Thread
from requests.packages.urllib3.exceptions import InsecureRequestWarning from requests.packages.urllib3.exceptions import InsecureRequestWarning
from requests.structures import CaseInsensitiveDict from requests.structures import CaseInsensitiveDict
from tinydb import TinyDB, Query
from tinydbstorage.storage import MemoryStorage
requests.packages.urllib3.disable_warnings(InsecureRequestWarning) requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
verifySSL = os.getenv("VERIFY_SSL", 'False').lower() in ('true', '1', 't') verifySSL = os.getenv("VERIFY_SSL", 'False').lower() in ('true', '1', 't')
zvm_url = os.environ['ZVM_HOST'] zvm_url = os.environ.get('ZVM_HOST', '192.168.50.60')
zvm_port = os.environ['ZVM_PORT'] zvm_port = os.environ.get('ZVM_PORT', '443')
client_id = os.environ['CLIENT_ID'] client_id = os.environ.get('CLIENT_ID', 'api-script')
client_secret = os.environ['CLIENT_SECRET'] client_secret = os.environ.get('CLIENT_SECRET', 'js51tDM8oappYUGRJBhF7bcsedNoHA5j')
LOGLEVEL = os.environ.get('LOGLEVEL', 'DEBUG').upper()
logging.basicConfig(filename='../logs/Log-Main.log', level=LOGLEVEL, format='%(relativeCreated)6d %(threadName)s %(message)s')
log = logging.getLogger("Node-Exporter")
log.debug("Running with Variables:\nVerify SSL: " + str(verifySSL) + "\nZVM Host: " + zvm_url + "\nZVM Port: " + zvm_port + "\nClient-Id: " + client_id + "\nClient Secret: " + client_secret)
# Global Variables
token = ""
lastStats = CaseInsensitiveDict()
def ZvmAuthHandler():
log.debug("ZVMAuthHandler Thread Started")
expiresIn = 0
global token
while True:
if (expiresIn < 30):
h = CaseInsensitiveDict()
h["Content-Type"] = "application/x-www-form-urlencoded"
d = CaseInsensitiveDict()
d["client_id"] = client_id
d["client_secret"] = client_secret
d["grant_type"] = "client_credentials"
uri = "https://" + zvm_url + ":" + zvm_port + "/auth/realms/zerto/protocol/openid-connect/token"
response = requests.post(url=uri, data=d, headers=h, verify=verifySSL)
responseJSON = response.json()
log.debug(responseJSON)
token = str(responseJSON['access_token'])
expiresIn = int(responseJSON['expires_in'])
expiresIn = expiresIn - 10
log.debug("Token Expires in " + str(expiresIn) + " seconds")
time.sleep(10)
print("Running with Variables:\nVerify SSL: " + os.environ['VERIFY_SSL'] + "\nZVM Host: " + zvm_url + "\nZVM Port: " + zvm_port + "\nClient-Id: " + client_id + "\nClient Secret: " + client_secret)
def GetDataFunc(): def GetDataFunc():
while True : tempdb = TinyDB(storage=MemoryStorage)
h = CaseInsensitiveDict() dbvm = Query()
h["Content-Type"] = "application/x-www-form-urlencoded" while (True) :
global token
d = CaseInsensitiveDict() if (token != ""):
d["client_id"] = client_id log.info("Got Auth Token!")
d["client_secret"] = client_secret log.debug("token: " + str(token))
d["grant_type"] = "client_credentials" log.debug("Data Collector Loop Running")
uri = "https://" + zvm_url + ":" + zvm_port + "/auth/realms/zerto/protocol/openid-connect/token" metricsDictionary = {}
response = requests.post(url=uri, data=d, headers=h, verify=verifySSL)
token = response.json() h2 = CaseInsensitiveDict()
h2["Accept"] = "application/json"
h2["Authorization"] = "Bearer " + token
h2 = CaseInsensitiveDict() uri = "https://" + zvm_url + ":" + zvm_port + "/v1/vpgs/"
h2["Accept"] = "application/json" service = requests.get(url=uri, timeout=3, headers=h2, verify=verifySSL)
h2["Authorization"] = "Bearer " + token['access_token'] vpg_json = service.json()
log.debug(vpg_json)
for vpg in vpg_json :
metricsDictionary["vpg_storage_used_in_mb{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["UsedStorageInMB"]
metricsDictionary["vpg_actual_rpo{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["ActualRPO"]
metricsDictionary["vpg_throughput_in_mb{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["ThroughputInMB"]
metricsDictionary["vpg_iops{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["IOPs"]
metricsDictionary["vpg_provisioned_storage_in_mb{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["ProvisionedStorageInMB"]
metricsDictionary["vpg_vms_count{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["VmsCount"]
metricsDictionary["vpg_configured_rpo_seconds{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["ConfiguredRpoSeconds"]
metricsDictionary["vpg_actual_history_in_minutes{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["HistoryStatusApi"]["ActualHistoryInMinutes"]
metricsDictionary["vpg_configured_history_in_minutes{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["HistoryStatusApi"]["ConfiguredHistoryInMinutes"]
uri = "https://" + zvm_url + ":" + zvm_port + "/v1/vpgs/" uri = "https://" + zvm_url + ":" + zvm_port + "/v1/vms/"
service = requests.get(url=uri, timeout=3, headers=h2, verify=verifySSL) vmapi = requests.get(url=uri, timeout=3, headers=h2, verify=verifySSL)
service_json = service.json() vmapi_json = vmapi.json()
log.debug(vmapi_json)
for vm in vmapi_json :
metricsDictionary["vm_actualrpo{VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + vm['VmName'] + "\"}"] = vm["ActualRPO"]
metricsDictionary["vm_throughput_in_mb{VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + vm['VmName'] + "\"}"] = vm["ThroughputInMB"]
metricsDictionary["vm_iops{VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + vm['VmName'] + "\"}"] = vm["IOPs"]
metricsDictionary["vm_journal_hard_limit{VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + vm['VmName'] + "\"}"] = vm["JournalHardLimit"]["LimitValue"]
metricsDictionary["vm_journal_used_storage_mb{VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + vm['VmName'] + "\"}"] = vm["JournalUsedStorageMb"]
metricsDictionary["vm_outgoing_bandwidth_in_mbps{VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + vm['VmName'] + "\"}"] = vm["OutgoingBandWidthInMbps"]
#metricsDictionary["vm_actual_rpo{VmName=\"" + vpg['VmName'] + "\"}"] = vm["actualRPO"]
metricsDictionary = {} uri = "https://" + zvm_url + ":" + zvm_port + "/v1/volumes?volumeType=scratch"
for vpg in service_json : volapi = requests.get(url=uri, timeout=5, headers=h2, verify=verifySSL)
metricsDictionary["vpg_storage_used_in_mb{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["UsedStorageInMB"] volapi_json = volapi.json()
metricsDictionary["vpg_actual_rpo{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["ActualRPO"]
metricsDictionary["vpg_throughput_in_mb{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["ThroughputInMB"]
metricsDictionary["vpg_iops{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["IOPs"]
metricsDictionary["vpg_provisioned_storage_in_mb{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["ProvisionedStorageInMB"]
metricsDictionary["vpg_vms_count{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["VmsCount"]
metricsDictionary["vpg_configured_rpo_seconds{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["ConfiguredRpoSeconds"]
metricsDictionary["vpg_actual_history_in_minutes{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["HistoryStatusApi"]["ActualHistoryInMinutes"]
metricsDictionary["vpg_configured_history_in_minutes{VpgIdentifier=\"" + vpg['VpgIdentifier'] + "\",VpgName=\"" + vpg['VpgName'] + "\"}"] = vpg["HistoryStatusApi"]["ConfiguredHistoryInMinutes"]
uri = "https://" + zvm_url + ":" + zvm_port + "/v1/vms/" if(bool(volapi_json)):
vmapi = requests.get(url=uri, timeout=3, headers=h2, verify=verifySSL) for volume in volapi_json :
vmapi_json = vmapi.json() #metricsDictionary["scratch_volume_provisioned_size_in_bytes{ProtectedVm=\"" + volume['ProtectedVm']['Name'] + "\", ProtectedVmIdentifier=\"" + volume['ProtectedVm']['Identifier'] + "\", OwningVRA=\"" + volume['OwningVm']['Name'] + "\"}"] = volume["Size"]["ProvisionedInBytes"]
# Determine the key for a given VM, then see if the key is already in the dictionary, if it is add the next disk to the total. If not, create a new key.
metrickey = "scratch_volume_size_in_bytes{ProtectedVm=\"" + volume['ProtectedVm']['Name'] + "\", ProtectedVmIdentifier=\"" + volume['ProtectedVm']['Identifier'] + "\", OwningVRA=\"" + volume['OwningVm']['Name'] + "\"}"
if (metrickey in metricsDictionary):
metricsDictionary[metrickey] = metricsDictionary[metrickey] + volume["Size"]["UsedInBytes"]
else:
metricsDictionary[metrickey] = volume["Size"]["UsedInBytes"]
percentage_used = (volume["Size"]["UsedInBytes"] / volume["Size"]["ProvisionedInBytes"] * 100)
percentage_used = round(percentage_used, 1)
#metricsDictionary["scratch_volume_percentage_used{ProtectedVm=\"" + volume['ProtectedVm']['Name'] + "\", ProtectedVmIdentifier=\"" + volume['ProtectedVm']['Identifier'] + "\", OwningVRA=\"" + volume['OwningVm']['Name'] + "\"}"] = percentage_used
for vm in vmapi_json : uri = "https://" + zvm_url + ":" + zvm_port + "/v1/statistics/vms/"
metricsDictionary["vm_actualrpo{VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + vm['VmName'] + "\"}"] = vm["ActualRPO"] statsapi = requests.get(url=uri, timeout=3, headers=h2, verify=verifySSL)
metricsDictionary["vm_throughput_in_mb{VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + vm['VmName'] + "\"}"] = vm["ThroughputInMB"] statsapi_json = statsapi.json()
metricsDictionary["vm_iops{VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + vm['VmName'] + "\"}"] = vm["IOPs"] log.debug(statsapi_json)
metricsDictionary["vm_journal_hard_limit{VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + vm['VmName'] + "\"}"] = vm["JournalHardLimit"]["LimitValue"] for vm in statsapi_json:
metricsDictionary["vm_journal_used_storage_mb{VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + vm['VmName'] + "\"}"] = vm["JournalUsedStorageMb"] log.debug(vm)
metricsDictionary["vm_outgoing_bandwidth_in_mbps{VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + vm['VmName'] + "\"}"] = vm["OutgoingBandWidthInMbps"] oldvmdata = dict()
#metricsDictionary["vm_actual_rpo{VmName=\"" + vpg['VmName'] + "\"}"] = vm["actualRPO"]
uri = "https://" + zvm_url + ":" + zvm_port + "/v1/statistics/vms/" CurrentIops = 0
statsapi = requests.get(url=uri, timeout=3, headers=h2, verify=verifySSL) CurrentWriteCounterInMBs = 0
statsapi_json = statsapi.json() CurrentSyncCounterInMBs = 0
CurrentNetworkTrafficCounterInMBs = 0
CurrentEncryptedLBs = 0
CurrentUnencryptedLBs = 0
CurrentTotalLBs = 0
CurrentPercentEncrypted = 0
VMName = "NA"
for vm in statsapi_json : oldvmdata = tempdb.search(dbvm.VmIdentifier == vm['VmIdentifier'])
metricsDictionary["vm_IoOperationsCounter{VmIdentifier=\"" + vm['VmIdentifier'] + "\"}"] = vm["IoOperationsCounter"] log.debug("+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_")
metricsDictionary["vm_WriteCounterInMBs{VmIdentifier=\"" + vm['VmIdentifier'] + "\"}"] = vm["WriteCounterInMBs"] log.debug("All Database")
metricsDictionary["vm_SyncCounterInMBs{VmIdentifier=\"" + vm['VmIdentifier'] + "\"}"] = vm["SyncCounterInMBs"] log.debug(tempdb.all())
metricsDictionary["vm_NetworkTrafficCounterInMBs{VmIdentifier=\"" + vm['VmIdentifier'] + "\"}"] = vm["NetworkTrafficCounterInMBs"] log.debug("+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_")
#metricsDictionary["vm_SampleTime{VmIdentifier=\"" + vm['VmIdentifier'] + "\"}"] = vm["SampleTime"] log.debug("Checking TempDB for VM " + vm['VmIdentifier'])
metricsDictionary["vm_EncryptedDataInLBs{VmIdentifier=\"" + vm['VmIdentifier'] + "\"}"] = vm["EncryptionStatistics"]["EncryptedDataInLBs"] if (oldvmdata):
metricsDictionary["vm_UnencryptedDataInLBs{VmIdentifier=\"" + vm['VmIdentifier'] + "\"}"] = vm["EncryptionStatistics"]["UnencryptedDataInLBs"] log.debug("Record Found")
log.debug("_*_*_*_*_*_*_*_*")
log.debug(oldvmdata[0])
log.debug("_*_*_*_*_*_*_*_*")
log.debug(tempdb.update(vm, dbvm.VmIdentifier == vm['VmIdentifier']))
uri = "https://" + zvm_url + ":" + zvm_port + "/v1/volumes?volumeType=scratch" log.debug("!@!@!@!@!@ Stats !@!@!@!@!@")
volapi = requests.get(url=uri, timeout=5, headers=h2, verify=verifySSL) VMName = oldvmdata[0]['VmName']
volapi_json = volapi.json() log.debug("Current VM " + str(VMName))
CurrentIops = vm['IoOperationsCounter'] - oldvmdata[0]['IoOperationsCounter']
log.debug("CurrentIops " + str(CurrentIops))
CurrentSyncCounterInMBs = vm['SyncCounterInMBs'] - oldvmdata[0]['SyncCounterInMBs']
log.debug("CurrentSyncCounterInMBs " + str(CurrentSyncCounterInMBs))
CurrentNetworkTrafficCounterInMBs = vm['NetworkTrafficCounterInMBs'] - oldvmdata[0]['NetworkTrafficCounterInMBs']
log.debug("CurrentNetworkTrafficCounterInMBs " + str(CurrentNetworkTrafficCounterInMBs))
CurrentEncryptedLBs = vm['EncryptionStatistics']['EncryptedDataInLBs'] - oldvmdata[0]['EncryptionStatistics']['EncryptedDataInLBs']
log.debug("CurrentEncryptedLBs " + str(CurrentEncryptedLBs))
CurrentUnencryptedLBs = vm['EncryptionStatistics']['UnencryptedDataInLBs'] - oldvmdata[0]['EncryptionStatistics']['UnencryptedDataInLBs']
log.debug("CurrentUnencryptedLBs " + str(CurrentUnencryptedLBs))
CurrentTotalLBs = CurrentEncryptedLBs + CurrentUnencryptedLBs
log.debug("CurrentTotalLBs " + str(CurrentTotalLBs))
if CurrentTotalLBs != 0:
CurrentPercentEncrypted = ((CurrentEncryptedLBs / CurrentTotalLBs) * 100)
else:
CurrentPercentEncrypted = 0
log.debug("CurrentPercentEncrypted " + str(CurrentPercentEncrypted))
if(bool(volapi_json)):
for volume in volapi_json :
#metricsDictionary["scratch_volume_provisioned_size_in_bytes{ProtectedVm=\"" + volume['ProtectedVm']['Name'] + "\", ProtectedVmIdentifier=\"" + volume['ProtectedVm']['Identifier'] + "\", OwningVRA=\"" + volume['OwningVm']['Name'] + "\"}"] = volume["Size"]["ProvisionedInBytes"]
# Determine the key for a given VM, then see if the key is already in the dictionary, if it is add the next disk to the total. If not, create a new key.
metrickey = "scratch_volume_size_in_bytes{ProtectedVm=\"" + volume['ProtectedVm']['Name'] + "\", ProtectedVmIdentifier=\"" + volume['ProtectedVm']['Identifier'] + "\", OwningVRA=\"" + volume['OwningVm']['Name'] + "\"}"
if (metrickey in metricsDictionary):
metricsDictionary[metrickey] = metricsDictionary[metrickey] + volume["Size"]["UsedInBytes"]
else: else:
metricsDictionary[metrickey] = volume["Size"]["UsedInBytes"] log.debug("No Record")
percentage_used = (volume["Size"]["UsedInBytes"] / volume["Size"]["ProvisionedInBytes"] * 100) #insert original VM record to tempdb
percentage_used = round(percentage_used, 1) log.debug(tempdb.insert(vm))
#metricsDictionary["scratch_volume_percentage_used{ProtectedVm=\"" + volume['ProtectedVm']['Name'] + "\", ProtectedVmIdentifier=\"" + volume['ProtectedVm']['Identifier'] + "\", OwningVRA=\"" + volume['OwningVm']['Name'] + "\"}"] = percentage_used
# This function will get data every 5 seconds # update database with VM name, for easier display in Grafana Legends
time.sleep(5) uri = "https://" + zvm_url + ":" + zvm_port + "/v1/vms/" + vm['VmIdentifier']
vapi = requests.get(url=uri, timeout=3, headers=h2, verify=verifySSL)
vapi_json = vapi.json()
log.debug("!@!@!@!@!@!@!@!@!@!@!@")
log.debug(vapi_json)
log.debug("!@!@!@!@!@!@!@!@!@!@!@")
tempdb.update({'VmName': vapi_json['VmName']}, dbvm.VmIdentifier == vm['VmIdentifier'])
VMName = vapi_json['VmName']
# open file to write new data # Store Calculated Metrics
file_object = open('metrics', 'w') metricsDictionary["vm_IoOperationsCounter{VpgIdentifier=\"" + vm['VpgIdentifier'] + "\",VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + VMName + "\"}"] = CurrentIops
for item in metricsDictionary : metricsDictionary["vm_WriteCounterInMBs{VpgIdentifier=\"" + vm['VpgIdentifier'] + "\",VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + VMName + "\"}"] = CurrentWriteCounterInMBs
file_object.write(item) metricsDictionary["vm_SyncCounterInMBs{VpgIdentifier=\"" + vm['VpgIdentifier'] + "\",VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + VMName + "\"}"] = CurrentSyncCounterInMBs
file_object.write(" ") metricsDictionary["vm_NetworkTrafficCounterInMBs{VpgIdentifier=\"" + vm['VpgIdentifier'] + "\",VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + VMName + "\"}"] = CurrentNetworkTrafficCounterInMBs
file_object.write(str(metricsDictionary[item])) metricsDictionary["vm_EncryptedDataInLBs{VpgIdentifier=\"" + vm['VpgIdentifier'] + "\",VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + VMName + "\"}"] = CurrentEncryptedLBs
file_object.write("\n") metricsDictionary["vm_UnencryptedDataInLBs{VpgIdentifier=\"" + vm['VpgIdentifier'] + "\",VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + VMName + "\"}"] = CurrentUnencryptedLBs
metricsDictionary["vm_TotalDataInLBs{VpgIdentifier=\"" + vm['VpgIdentifier'] + "\",VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + VMName + "\"}"] = CurrentTotalLBs
metricsDictionary["vm_PercentEncrypted{VpgIdentifier=\"" + vm['VpgIdentifier'] + "\",VmIdentifier=\"" + vm['VmIdentifier'] + "\",VmName=\"" + VMName + "\"}"] = CurrentPercentEncrypted
# open file to write new data
#file_object = open('metrics.txt', 'w')
#for item in metricsDictionary :
# file_object.write(item)
# file_object.write(" ")
# file_object.write(str(metricsDictionary[item]))
# file_object.write("\n")
file_object = open('metrics', 'w')
for item in metricsDictionary :
file_object.write(item)
file_object.write(" ")
file_object.write(str(metricsDictionary[item]))
file_object.write("\n")
# This function will get data every 10 seconds
log.debug("Starting Sleep")
time.sleep(10)
else:
log.debug("Waiting 1 second for Auth Token")
time.sleep(1)
#-------Start function to maintain ZVM Authentication---------
# run ZvmAuthHandler func in the background
background_thread = Thread(target = ZvmAuthHandler)
background_thread.start()
#-----------------Start Data collector Thread-----------------
# run GetDataFunc func in the background # run GetDataFunc func in the background
background_thread = Thread(target = GetDataFunc) background_thread = Thread(target = GetDataFunc)
background_thread.start() background_thread.start()
+2
View File
@@ -1 +1,3 @@
requests requests
tinydb
tinydb-storage
+3 -2
View File
@@ -10,7 +10,8 @@ services:
- VERIFY_SSL=False - VERIFY_SSL=False
- ZVM_HOST=192.168.50.60 - ZVM_HOST=192.168.50.60
- ZVM_PORT=443 - ZVM_PORT=443
- CLIENT_ID=zvm-exporter - CLIENT_ID=api-script
- CLIENT_SECRET=BObEOBlXFoTdnKPjtEXTM0HCPxa1MGOj - CLIENT_SECRET=js51tDM8oappYUGRJBhF7bcsedNoHA5j
- LOGGING_LEVEL=INFO #Valid settings are CRITICAL, ERROR, WARNING, INFO, DEBUG
volumes: volumes:
- "./app:/usr/src/app:rw" - "./app:/usr/src/app:rw"
-3207
View File
File diff suppressed because it is too large Load Diff