Anyframe Util System Demo Plugin

Version 1.0.1

본 문서의 저작권은 삼성SDS에 있으며 Anyframe 오픈소스 커뮤니티 활동의 목적하에서 자유로운 이용이 가능합니다. 본 문서를 복제, 배포할 경우에는 저작권자를 명시하여 주시기 바라며 본 문서를 변경하실 경우에는 원문과 변경된 내용을 표시하여 주시기 바랍니다. 원문과 변경된 문서에 대한 상업적 용도의 활용은 허용되지 않습니다. 본 문서에 오류가 있다고 판단될 경우 이슈로 등록해 주시면 적절한 조치를 취하도록 하겠습니다.


I. Introduction
II. System Utility Demo
1. Architecture
2. 화면 구성
2.1. System Utility Test List
2.2. Network Utility Test List
2.3. SystemUsageInfo Test List
2.4. SystemUsageChart Test List

I.Introduction

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 NameVersion Range
util-system2.0.0 > *
simpleweb-jquery2.0.0 > *
chart2.0.0 > *

II.System Utility Demo

Util System Demo Plugin에서 제공하는 화면들은 아래와 같다.

NameDescription
System Utility Test Listportlet 형태로 OS 정보, Java JVM 정보, CPU 정보, 메모리 정보 등의 시스템 관련 속성 정보를 제공한다.
Network Utility Test Listportlet 형태로 네트워크 상태 및 IP 정보, Mac 주소정보, PortScan 정보를 제공한다.
SystemUsageInfo Test Listportlet 형태로 CPU 사용량, 프로세스 목록 정보 등을 제공한다.
SystemUsageChart Test ListChart 형태로 CPU, 메모리, 디스크 사용량을 보여준다.

1.Architecture

다음 그림은 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 를 이용하여 직관적으로 보기 쉬운 화면을 제공한다.

2.화면 구성

직관적으로 보기 쉽도록 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";
    }

2.1.System Utility Test List

상단의 refresh 버튼을 클릭하면 전체 화면의 개별 Portlet Header click 이벤트를 trigger 시켜 각 기능을 재조회하게 된다. Portlet 형태의 UI 를 제공하므로 각 Portlet Header 를 마우스로 drag & drop 하여 위치를 쉽게 이동할 수 있고 Header 에 있는 refresh 아이콘이나 접힘/펼침 아이콘을 클릭하여 데이터 재조회와 화면 표시를 제어할 수 있다.

PortletDescription
OsInfoOS 정보
JavaInfoJava JVM 정보
NativeInfoSigar 관련 제공 정보
CpuInfoCPU 정보
MemoryInfoMemory 정보 (단위 : KB)
UptimeInfoUptime 정보 (시스템 최초 기동 및 경과시간)
ClientInfoClient 정보 (Request Header 에서 추출)
ProcessStatInfoProcess status 정보
UlimitInfoUlimit 정보
FileSystemInfoFile System 정보

2.2.Network Utility Test List

PortletDescription
NetworkInfoListNetwork 목록 정보 - Mac 주소, 호스트명, IP 주소, 서브넷, 게이트웨이, DNS
MyIPInfoLocal Network 정보
MyIPList내 IP 목록
MyMacAddressList내 Mac 주소 목록
Ping해당 주소에 대한 네트워크 상태 정보 (구동 기반인 InetAddress.isReachable() 은 완전한 ICMP ping 구현은 아니며 방화벽 환경에 따라 동작하지 않는 경우가 있음)
Routeroute 정보
PortScanport 스캔한 정보 (Sigar 의 netstat 수행 시 네트워크 환경에 따라 실행 시간이 오래 걸리는 경우가 있음에 유의!)

PortScan 기능의 경우 해당 Portlet 의 refresh 아이콘(기본 refresh 와 아이콘 모양이 다름!) 을 클릭한 경우에만 실행된다. 또한 위 캡쳐 화면에서 IP 정보 중 일부 영역은 보안상 편집하였으므로 참고한다.

2.3.SystemUsageInfo Test List

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

2.4.SystemUsageChart Test List

그래프를 구현하기 위한 코드는 아래와 같다.

  • 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"
        });
    }
});