アプリのロギングスクリプトのサンプル with Opensearch
Studio上で動作するアプリケーションのログを収集する仕組みとして、OpenSearchとOpenSearch Dashboardsのセットをデプロイするサンプルです。
また、このログ収集サーバに対して、ログを送信するサンプルのアプリ(Python)も付属しています。
OpensearchのスナップショットをAmazon S3へバックアップし、リストアすることも可能です(Amazon S3のアクセスキーが必要)。
紹介動画
概要
想定ユーザー
- ロギングを実装したいユーザー。
- PythonアプリケーションのログをOpenSearchに保存したいユーザー。
- OpenSearchに保存したログをOpenSearchダッシュボードで確認したいユーザー。
テンプレート動作
- 入力
- シークレット (スナップショットをAmazon S3に保存する場合に設定する)
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_SESSION_TOKEN
(任意。一 時的な認証情報を使用する場合に設定する。)
- Injection機能による初期設定
Dashboard
のSideAppにInjectionファイル/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml
のserver.basePath
の{namespace-id}
をCanvasのネームスペースIDに置き換える。
- ログの保存
app
ワークスペースのDummy log generation app
SideAppのInjectionファイル/app/src/app.py
に、ログを送信するためのコードが記載されている。本アセット単体で動作確認する場合は変更不要。
- シークレット (スナップショットをAmazon S3に保存する場合に設定する)
- Output
- 保存されたログをOpenSearchダッシュボードから確認できる。
- Function
- PythonアプリケーションのログをOpenSearchに保存する。
- OpenSearchダッシュボードでログを表示する。
利用方法
単体での動作確認
- スナップショットをAmazon S3に保存する場合、Canvasでシークレットとして下記を設定する。
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_SESSION_TOKEN
(任意。一時的な認証情報を使用する場合に設定する。)
- Canvasで
Dashboard
のSideAppにInjectionファイル/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml
のserver.basePath
の{namespace-id}
をCanvasのネームスペースIDに置き換える。
- デプロイボタンを押し、デプロイの完了を待つ。完了すると、
app
ワークスペースのDummy log generation app
SideAppが、30秒おきにログを出力する。 Dashboard
のSideAppに接続されたEndpointのURL (https://studio.{env-id}.studio.exabase.ai/{namespace-id}/log/dashboard/
) から、OpenSearchダッシュボードにアクセスする。- OpenSearchダッシュボードのメニューから "Discover" を開き、 "Create index pattern" から
python-logs-*
というインデックスパターンを作成する。Time field
としては、基本的には@timestamp
を用いる。 - 再度OpenSearchダッシュボードのメニューの "Discover" を開くと、ログを確認できる。
- スナップショットをAmazon S3に保存する場合は、OpenSearchダッシュボードから以下の設定を行う。
- メニューの "Snapshot Management" -> "Repositories" を開き、 "Create repository" から、下記のように入力してスナップショットリポジトリを登録する。
- Repository name:
{任意の名称}
- Repository type:
Custom configuration
- Custom configuration:
{
"type": "s3",
"settings": {
"bucket": "{bucket_name}",
"base_path": "{bucket_base_path}"
}
}
- Repository name:
- 自動的なスナップショット保存の設定をするために、 "Snapshot Management" -> "Snapshot policies" を開き、 "Create policy" から、表示されるフォームに入力する。
- メニューの "Snapshot Management" -> "Repositories" を開き、 "Create repository" から、下記のように入力してスナップショットリポジトリを登録する。
- スナップショットからログをリストアする場合、OpenSearchダッシュボードから以下のように操作する。
- "Snapshot Management" -> "Repositories" を開き、スナップショット設定時に設定したリポジトリがなければ、設定時と同様にスナップショットリポジトリを登録する。
- "Snapshot Management" -> "Snapshots" を開くと、保存していたスナップショットが表示される。リストアしたいスナップショットのチェックボックスをチェックし、 "Restore" を押す。表示に従ってリストアの設定を行い、 "Restore snapshot" を押す。
- メニューから "Discover" を開き、インデックスパターンがなければ、リストアしたログのインデックスにマッチするインデックスパターンを "Index pattern name" に入力し、インデックスパターンを作成する。
- 再度メニューの "Discover" を開くと、リストアしたログを確認できる。
他のアセットとの連携
-
本アセットは、PythonアプリケーションのログをOpenSearchとOpenSearch Dashboardsにより扱うための機能を、Studioで構築するアプリケーションに導入するために活用されることを想定されています。
-
方法は以下の通りです。
-
ロギング関連機能を導入したいCanvasに本アセットの
log
ワークスペースと同様のものを配置する。 -
アプリケーションのコードのログを取りたい箇所に、ロギングのコードを記述する。例えば、下記のように記述する。
import os
import logging
from opensearch_logger import OpenSearchHandler
logger = logging.getLogger(__name__)
logger.setLevel(level=logging.DEBUG)
openSearchHandler = OpenSearchHandler(
index_name="python-logs",
hosts=[f"{os.environ['LOG_ADDRESS']}:{os.environ['LOG_PORT']}"],
use_ssl=False,
raise_on_index_exc=True,
)
logger.addHandler(openSearchHandler)
logger.info("log message")なお、 opensearch-logger を、
pip install opensearch-logger
等により使用できるようにする必要がある。また、 上記コード中の
LOG_ADDRESS
とLOG_PORT
を、該当のSideApp等でEnvironment variablesとして設定する必要がある。それぞれの内容は下記。LOG_ADDRESS
:{OpenSearch SideAppが存在するワークスペース名}-{OpenSearch SideAppのID}
。log
ワークスペースの内容を変更していない場合は、値をlog-opensearch
とする。LOG_PORT
: OpenSearchのSideAppで該当プロ セスが待ち受けているポート。log
ワークスペースの内容を変更していない場合は、値を8080
とする。
その他、必要に応じて
app
ワークスペースのDummy log generation app
SideAppに設定されたEnvironment variablesとInjectionされた/app/src/app.py
を参考にする。 -
デプロイ後、 単体での動作確認 と同様に、OpenSearchダッシュボードからインデックスパターンやスナップショットの設定を行う。
-
再度OpenSearchダッシュボードのメニューのDiscoverを開くと、ログを確認できる。
-
関連情報
- OpenSearch
- OpenSearchは、ログ分析などの機能を有する検索エンジンです。
- OpenSearchにログを送信するPythonスクリプト中では、 opensearch-logger を使用しています。
- opensearch.org
- OpenSearch GitHub リポジトリ
- OpenSearch-Dashboards GitHub リポジトリ