この記事では、Python で OpenTelemetry の問題をトラブルシューティングする方法について説明します。
トラブルシューティングのチェックリスト
診断ログを有効にする
Microsoft Azure Monitor Exporter では、内部ログに Python 標準のログ ライブラリを使用します。 OpenTelemetry API と Azure Monitor Exporter のログには、不規則なアクティビティに対して重要度レベルの WARNING
または ERROR
が割り当てられます。 INFO
重要度レベルは、通常または正常なアクティビティに使用されます。
既定で、Python ログ ライブラリでは重要度レベルが WARNING
に設定されます。 そのため、この重要度設定を下回るログを表示するには重要度レベルを変更する必要があります。 次のコード例では、すべての重要度レベルのログをコンソールとファイルに出力する方法を示しています。
...
import logging
logging.basicConfig(format = "%(asctime)s:%(levelname)s:%(message)s", level = logging.DEBUG)
logger = logging.getLogger(__name__)
file = logging.FileHandler("example.log")
stream = logging.StreamHandler()
logger.addHandler(file)
logger.addHandler(stream)
...
アプリケーション ホストとインジェスト サービスの間の接続をテストする
Application Insights SDK とエージェントからテレメトリが送信され、インジェスト エンドポイントで REST 呼び出しとして取り込まれます。 Web サーバーまたはアプリケーション ホスト コンピューターからインジェスト サービス エンドポイントへの接続をテストするには、cURL コマンドまたは PowerShell の生の REST 要求を使用します。 詳細については、「Azure Monitor Application Insights でアプリケーション テレメトリがない場合のトラブルシューティング」を参照してください。
テレメトリの重複を回避する
多くの場合、プロセッサまたはエクスポーターの複数のインスタンスを作成すると、テレメトリの重複が発生します。 テレメトリの柱 (ログ、メトリック、分散トレース) ごとに、一度に 1 つのエクスポーターとプロセッサのみを実行してください。
次のセクションでは、テレメトリの重複を引き起こす可能性があるシナリオについて説明します。
Azure Functions でトレース ログを複製する
Application Insights 内のトレース ログごとにエントリのペアが表示される場合は、次の種類のログ インストルメンテーションが有効になっている可能性があります。
- Azure Functions のネイティブ ログ インストルメンテーション
- ディストリビューション内の
azure-monitor-opentelemetry
ログ インストルメンテーション
重複を防ぐために、ディストリビューションのログ記録を無効にできますが、Azure Functions のネイティブ ログ インストルメンテーションは有効のままにしておきます。 これを行うには、OTEL_LOGS_EXPORTER
環境変数を None
に設定します。
Azure Functions の "Always On" でテレメトリを複製する
Azure Functions の Always On 設定が On に設定されている場合、Azure Functions では、実行が完了するたびに一部のプロセスがバックグラウンドで実行され続けます。 たとえば、毎回 configure_azure_monitor
を呼び出す 5 分間のタイマー関数があるとします。 20 分後に、4 つのメトリック エクスポーターが同時に実行される場合があります。 この状況が、重複するメトリック テレメトリの原因である可能性があります。
このような場合は、Always On 設定を Off に設定するか、各 configure_azure_monitor
呼び出しの間にプロバイダーを手動でシャットダウンしてみてください。 各プロバイダーをシャットダウンするには、次のコードに示すように、現在のメーター、トレーサー、およびロガー プロバイダーごとにシャットダウン呼び出しを実行します。
get_meter_provider().shutdown()
get_tracer_provider().shutdown()
get_logger_provider().shutdown()
Azure Workbooks と Jupyter Notebook
Azure Workbooks と Jupyter Notebook は、エクスポーター プロセスをバックグラウンドで実行し続ける場合があります。 テレメトリの重複を防ぐには、configure_azure_monitor
に対してさらに呼び出しを行う前にキャッシュをクリアします。
FastAPI または Flask アプリからの要求テレメトリが欠落している
Requests テーブル のデータが見つからないが、他のカテゴリのデータがない場合は、HTTP フレームワークが正しくインストルメント化されていない可能性があります。 この問題は、import
宣言を正しく構造化していない場合Azure Monitor OpenTelemetry Distro クライアント ライブラリ for Python を使用する FastAPI および Flask アプリで発生する可能性があります。 configure_azure_monitor
関数を呼び出して FastAPI と Flask ライブラリをインストルメント化する前に、fastapi.FastAPI
または flask.Flask
をそれぞれインポートしている可能性があります。 たとえば、次のコードでは FastAPI と Flask アプリが正常にインストルメント化されません。
# FastAPI
from azure.monitor.opentelemetry import configure_azure_monitor
from fastapi import FastAPI
configure_azure_monitor()
app = FastAPI()
# Flask
from azure.monitor.opentelemetry import configure_azure_monitor
from flask import Flask
configure_azure_monitor()
app = Flask(__name__)
代わりに、fastapi
または flask
モジュール全体をインポートし、fastapi.FastAPI
または flask.Flask
にアクセスする前に、configure_azure_monitor
を呼び出して OpenTelemetry を構成して、Azure Monitor を使用することをお勧めします。
# FastAPI
from azure.monitor.opentelemetry import configure_azure_monitor
import fastapi
configure_azure_monitor()
app = fastapi.FastAPI(__name__)
# Flask
from azure.monitor.opentelemetry import configure_azure_monitor
import flask
configure_azure_monitor()
app = flask.Flask(__name__)
または、fastapi.FastAPI
または flask.Flask
をインポートする前に configure_azure_monitor
を呼び出すことができます。
# FastAPI
from azure.monitor.opentelemetry import configure_azure_monitor
configure_azure_monitor()
from fastapi import FastAPI
app = FastAPI(__name__)
# Flask
from azure.monitor.opentelemetry import configure_azure_monitor
configure_azure_monitor()
from flask import Flask
app = Flask(__name__)
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。