Jmxtrans를 사용하기 위한 MBean 설정

자바에서 모니터링과 Notification을 위해 보편적으로 사용하는 것이 jmxtrans이다. 툴이라기 보다 수집을 위한 방법(?, 또는 프로토콜?)이라고 하면 이해가 될까?

아무튼 jmxtrans를 통해 수집한 정보로 Graphite등 차트 툴을 이용해서 여러가지 모니터링 대시보드를 만들 수 있다.

일단 사내 공용 시스템 모니터링 페이지를 Graphite를 이용하여 만들어진 상태에서, 팀별로 비즈니스 매트릭을 작성하는 가이드가 나왔고 이참에 하나씩 만들어 가기로 했다.

jmx에 대한 사전 학습은 이곳을 참고하면 된다.
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jmx.html

세팅은 사내에서 기본 컨벤션으로 embedded-jmxtrans(https://github.com/jmxtrans/embedded-jmxtrans)를 사용하고 있어서 jmxtrans를 세팅하는 것은 과감히 넘어가겠다.

아마 구글 검색을 통해 더 자세하고 쉬운 문서를 찾을 수 있을 것이다.
여기서 이야기할 것은 MBeanExporter를 어떻게 설정하고 코드에 넣을 것인가를 중점적으로 다루도록 하겠다.

설정

java config를 기준으로 한다.
@Configuration
...
@EnableMBeanExport // <- 요거 추가 끝. ㅋ
@Import({ CommonApplicationContextConfig.class })
@ComponentScan(basePackageClasses = { BaseClass.class })
public class DomainApplicationContextConfig implements TransactionManagementConfigurer, AsyncConfigurer {
    ...
}
설정은 간단하다. ContextConfig에 @EnableMBeanExport만 추가해주면 된다.

 

Counter

객체를 전송해서 Querying하는 구조인지라 객체를 만들어 줘야 한다.
그래서 아래와 같이 카운터 객체를 만들자.

@ManagedResource(value = "web.analysis:type=PageViewCounter,name=pageViewCounter", description = "PV")
@Component
public class PageViewCounter {
    private AtomicLong pvCount = new AtomicLong(0);

    @ManagedAttribute
    public long getPvCount() {
        return pvCount.get();
    }

    public void increasePVCount() {
        if (pvCount == null) {
            pvCount = new AtomicLong(0);
        }

        pvCount.incrementAndGet();
    }
}

이제 하나씩 살펴보자.

@ManagedResource(value = “web.analysis:type=PageViewCounter,name=pageViewCounter”, description = “PV”)

나는 “MBean이 사용하는 리소스요!” 라고 지정한다. 이 리소스의 Path, Name등 쿼리에 사용할 속성을 기재한다.

@Component

MBean을 Spring Bean으로 등록해야 @EnableMBeanExport를 통해 자동으로 MBean 으로 Export 할 수 있다.
@Component 나 @Configuration의 Bean 정의를 통해 Spring Bean 으로 등록한다.

@ManagedAttribute

카운터 멤버에 대한 Getter에 설정한다. 쿼리에서 값을 추출할때 사용한다.

카운터 Component

이제 MBean을 작성했다. 그러면 카운터를 올려줄 레이어를 하나 만들자.
Counter를 바로 사용해도 되지만 나중에 유지보수할 것을 생각해서 완충지대를 만든다. 이건 개인 취향이니 좋을대로 하자.

@Component
public class DashboardService {

    @Autowired
    private PageViewCounter pageViewCounter;

    public void incresePV() {
        pageViewCounter.increseTotalCount();
    }
}

워낙 다 아는 것들이라서 추가 설명은 넘어가겠다.

Controller

그다음에는 Controller에 추가해주자.

@Constroller
public class HelloController {

    @Autowired
    private DashboardService dashboardService;

    @RequestMapping("/hello")
    public String helloWorld() {
        dashboardService.increasePV();

        return "hello world!";
    }
}

Interceptor에 넣거나 Spring Security Filter로 만들어서 적용하는건 자유다.

아직 끝이 아니다. 바로 jmxtrans 쿼리를 위해 설정을 해야 한다.

Jmxtrans Query 설정

먼저 jmxtrans-project-production.json 을 만들자.(파일명은 세팅시 얼마든지 바꿀 수 있다.)

{
  "queries": [
    {
      "objectName": "web.analysis:type=PageViewCounter,name=pageViewCounter",
      "resultAlias": "web.analysis.PageViewCounter",
      "attributes": [
        "pvCount"
      ]
    }
  ]
}
이것으로 Jmxtrans를 이용하기 위해 MBean을 적용하는 법을 마치도록 한다.
아주 쉬운 만큼 얼마든지 유연하게 적용이 가능하고 얼마든지 powerful한 대시보드가 가능하다.

우리 모두 장애없는 그날까지.
무한한 공간 저 너머로.

끝.

댓글 남기기