Oracle® Fusion Middleware Oracle WebLogic Server 10.3.6診断フレームワークの構成と使用 11gリリース1 (10.3.6) B60994-07 |
|
![]() 前 |
![]() 次 |
この付録では、WebLogic Server 10.3.6でWLSTおよびJMXを使用してWLDFコンポーネントと対話する例を示します。
この付録の内容は次のとおりです。
WebLogic Scripting Tool (weblogic.WLST)スクリプトの実行は、『Oracle WebLogic Scripting Tool』のAntからのWLSTの実行に関する項を参照してください。JMXアプリケーションの開発の詳細は、『Oracle WebLogic Server JMXによる管理の容易なアプリケーションの開発』を参照してください。
このデモ・スクリプトでは(例D-1を参照)、weblogic.WLSTツールを使用して動的にDyeInjectionモニターを作成する方法について示します。このスクリプトでは以下のことを行います。
サーバーに接続し、必要な場合には始めにサーバーを起動します。
WLDFシステム・リソースをルックアップまたは作成します。
DyeInjectionモニターを作成します。
仕分け条件を指定します。
モニターを有効にします。
構成を保存してアクティブ化します。
ServerDiagnosticConfigMBeanを介して診断コンテキスト機能を有効にします。
例D-1のデモ・スクリプトは、診断コンテキストへ仕分け値をインジェクションする仕分けモニターのみを構成します。イベントをトリガーするには、指定された仕分け条件に基づいて仕分けフィルタを使用してトリガーする下流工程の診断モニターを実装する必要があります。下流工程のモニター・アーティファクトの例は、例D-2に示します。これはweblogic-diagnostics.xmlのファイルに設定して、アプリケーションのアーカイブのMETA-INFディレクトリに配置する必要があります。JSR-88のデプロイメント・プランを使用してモニターを作成することも可能です。アプリケーションのデプロイの詳細は、『Oracle WebLogic Serverへのアプリケーションのデプロイ』を参照してください。
例D-1 例: WLSTを使用したDyeInjectionモニター(demoDyeMonitorCreate.py)の動的な作成
# Script name: demoDyeMonitorCreate.py ######################################################################### # Demo script showing how to create a DyeInjectionMonitor dynamically # via WLST. This script will: # - Connect to a server, booting it first if necessary # - Look up or create a WLDF System Resource # - Create the DyeInjection Monitor (DIM) # - Set the dye criteria # - Enable the monitor # - Save and activate # - Enable the Diagnostic Context functionality via the # ServerDiagnosticConfig MBean # Note: This will only configure the dye monitor, which will inject dye # values into the Diagnostic Context. To trigger events requires the # existence of "downstream" monitors set to trigger on the specified # dye criteria. ########################################################################## myDomainDirectory="domain" url="t3://localhost:7001" user="weblogic" password="weblogic" myServerName="myserver" myDomain="mydomain" props="weblogic.GenerateDefaultConfig=true,weblogic.RootDirectory="\ +myDomainDirectory try: connect(user,password,url) except: startServer(adminServerName=myServerName,domainName=myDomain, username=user,password=password,systemProperties=props, domainDir=myDomainDirectory,block="true") connect(user,password,url) # Start an edit session edit() startEdit() cd ("/") # Look up or create the WLDF System resource. wldfResourceName = "mywldf" myWldfVar = cmo.lookupSystemResource(wldfResourceName) if myWldfVar==None: print "Unable to find named resource,\ creating WLDF System Resource: " + wldfResourceName myWldfVar=cmo.createWLDFSystemResource(wldfResourceName) # Target the System Resource to the demo server. wldfServer=cmo.lookupServer(serverName) myWldfVar.addTarget(wldfServer) # create and set properties of the DyeInjection Monitor (DIM). mywldfResource=myWldfVar.getWLDFResource() mywldfInst=mywldfResource.getInstrumentation() mywldfInst.setEnabled(1) monitor=mywldfInst.createWLDFInstrumentationMonitor("DyeInjection") monitor.setEnabled(1) # Need to include newlines when setting properties # on the DyeInjection monitor. monitor.setProperties("\nUSER1=larry@celtics.com\ \nUSER2=brady@patriots.com\n") monitor.setDyeFilteringEnabled(1) # Enable the diagnostic context functionality via the # ServerDiagnosticConfig. cd("/Servers/"+serverName+"/ServerDiagnosticConfig/"+serverName) cmo.setDiagnosticContextEnabled(1) # save and disconnect save() activate() disconnect() exit()
例D-2 例:下流工程のモニター・アーティファクト
<?xml version="1.0" encoding="UTF-8"?> <wldf-resource xmlns="http://xmlns.oracle.com/weblogic/weblogic-diagnostics" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <instrumentation> <enabled>true</enabled> <!-- Servlet Session Monitors --> <wldf-instrumentation-monitor> <name>Servlet_Before_Session</name> <enabled>true</enabled> <dye-mask>USER1</dye-mask> <dye-filtering-enabled>true</dye-filtering-enabled> <action>TraceAction</action> <action>StackDumpAction</action> <action>DisplayArgumentsAction</action> <action>ThreadDumpAction</action> </wldf-instrumentation-monitor> <wldf-instrumentation-monitor> <name>Servlet_After_Session</name> <enabled>true</enabled> <dye-mask>USER2</dye-mask> <dye-filtering-enabled>true</dye-filtering-enabled> <action>TraceAction</action> <action>StackDumpAction</action> <action>DisplayArgumentsAction</action> <action>ThreadDumpAction</action> </wldf-instrumentation-monitor> </instrumentation> </wldf-resource>
このデモ・スクリプトでは(例D-3を参照してください)、weblogic.WLSTツールを用いて、WLDFの監視および通知コンポーネントを使用する、監視とJMX通知を構成する方法を示します。このスクリプトでは以下のことを行います。
サーバーに接続し、必要な場合には始めにサーバーを起動します。
WLDFシステム・リソースをルックアップまたは作成します。
ServerRuntimeMBeanにOpenSocketsCurrentCount属性用の監視と監視ルールを作成します。
JMX通知手段を使用するように監視を構成します。
このスクリプトは以下のファイルおよびスクリプトと連携させることで使用できます。
JMXWatchNotificationListener.javaクラス(「サンプル: JMXWatchNotificationListenerクラスの記述」を参照)。
収集するためにハーベスタにOpenSocketsCurrentCount属性を登録するdemoHarvester.pyスクリプト(「例:収集用のMBeanと属性の登録」を参照してください。)
これらのファイルを連携させるには、以下の手順を実行します。
次のように入力して、監視の構成スクリプト(demoWatch.py)を実行します。
java weblogic.WLST demoWatch.py
次のように入力して、JMXWatchNotificationListener.javaソースをコンパイルします。
javac JMXWatchNotificationListener.java
次のように入力して、JMXWatchNotificationListener.classファイルを実行します。
java JMXWatchNotificationListener
注意: 前の手順で作成したクラスが見つかるよう、カレント・ディレクトリがクラス・パス内にあることを確認してください。 |
次のように入力して、demoHarvester.pyスクリプトを実行します。
java weblogic.WLST demoHarvester.py
demoHarvester.pyスクリプトを実行すると、ステップ1で構成された監視のJMX通知がトリガーされます。
例D-3 例: 監視とJMX通知(demoWatch.py)
# Script name: demoWatch.py ########################################################################## # Demo script showing how to configure a Watch and a JMXNotification # using the WLDF Watches and Notification framework. # The script will: # - Connect to a server, booting it first if necessary # - Look up or create a WLDF System Resource # - Create a watch and watch rule on the ServerRuntimeMBean for the # "OpenSocketsCurrentCount" attribute # - Configure the watch to use a JMXNotification medium # # This script can be used in conjunction with # - the JMXWatchNotificationListener.java class # - the demoHarvester.py script, which registers the # "OpenSocketsCurrentCount" attribute with the harvester for collection. # To see these work together: # 1. Run the watch configuration script # java weblogic.WLST demoWatch.py # 2. Compile and run the JMXWatchNotificationListener.java source code # javac JMXWatchNotificationListener.java # java JMXWatchNotificationListener # 3. Run the demoHarvester.py script # java weblogic.WLST demoHarvester.py # When the demoHarvester.py script runs, it triggers the # JMXNotification for the watch configured in step 1. ######################################################################### myDomainDirectory="domain" url="t3://localhost:7001" user="weblogic" myServerName="myserver" myDomain="mydomain" props="weblogic.GenerateDefaultConfig=true\ weblogic.RootDirectory="+myDomainDirectory try: connect(user,user,url) except: startServer(adminServerName=myServerName,domainName=myDomain, username=user,password=user,systemProperties=props, domainDir=myDomainDirectory,block="true") connect(user,user,url) edit() startEdit() # Look up or create the WLDF System resource wldfResourceName = "mywldf" myWldfVar = cmo.lookupSystemResource(wldfResourceName) if myWldfVar==None: print "Unable to find named resource" print "creating WLDF System Resource: " + wldfResourceName myWldfVar=cmo.createWLDFSystemResource(wldfResourceName) # Target the System Resource to the demo server wldfServer=cmo.lookupServer(myServerName) myWldfVar.addTarget(wldfServer) cd("/WLDFSystemResources/mywldf/WLDFResource/mywldf/WatchNotification/mywldf") watch=cmo.createWatch("mywatch") watch.setEnabled(1) jmxnot=cmo.createJMXNotification("myjmx") watch.addNotification(jmxnot) serverRuntime() cd("/") on=cmo.getObjectName().getCanonicalName() watch.setRuleExpression("${"+on+"} > 1") watch.getRuleExpression() watch.setRuleExpression("${"+on+"//OpenSocketsCurrentCount} > 1") watch.setAlarmResetPeriod(10000) edit() save() activate() disconnect() exit()
例D-4に、JMXWatchNotificationListenerの記述方法について示します。
例D-4 例: JMXWatchNotificationListenerクラス(JMXWatchNotificationListener.java)
import javax.management.*; import weblogic.diagnostics.watch.*; import weblogic.diagnostics.watch.JMXWatchNotification; import javax.management.Notification; import javax.management.remote.JMXServiceURL; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXConnector; import javax.naming.Context; import java.util.Hashtable; import weblogic.management.mbeanservers.runtime.RuntimeServiceMBean; public class JMXWatchNotificationListener implements NotificationListener, Runnable { private MBeanServerConnection rmbs = null; private String notifName = "myjmx"; private int notifCount = 0; private String serverName = "myserver"; public JMXWatchNotificationListener(String serverName) { } public void register() throws Exception { rmbs = getRuntimeMBeanServerConnection(); addNotificationHandler(); } public void handleNotification(Notification notif, Object handback) { synchronized (this) { try { if (notif instanceof JMXWatchNotification) { WatchNotification wNotif = ((JMXWatchNotification)notif).getExtendedInfo(); notifCount++; System.out.println("==============================================="); System.out.println("Notification name: " + notifName + " called. Count= " + notifCount + "."); System.out.println("Watch severity: " + wNotif.getWatchSeverityLevel()); System.out.println("Watch time: " + wNotif.getWatchTime()); System.out.println("Watch ServerName: " + wNotif.getWatchServerName()); System.out.println("Watch RuleType: " + wNotif.getWatchRuleType()); System.out.println("Watch Rule: " + wNotif.getWatchRule()); System.out.println("Watch Name: " + wNotif.getWatchName()); System.out.println("Watch DomainName: " + wNotif.getWatchDomainName()); System.out.println("Watch AlarmType: " + wNotif.getWatchAlarmType()); System.out.println("Watch AlarmResetPeriod: " + wNotif.getWatchAlarmResetPeriod()); System.out.println("==============================================="); } } catch (Throwable x) { System.out.println("Exception occurred processing JMX watch notification: " + notifName +"\n" + x); x.printStackTrace(); } } } private void addNotificationHandler() throws Exception { /* * The JMX Watch notification listener registers with a Runtime MBean * that matches the name of the corresponding watch bean. * Each watch has its own Runtime MBean instance. */ ObjectName oname = new ObjectName( "com.bea:ServerRuntime=" + serverName + ",Name=" + JMXWatchNotification.GLOBAL_JMX_NOTIFICATION_PRODUCER_NAME + ",Type=WLDFWatchJMXNotificationRuntime," + "WLDFWatchNotificationRuntime=WatchNotification," + "WLDFRuntime=WLDFRuntime" ); System.out.println("Adding notification handler for: " + oname.getCanonicalName()); rmbs.addNotificationListener(oname, this, null, null); } private void removeNotificationHandler(String name, NotificationListener list) throws Exception { ObjectName oname = new ObjectName( "com.bea:ServerRuntime=" + serverName + ",Name=" + JMXWatchNotification.GLOBAL_JMX_NOTIFICATION_PRODUCER_NAME + ",Type=WLDFWatchJMXNotificationRuntime," + "WLDFWatchNotificationRuntime=WatchNotification," + "WLDFRuntime=WLDFRuntime" ); System.out.println("Removing notification handler for: " + oname.getCanonicalName()); rmbs.removeNotificationListener(oname, list); } public void run() { try { System.out.println("VM shutdown, unregistering notification listener"); removeNotificationHandler(notifName, this); } catch (Throwable t) { System.out.println("Caught exception in shutdown hook"); t.printStackTrace(); } } private String user = "weblogic"; private String password = "weblogic"; public MBeanServerConnection getRuntimeMBeanServerConnection() throws Exception { String JNDI = "/jndi/"; JMXServiceURL serviceURL; serviceURL = new JMXServiceURL("t3", "localhost", 7001, JNDI + RuntimeServiceMBean.MBEANSERVER_JNDI_NAME); System.out.println("URL=" + serviceURL); Hashtable h = new Hashtable(); h.put(Context.SECURITY_PRINCIPAL,user); h.put(Context.SECURITY_CREDENTIALS,password); h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote"); JMXConnector connector = JMXConnectorFactory.connect(serviceURL,h); return connector.getMBeanServerConnection(); } public static void main(String[] args) { try { String serverName = "myserver"; if (args.length > 0) serverName = args[0]; JMXWatchNotificationListener listener = new JMXWatchNotificationListener(serverName); System.out.println("Adding shutdown hook"); Runtime.getRuntime().addShutdownHook(new Thread(listener)); listener.register(); // Sleep waiting for notifications Thread.sleep(Long.MAX_VALUE); } catch (Throwable e) { e.printStackTrace(); } // end of try-catch } // end of main() }
このデモ・スクリプトでは、WLDFハーベスタで収集するために、weblogic.WLSTツールを使用してMBeanおよび属性を登録する方法を示します。このスクリプトでは以下のことを行います。
サーバーに接続し、必要な場合には始めにサーバーを起動します。
WLDFシステム・リソースをルックアップまたは作成します。
サンプリングの頻度を設定します。
収集する型を追加します。
収集する特定のインスタンスの属性を追加します。
構成を保存してアクティブ化します。
数サイクル分の収集対象データを表示します。
例D-5 例: MBeanの登録とデータ収集(demoHarvester.py)
# Script name: demoHarvester.py ################################################################## # Demo script showing how register MBeans and attributes for collection # by the WLDF Harvester Service. This script will: # - Connect to a server, booting it first if necessary # - Look up or create a WLDF System Resource # - Set the sampling frequency # - Add a type for collection # - Add an attribute of a specific instance for collection # - Save and activate ##################################################################### from java.util import Date from java.text import SimpleDateFormat from java.lang import Long import jarray ##################################################################### # Helper functions for adding types/attributes to the harvester # configuration ####################################################################### def findHarvestedType(harvester, typeName): htypes=harvester.getHarvestedTypes() for ht in (htypes): if ht.getName() == typeName: return ht return None def addType(harvester, mbeanInstance): typeName = "weblogic.management.runtime."\ + mbeanInstance.getType() + "MBean" ht=findHarvestedType(harvester, typeName) if ht == None: print "Adding " + typeName + " to harvestables collection for "\ + harvester.getName() ht=harvester.createHarvestedType(typeName) return ht; def addAttributeToHarvestedType(harvestedType, targetAttribute): currentAttributes = PyList() currentAttributes.extend(harvestedType.getHarvestedAttributes()); print "Current attributes: " + str(currentAttributes) try: currentAttributes.index(targetAttribute) print "Attribute is already in set" return except ValueError: print targetAttribute + " not in list, adding" currentAttributes.append(targetAttribute) newSet = jarray.array(currentAttributes, java.lang.String) print "New attributes for type "\ + harvestedType.getName() + ": " + str(newSet) harvestedType.setHarvestedAttributes(newSet) return def addTypeForInstance(harvester, mbeanInstance): typeName = "weblogic.management.runtime."\ + mbeanInstance.getType() + "MBean" return addTypeByName(harvester, typeName, 1) def addInstanceToHarvestedType(harvester, mbeanInstance): harvestedType = addTypeForInstance(harvester, mbeanInstance) currentInstances = PyList() currentInstances.extend(harvestedType.getHarvestedAttributes()); on = mbeanInstance.getObjectName().getCanonicalName() print "Adding " + str(on) + " to set of harvested instances for type "\ + harvestedType.getName() print "Current instances : " + str(currentInstances) for inst in currentInstances: if inst == on: print "Found " + on + " in existing set" return harvestedType # only get here if the target attribute is not in the set currentInstances.append(on) # convert the new list back to a Java String array newSet = jarray.array(currentInstances, java.lang.String) print "New instance set for type " + harvestedType.getName()\ + ": " + str(newSet) harvestedType.setHarvestedInstances(newSet) return harvestedType def addTypeByName(harvester, _typeName, knownType=0): ht=findHarvestedType(harvester, _typeName) if ht == None: print "Adding " + _typeName + " to harvestables collection for "\ + harvester.getName() ht=harvester.createHarvestedType(_typeName) if knownType == 1: print "Setting known type attribute to true for " + _typeName ht.setKnownType(knownType) return ht; def addAttributeForInstance(harvester, mbeanInstance, attributeName): typeName = mbeanInstance.getType() + "MBean" ht = addInstanceToHarvestedType(harvester, mbeanInstance) return addAttributeToHarvestedType(ht,attributeName) ##################################################################### # Display the currently registered types for the specified harvester ####################################################################### def displayHarvestedTypes(harvester): harvestedTypes = harvester.getHarvestedTypes() print "" print "Harvested types:" print "" for ht in (harvestedTypes): print "Type: " + ht.getName() attributes = ht.getHarvestedAttributes() if attributes != None: print " Attributes: " + str(attributes) instances = ht.getHarvestedInstances() print " Instances: " + str(instances) print "" return ######################################################################## # Main script flow -- create a WLDF System resource and add harvestables ######################################################################## myDomainDirectory="domain" url="t3://localhost:7001" user="weblogic" myServerName="myserver" myDomain="mydomain" props="weblogic.GenerateDefaultConfig=true,weblogic.RootDirectory="\ +myDomainDirectory try: connect(user,user,url) except: startServer(adminServerName=myServerName,domainName=myDomain, username=user,password=user,systemProperties=props, domainDir=myDomainDirectory,block="true") connect(user,user,url) # start an edit session edit() startEdit() cd("/") # Look up or create the WLDF System resource wldfResourceName = "mywldf" systemResource = cmo.lookupSystemResource(wldfResourceName) if systemResource==None: print "Unable to find named resource,\ creating WLDF System Resource: " + wldfResourceName systemResource=cmo.createWLDFSystemResource(wldfResourceName # Obtain the harvester bean instance for configuration print "Getting WLDF Resource Bean from " + str(wldfResourceName) wldfResource = systemResource.getWLDFResource() print "Getting Harvester Configuration Bean from " + wldfResourceName harvester = wldfResource.getHarvester() print "Harvester: " + harvester.getName() # Target the WLDF System Resource to the demo server wldfServer=cmo.lookupServer(myServerName) systemResource.addTarget(wldfServer) # The harvester Jython wrapper maintains refs to # the SystemResource objects harvester.setSamplePeriod(5000) harvester.setEnabled(1) # add an instance-based RT MBean attribute for collection serverRuntime() cd("/") addAttributeForInstance(harvester, cmo, "OpenSocketsCurrentCount") # have to return to the edit tree to activate edit() # add a RT MBean type, all instances and attributes, # with KnownType = "true" addTypeByName(harvester, "weblogic.management.runtime.WLDFInstrumentationRuntimeMBean", 1) addTypeByName(harvester, "weblogic.management.runtime.WLDFWatchNotificationRuntimeMBean", 1) addTypeByName(harvester, "weblogic.management.runtime.WLDFHarvesterRuntimeMBean", 1) try: save() activate(block="true") except: print "Error while trying to save and/or activate." dumpStack() # display the data displayHarvestedTypes(harvester) disconnect() exit()
デフォルトでは、Oracle JRockitもWLDFもデータを収集せず、他のインスタンスに特に構成されていないかぎり、ほとんどのイベントがWebLogic Serverインスタンスに記録されます。WLDF診断ボリュームがOff
に設定されている場合でも、JRockitおよびWLDFは記録設定に関する情報を持つグローバル・イベントを生成することに注意してください。たとえば、アクティブな記録をリストするJVMメタデータ・イベントおよびドメイン、サーバーおよびマシンのボリューム・レベルをリストするWLDF GlobalInformationEventsです。
例D-6では、WLDF診断ボリュームをMedium
に変更する方法を示します。
診断イメージのキャプチャは、次のいずれかの方法でWebLogic Serverインスタンスに対して作成できます。
WebLogic Server管理コンソール
WLSTスクリプト
監視および通知コンポーネントを使用したイメージの通知
注意: WebLogic Serverが本番モードで実行中の場合、スクリプトに含まれるコマンドを実行するときにサーバーのSSLポートを使用する必要があります。 |
例D-7は診断イメージをキャプチャするサンプルWLSTスクリプトを示します。この例では、次の操作を行います。
接続後、診断イメージをキャプチャして、イメージに関するタスクが完了するまで待機します。
getAvailableCapturedImages()
コマンドを使用してサーバーのイメージ・ディレクトリ内の使用可能な診断イメージのリストを取得します。
診断イメージ・キャプチャの使用可能なイメージのリストをループし、saveDiagnosticImageCaptureFile()
コマンドを使用して各イメージ・ファイルをローカルに保存します。
例D-7 診断イメージ・キャプチャの作成
# # WLST script to capture a WLDF Diagnostic Image and # retrieve the image files to a local dir. # # Usage: # # java weblogic.WLST captureImage.py [username] [passwd] [url] [output-dir] # # where # # username Username to use to connect # passwd Password for connecting to server # url URL to connect to the server # output-dir Path to place saved entries # from java.io import File # Retrieve a positional argument if it exists; if not, # the provided default is returned. # # Params: # pos The integer location in sys.argv of the parameter # default The default value to return if the parameter does not exist # # returns the value at sys.argv[pos], or the provided default if necesssary def getPositionalArgument(pos, default): value=None try: value=sys.argv[pos] except: value=default return value # Credential arguments uname=getPositionalArgument(1, "weblogic") passwd=getPositionalArgument(2, "welcome1") url=getPositionalArgument(3, "t3://localhost:7001") outputDir=getPositionalArgument(4, ".") connect(uname, passwd, url) serverRuntime() currentDrive=currentTree() # Capture a new diagnostic image try: cd("serverRuntime:/WLDFRuntime/WLDFRuntime/WLDFImageRuntime/Image") task=cmo.captureImage() Thread.sleep(1000) while task.isRunning(): Thread.sleep(5000) cmo.resetImageLockout(); finally: currentDrive() # List the available diagnostic image files in the server's image capture dir images=getAvailableCapturedImages() if len(images) > 0: # For each diagnostic image found, retrieve image file, renaming it as # the user sees fit for image in images: saveName=outputDir+File.separator+serverName+'-'+image saveDiagnosticImageCaptureFile(image,saveName)
次の例では、サーバーのイメージ宛先ディレクトリにある各診断イメージ・キャプチャからのJRockitフライト記録(JFR)ファイルの取得およびローカル・ディレクトリへのコピーを示します。このスクリプト例では次の事項を実行します。
必要な資格証明を渡してWebLogic Serverに接続します。
診断イメージ・キャプチャを作成します。
サーバーに構成されたイメージ・ディレクトリ内の使用可能な診断イメージ・ファイルのリストを取得します。
各診断イメージ・ファイルに対して、JFRファイルの取得を試み、ファイルの上書きを防止するために各ファイル名が必要に応じて変更されていることを確認してローカル・ディレクトリに保存します。
注意: WebLogic Serverが本番モードで実行中の場合、スクリプトに含まれるコマンドを実行するときにサーバーのSSLポートを使用する必要があります。 |
例D-8 診断イメージ・キャプチャ・ファイルの取得
# # WLST script to capture a WLDF Diagnostic Image and # save the FlightRecording.jfr entry locally # # Usage: # # java weblogic.WLST captureImageEntry.py [username] [passwd] [url] [output-dir] [image-suffix] # # where # # username Username to use to connect # passwd Password for connecting to server # url URL to connect to the server # output-dir Path to place saved entries # image-suffix Suffix to use to rename JFR image entries locally # import os.path from java.io import File # Retrieve a positional argument if it exists; if not, # the provided default is returned. # # Params: # pos The integer location in sys.argv of the parameter # default The default value to return if the parameter does not exist # # returns the value at sys.argv[pos], or the provided default if necesssary def getPositionalArgument(pos, default): value=None try: value=sys.argv[pos] except: value=default return value # Credential arguments uname=getPositionalArgument(1, "weblogic") passwd=getPositionalArgument(2, "welcome1") url=getPositionalArgument(3, "t3://localhost:7001") outputDir=getPositionalArgument(4, ".") imageSuffix=getPositionalArgument(5, "_WLS") connect(uname, passwd, url) serverRuntime() currentDrive=currentTree() # Capture a new diagnostic image capture file try: cd("serverRuntime:/WLDFRuntime/WLDFRuntime/WLDFImageRuntime/Image") task=cmo.captureImage() Thread.sleep(1000) while task.isRunning(): Thread.sleep(5000) cmo.resetImageLockout(); finally: currentDrive() # List the available diagnostic image captures in the server's image capture dir images=getAvailableCapturedImages() if len(images) > 0: # For each image capture found, retrieve the JFR entry and save it to a local # file, renaming it to avoid collisions in the event there are multiple # diagnostic image capture files with JFR entries. i=0 for image in images: saveName=outputDir+File.separator+"FlightRecording_"+imageSuffix+"-"+str(i)+".jfr" while os.path.exists(saveName): i+=1 saveName=outputDir+File.separator+"FlightRecording_"+imageSuffix+"-"+str(i)+".jfr" saveDiagnosticImageCaptureEntryFile(image,'FlightRecording.jfr',saveName) i+=1