メインコンテンツまでスキップ

アプリの死活監視テンプレート

Version: 1
  • logging
Download Canvas JSON
logo

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 を実行する。本アセット単体で動作確認する場合は変更不要。
  • 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からログを取得できるようにする。
      ld-monitoring-flow

利用方法

単体での動作確認

  1. sa1 SideAppのEnvironment variablesとして、キーに LOG_ENDPOINTID、値に sequence ("死活監視Entity" のID) が設定されていることを確認する。
  2. デプロイボタンを押し、デプロイの完了を待つ。
  3. "死活監視SideApp" に接続されたEndpointのURL (https://studio.{env-id}.studio.exabase.ai/{namespace-id}/ws1/app/) を開くと、Streamlit死活監視のデモページを確認することができる。
    ld-monitoring-sa1
  4. "死活監視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

他のアセットとの連携

  • 本アセットは、 sa1 SideAppのInjectionファイルを書き換えて、ログ出力と死活監視機能を備えたStreamlitのSideAppを構築するために活用されることを想定されています。

  • 方法は以下の通りです。

    1. 本アセットの "死活監視Entity" とそれに接続されたEndpointのように、Canvasでログ送信先のEntityとそれを取得するためのEndpointを配置する。

    2. 本アセットの sa1 SideAppを、Injection機能などを利用して構築したいアプリケーションの動作になるように実装する。

    3. sa1 SideAppのInjectionファイル /app/src/app.py を参考に、死活監視やシーケンスログ送信のためのコードを記載する。具体的には下記の通り。

      1. モジュールをimportする。

        import os
        from utils.lifedeath_logger import LifeDeathLogger
      2. 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")
      3. 死活監視ログを管理する 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アプリケーションの本体のコーディングの前に、上記ブロックを記載する。
      4. 死活監視ログにアプリケーションからのメッセージをセットしたい場合、以下のようにする。

        lifedeath_worker.set_message(message_from_app)
        注記
        • message_from_app の部分に、任意の文字列(str)をセットする。
        • LifeDeathLogger の動作について:
          • 死活監視ログは約1秒毎にEntityを更新する。以下の順に動作する。
            1. set_message(message_from_app) によりStreamlitアプリケーションの最新ログを受け取る。
            2. message_from_app を受け取ったタイミングでタイムスタンプ(JST)を自動付与する。
            3. 次のEntity更新タイミング(1秒毎)に、死活監視ログとして message_from_app を含んだ形で、Entityへメッセージをセットする。
              • セットしたタイミングでタイムスタンプが追加で付与される。
              • この動作はStreamlitアプリケーションとは非同期。
    4. Canvasでの実装完了後、デプロイボタンを押し、デプロイの完了を待つ。

    5. 単体での動作確認 と同様に、ログ送信先のEntityに接続されたEndpointから、ログを取得できる。

関連情報

ツール

  • Streamlit
    • Streamlitは、WebアプリケーションをPythonで簡単に素早く構築できるフレームワークです。
    • streamlit.io

ご利用に際して留意事項

  • 本アセットは、ロングランテストを1週間程度行ったものであり、長期運用の品質が担保されたものではないことにご留意ください。