https://blogs.oracle.com/fmwinstallproactive/entry/wlst_offline_script_to_create
Introduction
問題の調査において、早い段階でより大きい絵を把握することが重要であると常に信じています。例えば、管理対象サーバが問題のある挙動を示している場合、ログを見るだけでなく、背景も知りたいと考えています。例えば…- サーバーはクラスタメンバーか?
- WebLogic Serverドメインに何個のサーバー/クラスターが存在するか?
- ドメインは複数のマシンにまたがって展開しているか?
- システムリソース(JDBC、JMSなど)が動作しているか?
手動で<DOMAIN_HOME>/config/config.xmlファイルを調べることもできますが、いくつかの構成はconfig.xmlが参照している他のXMLファイルにあるため、これはあまりいい方策とは言えません。きっと別の方法があるはずです。何しろ、WebLogic Serverはドメイン構成をMBeanに保持しているわけですから。そんなわけで、WLSTを検討してみました。
WLST's readDomain Function
WLSTのreadDomain関数をオフラインモードで利用し、ドメインのMBean構成階層/ツリーをロードすることができます。これは以下のように簡単です。例:Unixマシンの場合
cdやlsスタイルの構文を使って、ツリーを移動する準備が整いました。WL_HOME=/oracle/middleware/wlserver_10.3 DOMAIN_HOME=/oracle/middleware/user_projects/domains/MyDomain $WL_HOME/common/bin/wlst.sh wls:/offline/readDomain('/oracle/middleware/user_projects/domains/MyDomain')
wls:/offline/MyDomain/ls() drw- AnyMachine drw- AppDeployment drw- Cluster drw- EmbeddedLDAP drw- FileStore drw- JDBCSystemResource drw- JMSServer drw- JMSSystemResource drw- Library drw- MigratableTarget drw- Security drw- SecurityConfiguration drw- Server drw- ShutdownClass drw- StartupClass drw- WLDFSystemResource -rw- Active false -rw- AdminServerName AdminServer -rw- AdministrationMBeanAuditingEnabled false -rw- AdministrationPort 9002 ......(略) wls:/offline/MyDomain/cd ('Server') wls:/offline/MyDomain/Server/ls() drw- AdminServer drw- MyManagedServer drw- MyManagedServer01 wls:/offline/MyDomain/Server/cd ('MyManagedServer') wls:/offline/MyDomain/Server/MyManagedServer/ls() drw- DataSource drw- NetworkAccessPoint drw- SSL drw- ServerDiagnosticConfig -rw- AcceptBacklog 300 -rw- AdminReconnectIntervalSeconds 10 -rw- AdministrationPort 0 -rw- AdministrationPortEnabled false -rw- AdministrationProtocol null ... -rw- JavaCompilerPostClassPath null -rw- JavaCompilerPreClassPath null -rw- JavaStandardTrustKeyStorePassPhraseEncrypted null -rw- JdbcLoginTimeoutSeconds 0 -rw- KeyStores null -rw- ListenAddress 127.0.0.1 -rw- ListenDelaySecs 0 -rw- ListenPort 7021 -rw- ListenPortEnabled true ... (略) wls:/offline/MyDomain/Server/MyManagedServer/foo = get('ListenPort') wls:/offline/MyDomain/Server/MyManagedServer/print foo 7021
Sample Script and Output
MBeanのツリーを横断して検索する機能がオンラインモードに比べて限られているので、サマリーに有用な属性の中から情報を自動的に取得、表示するスクリプトを書くことは難しいものです。ほとんどの場合、cd()、ls()、get()で立ち往生していますが、IFとFORループ構文を使ってちょっと工夫すると、プログラムでツリーを探索し、きれいなフォーマットで出力することができます。今回のサンプルではHTMLの表を使いました。Sample Output
サンプル出力結果例はこちらです。スクリーンショットは以下の通りです。Download Sample Script
サンプルスクリプトはこちらからどうぞ。Instructions to Run:
1. 起動ラッパースクリプト(UNIXの場合startWLSofflineCollection.sh、Windowsの場合、startWLSofflineCollection.cmd)の環境変数を皆さんの環境に合わせて変更します。例:startWLSofflineCollection.sh
(注意)WLST_OUTPUT_PATH ディレクトリの値はスラッシュ(/)(Windowsの場合は\)で終わる必要があります。スラッシュがないと、スクリプトはエラーになって動作しません。WL_HOME=/oracle/middleware/wlserver_10.3 DOMAIN_HOME=/oracle/middleware/user_projects/domains/MyDomain; export DOMAIN_HOME WLST_OUTPUT_PATH=/temp/wlst/; export WLST_OUTPUT_PATH WLST_OUTPUT_FILE=WLST_MBean_Config_Summary.html; export WLST_OUTPUT_FILE ${WL_HOME}/common/bin/wlst.sh CollectWLSConfigOffline.py
2. ラッパースクリプトを実行します。wlst.cmdを呼び出し、MBeanの値を収集してHTMLファイルに描画するはずです。
(スクリプトがWLSTシェルを呼び出しますが、Pythonスクリプトの実行は5~10秒程度です)
Disclaimer
これはMS Windows、Linuxで動作するWebLogic Server 10.3.6のドメインに対しテストしたサンプルスクリプトです。皆様の環境でエラーが発生しないとか、期待した結果を出すことを保証できません。数多くの同僚がこのスクリプトを使い、そのフィードバックをもっていくつかの問題を解決しました。もしフィードバックすべきことがあれば、このブログエントリのコメントにお願いいたします。WLSTコードの問題を修正するようにつとめます。Credits
以下のエントリが非常に参考になりました。Invoking FMW Application MBeans in Weblogic (Java / Oracle SOA blog)
http://biemond.blogspot.co.uk/2010/02/invoking-fmw-application-mbeans-in.html
WLST By Examples
http://wlstbyexamples.blogspot.co.uk/
Some Pitfalls (which required coding around)
Checking whether Configuration MBean Hierarchy Exists
クラスタやJDBC、JMS、ファイルストアなどのサービスや機能が構成されていない場合、間rねするMBean階層がドメインレベルでのリストに現れません。例えば、ClusterやJDBC、JMS、ファイルストアが構成されていない場合、ls()を使うと以下のように表示されます。プログラムでcdで表示されないディレクトリに移動しても以下のようなエラーが返ります。wls:/offline/MyDomain/ls() drw- AnyMachine drw- AppDeployment drw- EmbeddedLDAP drw- Library drw- MigratableTarget drw- Security drw- SecurityConfiguration drw- Server drw- ShutdownClass drw- StartupClass drw- WLDFSystemResource
これを回避するため、スクリプトにはカスタムのfindMBean関数が含まれています。この関数はreturnmapパラメータを使う配列にls()のコンテンツを格納しますので、配列を使って繰り返し処理をして指定した文字列(MBeanディレクトリ名)が存在するかどうかをチェックすることができます。Error: cd() failed. Do dumpStack() to see details.
def findMBean(v_pattern): # get a listing of everything in the current directory mydirs = ls(returnMap='true'); v_compile_pattern = java.util.regex.Pattern.compile(v_pattern); found = 'Nope not here'; for mydir in mydirs: x = java.lang.String(mydir); v_matched = v_compile_pattern.matcher(x); if v_matched.find(): found = 'true'; return found;
AnyMachine v Machines
WebLogic Server 10.3では、ドメインに複数のマシンが構成されている(つまりマシンに関連するノードマネージャがある)場合、ドメインレベルでのls()は以下のように表示されます。しかし、cd ('AnyMachine')は失敗します。正しいcdの構文は以下の通りです。wls:/offline/MyDomain/ls() drw- AnyMachine
wls:/offline/MyDomain/cd ('Machines')
Identifying Target Information
JDBCシステムリソースやクラスタのような機能にはターゲットがある場合とない場合があります。存在しないMBeanディレクトリへ移動しようとしたり、存在しないMBean属性を取得しようとすると、エラーが発生し、スクリプトは以後の処理を継続できません。これを回避するためには、TRY/ECXEPT構文を使うことができます。以下のサンプルスクリプトでは、JDBCシステムリソースターゲットを取得し処理しています。try: v_any_targets = ''; v_jdbc_target = get('Target'); # Even if the get fails, the variable is assigned a value of none, set the flag variable accordingly if v_jdbc_target == 'None': v_any_targets = 'None'; v_no_of_targets = 1; else: # If the get has succeeded then set flag accordingly and obtain length of array returned by the get # The array length will be used to determine the HTML rowspan value v_any_targets ='Use v_jdbc_target'; v_no_of_targets = len(v_jdbc_target); except: # Setting flag and rowspan variable here as well .. belt and braces v_any_targets = 'None'; v_no_of_targets = 1; # The exception will still display to standard out, which may cause alarm # So adding this message telling the user the exception is expected and can be ignored print "IGNORE this exception";
0 件のコメント:
コメントを投稿