Spring Actuator 기초 설정 & IntelliJ 활용하기

해당 코드는 Github에 공개되어 있습니다.

스프링은 Actuator를 이용해서 애플리케이션 상태를 종합적으로 모니터링할 수 있습니다.

의존성 주입

1
2
3
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

actuator 호출

http://localhost:8890/actuator를 호출하면 위와 같은 Response를 받을 수 있습니다. 기본 설정으로는 모든 endpoint가 노출돼있지는 않습니다. 모든 endpoint를 노출하도록 설정해보겠습니다.

endpoints 전체 노출

1
2
3
4
5
6
# application.yml
management:
  endpoints:
    web:
      exposure:
        include: "*"

application.yml 설정을 변경하고 다시 /actuator 호출하면 아래 Response와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
{
    "_links": {
        "self": {
            "href": "http://localhost:8890/actuator",
            "templated": false
        },
        "auditevents": {
            "href": "http://localhost:8890/actuator/auditevents",
            "templated": false
        },
        "beans": {
            "href": "http://localhost:8890/actuator/beans",
            "templated": false
        },
        "caches-cache": {
            "href": "http://localhost:8890/actuator/caches/{cache}",
            "templated": true
        },
        "caches": {
            "href": "http://localhost:8890/actuator/caches",
            "templated": false
        },
        "health": {
            "href": "http://localhost:8890/actuator/health",
            "templated": false
        },
        "health-component": {
            "href": "http://localhost:8890/actuator/health/{component}",
            "templated": true
        },
        "health-component-instance": {
            "href": "http://localhost:8890/actuator/health/{component}/{instance}",
            "templated": true
        },
        "conditions": {
            "href": "http://localhost:8890/actuator/conditions",
            "templated": false
        },
        "configprops": {
            "href": "http://localhost:8890/actuator/configprops",
            "templated": false
        },
        "env": {
            "href": "http://localhost:8890/actuator/env",
            "templated": false
        },
        "env-toMatch": {
            "href": "http://localhost:8890/actuator/env/{toMatch}",
            "templated": true
        },
        "info": {
            "href": "http://localhost:8890/actuator/info",
            "templated": false
        },
        "loggers": {
            "href": "http://localhost:8890/actuator/loggers",
            "templated": false
        },
        "loggers-name": {
            "href": "http://localhost:8890/actuator/loggers/{name}",
            "templated": true
        },
        "heapdump": {
            "href": "http://localhost:8890/actuator/heapdump",
            "templated": false
        },
        "threaddump": {
            "href": "http://localhost:8890/actuator/threaddump",
            "templated": false
        },
        "metrics-requiredMetricName": {
            "href": "http://localhost:8890/actuator/metrics/{requiredMetricName}",
            "templated": true
        },
        "metrics": {
            "href": "http://localhost:8890/actuator/metrics",
            "templated": false
        },
        "scheduledtasks": {
            "href": "http://localhost:8890/actuator/scheduledtasks",
            "templated": false
        },
        "httptrace": {
            "href": "http://localhost:8890/actuator/httptrace",
            "templated": false
        },
        "mappings": {
            "href": "http://localhost:8890/actuator/mappings",
            "templated": false
        }
    }
}

경로 설명
/beans 초기화된 모든 스프링 빈의 목록을 표시
/env 스프링 설정 가능한 환경 속성 목록욜 표시, OS 환경 변수 및 컨피규레이션 파일의 속성 목록
/health 애플리케이션 상태 정보 표시
/info 애플리케이션의 임의 정보 표시 properties 등
/loggers 로거 컨피규레이션 정보를 표시하고 수정
/metrics 매트릭스 정보를 표시(메모리, 실행중인 스레드 수, REST 메서드 응답 시간)
/trace 트레이스 정뵤 표시(기본적으로 마지막 100개의 HTTP Request)

다양한 정보들이 포함되어 있습니다. 필요한 정보들을 확인한 후 아래와 같이 필요한 정보들만 노출할 수 있습니다.

1
2
3
4
5
6
7
8
management:
  endpoints:
    web:
      exposure:
        include:
          - "info"
          - "health"
          - "httptrace"

application.yml 변경이후 다시 /actuator을 호출하면 include에 포함시킨 endpoint만 Response 받게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
  "_links": {
    "self": {
      "href": "http://localhost:8890/actuator",
      "templated": false
    },
    "health": {
      "href": "http://localhost:8890/actuator/health",
      "templated": false
    },
    "health-component": {
      "href": "http://localhost:8890/actuator/health/{component}",
      "templated": true
    },
    "health-component-instance": {
      "href": "http://localhost:8890/actuator/health/{component}/{instance}",
      "templated": true
    },
    "info": {
      "href": "http://localhost:8890/actuator/info",
      "templated": false
    },
    "httptrace": {
      "href": "http://localhost:8890/actuator/httptrace",
      "templated": false
    }
  }
}

Info Git Info 노출하기

기본 설정에서 actuator/info 호출시 아무 정보도 Response를 하지 않습니다. plugin을 이용하면 git에 대한 정보를 쉽게 노출할 수 있습니다.

1
2
3
4
5
6
7
8
9
<code>buildscript {
    ...
    dependencies {
        ...
        classpath "gradle.plugin.com.gorylenko.gradle-git-properties:gradle-git-properties:2.0.0"
    }
}
apply plugin: "com.gorylenko.gradle-git-properties"
</code>

필요한 디펜던시를 추가합니다.

1
2
3
4
5
management:
  ...
  info:
    git:
      mode: SIMPLE # FULL or SIMPLE

git 정보에 대한 mode를 SMPLE, FULL을 지정할 수 있습니다. 이후에 서버를 실행시키면 아래 그림처럼 git.properties 파일에 Git에 대한 정보가 담겨있습니다.

SIMPLE Mode

1
2
3
4
5
6
7
8
{
  "git": {
    "commit": {
      "time": "2019-07-02T16:31:35Z",
      "id": "293e840"
    },
    "branch": "master"
  }

FULL Mode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{
  "git": {
    "build": {
      "host": "yun",
      "version": "0.0.1-SNAPSHOT",
      "time": "2019-07-03T16:49:41Z",
      "user": {
        "name": "Yun",
        "email": "cheese10yun@gmail.com"
      }
    },
    "branch": "master",
    "commit": {
      "message": {
        "short": "오타 수정",
        "full": "오타 수정\n"
      },
      "id": {
        "describe": "",
        "abbrev": "293e840",
        "full": "293e840b752531eafb1be55e9cec78113743dd8d"
      },
      "time": "2019-07-02T16:31:35Z",
      "user": {
        "email": "cheese10yun@gmail.com",
        "name": "Yun"
      }
    },
    "closest": {
      "tag": {
        "name": "",
        "commit": {
          "count": ""
        }
      }
    },
    "dirty": "true",
    "remote": {
      "origin": {
        "url": "https://github.com/cheese10yun/blog-sample.git"
      }
    },
    "tags": "",
    "total": {
      "commit": {
        "count": "212"
      }
    }
  }
}

mode에 따라서 출력되는 정보가 다릅니다.

Health Database

기본 설정에서 /actuator/health를 호출하면 아래와 같은 응답 정보를 받을 수 있습니다. (데이터베이스 정보를 표시하기 위해서 H2 의존성을 추가했습니다.)

1
2
3
{
  "status": "UP"
}

데이터베이스에 대한 정보를 추가적으로 확인하기 위해서는 application.yml을 추가적으로 설정하면 됩니다.

1
2
3
4
5
6
management:
  ...
  endpoint:
    health:
      enabled: true
      show-details: always

위 설정을 추가하시고 /actuator/health를 다시 호출하면 아래와 같은 Response를 확인할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
  "status": "UP",
  "details": {
    "db": {
      "status": "UP",
      "details": {
        "database": "H2",
        "hello": 1
      }
    },
    "diskSpace": {
      "status": "UP",
      "details": {
        "total": 500068036608,
        "free": 389070479360,
        "threshold": 10485760
      }
    }
  }
}

Base Path 변경하기

기본으로 제공해주는 URL 정보는 변경해서 사용하는 것이 바람직합니다. base-path 속성을 이용하면 endpoint base path를 변경할 수 있습니다.

1
2
3
4
5
management:
  endpoints:
    ...
    web:
      base-path: "/system"

base-path을 변경하면 아래와 같이 endpoint base path가 변경되는 것을 확인할 수 있습니다.

IntelliJ Endpint

IntelliJ를 이용하면 Actuator를 더욱 잘 활용할 수 있습니다.

Run/Debug Tab에서 Endpoints에서는 전체 Request Mapping를 볼 수 있습니다. 실제 Run HTTP Request를 이용하면 요청을 보낼 수 있습니다.

우 클릭 이후 Edit을 활용하면 실제 매핑된 Controller 코드로 이동되어 컨트롤러에 있는 특정 Request Mapping 정보를 쉽게 찾을 수 있습니다.

Beans Tab에서는 등록돼있는 Bean들을 볼 수 있습니다. 스프링 부트에서는 특정 빈의 유무에 따라서 설정들이 변경되는 일이 많기 때문에 디버깅 시 유용하게 사용할 수 있습니다.

Health Tab에서는 위에서 확인한 heath 정보도 확인할 수 있습니다. Http 요청을 보내서 확인하는 것보다는 인텔리 제이에서 확인하는 것이 개인적으로는 편리한 거 같습니다.

Controller에서 HTTP Call을 위 그림처럼 진행할 수 있습니다.


Popit은 페이스북 댓글만 사용하고 있습니다. 페이스북 로그인 후 글을 보시면 댓글이 나타납니다.