4.15. ヘルスチェック¶
4.15.1. Overview¶
4.15.1.1. ロードバランサの負荷分散と縮退運転¶
4.15.1.2. ヘルスチェックの種類¶
項番 |
ヘルスチェックの種類 |
詳細 |
---|---|---|
(1)
|
PINGでのヘルスチェック
|
OSI参照モデルのネットワーク層レベルで稼働状況を確認する。サーバ(OS)に対してPINGを送信し、応答があれば稼働していると判断する。
|
(2)
|
TCP/UDPでのヘルスチェック
|
OSI参照モデルのトランスポート層レベルで稼働状況を確認する。Web/APサーバのTCPポート(またはUDPポート)にリクエストを送信し、応答があれば稼働していると判断する。
|
(3)
|
アプリケーションでのヘルスチェック
|
OSI参照モデルのアプリケーション層レベルで稼働状況を確認する。Web/APサーバ上で稼働するアプリケーションにHTTPリクエストを送信し、応答が正常であれば稼働していると判断する。
|
4.15.1.3. 本ガイドラインで示すヘルスチェックの構成¶
項番 |
説明 |
---|---|
(1)
|
LBからのリクエストを受け、Controller、Service、Repositoryを実行する。
単に稼働状況を確認する、という点では、よりシンプルにヘルスチェックを実現する方法も存在する。しかし本ガイドラインでは、ヘルスチェックによってアプリケーションが使用している仕組みやフレームワーク自体が正しく動作していることも確認するべく、対象アプリの使用技術構成にできる限り近づけるために、Controller、Service、Repositoryを実装する。
|
(2)
|
RepositoryからSQLを発行し、データベースが稼働していることを確認する。
これは、データベースアクセスを伴うアプリケーションの場合、アプリケーションが稼働していても、データベースに異常がある場合は正常に業務を行うことができないためである。
|
(3)
|
レスポンスを返すViewとしてJSP/Thymeleafを使用する。
本ガイドラインではJSP/Thymeleafを例にとって説明するが、RESTやSOAPを用いる場合など、アプリケーションの特性に合わせて通信方式やレスポンス形式は適宜変更すること。詳細は、RESTful Web Serviceや、SOAP Web Service(サーバ/クライアント)を参照されたい。
|
ヘルスチェック処理結果 |
ステータスコード |
レスポンス内容 |
---|---|---|
成功
|
200(正常)
|
OK. の3文字 |
エラー発生
|
例外ハンドリング機能で設定されたステータスコード
|
例外ハンドリング機能で設定されたレスポンス
|
4.15.2. How to use¶
4.15.2.1. Repositoryインタフェース¶
HealthCheckRepository
を作成する。HealthCheckRepository
はヘルスチェック用のSQLを実行し、データベースの稼働を確認するHealthCheckRepository.java
package com.example.domain.repository.healthcheck;
public interface HealthCheckRepository {
void healthcheck();
}
参照系であること
パラメータが不要であること
HealthCheckRepository.xml(PostgreSQLを使用した場合)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.domain.repository.healthcheck.HealthCheckRepository">
<select id="healthcheck" resultType="String">
SELECT '1'
</select>
</mapper>
HealthCheckRepository.xml(Oracleを使用した場合)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.domain.repository.healthcheck.HealthCheckRepository">
<select id="healthcheck" resultType="String">
SELECT '1' FROM DUAL
</select>
</mapper>
4.15.2.2. Serviceクラス¶
HealthCheckService
インタフェースと、HealthCheckService
インタフェースを実装したHealthCheckServiceImpl
クラスを作成する。HealthCheckServiceImpl
は、healthcheckRepository
のhealthcheck
メソッドを呼び出し、データベースのヘルスチェックを行う。HealthCheckService.java
package com.example.domain.service.healthcheck;
public interface HealthCheckService {
void healthcheck();
}
HealthCheckServiceImpl.java
package com.example.domain.service.healthcheck;
import healthcheck.domain.repository.healthcheck.HealthCheckRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import jakarta.inject.Inject;
@Service
@Transactional
public class HealthCheckServiceImpl implements HealthCheckService {
@Inject
HealthCheckRepository healthcheckRepository;
@Override
public void healthcheck() {
healthcheckRepository.healthCheck();
}
}
4.15.2.3. Controllerクラス¶
HealthCheckController
を作成する。HealthcheckService
のhealthcheck
メソッドを呼び出し、実行結果によって指定されたパスに遷移する。データベースの稼働が確認できた場合は、OK.
を表示するためのビューを返す。HealthCheckController.java
package com.example.app.healthcheck;
import healthcheck.domain.service.healthcheck.HealthCheckService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import jakarta.inject.Inject;
@Controller
public class HealthCheckController {
@Inject
HealthCheckService healthcheckService;
@GetMapping(value = "healthcheck") // (1)
public String healthcheck(){
healthcheckService.healthcheck();
return "common/healthcheck/ok";
}
}
項番
説明
(1)value
属性は、稼働状態を調べるためのヘルスチェック用のURLとなる。
Note
本ガイドラインでは、ヘルスチェック機能は共通機能の扱いとしてcommon
配下のディレクトリに配置している。しかし、共通的な画面を全てcommon
配下のディレクトリに配置してしまうと、ディレクトリが肥大化して管理が難しくなる。そのため、極力グルーピングを行い、適切なディレクトリ構成にすることを推奨する。
4.15.2.4. Viewの実装¶
<%@page>
ディレクティブとOK.
の間に改行文字などを挟まないようにする。ok.jsp
<%@page contentType="text/plain; charset=utf-8" language="java" pageEncoding="utf-8" %>OK.
<html>
タグ等を記述しないようにする。ok.html
OK.
4.15.2.5. アクセス権の設定¶
/healthcheck
配下の除外設定例を以下に示す。SpringSecurityConfig.java
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
// omitted
http.authorizeHttpRequests(authz -> authz.requestMatchers(
new AntPathRequestMatcher("/healthcheck/**")).permitAll()
// omitted
);
// omitted
return http.build();
}
spring-security.xml
<sec:http request-matcher="ant">
<sec:intercept-url pattern="/healthcheck/**" access="permitAll"/>
<!-- omitted -->
</sec:http>
Note
認可制御を外すと、誰でもヘルスチェック用URLにアクセスできるようになってしまうので、外部からアクセスされたくない場合はLBなどで防ぐ対処が必要である。
4.15.3. Appendix¶
4.15.3.1. レスポンスのデータ量を最低限にする設定¶
上記について、それぞれ実装例を以下に示す。
4.15.3.1.1. ヘッダファイルやフッタファイルを読み込まないようにする¶
<jsp-config>
タグの影響を受けることに注意が必要である。<jsp-config>
タグ内で<include-prelude>
タグや<include-coda>
タグを設定した場合、web.xml
<jsp-config>
<jsp-property-group>
<url-pattern>/WEB-INF/views/common/healthcheck/ok.jsp</url-pattern>
<el-ignored>false</el-ignored>
<page-encoding>UTF-8</page-encoding>
<scripting-invalid>false</scripting-invalid>
// (1)
</jsp-property-group>
</jsp-config>
項番
説明
(1) 余計なヘッダファイルやフッタファイルを読み込まないために、<include-prelude>
タグや<include-coda>
タグは設定しない。
4.15.3.1.2. レスポンスから余計な改行を削除する¶
<%@taglib>
ディレクティブを設定した場合、レスポンスの先頭に余計な改行が出力されてしまう。<%@page>
ディレクティブにtrimDirectiveWhitespaces
属性を設定し、ok.jspに余計な改行を出力しないようにする。ok.jsp(trimDirectiveWhitespaces属性を設定する場合)
<%@page contentType="text/plain; charset=utf-8" language="java" pageEncoding="utf-8" trimDirectiveWhitespaces="true" %>OK.
Note
ブランクプロジェクトのデフォルトの設定では、web.xmlの<include-prelude>
に/WEB-INF/views/common/include.jsp
が設定されている。
そのため、上記に示した設定をするか、もしくは、ok.jspを含まないように<url-pattern>
を修正する必要がある。
そうしないと、include.jspがすべてのJSPファイルに読み込まれok.jspには改行が出力されてしまう。