# # Get JVM PMI info for server. # NB: server must be running and PMI must be switched on. # #################################################################### # Patrick Finnegan 11/11/2005. V1. #################################################################### #################################################################### # proc - get JVM details #################################################################### namespace eval getJVMInfo { proc setPreparedStatement { ConnectionI schema } { set procName [ lindex [ info level 0 ] 0 ] putsLog "## proc - $procName" foreach i [ info args $procName ] { upxxvar 0 $i ilocal set propertiesArray($i) $ilocal } putsLog "properties are.................." foreach { a b } [ array get propertiesArray ] { putsLog [ format "%-35s %s" "$a" "$b" ] } global AdminConfig global AdminControl global null global Help set statement "insert into $schema.wasperformjvm values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" java::try { set StatementI [ $ConnectionI prepareStatement $statement ] } catch {SQLException SQLExceptionI } { catchSqlException::catchSqlException $SQLExceptionI } catch {TclException e } { putsLog "TCl Exception to prepare statement $e" return -code error } java::lock $StatementI putsLog " return statement [ $StatementI toString ]" return $StatementI } #################################################################### # proc - get JVM details #################################################################### proc getJVMInfo { nodeName serverName ConnectionI StatementI } { set procName [ lindex [ info level 0 ] 0 ] putsLog "## proc - $procName" foreach i [ info args $procName ] { upvar 0 $i ilocal set propertiesArray($i) $ilocal } putsLog "properties are.................." foreach { a b } [ array get propertiesArray ] { putsLog [ format "%-35s %s" "$a" "$b" ] } global AdminConfig global AdminControl global null global Help putsLog "getJVMInfo" #putsLog "get the performance mbean for the server - should be just one." append queryString "WebSphere:*,node=" append queryString $nodeName append queryString ",process=" append queryString $serverName append queryString ",type=Perf" #putsLog " query string is: $queryString " set perfMbean [ $AdminControl queryNames $queryString ] if { $perfMbean == $null || [ string length $perfMbean] == 0 } { putsLog " $serverName is not running or PMI is not enabled for $serverName. " return } else { set donothing true } #putsLog "get the JVM Bean." unset queryString append queryString "WebSphere:*,node=" append queryString $nodeName append queryString ",process=" append queryString $serverName append queryString ",type=JVM" #putsLog " query string is: $queryString " set jvmMbean [ $AdminControl queryNames $queryString ] if { $jvmMbean == $null || [ string length $jvmMbean] == 0 } { putsLog " $serverName jvm is not running " return } else { set donothing true } set jvmMbeanO [ $AdminControl makeObjectName $jvmMbean ] set boolean [ java::new Boolean recursive ] # NB: brackets around array object. set parramsArray [ java::new {Object[]} {2} [ list $jvmMbeanO $boolean ] ] set signaturesArray [ java::new {String[]} {2} [ list javax.management.ObjectName java.lang.Boolean ] ] set perfMbeanO [ $AdminControl makeObjectName $perfMbean ] #get the stats list from the performance bean set jvmInfo [ $AdminControl invoke_jmx $perfMbeanO "getStatsString" $parramsArray $signaturesArray ] set jvmInfoString [ $jvmInfo toString ] lappend valuesList [ $AdminControl getCell ] #get PMI data sub list. set e4 [ lindex $jvmInfoString 3 ] set dataList [ lindex $e4 1 ] set dataListL [ llength $dataList ] # sort in id order set dataList [ lsort -dictionary -index 0 $dataList ] set topParms [ lindex $dataList 0 ] set width 60 set descriptorIndex [ lsearch -glob $topParms {*Descriptor*} ] set descriptor [ lindex $topParms $descriptorIndex ] set x1 "[ lindex [ lindex [ lindex $descriptor 1 ] 0 ] 0 ]" set x2 "[ lindex [ lindex [ lindex $descriptor 1 ] 0 ] 1 ]" putsLog [ format "%-${width}s %s" $x1 $x2 ] lappend valuesList $x2 set x1 "[ lindex [ lindex [ lindex $descriptor 1 ] 1 ] 0 ]" set x2 "[ lindex [ lindex [ lindex $descriptor 1 ] 1 ] 1 ]" putsLog [ format "%-${width}s %s" $x1 $x2 ] lappend valuesList $x2 set timeIndex [ lsearch -glob $topParms {*Time*} ] set time [ lindex $topParms $timeIndex ] set x1 [ lindex [ lindex $topParms $timeIndex ] 0 ] set x2 [ clock format [ clock seconds ] -format "%Y-%m-%d %H:%M:%S" ] putsLog [ format "%-${width}s %s" $x1 $x2 ] lappend valuesList $x2 set valueIndex [ lsearch -glob $topParms {*Value*} ] set value [ lindex $topParms $valueIndex ] set x1 [ lindex [ lindex $value 1 ] 0 ] set x2 [ lindex [ lindex $value 1 ] 1 ] putsLog [ format "%-${width}s %s" $x1 $x2 ] lappend valuesList $x2 set x1 [ lindex [ lindex $value 2 ] 0 ] set x2 [ lindex [ lindex $value 2 ] 1 ] putsLog [ format "%-${width}s %s" $x1 $x2 ] lappend valuesList $x2 set x1 [ lindex [ lindex $value 3 ] 0 ] set x2 [ lindex [ lindex $value 3 ] 1 ] putsLog [ format "%-${width}s %s" $x1 $x2 ] lappend valuesList $x2 set x1 [ lindex [ lindex $value 4 ] 0 ] set x2 [ lindex [ lindex $value 4 ] 1 ] putsLog [ format "%-${width}s %s" $x1 $x2 ] lappend valuesList $x2 set x 1 while { $x < $dataListL } { set e [ lindex $dataList $x ] set idIndex [ lsearch -glob $e {*Id*} ] set id [ lindex $e $idIndex ] set pmiDataInfoIndex [ lsearch -glob $e {*PmiDataInfo*} ] set pmiDataInfo [ lindex $e $pmiDataInfoIndex ] set nl [ eval concat [ join $e ] ] set commentIndex [ lsearch -glob $nl {*Comment*} ] set comment [ lindex [ lindex $nl $commentIndex ] 1 ] set valueIndex [ lsearch -glob $e {*Value*} ] set value [ lindex [ lindex [ lindex $e $valueIndex ] 1 ] 1 ] putsLog [ format "%-${width}s %s" $comment $value ] lappend valuesList $value incr x } # write data to cloudscape. writeData $ConnectionI $valuesList $StatementI unset valuesList } #################################################################### # proc - write data to database. #################################################################### proc writeData { ConnectionI valuesList StatementI } { set procName [ lindex [ info level 0 ] 0 ] putsLog "## proc - $procName" foreach i [ info args $procName ] { upvar 0 $i ilocal set propertiesArray($i) $ilocal } putsLog "properties are.................." foreach { a b } [ array get propertiesArray ] { putsLog [ format "%-35s %s" "$a" "$b" ] } global AdminConfig global AdminControl global null putsLog "writeData" set opt1 [java::field ResultSet TYPE_SCROLL_INSENSITIVE] set opt2 [java::field ResultSet CONCUR_READ_ONLY ] set x 1 foreach i $valuesList { $StatementI setString $x $i incr x } #putsLog "execute sqlQuery" java::try { $StatementI executeUpdate } catch {SQLException SQLExceptionI } { catchSqlException::catchSqlException $SQLExceptionI } catch {TclException e } { putsLog "TCl Exception to prepare statement $e" return -code error } } }