次の方法で共有


Python での OpenTelemetry に関する問題のトラブルシューティング

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