4.14. ヘルスチェック¶
4.14.1. Overview¶
4.14.1.1. ロードバランサの負荷分散と縮退運転¶
4.14.1.2. ヘルスチェックの種類¶
項番 |
ヘルスチェックの種類 |
詳細 |
---|---|---|
(1)
|
PINGでのヘルスチェック
|
OSI参照モデルのネットワーク層レベルで稼働状況を確認する。サーバ(OS)に対してPINGを送信し、応答があれば稼働していると判断する。
|
(2)
|
TCP/UDPでのヘルスチェック
|
OSI参照モデルのトランスポート層レベルで稼働状況を確認する。Web/APサーバのTCPポート(またはUDPポート)にリクエストを送信し、応答があれば稼働していると判断する。
|
(3)
|
アプリケーションでのヘルスチェック
|
OSI参照モデルのアプリケーション層レベルで稼働状況を確認する。Web/APサーバ上で稼働するアプリケーションにHTTPリクエストを送信し、応答が正常であれば稼働していると判断する。
|
4.14.1.3. 本ガイドラインで示すヘルスチェックの構成¶
項番 |
説明 |
---|---|
(1)
|
LBからのリクエストを受け、Controller、Service、Repositoryを実行する。
単に稼働状況を確認する、という点では、よりシンプルにヘルスチェックを実現する方法も存在する。しかし本ガイドラインでは、ヘルスチェックによってアプリケーションが使用している仕組みやフレームワーク自体が正しく動作していることも確認するべく、対象アプリの使用技術構成にできる限り近づけるために、Controller、Service、Repositoryを実装する。
|
(2)
|
RepositoryからSQLを発行し、データベースが稼働していることを確認する。
これは、データベースアクセスを伴うアプリケーションの場合、アプリケーションが稼働していても、データベースに異常がある場合は正常に業務を行うことができないためである。
|
(3)
|
レスポンスを返すViewとしてJSPを使用する。
本ガイドラインではJSPを例にとって説明するが、RESTやSOAPを用いる場合など、アプリケーションの特性に合わせて通信方式やレスポンス形式は適宜変更すること。詳細は、RESTful Web Serviceや、SOAP Web Service(サーバ/クライアント)を参照されたい。
|
ヘルスチェック処理結果 |
ステータスコード |
レスポンス内容 |
---|---|---|
成功
|
200(正常)
|
OK. の3文字 |
エラー発生
|
例外ハンドリング機能で設定されたステータスコード
|
例外ハンドリング機能で設定されたレスポンス
|
4.14.2. How to use¶
4.14.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.14.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 javax.inject.Inject;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional(readOnly = true)
public class HealthCheckServiceImpl implements HealthCheckService {
@Inject
HealthCheckRepository healthcheckRepository;
@Override
public void healthcheck() {
healthcheckRepository.healthcheck();
}
}
4.14.2.3. Controllerクラス¶
HealthCheckController
を作成する。HealthcheckService
のhealthcheck
メソッドを呼び出し、実行結果によって指定されたパスに遷移する。データベースの稼働が確認できた場合は、OK.
を表示するためのビューを返す。HealthCheckController.java
package com.example.app.healthcheck;
import healthcheck.domain.service.healthcheck.HealthCheckService;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HealthCheckController {
@Inject
HealthCheckService healthcheckService;
@RequestMapping(value = "healthcheck") // (1)
public String healthcheck(){
healthcheckService.healthcheck();
return "common/healthcheck/ok"; // (2)
}
}
項番
説明
(1)value
属性は、稼働状態を調べるためのヘルスチェック用のURLとなる。 (2) Apache Tilesの設定を受けないようにするため、JSPファイルを配置するディレクトリを1階層深くしている。詳細は、Apache Tilesの設定を受けないようにするを参照されたい。
4.14.2.4. JSPファイル¶
<%@page>
ディレクティブとOK.
の間に改行文字などを挟まないようにする。ok.jsp
<%@page contentType="text/plain; charset=utf-8" language="java" pageEncoding="utf-8" %>OK.
4.14.2.5. アクセス権の設定¶
<sec:intercept-url>
を設定する。/healthcheck
配下の除外設定を行う例を以下に示す。spring-security.xml
<sec:http once-per-request="false">
<sec:intercept-url pattern="/healthcheck/**" access="permitAll"/>
<!-- omitted -->
</sec:http>
Note
認可制御を外すと、誰でもヘルスチェック用URLにアクセスできるようになってしまうので、 外部からアクセスされたくない場合はLBなどで防ぐ対処が必要である。
4.14.3. Appendix¶
4.14.3.1. レスポンスのデータ量を最低限にする設定¶
上記について、それぞれ実装例を以下に示す。
4.14.3.1.1. Apache Tilesの設定を受けないようにする¶
<put-attribute>
タグに従わないディレクトリ配下にJSPファイルを配置する必要がある。/WEB-INF/views/{1}/{2}.jsp
に該当するJSPにApache Tilesが適用される設定となっているため、1階層深いディレクトリを作成し、/WEB-INF/views/common/healthcheck/
配下にJSPファイルを配置している。4.14.3.1.2. ヘッダファイルやフッタファイルを読み込まないようにする¶
<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.14.3.1.3. レスポンスから余計な改行を削除する¶
<%@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には改行が出力されてしまう。
Warning
WebLogicを使用した場合、上記に示したtrimDirectiveWhitespaces
属性を設定しても、<%@page>
ディレクティブよりも前に余計な文字があった場合に改行が削除されない。
そのため、別の方法で対応する必要がある。
例として、web.xmlの<jsp-property-group>
タグに、<trim-directive-whitespaces>
タグを設定する対応法を以下に示す。
web.xml(<trim-directive-whitespaces>タグを設定する場合)
<jsp-config> <jsp-property-group> <url-pattern>/WEB-INF/views/common/healthcheck/ok.jsp</url-pattern> // (1) <el-ignored>false</el-ignored> <page-encoding>UTF-8</page-encoding> <scripting-invalid>false</scripting-invalid> <trim-directive-whitespaces>true</trim-directive-whitespaces> // (2) </jsp-property-group> </jsp-config>
項番
説明
(1) ok.jspのみに<trim-directive-whitespaces>
タグを適用するため、<url-pattern>
タグでok.jspのみを指定する。 (2)<trim-directive-whitespaces>
タグにtrue
を設定することで、対象のJSPファイル(ok.jsp)から余計な改行を削除する。