Python での OpenTelemetry の問題のトラブルシューティング
この記事では、Python で OpenTelemetry の問題をトラブルシューティングする方法について説明します。
トラブルシューティング チェックリスト
手順 1: 診断ログを有効にする
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)
...
手順 2: アプリケーション ホストとインジェスト サービス間の接続をテストする
Application Insights SDK とエージェントはテレメトリを送信して、インジェスト エンドポイントで REST 呼び出しとして取り込まれます。 Web サーバーまたはアプリケーション ホスト コンピューターからインジェスト サービス エンドポイントへの接続をテストするには、cURL コマンドまたは PowerShell からの生の REST 要求を使用します。 詳細については、「 Azure Monitor Application Insights で不足しているアプリケーション テレメトリのトラブルシューティング」を参照してください。
手順 3: テレメトリの重複を回避する
多くの場合、プロセッサまたはエクスポーターの複数のインスタンスを作成すると、テレメトリの重複が発生します。 テレメトリの柱 (ログ、メトリック、分散トレース) ごとに一度に実行するエクスポーターとプロセッサは 1 つだけであることを確認します。
次のセクションでは、テレメトリの重複を引き起こす可能性があるシナリオについて説明します。
Azure Functions でのトレース ログの重複
Application Insights 内のトレース ログごとにエントリのペアが表示される場合は、次の種類のログ インストルメンテーションが有効になっている可能性があります。
- Azure Functions のネイティブ ログ インストルメンテーション
- ディストリビューション内の
azure-monitor-opentelemetry
ログ インストルメンテーション
重複を防ぐために、ディストリビューションのログ記録を無効にできますが、Azure Functions のネイティブ ログ インストルメンテーションは有効のままにします。 これを行うには、環境変数を にNone
設定しますOTEL_LOGS_EXPORTER
。
Azure Functions の "Always On" でのテレメトリの重複
Azure Functions の [Always On] 設定が [オン] に設定されている場合、Azure Functions は、各実行が完了した後もバックグラウンドで実行中のプロセスを保持します。 たとえば、毎回を呼び出す configure_azure_monitor
5 分間のタイマー関数があるとします。 20 分後に、4 つのメトリック エクスポーターが同時に実行されている可能性があります。 この状況は、重複するメトリック テレメトリのソースである可能性があります。
このような場合は、[ Always On] 設定を [オフ] に設定するか、各 configure_azure_monitor
呼び出しの間にプロバイダーを手動でシャットダウンしてみてください。 各プロバイダーをシャットダウンするには、次のコードに示すように、現在のメーター、トレーサー、ロガー プロバイダーごとにシャットダウン呼び出しを実行します。
get_meter_provider().shutdown()
get_tracer_provider().shutdown()
get_logger_provider().shutdown()
Azure ブックと Jupyter Notebook
Azure Workbooks と Jupyter Notebook は、エクスポーター プロセスをバックグラウンドで実行し続ける場合があります。 テレメトリの重複を防ぐには、 への呼び出しを増やす前にキャッシュをクリアします configure_azure_monitor
。
手順 4: Flask 要求データが収集されていることを確認する
Flask アプリケーションを実装する場合、 Python 用 Azure Monitor OpenTelemetry Distro クライアント ライブラリを使用しているときに、Application Insights から Requests テーブル データを収集できない場合があります。 この問題は、宣言を正しく構成しない場合に発生する可能性があります import
。 関数を呼び出configure_azure_monitor
して Flask ライブラリをflask.Flask
インストルメント化する前に、Web アプリケーション フレームワークをインポートしている可能性があります。 たとえば、次のコードでは Flask アプリが正常にインストルメント化されません。
from azure.monitor.opentelemetry import configure_azure_monitor
from flask import Flask
configure_azure_monitor()
app = Flask(__name__)
代わりに、モジュール全体を flask
インポートしてから、 を呼び出 configure_azure_monitor
して、アクセス flask.Flask
する前に Azure Monitor を使用するように OpenTelemetry を構成することをお勧めします。
from azure.monitor.opentelemetry import configure_azure_monitor
import flask
configure_azure_monitor()
app = flask.Flask(__name__)
または、 をインポートflask.Flask
する前に を呼び出configure_azure_monitor
すことができます。
from azure.monitor.opentelemetry import configure_azure_monitor
configure_azure_monitor()
from flask import Flask
app = Flask(__name__)
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。