アプリの死活監視テンプレート
exaBase StudioのSideAppの動作ログを、外部のロギングシステムにEndpoint経由で送付する機能です。StreamlitによるSideAppから使われることを前提としています。
LOGを安定して取得すること、外部システムでロギングし死活監視や障害切り分けのためのシーケンスログを保管することを想定しています。
概要
想定ユーザー
- Studioで構築するアプリケーションの死活監視を行いたいユーザー。
- Studioで構築するアプリケーションのシーケンスログを外部からモニタリングしたいユーザー。
テンプレート動作
- 入力
- Environment variables
sa1
SideAppのEnvironment variablesとして、LOG_ENDPOINTID
を設定し、値に "死活監視Entity" のIDを設定する。本アセット単体で動作確認する場合は変更不要。
- ログの送信
sa1
SideAppのInjectionファイル/app/src/app.py
で、LifeDeathLogger
インスタンスのstart_worker
メソッドを呼び出し、ログをEntityに送信され続けるようにする。ログのメッセージを更新するには、start_worker
の返り値のメソッドset_message
を実行する。本アセット単体で動作確認する場合は変更不要。
- Environment variables
- Output
/sequence
EndpointにGETリクエストを送るとログを取得できる。レスポンスのJSONは、例えば下記のような形式。{
"data": {
"life_and_death_log": "2024/08/23 13:41:04, logging_counter:12548, last_message_from_app:app_log:2024/08/23 12:08:00, 223"
}
}
- Function
- シーケンスログをEntityに送り、Endpointからログを取得できるようにする。
- シーケンスログをEntityに送り、Endpointからログを取得できるようにする。
利用方法
単体での動作確認
sa1
SideAppのEnvironment variablesとして、キーにLOG_ENDPOINTID
、値にsequence
("死活監視Entity" のID) が設定されていることを確認する。- デプロイボタンを押し、デプロイの完了を待つ。
- "死活監視SideApp" に接続されたEndpointのURL (
https://studio.{env-id}.studio.exabase.ai/{namespace-id}/ws1/app/
) を開くと、Streamlit死活監視のデモページを確認することができる。 - "死活監視Entity" に接続されたEndpointの
/data
(https://studio.{env-id}.studio.exabase.ai/{namespace-id}/ws1/sequence/data
) にGETリクエストを送ると、ログを取得できる。具体例は下記。- curlコマンドにより死活監視情報を取得する場合
curl --max-time 5 -X GET https://studio.{env-id}.studio.exabase.ai/{namespace-id}/ws1/sequence/data
- watchとcurlコマンドにより1秒ごとに定期的に死活監視する場合
watch -n 1 'curl --max-time 5 -X GET https://studio.{env-id}.studio.exabase.ai/{namespace-id}/ws1/sequence/data'
- watchとcurlコマンドにより1秒ごとに定期的に死活監視してログファイルに残す場合
上記と組み合わせて異なるコマンドラインでログファイルの最新状態を閲覧し続ける場合
watch -n 1 'curl -w"¥n" --max-time 5 -X GET https://studio.{env-id}.studio.exabase.ai/{namespace-id}/ws1/sequence/data 1>>templog.txt'
tail -f templog.txt
- curlコマンドにより死活監視情報を取得する場合
他のアセットとの連携
-
本アセットは、
sa1
SideAppのInjectionファイルを書き換えて、ログ出力と死活監視機能を備えたStreamlitのSideAppを構築するために活用されることを想定されています。 -
方法は以下の通りです。
-
本アセットの "死活監視Entity" とそれに接続されたEndpointのように、Canvasでログ送信先のEntityとそれを取得するためのEndpointを配置する。
-
本アセットの
sa1
SideAppを、Injection機能などを利用して構築したいアプリケーションの動作になるように実装する。 -
sa1
SideAppのInjectionファイル/app/src/app.py
を参考に、死活監視やシーケンスログ送信のためのコードを記載する。具体的には下記の通り。-
モジュールをimportする。
import os
from utils.lifedeath_logger import LifeDeathLogger -
Studioの環境変数を読み込む。
# ---------------------------------------------
# 環境変数の取得 / get the environmental variables
# ローカル環境でdockerを動かす場合は同様に環境変数をDockerfile等で定義してください
# / be aware if to local docker test, all variables also set, such on Dockerfile or else
# ---------------------------------------------
NAMESPACEID = os.getenv("EBS_NAMESPACEID")
WORKSPACEID = os.getenv("EBS_WORKSPACEID")
LOG_ENDPOINTID = os.getenv("LOG_ENDPOINTID") -
死活監視ログを管理する
LifeDeathLogger
クラスのインスタンスを作成し、スレッドをスタートさせる。life_death_logger = LifeDeathLogger(NAMESPACEID, WORKSPACEID, LOG_ENDPOINTID)
# スレッドを1度だけスタートさせます / start the thread for the first time
# ページreloadでもlifedeath_workerが生き続けるようにしています / lifedeath_worker will continue when page loaded again
lifedeath_worker = None
if not life_death_logger.is_running():
lifedeath_worker = life_death_logger.start_worker()
else:
lifedeath_worker = life_death_logger.get_worker()ヒント- アプリケーションとは別スレッドで動作させることで、Coding時に意識すること無く、死活監視ログを送信し続けられる。
- Streamlitの特性に合わせて、SideAppのページの開き直し、リロード等に影響を受けることなく、死活監視スレッドは動作し続けるよう、
LifeDeathLogger
クラスが定義されている。Streamlitアプリケーションの本体のコーディングの前に、上記ブロックを記載する。
-
死活監視ログにアプリケーションからのメッセージをセットしたい場合、以下のようにする。
lifedeath_worker.set_message(message_from_app)
注記message_from_app
の部分に、任意の文字列(str)をセットする。LifeDeathLogger
の動作について:- 死活監視ログは約1秒毎にEntityを更新する。以下の順に動作する。
set_message(message_from_app)
によりStreamlitアプリケーションの最新ログを受け取る。message_from_app
を受け取ったタイミングでタイムスタンプ(JST)を自動付与する。- 次のEntity更新タイミング(1秒毎)に、死活監視ログとして
message_from_app
を含んだ形で、Entityへメッセージをセットする。- セットしたタイミングでタイムスタンプが追加で付与される。
- この動作はStreamlitアプリケーションとは非同期。
- 死活監視ログは約1秒毎にEntityを更新する。以下の順に動作する。
-
-
Canvasでの実装完了後、デプロイボ タンを押し、デプロイの完了を待つ。
-
単体での動作確認 と同様に、ログ送信先のEntityに接続されたEndpointから、ログを取得できる。
-
関連情報
ツール
- Streamlit
- Streamlitは、WebアプリケーションをPythonで簡単に素早く構築できるフレームワークです。
- streamlit.io
ご利用に際して留意事項
- 本アセットは、ロングランテストを1週間程度行ったものであり、長期運用の品質が担保されたものではないことにご留意ください。