Sunday, February 11, 2018

Websphere Connection Pool monitoring and Alerting System ( Connection Pool runtime information)

Many of the infrastructure monitoring tools brings their own JMX monitoring now a days to monitor all the JVM components including connection pool (DataSource) JMS etc.
But, If in case you wanted to set up your own alerting system (Email Notification etc.) for Connection pool.  You can use this  wsadmin script.

Design

-It will find all the running servers registered with DMGR (cell) and take a list of running connection pools targeted on those servers.
-It will automatically set 80 percent of the connection max_limit as a threshold.
-It will print a alert message, in case of possible connection pool overflow. When the current connection limit reaches the threshold.
  
If you do not want any alerting system and want to see the connection pool usage manually in case of requirement (or) on demand basis. You can just use this jython script with wsadmin. In case if you wanted to setup alerting system refer the additional notes for some ideas of designing the alerting system.

Additional notes

1    You can run this script in a frequent interval like 2 minutes (or) 10 minutes using the external shell script scheduled in crontab and get the alert generated. ( let me know in comment section if you need help) 
2    If you have Autosys, you can rather schedule it with JIL and run this in a periodic interval.
       After scheduling it to run on certain interval you can use any log parse monitoring tools like Tivoli and get alerts/tickets upon your infrastructure set up.

Version compatibility
was6.1 and above ( for was 6 there is little bit modification required, write a comment if you need)
wsadmin script


wsadmin script

import re
Running_JVMS
=AdminControl.queryNames("*:type=Server,*").split(java.lang.System.getProperty("line.separator"))
ignorelist
=['nodeagent','dmgr']
TMPFILE
='/tmp/PoolContents.tmp'
global current_conn
for JVM in Running_JVMS:
        ServerName
=AdminControl.invoke(JVM ,"getName()")
       
if ServerName not in ignorelist:
                DS
=AdminControl.queryNames('*:process='+ServerName+',type=DataSource,*').split(java.lang.System.getProperty("line.separator"))
               
for entry in DS:
                       
if AdminControl.invoke(entry, "getStatus()") != '99':
                               
print "============================================"
                               
print "ServerName    :", ServerName
                                DSN
=AdminControl.invoke(entry, "getName()")
                               
print "DataSourceName:", DSN
                                JNDN
=AdminControl.invoke(entry, "getJndiName()")
                               
print "JNDIName      :", JNDN
                                MaxConn
=AdminControl.invoke(entry, "getMaxConnections()")
                               
print "MaxConnections:", MaxConn
                               
print "StatusCode    :", AdminControl.invoke(entry, "getStatus()")
                               
##########################
                                fout
=open(TMPFILE, 'w')
                                data
=AdminControl.invoke(entry, "showPoolContents")
                                fout.write(data)
                                fout.close()
                                percent
=0.8
                                threshold
=int(MaxConn)*float(percent)
                               
print "Threshold     :", threshold
                                
try:
                                        fin
=open(TMPFILE)
                                        filedata
=fin.readlines()
                                       
for line in filedata:
                                               
#match 1= re.search(r':sd', line)
                                               
#matchstr=re.search(r'Total number of connection in shared pool', line)
                                                matchstr
=re.search('(.....s......s..s..........s..s......s....):(sd)', line)
                                               
if matchstr:
                                                       
#current_conn=match.group().split(":")[1].strip(" ")
                                                        current_conn
=matchstr.group(2)
                                                       
if int(current_conn) >= int(threshold):
                                                                ALERT
='YES'
                                                                ALERTSTRING
='Connection Pool %r reached 80 percent of its max_limit on Server %r'%(DSN,ServerName)
                                                               
print ALERTSTRING
                                                       
else:
                                                                ALERT
='NO'
                                                       
break

                                               
else:
                                                        current_conn
=0


                                        fin.close()
                                       
print "Currently used:", current_conn
                                       
print "============================================"
                               
except IOError:
                                       
print  'Something went Wrong.'


How to run

Save the above code with “.py” extension and run it with wsadmin.
In example
wsadmin.sh -lang jython -username <username> -password <password> -lang jython -f <saved py file name>


No comments:

Post a Comment