Version 1.0.1
저작권 © 2007-2011 삼성SDS
Util System Demo Plugin은 시스템 리소스를 확인할 수 있는 Util-System Service 의 내용을 simpleweb-jquery 플러그인(jQuery UI Portlet)과 Chart 플러그인의 FusionChart Free 서비스를 사용하여 DashBoard 형태로 한눈에 볼 수 있도록 웹 어플리케이션 형태로 제공한다.
Installation
Command 창에서 다음과 같이 명령어를 입력하여 util-system-demo plugin을 설치한다.
mvn anyframe:install -Dname=util-system-demo
installed(mvn anyframe:installed) 혹은 jetty:run(mvn clean jetty:run) command를 이용하여 설치 결과를 확인해볼 수 있다.
Util System Demo Plugin에서는 서버 기동 시 Sigar를 통한 초기 시스템 정보를 수집하게 되는데 해당 시스템에 실행중인 process 에 대한 permission 이 없거나(ex. linux 의 system process), PC 기반의 보안툴에서 process 정보 조회를 막는 경우(ex. incops) Sigar 에서는 표준 에러 출력으로 해당 process 접근이 불가함을 warning 메시지 처리하지만 기동 및 실행에는 문제가 없으므로 참고한다.
Dependent Plugins
| Plugin Name | Version Range |
|---|---|
| util-system | 2.0.0 > * |
| simpleweb-jquery | 2.0.0 > * |
| chart | 2.0.0 > * |
Util System Demo Plugin에서 제공하는 화면들은 아래와 같다.
| Name | Description |
|---|---|
| System Utility Test List | portlet 형태로 OS 정보, Java JVM 정보, CPU 정보, 메모리 정보 등의 시스템 관련 속성 정보를 제공한다. |
| Network Utility Test List | portlet 형태로 네트워크 상태 및 IP 정보, Mac 주소정보, PortScan 정보를 제공한다. |
| SystemUsageInfo Test List | portlet 형태로 CPU 사용량, 프로세스 목록 정보 등을 제공한다. |
| SystemUsageChart Test List | Chart 형태로 CPU, 메모리, 디스크 사용량을 보여준다. |
다음 그림은 Util System Demo Architecture 이다.

util-system-demo plugin의 Web Application 을 구성하기 위해서 util-system, simpleweb-jquery, chart plugin이 미리 설치된다.
util-system 의 라이브러리들을 사용해서 시스템 정보들을 수집한다.
simpleweb-jquery 에 포함되어 있는 jQuery UI Portlet 형태로 정보들을 보여준다.
chart 에 포함되어 있는 FusionChart Free 의 chart/graph 를 이용하여 직관적으로 보기 쉬운 화면을 제공한다.
직관적으로 보기 쉽도록 portlet과 chart 를 이용한 시스템 , 네트워크 관련 정보 화면을 제공한다.
아래는 portlet 사용을 위한 샘플 소스이다.
portlet 화면 구성을 위한 systemInfoUtilTest.jsp 의 일부분이다.
<div class="portlet">
<div class="portlet-header">OsInfo</div>
<div class="portlet-content" id="osInfo"></div>
</div>
portlet 데이터 조회를 위한 systemInfoUtilTest.jsp의 JavaScript부분이다. 아래 javascript 소스 영역은 Portlet Header click 시 실행될 callback function 이고 jQuery Ajax 요청은 search 함수로 일반화하여 재사용하고 success callback function 을 인자로 넘겨준다. 아래에서 확인할 수 있듯이 해당 portlet 영역(div) 에 simpleAutoProperties 함수로 공통화 하여 json 결과 데이터를 html 요소(ul-li) 로 동적으로 그려주게 된다.
if($(this).parent().text() == "OsInfo") {
search("OsInfo", function(data){
var osInfo = simpleAutoProperties(data.result);
$("#osInfo").html(osInfo);
}
);
portlet 데이터 핸들링을 위한 UtilSystemController.java 의 일부분이다. Util-System 기능(내부적으로 Sigar 활용)인 SystemInfoUtil 을 호출하여 결과 객체(여기서는 OsInfo Value Object)를 result 라는 key 로 Model 에 담는다. jsonView 로 리턴하게 되면 VO 가 Json 객체로 변환되어 클라이언트에 되돌려진다.
@RequestMapping("/utilSystem/getOsInfo.do")
public String getOsInfo(ModelMap map) {
map.addAttribute("result", SystemInfoUtil.getSystemInfo());
return "jsonView";
}

상단의 refresh 버튼을 클릭하면 전체 화면의 개별 Portlet Header click 이벤트를 trigger 시켜 각 기능을 재조회하게 된다. Portlet 형태의 UI 를 제공하므로 각 Portlet Header 를 마우스로 drag & drop 하여 위치를 쉽게 이동할 수 있고 Header 에 있는 refresh 아이콘이나 접힘/펼침 아이콘을 클릭하여 데이터 재조회와 화면 표시를 제어할 수 있다.
| Portlet | Description |
|---|---|
| OsInfo | OS 정보 |
| JavaInfo | Java JVM 정보 |
| NativeInfo | Sigar 관련 제공 정보 |
| CpuInfo | CPU 정보 |
| MemoryInfo | Memory 정보 (단위 : KB) |
| UptimeInfo | Uptime 정보 (시스템 최초 기동 및 경과시간) |
| ClientInfo | Client 정보 (Request Header 에서 추출) |
| ProcessStatInfo | Process status 정보 |
| UlimitInfo | Ulimit 정보 |
| FileSystemInfo | File System 정보 |

| Portlet | Description |
|---|---|
| NetworkInfoList | Network 목록 정보 - Mac 주소, 호스트명, IP 주소, 서브넷, 게이트웨이, DNS |
| MyIPInfo | Local Network 정보 |
| MyIPList | 내 IP 목록 |
| MyMacAddressList | 내 Mac 주소 목록 |
| Ping | 해당 주소에 대한 네트워크 상태 정보 (구동 기반인 InetAddress.isReachable() 은 완전한 ICMP ping 구현은 아니며 방화벽 환경에 따라 동작하지 않는 경우가 있음) |
| Route | route 정보 |
| PortScan | port 스캔한 정보 (Sigar 의 netstat 수행 시 네트워크 환경에 따라 실행 시간이 오래 걸리는 경우가 있음에 유의!) |
PortScan 기능의 경우 해당 Portlet 의 refresh 아이콘(기본 refresh 와 아이콘 모양이 다름!) 을 클릭한 경우에만 실행된다. 또한 위 캡쳐 화면에서 IP 정보 중 일부 영역은 보안상 편집하였으므로 참고한다.

| Portlet | Description |
|---|---|
| CpuPerc | CPU percentage usage |
| CpuPercList | 개별 CPU에 대한 CPU percentage usage |
| DiskUsage | 디스크별 사용량 |
| ProcessInfo | 개별 프로세스 상세 정보(process 의 status/cpu/메모리/실행파일) |
| ProcessList | 프로세스 목록 |

그래프를 구현하기 위한 코드는 아래와 같다.
Controller 구현
다음은 UtilSystemController.java 소스 코드중의 일부로 FusionChart Free 의 Pie2d 차트를 그리기 위해 먼저 Pie2d 차트 data xml 로 변환하기 위한 Jaxb Model class 로 데이터를 세팅한 후 marshallingView 를 통해 XML 로 변환하는 예이다.
@RequestMapping("/utilSystem/getMemoryUsageChart.do")
public String getMemoryUsageChart(ModelMap map) throws Exception {
SigarAccessor.gatherMemoryInfo();
MemoryInfo memoryInfo = SigarAccessor.getSysInfo().getMemoryInfo();
Pie2dGraph pie2d = new Pie2dGraph();
pie2d.setCaption("Memory Usage");
pie2d.setDecimalPrecision(0);
pie2d.setShowPercentageValues(1);
pie2d.setShowNames(1);
pie2d.setNumberSuffix("MB");
pie2d.setShowValues(1);
pie2d.setShowPercentageInLabel(0);
pie2d.setPieYScale(45);
pie2d.setPieBorderAlpha(100);
pie2d.setPieRadius(100);
pie2d.setAnimation(0);
pie2d.setShadowXShift(4);
pie2d.setShadowAlpha(40);
pie2d.setPieFillAlpha(95);
pie2d.setPieBorderColor("FFFFFF");
pie2d.setFormatNumberScale(0);
pie2d.setFormatNumber(1);
pie2d.setThousandSeparator(",");
Pie2dSet set1 = new Pie2dSet();
set1.setValue((double) memoryInfo.getMemFree() / 1024.0);
set1.setName("Free");
set1.setColor("AFD8F8");
Pie2dSet set2 = new Pie2dSet();
set2.setValue((double) memoryInfo.getMemUsed() / 1024.0);
set2.setName("Used");
set2.setColor("F6BD0F");
set2.setIsSliced(1);
List sets = new ArrayList();
sets.add(set1);
sets.add(set2);
pie2d.setSet(sets);
map.addAttribute(pie2d);
return "utilMarshallingView";
}
화면 구현
그래프 구현 코드는 아래와 같다. 다음은 systemUsageChartTest.jsp 소스 코드중의 일부이다. FusionChart Free for jQuery 플러그인(jquery.fusionchart.js) 을 사용하여 차트를 삽입하고자 하는 영역(div)에 원하는 옵션을 다양하게 지정하여 손쉽게 웹페이지에 차트를 통합하고 있다.
if($(this).parent().text() == "CpuPercChart") {
$('#cpuPercChart').insertFusionCharts({
swfPath: "<c:url value='/chart/javascript/fusionchart-free/charts/'/>",
type: "Pie2D",
data: "<c:url value='/utilSystem/getCpuPercChart.do'/>",
dataFormat: "URIData",
width: "370",
height: "270",
wMode: "opaque"
});
} else if($(this).parent().text() == "MemoryUsageChart") {
$('#memoryUsageChart').insertFusionCharts({
swfPath: "<c:url value='/chart/javascript/fusionchart-free/charts/'/>",
type: "Pie2D",
data: "<c:url value='/utilSystem/getMemoryUsageChart.do'/>",
dataFormat: "URIData",
width: "450",
height: "270",
wMode: "opaque"
});
} else if($(this).parent().text() == "DiskUsageChart") {
$('#diskUsageChart').insertFusionCharts({
swfPath: "<c:url value='/chart/javascript/fusionchart-free/charts/'/>",
type: "StackedBar2D",
data: "<c:url value='/utilSystem/getDiskUsageChart.do'/>",
dataFormat: "URIData",
width: "450",
height: "350",
wMode: "opaque"
});
} else if($(this).parent().text() == "ProcessMemoryUsageChart") {
$('#processMemoryUsageChart').insertFusionCharts({
swfPath: "<c:url value='/chart/javascript/fusionchart-free/charts/'/>",
type: "Pie2D",
data: "<c:url value='/utilSystem/getProcessMemoryUsageChart.do'/>",
dataFormat: "URIData",
width: "370",
height: "270",
wMode: "opaque"
});
} else if($(this).parent().text() == "ProcessCpuUsageChart") {
$('#processCpuUsageChart').insertFusionCharts({
swfPath: "<c:url value='/chart/javascript/fusionchart-free/charts/'/>",
type: "Pie2D",
data: "<c:url value='/utilSystem/getProcessCpuUsageChart.do'/>",
dataFormat: "URIData",
width: "370",
height: "270",
wMode: "opaque"
});
}
DiskUsageChart의 경우는 가장 오른쪽의 버튼을 클릭하면 확대된 막대 그래프로 볼 수 있다. 해당 기능은 jQuery UI 의 Modal Dialog box 기능을 활용하였다.

확대된 그래프 관련 구현 사례는 아래와 같다.
$(".portlet-header .ui-icon-newwin").click(function() {
if($(this).parent().text() == "DiskUsageChart") {
$("#dialog-modal").dialog({
width: 1024,
height: 768,
zindex: 100,
modal: true
});
$('#diskUsageChartModal').insertFusionCharts({
swfPath: "<c:url value='/chart/javascript/fusionchart-free/charts/'/>",
type: "StackedBar2D",
data: "<c:url value='/utilSystem/getDiskUsageChart.do'/>",
dataFormat: "URIData",
width: "1000",
height: "700"
});
}
});