OpenSource

Springboot 2 Actuator, admin UI 모니터링

아르비스 2018. 12. 12. 08:53

Spring boot 를 사용하면서, 개발은 쉬워졌지만, 모니터링에 대한 부담은 커졌다.


각 인스턴스에 대한 CPU, Memory, Heap, Thread 등 리소스 관리를 개별로 모니터링 하기란.. 정만 어려운 난제다.


이를 위해서 Spring boot에서 내놓은 것이 Actuator이다.

https://aboullaite.me/actuator-in-spring-boot-2-0/


단순한 library 추가 및 설정 Properties 만으로 Resource 를 모니터링 할수 있다.

= 구성 요소

  - Spring boot actuator

  - Service Discovery ( Consul / Eureka 등 )

  - Spring boot Admin UI

. 이것만 있으면 된다. 그럼 어떻게??  이렇게


* Spring boot Actuator 

pom.xml 에 dependency 추가

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-actuator</artifactId>

    <version>2.1.1.RELEASE</version>

</dependency>

application properties에 아래 설정 추가

spring.application.name=service-name

spring.cloud.consul.host=localhost

spring.cloud.consul.port=8500

spring.cloud.consul.discovery.enabled=true

spring.cloud.consul.discovery.register=true

spring.cloud.consul.discovery.prefer-ip-address=true

spring.cloud.consul.discovery.health-check-interval=3s

spring.cloud.consul.discovery.register-health-check=true

spring.cloud.consul.discovery.instance-id=${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

spring.cloud.consul.discovery.tags=urlprefix-/${spring.application.name}


management.endpoints.web.exposure.include=*

management.endpoint.shutdown.enabled=true 

application.yml의 경우

spring:

  application:

    name: service-name


## Consul

  cloud:

    consul:

      host: localhost #enviroment property

      port: 8500

      

      discovery:

        enabled: true

        register: true

        prefer-ip-address: true

        healthCheckInterval: 3s

        register-health-check: true

        instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

        tags: urlprefix-/${spring.application.name}


management:

  endpoints.web.exposure.include: '*'

  endpoint.shutdown.enabled: true  


 * Service Discovery 

  Spring 계열이라, Eureka를 생각하겠지만, 전 Routing을 고려해서, Consul로 결정

 Hashcorp 사에서 나온 오픈소스로, 그야말로 대세죠..

https://www.consul.io/

주의) consul을 별도로 기동해야 합니다.. 그래야 서비스에 종속적이지 않고.. service를 Discovery 할수 있음.

역시 pom.xml에 consul library 추가

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-consul-all</artifactId>

<version>2.0.1.RELEASE</version>

</dependency>


* Springboot Admin UI

https://github.com/codecentric/spring-boot-admin

 아직  따끈따끈한 아이지만, 보면 볼수록 괜찮다는..

별도 Project를 사용하거나 기본 서비스중 한곳에 Admin lib와 annotation을 설정해주면 됨.

상세 설정은 아래 URL 참조

http://codecentric.github.io/spring-boot-admin/current/

pom.xml에 library 추가

<dependency>

    <groupId>de.codecentric</groupId>

    <artifactId>spring-boot-admin-starter-server</artifactId>

    <version>2.1.2-SNAPSHOT</version>

</dependency>

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-web</artifactId>

</dependency>


admin server application annotation 추가

@Configuration

@EnableAutoConfiguration

@EnableDiscoveryClient

@EnableAdminServer

public class SpringBootAdminApplication {

    public static void main(String[] args) {

        SpringApplication.run(SpringBootAdminApplication.class, args);

    }

}

application.yml 설정

spring:

  application:

    name: admin-ui


## Consul

  cloud:

    consul:

      host: localhost #enviroment property

      port: 8500

      discovery:

        enabled: true

        register: true

        prefer-ip-address: true

        healthCheckInterval: 3s

        register-health-check: true

        instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

        tags: management.context-path=/, health.path=/actuator/health, user.name=user, user.password=password, urlprefix-/admin

  profiles:

    active:

      - secure


## Admin UI

  boot:

    admin:

      discovery:

        ignored-services: "consul, fabio"

      context-path: /admin


management:

  endpoints.web.exposure.include: '*'

  endpoint.shutdown.enabled: true   


덤으로, Routing을 위하여 fabio는 그냥 띄워주면 됨.

https://github.com/fabiolb/fabio


※ 무엇보다 중요한건, 서비스 올리기 전에, Service Discory Consul을 먼저 띄워야 한다는거..!!!


띄운 그림은 다음과 같다.

<consul> http://localhost:8500/   


<fabio> http://localhost:9998    (routing은 http://localhost:9999/{서비스명} )


<admin-ui> http://localhost:8100/admin    (port 사용자지정)





더이상 service instance Monitoring 많은 고민 하지 말자..