2014年11月30日 星期日

Using Oracle jrockit jConsole monitor WebLogic with remoto server

最近在研究使用jmx來monitor WebLogic
首先我使用的WebLogic版本是10.3.3,安裝時設定成 Production mode
若有安裝過的話,通常 Oracle建議 Production mode使用 jrockit ,developer mode則用 jdk
因此我們現在應該是透過 jrockit 來 monitor,首先找到 jConsole的執行檔
它位於你安裝 jrockit 所在的目錄下/bin裡面

找到後,你可以直接點二下執行,但這是採用 Local 的方式去monitor,會抓取你目前的 java instance,這邊我們不討論。

那麼該如何使用 remote 的方式去 monitor 呢?
首先至你想要 monitor 的 WLS Server 開啟 WLS Admin Console-->伺服器-->your server name-->通訊協定-->啟用 IIOP(勾選)-->點選進階後設定 IIOP預設帳密,如圖


接著在你的 cmd 下 使用指令呼叫 jConsole吧!
我這邊示範是基本的呼叫方式,呼叫完後一樣會出現 jConsole的視窗
請在上面打上
service:jmx:iiop://hostname:port/jndi/weblogic.management.mbeanservers.runtime
請自行替換你的 hostname and port,下面就是你剛剛設定的IIOP帳密
如圖:

如果看到上圖畫面,就代表你成功嘍!,接著你就可以點選你想要看的資訊了。



2014年11月25日 星期二

處理Splunk 與 WebLogic Log 時間不一致問題

最近使用Splunk導入WebLogic時發現時間不夠一致,甚至假設我自己撰寫程式來印出Log時,在Log檔裡顯示的時間是正確的,但在Splunk中卻被視為同一時間,由於我的Splunk Search非常依賴時間來做查詢條件,因此為了解決這種問題,我決定為WLS Log的時間新增一個欄位(Field)叫作 log_time。
另外WLS Log在我的Log File中原本時間顯示為中文,但是進入Splunk時,卻變成了亂碼,這個問題我試過不少方法也暫時無法解決(我是透過Forwarder,Splunk & WLS不同台機器)。
於是我試圖先讓WLS Log時間變成單純的數字日期,而不在出現中文。




步驟依序如上面圖示,至WebLogic AdminConsole中點選 伺服器-->欲修改的Log伺服器所在位置-->點選日誌記錄-->進階,在「日期格式樣式」把原本有中文 時分秒的設定 改成
 yyyy/M/d HH'-'mm'-'ss'-' z
重新啟動 Server,再至Log檔觀察,就可以發現時間格式改變了。
實際至Splunk 觀察也是一樣,另外我已經定義好 log_time 欄位的 pattern了如圖
如上圖所示,藍色是Splunk定義的時間,而紅色部分是Log的真實時間,以及我定義log_time欄位的時間,而為了使用我定義的時間來做查詢,在程式呼叫curl指令時需要將時間作轉換,注意"2014-11/26" 與 "10-37-33"之間是有空白的。
程式如下

Calendar calendar1 = Calendar.getInstance();
System.out.println("calendar1 : " + calendar1.getTime());
calendar1.add(Calendar.MINUTE, -5);
System.out.println("calendar2 : " + calendar1.getTime());
Date date = calendar1.getTime();
SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd HH-mm-ss");
String date1 = DATE_FORMAT.format(date);
System.out.println("Date1 : " + date1);
String[] tokens = date1.split(" ");
    for (String token:tokens) {
  System.out.println(token);
}
String finalDate = tokens[0]+"\\%20"+tokens[1];
System.out.println("finalDate: " + finalDate);
String log_time = "2014/11/25\\%2014-21-02";

注意我在程式碼第三行,已將實際時間減5分鐘,因為我的目的是查詢現在時間與前5分鐘之間的Log(假設Splunk時間若正確等同於Splunk執行earliest="-5m"),而最後得到的樣式就會像程式最後一行一樣  "2014/11/25\\%2014-21-02";
細心的你會發現我們中間的空白是使用\\%20取代,這是在Windows執行Java的作法

之後就是Splunk厲害的地方,他可以使用String表示時間後,依然可以比較時間,如下圖

因此我們可以放心的使用log_time當作時間基準查詢了,另外介紹Windows2003時間同步
我將Splunk Server與 WLS Server同步至我的DC Server
w32tm /config /manualpeerlist:dc.test.com.tw /syncfromflags:MANUAL
w32tm /config /update
w32tm /resync

讓時間更一致,WLS Log實在不夠精準,看來目前使用自定義的欄位查詢最精準。

**********************更好的方式  最新更新*******************************
修改WLS Date Format Pattern,修改成  yy/M/d HH':'mm':'ss  like as  14/12/12 16:52:09
重新啟動 WLS Server,則Splunk就可以認出正確的時間格式,並將其傳入 _time default index中,已 _time 的時間正確的話 ,就可以 如常的 使用 Splunk Time Modifier 
ex: earliest="-5m" or latest








Java Call Splunk Restful Service with curl On Linux

之前文章已經實現了使用Java搭配Curl and openssl 來呼叫 Splunk Restful API
但那是透過 CMD 也就是 Windows平台,現在假設我們程式需要佈署在Linux平台上
則語法也會不同。首先在Linux平台上有個好處,那就是大多數已經內建了curl
但是使用Java呼叫curl時,我必須先知道 curl 需在哪執行,你可以在Linux 下執行which curl
一樣使用ProcessBuilder
程式範例如下:
import java.io.*;
import java.util.*;

public class ProcessBuilderTest {
  public static void main(String args[]) 
     throws InterruptedException,IOException 
  {
  final List<String> commands = new ArrayList<String>();                

commands.add("/usr/bin/curl"); 
 commands.add("-k"); 
 commands.add("-u"); 
 commands.add("admin:hello"); 
 commands.add("-s"); 
 commands.add("https://localhost:8089/services/search/jobs/"+sid+"/results/");

ProcessBuilder builder = new ProcessBuilder(commands);
File dir = new File("/home");
builder.directory(dir);

    final Process process = builder.start();
    
    InputStream is = process.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String line;
    while ((line = br.readLine()) != null) {
      System.out.println(line);
    }
    System.out.println("Program terminated!");
  }
}

如上面程式所示,只要能先得到Splunk Restful 回傳的 SID後加入程式,即可得到與Splunk Server上搜尋一樣的結果。
此外由於程式可能需要同時於Windows及Linux執行,所以可以使用下面程式來判別以決定command的組合模式
private static String OS = System.getProperty("os.name").toLowerCase();

private static boolean isWindows() {  
return (OS.indexOf("win") >= 0);
}
private static boolean isUnix() { 
return (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0 );

當然Windows與Linux上指令上還有一些小差別,另外Linux可以使用空白,但Windows要使用%20或一些需要使用跳脫字元的用法,才可正確執行呼叫CURL,歡迎大家一起研究討論。

}