Spring boot Actuator
yarn
• Actuator
• Actuator Remote Shell
• JMX
Actuator
실행 중인 애플리케이션 내부를 볼 수 있게 하는 엔드포인
트(URI)을 제공.
endpoint
HTTP method path description
GET /autoconfig 자동구성 조건의 성공 실패 여부
GET
/configprops
/.
기본값, 구성 프로퍼티에 빈 주입 정보
GET /beans 빈과 빈사이의 관계를 보여줌
GET /dump 스레드활동의 스냅샷 덤프를 조회
GET /env 모든 환경 프로퍼티를 조회
GET /env/{name} 환경변수 이름으로 특정 환경값 조회
GET /health 헬스 메트릭 정보를 조회
GET /info info로 시작 하는 프로퍼티 정보 조회
GET /mappings controller에 맵핑된 uri 정보
GET /metrics 메모리 사용량, HTTP 요청 카운터등..
GET /metrics/{name} 메트릭에 대한 개별 정보
compile(‘org.springframework.boot:spring-boot-starter-actuator’)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
@Grap(“spring-boot-starter-actuator”)
{server-url}:{port}/{endPoint}
/beans
[{
"context": "application:8443",
"parent": null,
"beans": [{
"bean": "helloworldYarnApplication",
"aliases": [],
"scope": "singleton",
"type": "com.blog.yarn.HelloworldYarnApplication$$EnhancerB
"resource": "null",
"dependencies": []
}]
}]
/autoconfig
{
"positiveMatches": { //성공한 조건
"AuditAutoConfiguration#auditListener": [{
"condition": "OnBeanCondition",
"message": "@ConditionalOnMissingBean (types: org.springframework
}]
},
“negativeMatches" : { //실패한 조건
….
}
}
/env/{name}{
"profiles": [],
"server.ports": {
"local.server.port": 8443
},
"servletContextInitParams": {},
"systemProperties": {
"java.runtime.name": "Java(TM) SE Runtime Environment",
"sun.boot.library.path": "/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib",
....
},
"systemEnvironment": {
"PATH": “/usr/bin:/bin:/usr/sbin:/sbin",
"COMMAND_MODE": "unix2003",
"TMPDIR": "/var/folders/zz/gptpb61d5wgg1cqnt24pv5w00000gn/T/",
.....
},
"applicationConfig: [classpath:/application.properties]": {
"http.port": "8080"
},
"applicationConfig: [classpath:/application.yml]": {
"server.port": 8443,
"server.ssl.key-store": "file:///Users/choonghyun/Dev/tmp/yarn.jks",
"server.ssl.key-store-password": "******",
"server.ssl.key-password": "******"
}
}
/mappings
{
"/webjars/**": {
"bean": "resourceHandlerMapping"
},
"/**": {
"bean": "resourceHandlerMapping"
},
"/**/favicon.ico": {
"bean": "faviconHandlerMapping"
},
"{[/]}": {
"bean": "requestMappingHandlerMapping",
"method": "public java.lang.String com.blog.yarn.controller.HelloWorldController.helloworld()"
},
"{[/error]}": {
"bean": "requestMappingHandlerMapping",
"method": "public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.sp
},
"{[/autoconfig || /autoconfig.json],methods=[GET],produces=[application/json]}": {
"bean": "endpointHandlerMapping",
"method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
}
…..
"{[/mappings || /mappings.json],methods=[GET],produces=[application/json]}": {
"bean": "endpointHandlerMapping",
"method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
}
}
/metric/{name}
{
"mem": 335850,
"mem.free": 197114,
"processors": 4,
"instance.uptime": 1647523,
"uptime": 1662801,
"systemload.average": 1.8447265625,
"heap.committed": 279552,
"heap": 1864192,
"nonheap.committed": 57536,
"nonheap": 0,
"threads.peak": 26,
"threads": 26,
"classes": 7210,
"classes.loaded": 7210,
"gc.ps_scavenge.count": 10,
"httpsessions.max": -1,
"gauge.response.beans": 126.0,
"counter.status.200.mappings": 1,
}
prefix description
gc.* gc 발생 횟수, 수행시간
mem.* 할당된 메모리 용량, 여유 메모리 용량
heap.* 현재 메모리 사용량
classes.* 클래스 로더로 로드, 언로드 된 클래스 개수
threads.* 스레드, 데몬 스레드 개수와 서버 시작 후 최대 스레드 개수
datasource.* 데이터 소스 커넥션 개수
httpsessions.* 톰캣의 활성화 된 세션과 최대 세션 개수
couter.status.* http 요청에 대한 상태
gauge.response.
*
요청 수행 시간
/trace[{
"timestamp": 1481109359860,
"info": {
"method": "GET",
"path": "/metrics",
"headers": {
"request": {
"host": "localhost:8080",
"connection": "keep-alive",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Ge
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"accept-encoding": "gzip, deflate, sdch, br",
"accept-language": "ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4"
},
"response": {
"X-Application-Context": "application:8443",
"X-Content-Type-Options": "nosniff",
"X-XSS-Protection": "1; mode=block",
"Cache-Control": "no-cache, no-store, max-age=0, must-revalidate",
"Pragma": "no-cache",
"Expires": "0",
"X-Frame-Options": "DENY",
"Content-Type": "application/json;charset=UTF-8",
"Transfer-Encoding": "chunked",
"Date": "Wed, 07 Dec 2016 11:15:59 GMT",
"status": "200"
}
}
}
}]
/dump[{
"threadName": "http-nio-8080-exec-10",
"threadId": 36,
"blockedTime": -1,
"blockedCount": 0,
"waitedTime": -1,
"waitedCount": 2,
"lockName": "java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@7c8db25e",
"lockOwnerId": -1,
"lockOwnerName": null,
"inNative": false,
"suspended": false,
"threadState": "WAITING",
"stackTrace": [{
"methodName": "park",
"fileName": "Unsafe.java",
"lineNumber": -2,
"className": "sun.misc.Unsafe",
"nativeMethod": true
} {
"methodName": "run",
"fileName": "Thread.java",
"lineNumber": 745,
"className": "java.lang.Thread",
"nativeMethod": false
}],
"lockedMonitors": [],
"lockedSynchronizers": [],
"lockInfo": {
"className": "java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject",
"identityHashCode": 2089661022
}
}]
/shutdown
$ curl -X POST http://localhost:8080/shutdown
shutdown 기능은 기본적으로 비활성화 되어있음.
*명시적으로 활성화 하기(application.yml)
endpoints:
shutdown:
enabled: true
/info
info 정보를 등록 하지 않은 경우
{}
info 정보를 등록한 경우(application.yml)
info:
contactEmail: choong83@gmail.com
phone: 66-546-7865
{"contactEmail":"choong83@gmail.com","phone":"66-546-7865"}
• Actuator
• Actuator Remote Shell
• JMX
remote shell
compile(‘org.springframework.boot:spring-boot-starter-remote-shell’)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-remote-shell</artifactId>
</dependency>
@Grap(“spring-boot-starter-remote-shell”)
how to connect
logging..
Using default security password: ed214d16-285b-45a9-b671-41a4b0856
$ ssh user@localhost -p 2000
Password authentication
Password : ed214d16-285b-45a9-b671-41a4b0856e98
. ____ _ __ _ _
/ / ___'_ __ _ _(_)_ __ __ _    
( ( )___ | '_ | '_| | '_ / _` |    
/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.4.2.RELEASE)
>
CRaSH 셸
command description
autoconfig 자동 구성 보고서를 생성한다, /autoconfig와 유사하다.
beans 스프링 애플리케이션 컨텍스트의 빈을 보여준다.
endpoint actuator endpoint를 보여준다
metrics
스프링 부트 메트릭을 나타낸다. /metrics 엔드포인트와 유사하나
값의 변화를 실시간으로 반영한 메트릭 목록을 보여 준다.
endpoint list
requestMappingEndpoint
environmentEndpoint
healthEndpoint
beansEndpoint
infoEndpoint
metricsEndpoint
traceEndpoint
dumpEndpoint
autoConfigurationReportEndpoint
configurationPropertiesReportEndpoint
*Endpoint 접미어를 제외한 엔드 포인트의 빈 이름으로 endpoint invoke 명령을 실행.
> endpoint invoke health
• Actuator
• Actuator Remote Shell
• JMX
JMX console
MBean으로 엔드 포인트 노출
actuator endpoint는 org.springframework.boot 도메인 아래에 노출된다.
Actuator 사용자 하기
• 엔드포인트 이름 변경
• 엔드포인트 활성화 / 비활성화
• 사용자 메트릭과 게이지 정의
• 트레이스 데이터를 저장할 사용자 정의 레포지토
리 생성
• 사용자 정의 헬스 인디케이터 추가
endpoint ID 변경
• 자신이 원하는 id로 변경 가능.
• endpoints.endpoint-id.id
• shutdown id 변경 예제
endpoints:
shutdown:
id: kill
endpoint 활성화 / 비활
성화
개별
endpoints.endpoint-id.enabled
endpoints:
metrics:
enabled: false
전체
endpoints.enabled
endpoints:
enabled: false
일부만 활성화
endpoints:
enabled: false
metric:
enabled: false
사용자 정의 메트릭과 게이지 추가
하기
@Controller
public class HelloWorldController {
@Autowired
private CounterService couterService;
@Autowired
private GaugeService gaugeService;
@RequestMapping("/")
public String helloworld(){
couterService.increment("books saved");
gaugeService.submit("books.last.saved", System.currentTimeMillis());
return "/";
}
}
{"mem":335431,"mem.free":204268,"processors":4,"instance.uptime":268651,"uptime":284223,"systemload.average":1.424316406
PublicMetrics
• 간단한 정보는 CouterService, GaugeService를
이용하면 되지만 표현하려는 정보가 조금 복잡한
경우 PublicMetrics 인터페이스를 직접 구현하면
된다.
public interface PublicMetrics {
Collection<Metric<?>> metrics();
}
사용자정의 트레이스 리포지토리 생성
하기
• /trace endpoint는 최근 100개까지만 저장.
• InMemoryTraceRepository 빈을 직접선언 하여
개수를 늘릴 수 있다.
• 하지만 영구적이지 않고, 메모리 공간에 영향을
줄 수 있다.
TraceRepository
• 어디에서든 저장 가능하고, 메모리를 소비하지 않
고 영구적.
public interface TraceRepository {
List<Trace> findAll();
void add(Map<String, Object> traceInfo);
}
사용자 정의 헬스 인디케
이터
• 헬스 인디케이터 기능이 없는 시스템과 상호작용
을 하기 위한 기능.
• HealthIndicator class를 구현한다.
Actuator endpoint 보안
• URL기반이므로, 누구나 접근 가능.
• Spring Security를 사용하여, path에 대해 보안 적
용 가능.
• 액추에이터에 대한 context path 설정 가능 (기본은
/)
management.context-path=xxxx
management
context-paht: xxxx

Spring boot actuator

  • 1.
  • 2.
    • Actuator • ActuatorRemote Shell • JMX
  • 3.
    Actuator 실행 중인 애플리케이션내부를 볼 수 있게 하는 엔드포인 트(URI)을 제공.
  • 4.
    endpoint HTTP method pathdescription GET /autoconfig 자동구성 조건의 성공 실패 여부 GET /configprops /. 기본값, 구성 프로퍼티에 빈 주입 정보 GET /beans 빈과 빈사이의 관계를 보여줌 GET /dump 스레드활동의 스냅샷 덤프를 조회 GET /env 모든 환경 프로퍼티를 조회 GET /env/{name} 환경변수 이름으로 특정 환경값 조회 GET /health 헬스 메트릭 정보를 조회 GET /info info로 시작 하는 프로퍼티 정보 조회 GET /mappings controller에 맵핑된 uri 정보 GET /metrics 메모리 사용량, HTTP 요청 카운터등.. GET /metrics/{name} 메트릭에 대한 개별 정보
  • 5.
  • 6.
  • 7.
    /beans [{ "context": "application:8443", "parent": null, "beans":[{ "bean": "helloworldYarnApplication", "aliases": [], "scope": "singleton", "type": "com.blog.yarn.HelloworldYarnApplication$$EnhancerB "resource": "null", "dependencies": [] }] }]
  • 8.
    /autoconfig { "positiveMatches": { //성공한조건 "AuditAutoConfiguration#auditListener": [{ "condition": "OnBeanCondition", "message": "@ConditionalOnMissingBean (types: org.springframework }] }, “negativeMatches" : { //실패한 조건 …. } }
  • 9.
    /env/{name}{ "profiles": [], "server.ports": { "local.server.port":8443 }, "servletContextInitParams": {}, "systemProperties": { "java.runtime.name": "Java(TM) SE Runtime Environment", "sun.boot.library.path": "/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib", .... }, "systemEnvironment": { "PATH": “/usr/bin:/bin:/usr/sbin:/sbin", "COMMAND_MODE": "unix2003", "TMPDIR": "/var/folders/zz/gptpb61d5wgg1cqnt24pv5w00000gn/T/", ..... }, "applicationConfig: [classpath:/application.properties]": { "http.port": "8080" }, "applicationConfig: [classpath:/application.yml]": { "server.port": 8443, "server.ssl.key-store": "file:///Users/choonghyun/Dev/tmp/yarn.jks", "server.ssl.key-store-password": "******", "server.ssl.key-password": "******" } }
  • 10.
    /mappings { "/webjars/**": { "bean": "resourceHandlerMapping" }, "/**":{ "bean": "resourceHandlerMapping" }, "/**/favicon.ico": { "bean": "faviconHandlerMapping" }, "{[/]}": { "bean": "requestMappingHandlerMapping", "method": "public java.lang.String com.blog.yarn.controller.HelloWorldController.helloworld()" }, "{[/error]}": { "bean": "requestMappingHandlerMapping", "method": "public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.sp }, "{[/autoconfig || /autoconfig.json],methods=[GET],produces=[application/json]}": { "bean": "endpointHandlerMapping", "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()" } ….. "{[/mappings || /mappings.json],methods=[GET],produces=[application/json]}": { "bean": "endpointHandlerMapping", "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()" } }
  • 11.
    /metric/{name} { "mem": 335850, "mem.free": 197114, "processors":4, "instance.uptime": 1647523, "uptime": 1662801, "systemload.average": 1.8447265625, "heap.committed": 279552, "heap": 1864192, "nonheap.committed": 57536, "nonheap": 0, "threads.peak": 26, "threads": 26, "classes": 7210, "classes.loaded": 7210, "gc.ps_scavenge.count": 10, "httpsessions.max": -1, "gauge.response.beans": 126.0, "counter.status.200.mappings": 1, }
  • 12.
    prefix description gc.* gc발생 횟수, 수행시간 mem.* 할당된 메모리 용량, 여유 메모리 용량 heap.* 현재 메모리 사용량 classes.* 클래스 로더로 로드, 언로드 된 클래스 개수 threads.* 스레드, 데몬 스레드 개수와 서버 시작 후 최대 스레드 개수 datasource.* 데이터 소스 커넥션 개수 httpsessions.* 톰캣의 활성화 된 세션과 최대 세션 개수 couter.status.* http 요청에 대한 상태 gauge.response. * 요청 수행 시간
  • 13.
    /trace[{ "timestamp": 1481109359860, "info": { "method":"GET", "path": "/metrics", "headers": { "request": { "host": "localhost:8080", "connection": "keep-alive", "upgrade-insecure-requests": "1", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Ge "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "accept-encoding": "gzip, deflate, sdch, br", "accept-language": "ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4" }, "response": { "X-Application-Context": "application:8443", "X-Content-Type-Options": "nosniff", "X-XSS-Protection": "1; mode=block", "Cache-Control": "no-cache, no-store, max-age=0, must-revalidate", "Pragma": "no-cache", "Expires": "0", "X-Frame-Options": "DENY", "Content-Type": "application/json;charset=UTF-8", "Transfer-Encoding": "chunked", "Date": "Wed, 07 Dec 2016 11:15:59 GMT", "status": "200" } } } }]
  • 14.
    /dump[{ "threadName": "http-nio-8080-exec-10", "threadId": 36, "blockedTime":-1, "blockedCount": 0, "waitedTime": -1, "waitedCount": 2, "lockName": "java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@7c8db25e", "lockOwnerId": -1, "lockOwnerName": null, "inNative": false, "suspended": false, "threadState": "WAITING", "stackTrace": [{ "methodName": "park", "fileName": "Unsafe.java", "lineNumber": -2, "className": "sun.misc.Unsafe", "nativeMethod": true } { "methodName": "run", "fileName": "Thread.java", "lineNumber": 745, "className": "java.lang.Thread", "nativeMethod": false }], "lockedMonitors": [], "lockedSynchronizers": [], "lockInfo": { "className": "java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject", "identityHashCode": 2089661022 } }]
  • 15.
    /shutdown $ curl -XPOST http://localhost:8080/shutdown shutdown 기능은 기본적으로 비활성화 되어있음. *명시적으로 활성화 하기(application.yml) endpoints: shutdown: enabled: true
  • 16.
    /info info 정보를 등록하지 않은 경우 {} info 정보를 등록한 경우(application.yml) info: contactEmail: choong83@gmail.com phone: 66-546-7865 {"contactEmail":"choong83@gmail.com","phone":"66-546-7865"}
  • 17.
    • Actuator • ActuatorRemote Shell • JMX
  • 18.
  • 19.
    how to connect logging.. Usingdefault security password: ed214d16-285b-45a9-b671-41a4b0856 $ ssh user@localhost -p 2000 Password authentication Password : ed214d16-285b-45a9-b671-41a4b0856e98 . ____ _ __ _ _ / / ___'_ __ _ _(_)_ __ __ _ ( ( )___ | '_ | '_| | '_ / _` | / ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |___, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.4.2.RELEASE) >
  • 20.
    CRaSH 셸 command description autoconfig자동 구성 보고서를 생성한다, /autoconfig와 유사하다. beans 스프링 애플리케이션 컨텍스트의 빈을 보여준다. endpoint actuator endpoint를 보여준다 metrics 스프링 부트 메트릭을 나타낸다. /metrics 엔드포인트와 유사하나 값의 변화를 실시간으로 반영한 메트릭 목록을 보여 준다.
  • 21.
  • 22.
    • Actuator • ActuatorRemote Shell • JMX
  • 23.
    JMX console MBean으로 엔드포인트 노출 actuator endpoint는 org.springframework.boot 도메인 아래에 노출된다.
  • 24.
    Actuator 사용자 하기 •엔드포인트 이름 변경 • 엔드포인트 활성화 / 비활성화 • 사용자 메트릭과 게이지 정의 • 트레이스 데이터를 저장할 사용자 정의 레포지토 리 생성 • 사용자 정의 헬스 인디케이터 추가
  • 25.
    endpoint ID 변경 •자신이 원하는 id로 변경 가능. • endpoints.endpoint-id.id • shutdown id 변경 예제 endpoints: shutdown: id: kill
  • 26.
    endpoint 활성화 /비활 성화 개별 endpoints.endpoint-id.enabled endpoints: metrics: enabled: false 전체 endpoints.enabled endpoints: enabled: false 일부만 활성화 endpoints: enabled: false metric: enabled: false
  • 27.
    사용자 정의 메트릭과게이지 추가 하기 @Controller public class HelloWorldController { @Autowired private CounterService couterService; @Autowired private GaugeService gaugeService; @RequestMapping("/") public String helloworld(){ couterService.increment("books saved"); gaugeService.submit("books.last.saved", System.currentTimeMillis()); return "/"; } } {"mem":335431,"mem.free":204268,"processors":4,"instance.uptime":268651,"uptime":284223,"systemload.average":1.424316406
  • 28.
    PublicMetrics • 간단한 정보는CouterService, GaugeService를 이용하면 되지만 표현하려는 정보가 조금 복잡한 경우 PublicMetrics 인터페이스를 직접 구현하면 된다. public interface PublicMetrics { Collection<Metric<?>> metrics(); }
  • 29.
    사용자정의 트레이스 리포지토리생성 하기 • /trace endpoint는 최근 100개까지만 저장. • InMemoryTraceRepository 빈을 직접선언 하여 개수를 늘릴 수 있다. • 하지만 영구적이지 않고, 메모리 공간에 영향을 줄 수 있다.
  • 30.
    TraceRepository • 어디에서든 저장가능하고, 메모리를 소비하지 않 고 영구적. public interface TraceRepository { List<Trace> findAll(); void add(Map<String, Object> traceInfo); }
  • 31.
    사용자 정의 헬스인디케 이터 • 헬스 인디케이터 기능이 없는 시스템과 상호작용 을 하기 위한 기능. • HealthIndicator class를 구현한다.
  • 32.
    Actuator endpoint 보안 •URL기반이므로, 누구나 접근 가능. • Spring Security를 사용하여, path에 대해 보안 적 용 가능. • 액추에이터에 대한 context path 설정 가능 (기본은 /) management.context-path=xxxx management context-paht: xxxx