#!/usr/bin/python3 import json import os import warnings warnings.filterwarnings("ignore") PLUGIN_VERSION=1 HEARTBEAT=True class oracle: def __init__(self,args): self.maindata={} self.maindata['plugin_version'] = PLUGIN_VERSION self.maindata['heartbeat_required']=HEARTBEAT self.username=args.username self.password=args.password self.sid=args.sid self.hostname=args.hostname self.port=args.port self.logsenabled=args.logs_enabled self.logtypename=args.log_type_name self.logfilepath=args.log_file_path def metriccollector(self): metric_queries={ "blocking_locks":"SELECT s.blocking_session, s.sid, s.serial#, s.seconds_in_wait, username FROM gv$session s WHERE blocking_session IS NOT NULL"} try: import oracledb except Exception as e: self.maindata['status'] = 0 self.maindata['msg'] = str(e) + "\n Solution : Use the following command to install oracledb\n pip install oracledb \n(or)\n pip3 install oracledb" return self.maindata try: try: conn = oracledb.connect(user=self.username, password=self.password, dsn=f"{self.hostname}:{self.port}/{self.sid}") c = conn.cursor() except Exception as e: self.maindata['status']=0 self.maindata['msg']='Exception while making connection: '+str(e) return self.maindata units={} i=1 c.execute(metric_queries['blocking_locks']) for row in c: self.maindata['Blocking Session_'+str(i)]=row[0] self.maindata['SID_'+str(i)]=row[1] self.maindata['Serial_'+str(i)]=row[2] self.maindata['Seconds Waited_'+str(i)]=row[3] self.maindata['Username_'+str(i)]=row[4] units['Seconds Waited_'+str(i)]='sec' i+=1 self.maindata['units']=units c.close() conn.close() applog={} if(self.logsenabled in ['True', 'true', '1']): applog["logs_enabled"]=True applog["log_type_name"]=self.logtypename applog["log_file_path"]=self.logfilepath else: applog["logs_enabled"]=False self.maindata['applog'] = applog self.maindata['tags']=f"oracle_hostname:{self.hostname},oracle_sid:{self.sid}" except Exception as e: self.maindata['msg']=str(e) self.maindata['status']=0 return self.maindata if __name__=="__main__": hostname="localhost" port="1521" sid="ORCLCDB" username=None password=None oracle_home='/opt/oracle/product/19c/dbhome_1' import argparse parser=argparse.ArgumentParser() parser.add_argument('--hostname', help='hostname for oracle',default=hostname) parser.add_argument('--port', help='port number for oracle',default=port) parser.add_argument('--sid', help='sid for oracle',default=sid) parser.add_argument('--username', help='username for oracle',default=username) parser.add_argument('--password', help='password for oracle',default=password) parser.add_argument('--oracle_home',help='oracle home path',default=oracle_home) parser.add_argument('--logs_enabled', help='enable log collection for this plugin application',default="False") parser.add_argument('--log_type_name', help='Display name of the log type', nargs='?', default=None) parser.add_argument('--log_file_path', help='list of comma separated log file paths', nargs='?', default=None) args=parser.parse_args() os.environ['ORACLE_HOME']=args.oracle_home obj=oracle(args) result=obj.metriccollector() print(json.dumps(result,indent=True))