30代半ばの事務職員がITエンジニアになった話

おおよそタイトルのとおり、30代半ばにしてITエンジニアのタマゴになってしまった会社員の話

【Java】JavaからPingを打ってNGならエラーページを返すプログラム(死活監視の一環)

背景


・AサーバーとBサーバーが存在

・AサーバーはBサーバーへの通信が
 できないと徐々にエラーを蓄積し
 最後にはハングアウトする問題を
 抱えている

・なのでAサーバーからBサーバーへ通信
 できなくなった時点で検知したい

・監視サーバーが存在

・監視サーバー⇒Aサーバー
 監視サーバー⇒Bサーバー
 の通信は監視できるものの
 Aサーバー⇒Bサーバーへの
 監視はできない

・監視サーバーにはWebページ監視の
 機能があり指定されたWebページに
 アクセスして200(正常)以外のコード
 が返ってきたらアラートを出す

・AサーバーにはApachetomcat
 搭載されている


     ↓


Aサーバーに、BサーバーへPingを打って
NGならエラーページを返すプログラムを
Javaで作成してWebページとして置くことで
既存の監視をそのまま活用できるようにした




プログラム


単純なプログラムなので
Javaのコードとしてはだいぶすっきりしている
と思われる

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Ping  extends HttpServlet  {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		boolean success = false;
		String buffer;
		String result = null;
		String TIMEOUT = "255"; 

		FileInputStream FileInputStream = new FileInputStream("/webapps/Ping/Host_IP.txt");
		BufferedReader BufferReader1 = new BufferedReader(new InputStreamReader(FileInputStream));
		String target = BufferReader1.readLine();

		 String[] command = {"ping", "-c", "1", "-t", TIMEOUT, target};

		InputStream InputStream = new ProcessBuilder(command).start().getInputStream();
		BufferedReader BufferReader2 = new BufferedReader(new InputStreamReader(InputStream));

		int i = 0;
		while((buffer = BufferReader2.readLine()) != null) {

			if(i == 1) {
				if(!buffer.contains("Unreachable")) {
					success = true;
				}
				result = buffer;
			}
			i = i + 1;
		}

		PrintWriter out = response.getWriter();

		if(success) {
			out.println("<html><head><title>OK</title></head><body>" + result + "</body></html>");

		} else {
			response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

		}

		out.close();
	}


 

自然言語に翻訳


Webページを表示させるので
当然ながらサーブレットクラスを継承

public class Ping  extends HttpServlet  {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

変数部分の宣言

boolean success = false; //PingがOKのときにtrueにする
String buffer; //Pingの結果を格納する文字列
String result = null; //Pingの結果をWebページに表示するための文字列
String TIMEOUT = "255";  //ping のタイムアウト(ms)

Pingの対象となるIPはプログラムを修正しなくても
IPの変更ができるよう外部ファイルに記載

FileInputStream FileInputStream = new FileInputStream("/webapps/Ping/Host_IP.txt"); //外部ファイルの指定
BufferedReader BufferReader1 = new BufferedReader(new InputStreamReader(FileInputStream)); //ファイルを読み込む
String target = BufferReader1.readLine(); //ファイル内の文を読み取る

Pingのコマンドを変数に入れる
WindowsLinuxでコマンドが微妙に違う

// Windows の場合
String[] command = {"ping", "-n", "1", "-w", TIMEOUT, target};
//-n 1 でPingを1回だけ -w xxx でタイムアウトを指定
//Linux の場合
String[] command = {"ping", "-c", "1", "-t", TIMEOUT, target};
//-c 1 でPingを1回だけ -t xxx でタイムアウトを指定

変数に入れたPingコマンドを実行する

InputStream InputStream = new ProcessBuilder(command).start().getInputStream();  //コマンドを実行して変数に入れる
BufferedReader BufferReader2 = new BufferedReader(new InputStreamReader(InputStream));  //コマンドの実行結果を変数に入れる

Pingの結果を変数に格納する

while((buffer = BufferReader2.readLine()) != null) {   //Pingの結果を行ごとに見ていく
  if(i == 1) {     //2行目で
    if(!buffer.contains("Unreachable")) {    //接続できません的な文字がなければ
      success = true;       //フラグをON
    }
    result = buffer;      //結果表示用変数にPingの結果を格納
  }
  i = i + 1;
}

PingがOKなら通常ページを表示
PingがNGならエラーページを表示

PrintWriter out = response.getWriter();    //画面出力用
if(success) {    //フラグがONなら
  out.println("<html><head><title>OK</title></head><body>" + result + "</body></html>");   //申し訳程度にPing結果を表示するページ
} else {
  response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);    //OFFなら500エラーを返すページ
}
out.close();    //クローズが必要らしい