SK VMS サーバーAPI 初級応用編 -サーバー情報を取得-
SK VMSの知識 —
サーバー監視でお困りの皆様、こんにちは。
SK VMS APIの続編です。
前回は具体的なAPIの使い方について触れました。
その中で扱ったAPIは「通常操作をHTTPでもできる」といった形で、どちらかといえばユーザー向けのAPIでした。
今回は一転、管理者向けとしてAPIでデータを受け取って利用する方法について紹介します。サーバー監視としてはここからが本番ですね。
データ形式の都合や自動化を考慮して、プログラムで扱うときの概念をメインに取り扱います。Windows のC#でもよいのですが、今回は筆者の好みでUbuntuのbash (シェルスクリプト) での例を紹介します。情報量を要点に絞るため、プログラム言語に依存する部分はできるだけぼんやりと記述します。
====
対象読者:
- サーバー情報を自動的に取得したい
- その他サーバーから受け取った情報をプログラムで処理したい
====
例として、サーバーの負荷状況を確認してみましょう。
webブラウザで確認
いきなりプログラム編に入る前に、準備運動としてwebブラウザでデータ構造を確認してみます。入門編でも少し触れましたが、SK VMS APIのレスポンスはJSONという文字列で提供されます。そのままだと、改行もインデントもされない非常に長い1行の文字列が表示されてしまい、人間にとっては非常に読みにくいです。
Google ChromeではJSON Viewer等の拡張機能を入れることで、人間にとって読みやすいように表示することができます。今回はChrome + 拡張機能のキャプチャを掲載します。また、Firefoxは基本機能のみでJSONデータを綺麗に表示してくれますので、こちらもおすすめです。
IEでは表示する前にファイルダウンロード扱いになってしまいますので、この用途には不向きです。Chromium版EdgeであればChrome拡張機能を使えると思いますので、可能であればそちらを使いましょう。
それでは早速APIを使ってデータを取得してみましょう。
自分のPCにSK VMSサーバーをインストールしている場合、サーバーの負荷状態は次のアドレスにて確認できます。
http://localhost:7001/api/statistics
(localhostの部分は適宜サーバーIPに置き換えてください。)
このように表示されました。JSON構造は基本的に次のようになっています。
{
“キー1”: “値1”,
“キー2”: “値2”
}
画像の場合、「error」の値が”0″、「errorString」が空文字列(なし)、「reply」は入れ子のデータを持っているというように見ていきます。
イメージしにくい方は、ファイル・フォルダの構造に置き換えると理解しやすいかもしれません。errorファイルの中には”0″とだけ書かれていて、errorStringは中身のないファイル、replyはフォルダのイメージです。
「reply」の中身を開けてみると、次のようになります。
「statistics」がまた入れ子のデータ、「updatePeriod」は”2000″、「uptimeMs」は”330928438″というデータを持っています。「statistics」は今までと違い、波括弧のほかに角括弧が使われています。後々情報の取り出し方に関わってきますので、頭の片隅に留めておいてください。「statistics」の中身は次の枠内のようになっています。CPUやメモリ、ハードディスクやネットワークの使用率(最大値=1)等が格納されています。
プログラムで扱う
サーバー負荷状況のデータ構造が把握できたので、プログラムで値を取り出してみましょう。Ubuntuのbash (シェルスクリプト) での例を記載していきます。
ブラウザで見たときと同じ状態まで
まず、プログラム内でwebブラウザのようにHTTPでデータを取得しなければなりません。これにはcurlコマンドが便利です。JSON文字列からデータを取り出すためには、jqコマンドを使用します。
組み合わせると、次のようになります。
$ curl -sS -k -X GET -u “userID:password” “https://localhost:7001/api/statistics” | jq
curlコマンドでは、「-sS」「-k」「-X GET」というオプションが付いていますが、きちんと動くためのおまじないだと思ってください。-u のあとに”[ユーザー名]:[パスワード]”を指定し、最後に接続先URLを指定しています。
このまま実行しても情報を取ることはできますが、ひたすら長い文字列が表示されてしまうことになるので、パイプ「|」を使ってjqコマンドに整形してもらいます。これで、ブラウザで見ていたときと同じ状態になりました。
情報を指定して取り出す
さて、ついに目的の情報を取り出します。
まずは第一階層にあった「error」「errorString」「reply」について見ていきましょう。
jqコマンドで取り出したい情報(キー)を指定すれば、対応する値だけを取り出してくれます。
3つの例を表示します。キー指定の先頭の「.」はおまじないと思ってつけておきましょう。
$ curl -sS -k -X GET -u “userID:password” “https://localhost:7001/api/statistics” | jq ‘.error’
$ curl -sS -k -X GET -u “userID:password” “https://localhost:7001/api/statistics” | jq ‘.errorString’
$ curl -sS -k -X GET -u “userID:password” “https://localhost:7001/api/statistics” | jq ‘.reply’
「error」「errorString」は値だけ取り出せましたが、「reply」は中身がそのまま出ていますね。やはりこのままでは扱いにくいので、次は「reply」の下、第二階層のデータを取り出します。やることは同じで、取り出すデータ階層を「.」で繋いでいきます。
$ curl -sS -k -X GET -u “userID:password” “https://localhost:7001/api/statistics” | jq ‘.reply.updatePeriod”
さらに次の階層、「statistics」の中も見ていきたいところですが、ここには角括弧が使われているので少しだけ記法が変わります。
$ curl -sS -k -X GET -u “userID:password” “https://localhost:7001/api/statistics” | jq “.reply.statistics[]’
さて、ここから先は今までのように {“キー1”: “値1”} のような構造になっていません。一見そうなっているようにも見えますが、角括弧の中は
[{“値1”},{“値2”},{“値3”},{“値4”},{“値5”}]
のようになっていたため、今までのような値の指定方法はできなくなっています。
たとえば今までと同じように「description」を指定すると、
$ curl -sS -k -X GET -u “userID:password” “https://localhost:7001/api/statistics” | jq ‘.reply.statistics[].description’
このように5つそれぞれのブロックから「description」キーを取り出してしまいます。このような動作が都合のいい場合もありますが、そういうケースばかりではないと思います。
例えばメモリ使用率だけが気になる場合は、次のように取り出します。
$ curl -sS -k -X GET -u “userID:password” “https://localhost:7001/api/statistics” | jq ‘.reply.statistics[] | select(.deviceType==”StatisticsRAM”).value’
「statistics」の中身まで表示させたあと、パイプ「|」を利用してselect句を使います。この書き方だと「deviceType」の値が「StatisticsRAM」であるブロックから「value」で示される値を取得していることになります。
$ curl -sS -k -X GET -u “userID:password” “https://localhost:7001/api/statistics” |
jq ‘.reply.statistics[] | select(.deviceType == “StatisticsCPU” or .deviceType == “StatisticsRAM”).value’
のようにすれば、and検索やor検索も可能です。
他の言語では?
他の言語(C#やJavaScript等)でも基本的な考え方は同じで、HTTPのリクエストの仕方、レスポンスの受け取り方、JSONオブジェクトの扱い方などを、それぞれの言語が定める書き方に従って同じように書いていけば目的の値を取得できます。
最後に
第三部にしてやっとサーバー監視らしい情報が出ましたが、いかがでしたか?
目的の値が取れれば、ファイルに書き出す、値を判定して一定値以上なら警告メール送信、などなど自由に処理を組み立てることができますね。また、作成したプログラムはWindowsでいえばタスクスケジューラ、Linuxでいえばcronに登録することで、定期的に実行することができます。これまでの情報を駆使すれば、ストレージは無事か、カメラは切断されていないかなど、画面を見ていなくても診断することができるようになります。
次回は中級編、APIでカメラ登録をしてみます。今までと違い、HTTPのPOSTメソッドを使用していきます。POSTをつかいこなすことで、情報取得だけでなく設定までAPIで行えるようになります。
ちなみに、APIの使い方は中級編でほぼ全て網羅できるため、最終回となる予定です。番外編は出るかもしれません。思い通りに使いこなせればAPI上級者です。ぜひ挑戦してみてください。
それでは、よきAPIライフを!
[関連ページ]SK VMS サーバーAPI 入門編 -APIとは-
https://sk-vms.systemk.co.jp/blog/knowledge/api.php
SK VMS サーバーAPI 初級編 -通知とブックマーク-
https://sk-vms.systemk.co.jp/blog/knowledge/api-notifications-bookmarks.php
SK VMS サーバーAPI 中級編 -コマンドによるカメラ登録-
https://sk-vms.systemk.co.jp/blog/knowledge/api-camera-registration.php