December 21, 2021

分散トレース用のFlaskアプリケーションマニュアルインストルメンテーション

分散トレース用のFlaskアプリケーションマニュアルインストルメンテーション

このブログシリーズでは、複数の言語にまたがるOpenTelemetry標準を使用した分散トレースのアプリケーションインストルメンテーション手順を共有します。 以前にカバーしました 分散トレース用のJavaアプリケーションマニュアルインスツルメンテーション, 分散トレース用のGolangアプリケーションインストルメンテーション, 分散トレース用のノードJSアプリケーション, 分散トレース用のDotNetアプリケーションインストルメンテーション.  

このブログ投稿では、以下について説明します。

OpenTelemetryは、Cloud Native Computing Foundationによるプロジェクトであり、アプリケーションのテレメトリデータがダウンストリームのプラットフォームで記録および利用される方法を標準化することを目的としています。 このアプリケーショントレースデータは、アプリケーションの所有者がコード内のコンポーネントとサービスの関係、各ステップで導入されるリクエストの量と遅延、そして最終的にはユーザーエクスペリエンスの低下につながるボトルネックを理解するのに役立ちます。 PythonはOpenTelemetryがサポートする多くの言語のXNUMXつであり、FlaskはWebアプリケーションの作成に使用される人気のある軽量フレームワークです。 以下では、基本的なFlaskアプリケーションをインストルメント化するための手順について説明します。

OpenTelemetryについてもっと読むことができます 詳細を見る

インストール

受験資格:

  • Pythonがインストールされています(3.7以降)。
  • 選択したIDE(PyCharmなど)
  • IDEを入手したら、プロジェクトを選択します(または、フォローしているだけの場合は、新しいプロジェクトを作成します)。 私は自分の名前を「楽器-フラスコ-アプリ"。
  • virtualenv — PyCharmを使用している場合、これについて心配する必要はありません。

プロジェクトを初期化します。

次のライブラリをインストールします。

pip install flask
pip install opentelemetry-api
pip install opentelemetry-sdk
pip install opentelemetry-opentelemetry-instrumentation-flask
pip install opentelemetry-exporter-otlp

ルートプロジェクトディレクトリ「instrument-flask-app」の下にファイル「app.py」を作成します。

Instrument-flask-app
	|___ app.py

次のライブラリをインポートします。

from flask import Flask  			
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider		
from opentelemetry.instrumentation.flask import FlaskInstrumentor
from opentelemetry.sdk.trace.export import BatchSpanProcessor,          ConsoleSpanExporter
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import   OTLPSpanExporter

Flaskアプリインスタンスを作成します。

app = Flask(__name__)

トレースプロバイダーを構築します。

trace.set_tracer_provider(TracerProvider())

スパンエクスポーターの初期化:

エクスポータは、テレメトリ信号(トレース)をアプリケーションからリモートバックエンドにエクスポートし、ファイルにログを記録し、stdoutにストリーミングするSDKのコンポーネントです。 この例では、ローカルホストで実行されているOpenTelemetryレシーバーバックエンドにトレースを送信するgRPCエクスポーターを作成しています。 

trace.get_tracer_provider().add_span_processor(BatchSpanProcessor
(OTLPSpanExporter(endpoint=os.environ.get("LM_OTEL_ENDPOINT"),insecure=True)))

注:オプションで、次のようにして、アプリケーションから出力されたトレースをコンソールに出力することもできます。

trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))

OTELコレクタエンドポイントを設定します。

OTELコレクターのエンドポイントである環境変数LMOTEL_ENDPOINTを設定する必要があります。 トレースは、次のようにして出力されます。

export  LM_OTEL_ENDPOINT=http://<HOSTNAME>:<PORT>

リソース検出器を作成します。

リソースは、を生成したオブジェクトを記述します テレメトリー 信号。 基本的に、これはサービスまたはアプリケーションの名前である必要があります。 LogicMonitorでは、これらの属性を使用して、LogicMonitor内ですでに監視しているデバイスまたはリソースにマップできます。

  • Service.namespace: サービスをグループ化するために使用されます。 たとえば、これを使用して、QA、UAT、PRODなどの環境間でサービスを区別できます。
  • サービス名: サービスの論理名。
  • Host.name:サービスが実行されているホストの名前。

環境変数を次のように設定します。

export OTEL_RESOURCE_ATTRIBUTES=service.namespace=opentelemetry,service.name=instrument-flask-app,host.name=localhost

Flaskアプリオブジェクトの自動インスツルメンテーション:

FlaskInstrumentor().instrument_app(app)

インストルメンテーションをテストするエンドポイントを定義します。

@app.route("/hello") 
def hello():  
   return "Hello World!" 

Flaskアプリの実行:

Flaskアプリは、デフォルトでポート5000で実行されます。

if __name__ == "__main__":  	# on running python app.py
        app.run()  			# run the flask app

それを一緒に入れて:

# app.py

from flask import Flask
from opentelemetry import trace
from opentelemetry.instrumentation.flask import FlaskInstrumentor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter importOTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor,ConsoleSpanExporter

app = Flask(__name__) 
trace.set_tracer_provider(TracerProvider())

# To print the traces on the console
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))

# To send the traces to the configured OTEL collector
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(
OTLPSpanExporter(endpoint=os.environ.get("LM_OTEL_ENDPOINT"), insecure=True)))

@app.route("/hello")  
def hello():  
       return "Hello World!"  


if __name__ == "__main__":  
   app.run()

アプリケーションをテストする

Pythonアプリを実行して、アプリケーションをテストしてみましょう。 サーバーは次のように起動する必要があります。

python app.py
Pythonアプリケーションのテスト

成功! 

ブラウザからエンドポイント(「http://127.0.0.1:5000/hello」)にアクセスすると、LogicMonitorポータルでトレースを確認できるはずです。 

LogicMonitorでの成功を示すトレース

トレースをクリックすると、追加情報を表示できます。

LogicMonitorのトレースの追加情報。

コンソールのトレースは次のようになります。

コンソールの例内のトレース。

次のステップ

おめでとうございます。OpenTelemetryProtocol(OTLP)仕様を使用して、トレースを出力するフラスコベースのPythonアプリケーションをインストルメント化しました。 これで、アプリケーションを可視化し、アプリケーションコードに存在する潜在的なボトルネックに対処できるようになります。 すでにLogicMonitorを使用してインフラストラクチャを監視したり、ログを収集している場合は、これらのトレースを関連付けて、トラブルシューティングを高速化できます。 

まだログを送信していない場合は、試してみてください 詳細を見る LogicMonitorに取り込むことができるコンテキストの量をさらに充実させるため。 

外部リソース

OpenTelemetryとCNCFの詳細については、次のリソースをお勧めします。

  • Slackコミュニティに参加する 詳細を見る.
  • 彼らのOTelドキュメントをチェックしてください 詳細を見る.
  • 詳細を読むか、OTelPythonリポジトリにフィードバックを残してください 詳細を見る.

他のアプリケーション言語にまたがるOpenTelemetry標準を使用した分散トレースの手順をカバーする他のブログをチェックしてください。