簡単なWebサーバーの監視をする

今回は Web サーバーが公開する URL にリクエストを送り、死活監視を行うジョブフローを作成します。


環境情報

本稿は、以下の環境で検証しています。

項目 バージョン
Kompira Enterprise 1.5.5.post7
OS CentOS 7.8.2003

または

ソフトウェア バージョン
Kompira Enterprise 1.6.2.post4
OS CentOS 8.2.2004

以下のような処理の流れを想定しています。

  • 指定の URL にリクエストを送信し、応答がなければエラーを表示
  • HTTP のステータスコードが200以外の場合にはエラーを表示
  • 上記以外の場合には正常であると表示

まず WEB サーバーにリクエストを送信する方法ですが、以下のような Kompira Enterprise の組み込み関数 urlopen() を使います。引数で指定した url に対して、HTTP リクエストを送信し、結果を取得します。

urlopen(url [, user, password, data, params, files, timeout, encode, http_method, verify, quiet, headers, cookies, charset, binary, proxies])

[ ] 内の引数は省略可能です。各引数の意味は以下の通りです。

user 、password Basic 認証によるアクセスを行います。
data 送信データを辞書型の値として格納し、HTTP の POST リクエストを送信できます。
params 辞書を渡すと URL のクエリ文字列として展開されます。
例えば urlopen(url=’http://example.com‘, params={key1=’value1’,key2=’value2’}) とすると、
実際にアクセスする URL は http://example.com?key1=value1&key2=value2 となります。
files アップロードするファイルを渡すことができます。ファイルは name と data というフィールドを持つ辞書、ファイル名とコンテンツのリスト、Kompira Enterprise サーバー上のファイル名、または添付ファイルフィールドのいずれかの形式で指定することができます。
例: files={file={name=’filename’, data=’content’}}
timeout タイムアウトするまでの時間を秒単位で指定します。
encode エンコードタイプとして “json” を指定することができます。
data が指定され encode が “json” のとき、HTTP リクエストの Content-Type ヘッダには自動的に application/json が設定されます。
encode 引数を省略した場合、送信データは application/x-www-form-urlencoded 形式でエンコードされます。
http_method HTTPリクエストのメソッドを ’GET’ 、‘POST’ 、‘PUT’ 、’DELETE’ 、‘HEAD’ のいずれかから指定します。
http_method を省略した場合、data が指定されていない場合は GET メソッド、指定されている場合は POST メソッドとなります。
verify true を指定すると、指定した URL が https アクセスである時に SSL 証明書のチェックを行います。
不正な SSL 証明書を検出するとurlopen ジョブはエラーになります。verify のデフォルト値は false です。
quiet true を指定すると、https アクセスした際に表示される警告メッセージを抑止します。
headers HTTP リクエストに設定するヘッダ情報を、辞書型の値で渡すことができます。
cookies サーバーに渡すクッキーを辞書型の値で渡します。
charset レスポンスとして期待する文字コードを指定することができます。
binary true を指定すると、Content-Type によらずコンテンツをバイナリとして扱います。
proxies HTTP リクエスト送信時のプロキシサーバー情報を辞書型の値で渡すことができます。
例: urlopen(‘http://www.kompira.jp’, proxies={‘http’: ‘http://10.10.1.10:3128’, ‘https’: ‘http://10.10.1.10:1080’})

urlopen()でアクセスに成功した場合の結果は、以下の要素を持つ辞書で返されます。code には HTTP のステータスコードが、body にはレスポンスの内容が格納されています。

フィールド名 説明
url レスポンスの URL
code 結果ステータスコード
text レスポンスの内容 (エンコード情報をもとにレスポンス本文をテキストにデコードしたもの。ただし、バイナリコンテンツの場合は空文字)
content レスポンスの内容 (バイナリのままのレスポンス本文)
body レスポンスの内容 (コンテンツがバイナリであると判断したときは content と同じ値になり、テキストであると判断したときは text と同じ値)
encoding エンコード情報
headers レスポンスに含まれるヘッダ情報 (辞書型)
cookies サーバーから渡されたクッキー値 (辞書型)
history リダイレクトがあった場合にその履歴情報 (リスト型)
binary バイナリコンテンツであるかの真偽値

これを用いて、Web サーバーにリクエストを送信するのは以下のようなコードになります。

| url = "http://www.kompira.jp/" |

urlopen(url)

続いて結果を判断して表示の切り替えを行います。
条件分岐は if ブロックを用いて行います。

{ if (条件式) |
  then: 
    (条件が真の場合の処理)
  else:
    (条件が偽の場合の処理)
}

urlopen() を実行した際、リクエストの送信に成功した場合には $STATUS が0に、失敗した場合は $STATUS が0以外になります。

よって、まずは urlopen() 自体が成功したかどうかで分岐する処理をします。

| url = "http://www.kompira.jp/" |

urlopen(url) =>
{ if $STATUS != 0 | 
  then:
    print("異常が検出されました")
  else:
    print("正常です")
}

具体的に失敗する場合は、urlopen() に指定したホスト名や IP アドレスが間違っていたり、ネットワークが接続できなかったということが原因であると考えられます。

さて、今回は「HTTP の応答コードが200以外の場合にはエラーを表示」としたいので、このコードだけでは十分ではありません。

ここに HTTP リクエストのステータスコードが200であるかどうかを確認する処理を追加してみましょう。

if ブロックで追加条件を指定する場合には elif 節を用います。

{ if (条件式) |
  then: 
    (条件が真の場合の処理)
  elif (追加条件式):
    (条件が偽、かつ追加条件が真の場合の処理)
  else:
    (条件が偽、かつ追加条件も偽の場合の処理)
}

これを用いて、HTTP のステータスコードが200以外の場合は異常とします。urlopen() の結果は $RESULT に辞書型で格納されており、”code” というキーで参照できます。

| url = "http://www.kompira.jp/" |

urlopen(url) =>
{ if $STATUS != 0 | 
  then: 
    print("異常が検出されました")
  elif $RESULT.code != 200:
    print("異常が検出されました。エラーコードは %{code}" % $RESULT)
  else:
    print("正常です")
}

HTTP リクエストに対する応答が正常でなかったときは、$RESULT.code が200以外になります。

例えば、存在しない URL パスを指定していたり、Web サーバー側で何らかのトラブルが発生している場合等があります。

本稿では HTTP GET リクエストを送信するのに urlopen() を使用しました。上記ではレスポンス中のステータスコードを確認するだけにとどまっていますが、サイトのコンテンツ内容の取得はもちろん、ファイルのダウンロードや外部の REST API 呼び出しなど、urlopen() は様々な場面で使用することができます。

TOP