아무튼 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를 어떻게 설정하고 코드에 넣을 것인가를 중점적으로 다루도록 하겠다.
설정
@Configuration ... @EnableMBeanExport // <- 요거 추가 끝. ㅋ @Import({ CommonApplicationContextConfig.class }) @ComponentScan(basePackageClasses = { BaseClass.class }) public class DomainApplicationContextConfig implements TransactionManagementConfigurer, AsyncConfigurer { ... }
Counter
그래서 아래와 같이 카운터 객체를 만들자.
@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" ] } ] }
아주 쉬운 만큼 얼마든지 유연하게 적용이 가능하고 얼마든지 powerful한 대시보드가 가능하다.
우리 모두 장애없는 그날까지.
무한한 공간 저 너머로.
끝.