デビッド・ホープ
最近のブログ投稿で、 Elastic の無料でオープンなオブザーバビリティ レイヤーの使用を開始する方法を紹介しました。以下では、アプリケーション パフォーマンス モニタリング (APM) からのメトリクスの収集またはクラスター内のデータの追跡を無料で開始できるように、デプロイをスケーリングするために必要なことについて説明します。
Elastic Observability デプロイメントの一部として無料でオープンな Elastic APM を追加 - 8.x
APM とは何ですか?
アプリケーション パフォーマンスの監視により、アプリケーションがどこで時間を費やしているか、何を行っているか、他のどのアプリケーションやサービスを呼び出しているか、どのようなエラーや例外が発生しているかを把握できます。
さらに、APM では、レイテンシーやスループットなどの重要なパフォーマンス指標の履歴と傾向、およびトランザクションと依存関係の情報を表示することもできます。
SLA 違反アラートの設定、最新リリースの影響の測定、次の改善点の決定など、APM は根本原因の分析に役立ちます。これにより、ユーザー エクスペリエンスが向上し、平均解決時間が短縮されます。 ( MTTR ) はゼロに近づきます。
Elastic APM の詳細については、記事「オブザーバビリティ: アプリケーション パフォーマンスの監視/管理 (APM) の実践」を参照してください。
論理アーキテクチャ
Elastic APM は、Elastic Agent 内の APM 統合に依存しており、APM エージェントで計測されたアプリケーションから Elastic Observability クラスターにアプリケーション トレースとメトリック データを転送します。Elastic APM は、いくつかのプロキシ スタイルをサポートしています。
- Java、.NET、Go、Ruby、Python、Node.js、PHP、およびクライアント側 JavaScript を含む複数の言語をサポートするネイティブ Elastic APM エージェント
- OpenTelemetryで計測されたコード
- OpenTracingで計測されたコード
- Jaegerで計測されたコード
このブログでは、ネイティブの Elastic APM Python エージェントを使用してコードをインストルメント化する方法の簡単な例を提供しますが、全体的な手順は他の言語でも同様です。
Elastic APM Agent と Elastic Agent には大きな違いがあることに注意してください。上の画像でわかるように、これらは非常に異なるコンポーネントであるため、混同しないことが重要です。
エラスティック エージェントをインストールする
最初のステップは、エラスティック エージェントをインストールすることです。最初に Fleet をインストールする必要があります。または、Elastic Agent を個別にインストールすることもできます。このガイドに従って、 Elastic Agent をどこかにインストールします。これにより、アクセス可能な APM 統合エンドポイントが提供されます。Elastic Cloud では、APM 統合をホストしているため、この手順は必要ありません。以下を実行して、Elastic Agent が開始されていることを確認します。
curl <ELASTIC_AGENT_HOSTNAME>:8200
Elastic APM エージェントを使用してサンプル コードを計測する
さまざまな言語エージェントの指示はプログラミング言語によって異なりますが、大まかな流れは似ています。最初に、言語のネイティブ仕様でエージェントへの依存関係を追加してから、APM 統合を見つける方法をエージェントが認識できるようにエージェントを構成します。
好きなスタイルを試すことができますが、私が作成したこのPython の例を使用して、Python コマンドを説明します。
サンプル コードを入手する (または独自のコードを使用する)
まず、GitHub リポジトリのクローンを作成してから、次のディレクトリに移動します。
git clone https://github.com/davidgeorgehope/PythonElasticAPMExample
cd PythonElasticAPMExample
依存関係を追加する方法
Elastic APM の依存関係を追加するのは簡単です。github リポジトリの app.py ファイルを確認すると、次のコード行に気付くでしょう。
import elasticapm
from elasticapm import Client
app = Flask(__name__)
app.config["ELASTIC_APM"] = {
"SERVICE_NAME": os.environ.get("APM_SERVICE_NAME", "flask-app"),
"SECRET_TOKEN": os.environ.get("APM_SECRET_TOKEN", ""),
"SERVER_URL": os.environ.get("APM_SERVER_URL", "http://localhost:8200"),
}
elasticapm.instrumentation.control.instrument()
client = Client(app.config["ELASTIC_APM"])
Flask の Python ライブラリはトランザクションを自動的に検出できますが、次の例のように、コードでトランザクションを開始することもできます。
@app.route("/")
def hello():
client.begin_transaction('demo-transaction')
client.end_transaction('demo-transaction', 'success')
プロキシを構成する
エージェントは、アプリケーション トレース データを APM 統合に送信する必要があり、そのデータにアクセスできる必要があります。ローカルホストの IP でリッスンするようにエラスティック エージェントを構成したので、サブネット上のすべてのものがそれにデータを送信できます。以下のコードからわかるように、docker-compose.yml を使用して、環境変数を介して構成を渡します。独自の Elastic インストール用にこれらの変数を編集してください。
# docker-compose.yml
version: "3.9"
services:
flask_app:
build: .
ports:
- "5001:5001"
environment:
- PORT=5001
- APM_SERVICE_NAME=flask-app
- APM_SECRET_TOKEN=your_secret_token
- APM_SERVER_URL=http://host.docker.internal:8200
上記のいくつかの説明:
- service_name : これを省略すると、デフォルトでアプリケーションの名前になりますが、ここで上書きできます。
- secret_token :シークレット トークンを使用すると、APM サーバーへのリクエストを承認できますが、APM サーバーを SSL/TLS でセットアップし、シークレット トークンをセットアップする必要があります。エージェントと APM サーバー間で HTTPS を使用していないため、この行をコメントアウトします。
- server_url : これは、エージェントがエラスティック エージェント内の APM 統合にアクセスする方法です。エラスティック エージェントを実行しているホストの名前または IP に置き換えます。
Elastic APM 側の構成が完了したので、 READMEの手順に従って開始するだけです。
docker-compose up --build -d
ビルド手順には数分かかります。
http://localhost:5001にアクセスすると、実行中のサンプル アプリケーションに移動できます。サンプル コンテンツはあまりありませんが、APM データが生成されます。少しの負荷を生成するには、それらを数回リロードするか、簡単な小さなスクリプトを実行します。
#!/bin/bash
# load_test.sh
url="http://localhost:5001"
for i in {1..1000}
do
curl -s -o /dev/null $url
sleep 1
done
これは毎秒ページをリロードするだけです。
Kibana に戻り、APM アプリケーション (ハンバーガー アイコンからAPM を選択) に戻ると、新しいフラスコアプリサービスが表示されます(ローカル デプロイを実行したままにして、より多くの履歴を表示します)。
サービスの概要ページでは、サービスの正常性の概要が 1 か所に表示されます。あなたが開発者または SRE である場合、このページは次の質問に答えるのに役立ちます。
- 新しい展開はパフォーマンスにどのように影響しますか?
- 最も影響を受けるトランザクションは何ですか?
- パフォーマンスは基盤となるインフラストラクチャとどのように関連していますか?
このビューには、指定された期間 (この場合は過去 15 分間) 内にアプリケーション トレース データを Elastic APM に送信したすべてのアプリケーションのリストが表示されます。レイテンシ、スループット、エラー率を示すスパークラインもあります。Flask-appをクリックすると、サービスの概要ページが表示され、サービス内のさまざまなトランザクションが表示されます (トランザクションセクションで見られるように、スクリプトが / エンドポイントにアクセスしていることを思い出してください)。レイテンシ、スループット、エラー、エラー率の大きなグラフが得られました。
実際の負荷の下で実際のアプリケーションを計測すると、はるかに多くの接続 (およびエラー!) が表示されます。
トランザクション ビューでトランザクション (この場合はサンプル アプリケーションのデモトランザクショントランザクション) をクリックすると、どの操作が呼び出されたかを正確に確認できます。
これには、データベース クエリなどの外部サービスの呼び出しに関する詳細が含まれます。
次は何ですか?
Elastic オブザーバビリティ クラスターを起動して実行し、すぐに使用できるアプリケーション トレース データを収集したので、アプリケーションが使用する言語のパブリック API を調べて、APM データを次のレベルに引き上げることができます。これらの API を使用すると、カスタム メタデータの追加、ビジネス トランザクションの定義、カスタム スパンの作成などを行うことができます。さまざまな APM エージェント ( Java、Ruby、Pythonなど)の公開 API 仕様は、APM エージェントのドキュメント ページにあります。
Elastic APM について詳しく知りたい場合は、Elastic APM のクラウドネイティブへの移行に関するウェビナーを視聴して、Elastic APM がエコシステムで役立つその他の方法について学んでください。
可観測性クラスターを当社にホストしてもらうことに決めた場合は、 Elastic Cloud で Elasticsearch Serviceの無料トライアルにサインアップし、新しいクラスターを指すようにプロキシを変更できます。