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 フィードバック コミュニティに製品フィードバックを送信することもできます。