Advertisement
jonheese

Rubrik graphite collector

Nov 30th, 2018
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.52 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import socket, time, json, sys
  4. from datetime import datetime, timedelta
  5. from config import rubrik_locations, carbon_server, carbon_port, metric_prefix
  6. from rubriker import Rubriker
  7.  
  8. # How often to gather and send data to Graphite, in seconds
  9. SEND_INTERVAL_SECS = 300
  10. SEND_INTERVAL = timedelta(seconds=SEND_INTERVAL_SECS)
  11. ARMED=True
  12.  
  13.  
  14. def send_to_graphite(location, metric, value, timestamp=time.time()):
  15.     message = "%s.%s.%s %s %d\n" % (metric_prefix, location, metric.replace(" ", ""), value, int(timestamp))
  16.     print "%s" % message,
  17.     if ARMED:
  18.         sock = socket.socket()
  19.         sock.connect((carbon_server, carbon_port))
  20.         sock.sendall(message)
  21.         sock.close()
  22.  
  23.  
  24. def send_if_recent(location, metric_name, value, last_entry, rubrik_version):
  25.     if last_entry is not None:
  26.         if rubrik_version >= 4.1:
  27.             timestamp = datetime.strptime(last_entry, "%Y-%m-%dT%H:%M:%S.%fZ")
  28.         else:
  29.             timestamp = datetime.strptime(last_entry, "%Y-%m-%dT%H:%M:%SZ")
  30.         if datetime.utcnow() - timestamp <= SEND_INTERVAL:
  31.             send_to_graphite(location, metric_name, value, (timestamp - datetime.utcfromtimestamp(0)).total_seconds())
  32.             return True
  33.     return False
  34.  
  35.  
  36. def send_latest_stat(rubriker, metric_name, endpoint, stat_name):
  37.     json_results = rubriker.do_api_call(endpoint)
  38.     for result in json_results:
  39.         send_if_recent(rubriker.location, metric_name, result[stat_name], result['time'], rubriker.get_rubrik_version())
  40.  
  41.  
  42. def send_singleton_stat(rubriker, metric_name, endpoint):
  43.     try:
  44.         json_results = rubriker.do_api_call(endpoint)
  45.         send_if_recent(rubriker.location, metric_name, json_results['value'], json_results['lastUpdateTime'], rubriker.get_rubrik_version())
  46.     except Exception as e:
  47.         print e
  48.  
  49.  
  50. def send_storage_stats(rubriker):
  51.     try:
  52.         json_results = rubriker.do_api_call("api/internal/stats/system_storage")
  53.         last_entry = json_results['lastUpdateTime']
  54.         if send_if_recent(rubriker.location, "storage.total_storage", json_results['total'], last_entry, rubriker.get_rubrik_version()):
  55.             send_if_recent(rubriker.location, "storage.used_storage", json_results['used'], last_entry, rubriker.get_rubrik_version())
  56.             send_if_recent(rubriker.location, "storage.available_storage", json_results['available'], last_entry, rubriker.get_rubrik_version())
  57.     except Exception as e:
  58.         print e
  59.  
  60.  
  61. def send_storage_and_compression_stats(rubriker):
  62.     try:
  63.         ingested_bytes = None
  64.         snapshot_bytes = None
  65.         json_results = rubriker.do_api_call("api/internal/stats/snapshot_storage/ingested")
  66.         if rubriker.get_rubrik_version() >= 4.1:
  67.             timestamp = datetime.strptime(json_results['lastUpdateTime'], "%Y-%m-%dT%H:%M:%S.%fZ")
  68.         else:
  69.             timestamp = datetime.strptime(json_results['lastUpdateTime'], "%Y-%m-%dT%H:%M:%SZ")
  70.         if datetime.utcnow() - timestamp <= SEND_INTERVAL:
  71.             ingested_bytes = json_results['value']
  72.             send_to_graphite(rubriker.location, "performance.backend_ingested_bytes", ingested_bytes, (timestamp - datetime.utcfromtimestamp(0)).total_seconds())
  73.         json_results = rubriker.do_api_call("api/internal/stats/snapshot_storage/physical")
  74.         if rubriker.get_rubrik_version() >= 4.1:
  75.             timestamp = datetime.strptime(json_results['lastUpdateTime'], "%Y-%m-%dT%H:%M:%S.%fZ")
  76.         else:
  77.             timestamp = datetime.strptime(json_results['lastUpdateTime'], "%Y-%m-%dT%H:%M:%SZ")
  78.         if datetime.utcnow() - timestamp <= SEND_INTERVAL:
  79.             snapshot_bytes = json_results['value']
  80.             send_to_graphite(rubriker.location, "storage.physical_snapshot_storage", snapshot_bytes, (timestamp - datetime.utcfromtimestamp(0)).total_seconds())
  81.         if ingested_bytes is not None and snapshot_bytes is not None:
  82.             try:
  83.                 reduction = (1 - (float(snapshot_bytes) / float(ingested_bytes))) * 100
  84.             except ZeroDivisionError:
  85.                 reduction = 0.0
  86.             try:
  87.                 ratio = float(ingested_bytes) / float(snapshot_bytes)
  88.             except ZeroDivisionError:
  89.                 ratio = 1.0
  90.             send_to_graphite(rubriker.location, "performance.compression.reduction", reduction, (timestamp - datetime.utcfromtimestamp(0)).total_seconds())
  91.             send_to_graphite(rubriker.location, "performance.compression.ratio", ratio, (timestamp - datetime.utcfromtimestamp(0)).total_seconds())
  92.     except Exception as e:
  93.         print e
  94.  
  95.  
  96. def send_cross_compression_stats(rubriker):
  97.     try:
  98.         json_results = rubriker.do_api_call("api/internal/stats/cross_compression")
  99.         last_entry = json_results['lastUpdateTime']
  100.         data = json.loads(json_results['value'])
  101.         if send_if_recent(rubriker.location, "performance.compression.logical_bytes", data['logicalBytes'], last_entry, rubriker.get_rubrik_version()):
  102.             send_if_recent(rubriker.location, "performance.compression.logical_bytes", data['logicalBytes'], last_entry, rubriker.get_rubrik_version())
  103.             send_if_recent(rubriker.location, "performance.compression.zero_bytes", data['zeroBytes'], last_entry, rubriker.get_rubrik_version())
  104.             send_if_recent(rubriker.location, "performance.compression.precomp_bytes", data['preCompBytes'], last_entry, rubriker.get_rubrik_version())
  105.             send_if_recent(rubriker.location, "performance.compression.postcomp_bytes", data['postCompBytes'], last_entry, rubriker.get_rubrik_version())
  106.             send_if_recent(rubriker.location, "performance.compression.physical_bytes", data['physicalBytes'], last_entry, rubriker.get_rubrik_version())
  107.     except Exception as e:
  108.         print e
  109.  
  110.  
  111. def send_sla_stats(rubriker):
  112.     try:
  113.         sla_domains = rubriker.do_api_call("api/v1/sla_domain?primary_cluster_id=local")['data']
  114.         for sla_domain in sla_domains:
  115.             (sla_name, sla_id) = (sla_domain['name'], sla_domain['id'])
  116.             send_singleton_stat(rubriker, "storage.sla_domain_storage.%s" % sla_name, "api/internal/stats/sla_domain_storage/%s" % sla_id)
  117.             send_to_graphite(rubriker.location, "storage.windows_hosts_protected.%s" % sla_name, sla_domain['numWindowsHosts'])
  118.             send_to_graphite(rubriker.location, "storage.linux_hosts_protected.%s" % sla_name, sla_domain['numLinuxHosts'])
  119.             send_to_graphite(rubriker.location, "storage.filesets_protected.%s" % sla_name, sla_domain['numFilesets'])
  120.             send_to_graphite(rubriker.location, "storage.shares_protected.%s" % sla_name, sla_domain['numShares'])
  121.             send_to_graphite(rubriker.location, "storage.dbs_protected.%s" % sla_name, sla_domain['numDbs'])
  122.             send_to_graphite(rubriker.location, "storage.vms_protected.%s" % sla_name, sla_domain['numVms'])
  123.     except Exception as e:
  124.         print e
  125.  
  126.  
  127. def send_replication_storage_stats(rubriker):
  128.     try:
  129.         replication_stats = rubriker.do_api_call("api/internal/stats/total_replication_storage")
  130.         for remote in replication_stats['remoteVmStorageOnPremise']:
  131.             send_to_graphite(rubriker.location, "replication.remote_vm_storage_locally.%s" % remote['remoteClusterUuid'], remote['totalStorage'])
  132.         for local in replication_stats['localVmStorageAcrossAllTargets']:
  133.             send_to_graphite(rubriker.location, "replication.local_vm_storage_remotely.%s"% local['remoteClusterUuid'], local['totalStorage'])
  134.     except Exception as e:
  135.         print e
  136.  
  137.  
  138. def send_archival_storage_stats(rubriker):
  139.     try:
  140.         archival_location_details = rubriker.do_api_call("api/internal/archive/location")['data']
  141.         archival_location_storage = rubriker.do_api_call("api/internal/stats/data_location/usage")['data']
  142.         for archival_location in archival_location_storage:
  143.             archival_location_name = None
  144.             archival_location_id = archival_location['locationId']
  145.             for archival_location_detail in archival_location_details:
  146.                 if archival_location_detail['id'] == archival_location_id:
  147.                     archival_location_name = "%s.%s" % (archival_location_detail['locationType'], archival_location_detail['bucket'])
  148.                     break
  149.             if archival_location_name is not None:
  150.                 send_to_graphite(rubriker.location, "archive.bytes_downloaded.%s" % archival_location_name, archival_location['dataDownloaded'])
  151.                 send_to_graphite(rubriker.location, "archive.bytes_uploaded.%s" % archival_location_name, archival_location['dataArchived'])
  152.                 send_to_graphite(rubriker.location, "archive.vms_archived.%s" % archival_location_name, archival_location['numVMsArchived'])
  153.                 send_to_graphite(rubriker.location, "archive.linux_filesets_archived.%s" % archival_location_name, archival_location['numLinuxFilesetsArchived'])
  154.                 send_to_graphite(rubriker.location, "archive.windows_filesets_archived.%s" % archival_location_name, archival_location['numWindowsFilesetsArchived'])
  155.                 send_to_graphite(rubriker.location, "archive.share_filesets_archived.%s" % archival_location_name, archival_location['numShareFilesetsArchived'])
  156.                 send_to_graphite(rubriker.location, "archive.mssql_dbs_archived.%s" % archival_location_name, archival_location['numMssqlDbsArchived'])
  157.                 send_to_graphite(rubriker.location, "archive.managed_volumes_archived.%s" % archival_location_name, archival_location['numManagedVolumesArchived'])
  158.                 send_latest_stat(rubriker, "archive.bandwidth.%s" % archival_location_name, "api/internal/stats/archival/bandwidth/time_series?data_location_id=%s" % archival_location_id, "stat")
  159.     except Exception as e:
  160.         print e
  161.  
  162.  
  163. def send_all_data(rubriker):
  164.     try:
  165.         send_to_graphite(rubriker.location, "system.briks", rubriker.do_api_call("api/internal/cluster/me/brik_count")['count'])
  166.         send_to_graphite(rubriker.location, "storage.disk_capacity", rubriker.do_api_call("api/internal/cluster/me/disk_capacity")['bytes'])
  167.         send_to_graphite(rubriker.location, "storage.flash_capacity", rubriker.do_api_call("api/internal/cluster/me/flash_capacity")['bytes'])
  168.         send_to_graphite(rubriker.location, "system.cpu_core_count", rubriker.do_api_call("api/internal/node/*/cpu_cores_count")['count'])
  169.         send_to_graphite(rubriker.location, "performance.streams", rubriker.do_api_call("api/internal/stats/streams/count")['count'])
  170.         send_to_graphite(rubriker.location, "storage.average_storage_growth_per_day", rubriker.do_api_call("api/internal/stats/average_storage_growth_per_day")['bytes'])
  171.         send_to_graphite(rubriker.location, "performance.runway_remaining", rubriker.do_api_call("api/internal/stats/runway_remaining")['days'])
  172.         send_to_graphite(rubriker.location, "storage.vms_in_vcenter", rubriker.do_api_call("api/internal/vmware/vm/count")['count'])
  173.         send_to_graphite(rubriker.location, "performance.physical_ingest_per_day", rubriker.do_api_call("api/internal/stats/physical_ingest_per_day/time_series")[0]['stat'])
  174.         send_to_graphite(rubriker.location, "memory.total_memory", rubriker.do_api_call("api/internal/cluster/me/memory_capacity")['bytes'])
  175.     except Exception as e:
  176.         print e
  177.  
  178.     try:
  179.         send_latest_stat(rubriker, "performance.logical_ingest", "api/internal/stats/logical_ingest/time_series", "stat")
  180.         send_latest_stat(rubriker, "performance.physical_ingest", "api/internal/stats/physical_ingest/time_series", "stat")
  181.         send_latest_stat(rubriker, "performance.snapshot_ingest", "api/internal/stats/snapshot_ingest/time_series", "stat")
  182.         send_latest_stat(rubriker, "replication.bandwidth.outgoing", "api/internal/stats/replication/outgoing/time_series", "stat")
  183.         send_latest_stat(rubriker, "replication.bandwidth.incoming", "api/internal/stats/replication/incoming/time_series", "stat")
  184.     except Exception as e:
  185.         print e
  186.  
  187.     try:
  188.         send_singleton_stat(rubriker, "storage.protected_primary_storage", "api/internal/stats/protected_primary_storage")
  189.         send_singleton_stat(rubriker, "storage.logical_snapshot_storage", "api/internal/stats/snapshot_storage/logical")
  190.         send_singleton_stat(rubriker, "storage.live_snapshot_storage", "api/internal/stats/snapshot_storage/live")
  191.         send_singleton_stat(rubriker, "storage.cloud_storage", "api/internal/stats/cloud_storage")
  192.         send_singleton_stat(rubriker, "storage.sla_domain_storage", "api/internal/stats/sla_domain_storage")
  193.         send_singleton_stat(rubriker, "storage.unprotected_vm_storage", "api/internal/stats/unprotected_snappable_storage")
  194.     except Exception as e:
  195.         print e
  196.  
  197.     # These API calls fail, probably new or deprecated feature
  198.     #send_singleton_stat("replication.managed_physical_storage", "stats/replicated/managedPhysicalStorage")
  199.     #send_singleton_stat("replication.used_physical_storage", "stats/replicated/physicalStorage")
  200.  
  201.     send_storage_stats(rubriker)
  202.     send_cross_compression_stats(rubriker)
  203.     send_storage_and_compression_stats(rubriker)
  204.     send_sla_stats(rubriker)
  205.     send_replication_storage_stats(rubriker)
  206.     send_archival_storage_stats(rubriker)
  207.  
  208.  
  209. print datetime.now()
  210. for location in rubrik_locations.keys():
  211.     config_dict = rubrik_locations[location]
  212.     rubrik_user = config_dict["rubrik_user"]
  213.     rubrik_pass = config_dict["rubrik_pass"]
  214.     rubrik_url = config_dict["rubrik_url"]
  215.     rubriker = Rubriker(location, rubrik_user, rubrik_pass, rubrik_url)
  216.     send_all_data(rubriker)
  217.     rubriker.logout_of_api()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement