これらの Python チュートリアルのいずれかを試して、New Relic プラットフォームが OTLP データで何ができるかを確認してください。 選択できる 3 つのチュートリアルがあり、それぞれ同じデモ Flask アプリを使用しています。 アプリはフィボナッチ数列の n 番目の数値を計算し、トレース、メトリクス、ログを生成します。
これらのチュートリアルのいずれかを進めることで、OpenTelemetry と New Relic を使用して独自のアプリをセットアップするのに役立つスキルを学ぶことができます。
これらのチュートリアルのいずれかを完了すると、次のようなグラフでスパン メトリックを表示できるようになります。
要件
開始する前に、次のものが揃っていることを確認してください。
- New Relic アカウント:無料アカウントをまだお持ちでない場合は、サインアップしてください。
- Python 3.8 以降、および pip (Python バージョン 3.4 以降に含まれる): これらをまだお持ちでない場合は、これらの ダウンロード オプションを参照してください。
チュートリアル
各チュートリアルでは同じデモ アプリを使用しますが、OpenTelemetry と New Relic に慣れるのに役立つ異なるアプローチが用意されています。
- プレインストゥルメント化されたアプリ: プレインストゥルメント化されたデモ アプリを実行すると、UI でデータを簡単に確認できます。
- OpenTelemetry Python エージェント: OpenTelemetry Python エージェントを使用してデモ アプリを監視します。
- 手動セットアップ: デモアプリを手動でインストルメントしました。
完了したいチュートリアルに応じて、下のタブをクリックしてください。
ヒント
OpenTelemetry を使用する場合、OTLP 経由でアプリケーションから New Relic にデータをエクスポートするには 2 つの選択肢があります。
アプリから New Relic に直接
アプリは OpenTelemetry Collector にデータを送信し、そこで New Relic にエクスポートされます。
これらのチュートリアルでは、最初のオプションについて説明します。コレクター経由でデータをエクスポートする場合は、このコレクターのドキュメントで詳細を確認してください。
事前にインストルメント化されたデモ アプリを実行する
New Relic にデータを送信し、UI で表示するのがどのようなものかをすばやく確認できるように、インストルメンテーションを行う場合は、これが最適なオプションです。
ターミナルで次のコマンドを実行してデモ アプリのクローンを作成し、Getting Started Guides の
python/Instrumented
ディレクトリに移動します。git clone https://github.com/newrelic/newrelic-opentelemetry-examples.gitcd newrelic-opentelemetry-examples/getting-started-guides/python/InstrumentedNew Relic アカウントにデータを送信するには、次の環境変数を設定します。
必ずを使用してください。
New Relic データセンターのリージョンが EU で US ではない場合、エンドポイントを次のように設定します。
https://otlp.eu01.nr-data.net
- OTEL_EXPORTER_OTLP_HEADERS=api-key=INSERT_YOUR_NEW_RELIC_LICENSE_KEY
- OTEL_EXPORTER_OTLP_ENDPOINT= https://otlp.nr-data.net
この環境変数を設定してサービスに名前を付けます。これは、New Relic アカウントでサービスを識別する方法です。
- OTEL_SERVICE_NAME=入門-Python
同じ
getting-started-guides/python/Instrumented/
ディレクトリで、仮想環境を作成してアクティブ化し、必要なライブラリをインストールして、アプリを実行します。マックOS:
python3 -m venv venvsource venv/bin/activatepip install -r requirements.txtpython3 app.pyパワーシェル:
python -m venv venv.\venv\Scripts\Activate.ps1pip install -r requirements.txtpython app.py
新しいターミナル タブを開き、
getting-started-guides/python/Instrumented
ディレクトリに切り替え、次のコマンドを実行してアプリケーションへのトラフィックを生成します:マックOS:
./load-generator.shパワーシェル:
.\load-generator.ps1
ヒント
または、ブラウザの次の URL でエンドポイントにアクセスできます:
http://localhost:8080/fibonacci?n=INSERT_A_VALUE
。INSERT_A_VALUE
を 1 から 90 の値に置き換えます。エラーを生成するには、有効範囲外の整数を挿入します。one.newrelic.com > All capabilities > APM & servicesに移動します。
getting-started-python
という新しいエンティティ (サービス) をクリックして、UI を調べます。UI で何を探すべきかについてのその他のヒントについては、New Relic でデータを表示するを参照してください。UI でデータを確認し終わったら、両方のターミナル セッションで
CONTROL+C
を押してアプリケーションをシャットダウンします。
OpenTelemetry Python エージェントを使用してデモ アプリを監視する
これは、同じデモ アプリを使用する別のチュートリアルですが、この場合は、OpenTelemetry Python エージェントを使用して、デモ アプリを自動的に監視します。Python ソース コードを変更する必要はありません。エージェントを使用すると、New Relic へのサンプル データのエクスポートをすぐに開始できます。
ただし、ログやカスタムメトリックなど、アプリに関するより深いレベルの情報を取得するには、カスタムインストゥルメンテーションを追加する必要があることに注意してください。
自動インストルメンテーション エージェントは、バイトコードを動的に挿入して、一般的なライブラリやフレームワークからテレメトリをキャプチャする一連の PyPI パッケージです。これを使用して、受信リクエスト、送信 HTTP 呼び出し、データベース呼び出しなどのデータをキャプチャすることもできます。任意の Python 3 アプリケーションに接続できます。
ヒント
追加の構成オプションについては 、OpenTelemetry Python エージェントの公式ドキュメントを 参照してください。
OpenTelemetry Python エージェントを使用してデモ アプリを監視するには:
これら 2 つのコマンドを実行して、デモ アプリケーション リポジトリをダウンロードし、次のディレクトリに移動します。
git clone https://github.com/newrelic/newrelic-opentelemetry-examples.gitcd newrelic-opentelemetry-examples/getting-started-guides/python/Uninstrumented以下の環境変数の参照セクションに移動して、エクスポートする必要がある変数を確認してから、これらの手順に戻ります。
次に、同じ
getting-started-guides/python/Uninstrumented/
ディレクトリに仮想環境を作成してアクティブ化します。マックOS:
python3 -m venv venvsource venv/bin/activateパワーシェル:
python -m venv venv.\venv\Scripts\Activate.ps1
これで、必要なライブラリをインストールする準備が整いました。
pip install flaskpip install opentelemetry-instrumentation-flaskpip install opentelemetry-exporter-otlppip install opentelemetry-distrogetting-started-guides/python/Uninstrumented/
に進み、アプリでエージェントを起動します。マックOS:
opentelemetry-instrument python3 app.pyパワーシェル:
opentelemetry-instrument python app.py
getting-started-guides/python/Uninstrumented
ディレクトリで新しいターミナルを開き、ロード ジェネレーターを実行して、アプリケーションへのトラフィックを生成します。マックOS:
./load-generator.shパワーシェル:
.\load-generator.ps1ヒント
または、ブラウザの次の URL でエンドポイントにアクセスできます:
http://localhost:8080/fibonacci?n=INSERT_A_VALUE
。INSERT_A_VALUE
を 1 から 90 の値に置き換えます。エラーを生成するには、有効範囲外の整数を挿入します。
New Relic にデータを送信したので、UI でデータを表示する手順を参照してください。
UI でデータを確認し終わったら、両方のターミナル セッションで
CONTROL+C
を押してアプリケーションをシャットダウンします。
デモアプリを手動でセットアップする
前のチュートリアルは、OpenTelemetry Python エージェントを使用した自動インストゥルメンテーションを探索するのに役立ちました。 このチュートリアルでは、カスタムインストゥルメンテーションを使用して、収集したテレメトリーをより詳細に制御する方法を説明します。 次に、OpenTelemetry SDK を設定してデータを New Relic にエクスポートする方法を説明します。
デモアプリケーションをダウンロードする
以下を実行してデモ アプリをダウンロードします。
git clone https://github.com/newrelic/newrelic-opentelemetry-examples.git
必要なライブラリをインストールする
必要なライブラリを追加するには:
このチュートリアルの開始点として、インストルメント化されていないアプリのアプリケーション ディレクトリに移動します。このチュートリアルが終わるまでに、コードは
Instrumented
ディレクトリにあるもののようになっているはずです。cd newrelic-opentelemetry-examples/getting-started-guides/python/UninstrumentedUninstrumented
ディレクトリに仮想環境を作成してアクティブ化します。マックOS:
python3 -m venv venvsource venv/bin/activateパワーシェル:
python -m venv venv.\venv\Scripts\Activate.ps1
以下をインストールします。
pip install opentelemetry-apipip install opentelemetry-sdkpip install flaskpip install opentelemetry-instrumentation-loggingpip install opentelemetry-instrumentation-flaskpip install opentelemetry-exporter-otlppip install opentelemetry-distro
SDKを設定する
app.py
で、以下の強調表示された行をtop of the fileに追加します。 必要に応じて、カスタムアトリビュートenvironment
の値を変更します。########################### OpenTelemetry Settings ###########################from opentelemetry.sdk.resources import Resourceimport uuidOTEL_RESOURCE_ATTRIBUTES = {"service.instance.id": str(uuid.uuid1()),"environment": "local"}from flask import Flask, jsonify, requestapp = Flask(__name__)以下の 環境変数リファレンス セクション に移動して、エクスポートする必要がある変数を確認してから、インストルメンテーション ライブラリを追加する次の手順に進みます。
インストルメンテーション ライブラリの追加: トレース
app.py
で、追加した OpenTelemetry Settings
の後に以下を挿入します。
########### Traces ###########from opentelemetry import tracefrom opentelemetry.sdk.trace import TracerProviderfrom opentelemetry.sdk.trace.export import BatchSpanProcessorfrom opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporterfrom opentelemetry.trace.status import Status, StatusCode
# Initialize tracing and an exporter that can send data to an OTLP endpoint# SELECT * FROM Span WHERE instrumentation.provider='opentelemetry'trace.set_tracer_provider(TracerProvider(resource=Resource.create(OTEL_RESOURCE_ATTRIBUTES)))trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(OTLPSpanExporter()))
インストルメンテーション ライブラリの追加: メトリクス
app.py
で、ステップ D で追加した Traces
セクションの後に次の行を追加します。
############ Metrics ############from opentelemetry import metricsfrom opentelemetry.sdk.metrics import MeterProviderfrom opentelemetry.sdk.metrics.export import PeriodicExportingMetricReaderfrom opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter
# Initialize metering and an exporter that can send data to an OTLP endpoint# SELECT count(`http.server.active_requests`) FROM Metric FACET `service.name` TIMESERIESmetrics.set_meter_provider(MeterProvider(resource=Resource.create(OTEL_RESOURCE_ATTRIBUTES), metric_readers=[PeriodicExportingMetricReader(OTLPMetricExporter())]))metrics.get_meter_provider()fib_counter = metrics.get_meter("opentelemetry.instrumentation.custom").create_counter("fibonacci.invocations", unit="1", description="Measures the number of times the fibonacci method is invoked.")
インストルメンテーション ライブラリの追加: ログ
app.py
の Metrics
セクションの後に以下を追加します。これにより、ログ モジュールがインポートされ、 basicConfig
ログ レベルが DEBUG
に設定されます。
######### Logs # - OpenTelemetry Logs are still in the experimental state, so function names may change in the future########import logginglogging.basicConfig(level=logging.DEBUG)
from opentelemetry import _logsfrom opentelemetry.sdk._logs import LoggerProvider, LoggingHandlerfrom opentelemetry.sdk._logs.export import BatchLogRecordProcessorfrom opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
# Initialize logging and an exporter that can send data to an OTLP endpoint by attaching OTLP handler to root logger# SELECT * FROM Log WHERE instrumentation.provider='opentelemetry'_logs.set_logger_provider(LoggerProvider(resource=Resource.create(OTEL_RESOURCE_ATTRIBUTES)))logging.getLogger().addHandler(LoggingHandler(logger_provider=_logs.get_logger_provider().add_log_record_processor(BatchLogRecordProcessor(OTLPLogExporter()))))
Flask インストゥルメンテーションを追加
app.py
の Logs
セクションの後に、以下の強調表示された行を追加します。これは、分散トレースとログインコンテキストのスパンをリンクするのに役立ちます。
###################### Flask Application ######################from flask import Flask, jsonify, requestfrom opentelemetry.instrumentation.flask import FlaskInstrumentor
app = Flask(__name__)FlaskInstrumentor().instrument_app(app)
カスタム トレース インストルメンテーション: カスタム スパンの作成
必要なスパンを作成できます。特定の操作に関する属性でスパンに注釈を付けるのはあなた次第です。設定した属性は、結果や操作のプロパティなど、追跡している特定の操作に関する追加のコンテキストを提供します。
app.py
に、以下の強調表示された行を挿入して、次の処理を行う /fibonacci
という新しいスパンを開始します。
このメソッドの実行に関するデータをキャプチャします
ユーザーのリクエストから n の値を格納する属性を設定します
@app.route("/fibonacci")@trace.get_tracer("opentelemetry.instrumentation.custom").start_as_current_span("/fibonacci")def fibonacci():args = request.argsx = int(args.get("n"))error_message = "n must be 1 <= n <= 90."trace.get_current_span().set_attribute("fibonacci.n", x)try:assert 1 <= x <= 90array = [0, 1]for n in range(2, x + 1):array.append(array[n - 1] + array[n - 2])trace.get_current_span().set_attribute("fibonacci.result", array[x])return jsonify(n=x, result=array[x])except AssertionError:return jsonify({"message": error_message})app.run(host='0.0.0.0', port=8080)
カスタム トレース インストルメンテーション: 例外を記録する
例外が発生したときに、例外を記録したい場合があります。スパンステータスの設定と併せてこれを行うことをお勧めします。
例外が発生したときにスパンのステータス コードを
ERROR
に設定するには、手順Dで追加したopentelemetry.trace.status package
のStatus
モジュールとStatusCode
モジュールを使用します。########### Traces ###########from opentelemetry import tracefrom opentelemetry.sdk.trace import TracerProviderfrom opentelemetry.sdk.trace.export import BatchSpanProcessorfrom opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporterfrom opentelemetry.trace.status import Status, StatusCode次に、以下の強調表示された行を挿入して例外を記録します。この例外は New Relic でスパン イベントとして表示され、スパンのステータスを
ERROR
に設定します。@app.route("/fibonacci")@trace.get_tracer("opentelemetry.instrumentation.custom").start_as_current_span("/fibonacci")def fibonacci():args = request.argsx = int(args.get("n"))error_message = "n must be 1 <= n <= 90."trace.get_current_span().set_attribute("fibonacci.n", x)try:assert 1 <= x <= 90array = [0, 1]for n in range(2, x + 1):array.append(array[n - 1] + array[n - 2])trace.get_current_span().set_attribute("fibonacci.result", array[x])return jsonify(n=x, result=array[x])except AssertionError:trace.get_current_span().record_exception(exception=Exception, attributes={"exception.type": "AssertionError", "exception.message": error_message})trace.get_current_span().set_status(Status(StatusCode.ERROR, error_message))return jsonify({"message": error_message})app.run(host='0.0.0.0', port=8080)
カスタム メトリック インストルメンテーション: カスタム メトリック カウンターを追加します。
メトリックは、個々の測定値を集計に結合し、システム負荷の関数として一定のデータを生成するため、非常に役立つテレメトリ データ タイプです。このデータをスパンと組み合わせて使用すると、傾向を特定し、アプリケーションのランタイム テレメトリを提供できます。また、メトリクスが表す測定値の下位区分を説明するのに役立つ属性でメトリクスに注釈を付けることもできます。
OpenTelemetry メトリクス API は、メトリクス SDK によって集計され、アウト オブ プロセスでエクスポートされる測定値を記録する多数の計測器を定義します。器具には次の 2 種類があります。
- 同期: これらの計測器は、発生時に測定値を記録します。
- 非同期: これらの計測器はコールバックを登録します。これはコレクションごとに 1 回だけ呼び出され、関連付けられたコンテキストはありません。
ステップEで、カウンターを作成する以下の強調表示された行を追加しました。
############ Metrics ############from opentelemetry import metricsfrom opentelemetry.sdk.metrics import MeterProviderfrom opentelemetry.sdk.metrics.export import PeriodicExportingMetricReaderfrom opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter# Initialize metering and an exporter that can send data to an OTLP endpoint# SELECT count(`http.server.active_requests`) FROM Metric FACET `service.name` TIMESERIESmetrics.set_meter_provider(MeterProvider(resource=Resource.create(OTEL_RESOURCE_ATTRIBUTES), metric_readers=[PeriodicExportingMetricReader(OTLPMetricExporter())]))metrics.get_meter_provider()fib_counter = metrics.get_meter("opentelemetry.instrumentation.custom").create_counter("fibonacci.invocations", unit="1", description="Measures the number of times the fibonacci method is invoked.")次に、作成したカウンターを使用して測定するために、以下の強調表示された行を追加します。
この関数が正常に実行された回数
実行に失敗した回数
アプリを再起動するたびにカウンターが 0 にリセットされることに注意してください。
@app.route("/fibonacci")@trace.get_tracer("opentelemetry.instrumentation.custom").start_as_current_span("/fibonacci")def fibonacci():args = request.argsx = int(args.get("n"))error_message = "n must be 1 <= n <= 90."trace.get_current_span().set_attribute("fibonacci.n", x)try:assert 1 <= x <= 90array = [0, 1]for n in range(2, x + 1):array.append(array[n - 1] + array[n - 2])trace.get_current_span().set_attribute("fibonacci.result", array[x])fib_counter.add(1, {"fibonacci.valid.n": "true"})return jsonify(n=x, result=array[x])except AssertionError:trace.get_current_span().record_exception(exception=Exception, attributes={"exception.type": "AssertionError", "exception.message": error_message})trace.get_current_span().set_status(Status(StatusCode.ERROR, error_message))fib_counter.add(1, {"fibonacci.valid.n": "false"})return jsonify({"message": error_message})app.run(host='0.0.0.0', port=8080)
カスタムログ計測
OpenTelemetry Python のログ信号のステータスは、現在 実験段階です。
app.py
で、以下の強調表示された行を次の行に追加します。
入力値と出力値の
INFO
レベルのログを記録します。入力値が有効範囲外の場合、
ERROR
レベルのログを記録します。@app.route("/fibonacci")@trace.get_tracer("opentelemetry.instrumentation.custom").start_as_current_span("/fibonacci")def fibonacci():args = request.argsx = int(args.get("n"))error_message = "n must be 1 <= n <= 90."trace.get_current_span().set_attribute("fibonacci.n", x)try:assert 1 <= x <= 90array = [0, 1]for n in range(2, x + 1):array.append(array[n - 1] + array[n - 2])trace.get_current_span().set_attribute("fibonacci.result", array[x])fib_counter.add(1, {"fibonacci.valid.n": "true"})logging.info("Compute fibonacci(" + str(x) + ") = " + str(array[x]))return jsonify(n=x, result=array[x])except AssertionError:trace.get_current_span().record_exception(exception=Exception, attributes={"exception.type": "AssertionError", "exception.message": error_message})trace.get_current_span().set_status(Status(StatusCode.ERROR, error_message))fib_counter.add(1, {"fibonacci.valid.n": "false"})logging.error("Failed to compute fibonacci(" + str(x) + ")")return jsonify({"message": error_message})app.run(host='0.0.0.0', port=8080)
アプリを実行してトラフィックを生成する
New Relic にデータを送信する準備ができました!
ターミナルで、
getting-started-guides/python/Uninstrumented
ディレクトリにいることを確認し、アプリケーションを実行します。マックOS:
python3 app.pyパワーシェル:
python app.py
getting-started-guides/python/Uninstrumented
ディレクトリで新しいターミナル タブを開き、ロード ジェネレーターを実行して、アプリケーションへのトラフィックを生成します。マックOS:
./load-generator.shパワーシェル:
.\load-generator.ps1
ヒント
または、ブラウザの次の URL でエンドポイントにアクセスできます:
http://localhost:8080/fibonacci?n=INSERT_A_VALUE
。INSERT_A_VALUE
を 1 から 90 の値に置き換えます。エラーを生成するには、有効範囲外の整数を挿入します。New Relic にデータを送信したので、UI でデータを表示する手順を参照してください。
New Relic でデモ データを表示する
どのチュートリアルを完了しても、New Relic UI でデータを見つけるための以下のヒントに従うことができます。
「チュートリアル 2: OpenTelemetry Python エージェントを使用してデモ アプリを監視する:」に従った場合は、より詳細なデータをキャプチャするにはカスタム インストルメンテーションを手動で追加する必要があるため、カスタム データ (カスタム メトリクスやログなど) が表示されないことに注意してください。
one.newrelic.com > All capabilities > APM & services
に移動します。
getting-started-python
という名前の新しいエンティティ (サービス) (または任意の名前) をクリックします。各データ型のセクションで詳細を確認してください。
ヒント
Microsoft Windows を使用していて、New Relic アカウントにデータが表示されない場合は、ファイアウォールを通過するトラフィックを許可しているかどうかを確認してください。
トレース
New Relic でgetting-started-python
エンティティに到達したら:
左側のペインの
Monitor
セクションで、
Distributed tracing
をクリックし、
/fibonacci
トレース グループをクリックします。そこから、エラーのあるトレースを探し、クリックして開きます。
トレースを開いたら、
Show in-process spans
クリックし、結果のスパンをクリックすると、右側に詳細パネルが開きます。 ユーザー入力が無効な場合に記録した例外を表示するには、View span events
をクリックします。
手動インストルメンテーション チュートリアルを完了した場合、スパンとして記録した例外が New Relic でどのように表示されるかを以下に示します。
スパン属性、スパン名、ステータス コードなど、設定した追加の詳細を表示するには、 Attributesタブをクリックします。 このペインには、このガイドで使用したインストゥルメンテーション ライブラリによって自動的に収集された追加のメタデータや、New Relic によって添付されたメタデータも表示できます。
データの表示の詳細については、New Relic UI の OpenTelemetry を参照してください。
指標
New Relic の getting-started-python
エンティティに到達すると、カスタム カウンター属性など、収集されたすべてのメトリクスのリストが表示されます。
メトリクスエクスプローラー
これは、メトリックのリストを表示できるツールです。
左側のペインで、 Data > Metrics explorerを選択し、次に
fibonacci.invocations
を選択します。Dimensionsで、収集した属性とカスタムメトリックを表示し、 fibonacci.valid.nをクリックします。
詳しくは、 メトリクス エクスプローラー ビューに関するドキュメントをご覧ください。
ログ
ログにアクセスする場所は次のとおりです。
ターミナルにもログが表示されます。
ログ ビューに戻り、ログを選択すると、ログ メッセージと、関連するスパンやトレース ID などの収集された追加の属性、および New Relic によって挿入されたメタデータが表示されたペインが開きます。
この小さな青いアイコンをクリックすると、相関分散トレースに移動できます。
これにより、相関トレースを表示するペインが開き、トレースに関する詳細を表示できます。このページの詳細については、UI の OpenTelemetry: 分散トレース ページおよび分散トレース UI の理解と使用を参照してください。
分散トレース ビューから相関ログを見つけることもできます。対応するログを持つトレースを選択すると、それがタブとして示され、ビューを切り替えることなくトレースから直接ログを表示できます。
ログ ビューの詳細については、 こちらをご覧ください。
参考:環境変数
これは、チュートリアル 2 または 3 を実行している場合にエクスポートする必要がある環境変数のリストです。変数のエクスポートが完了したら、変数リストに続くリンクを使用してチュートリアルに戻ります。
上の折りたたみツールにリストされている環境変数をエクスポートした後、チュートリアルに戻ってセットアップを完了します。
次は何ですか?
OpenTelemetry インストルメンテーションと SDK 構成を試したので、学んだことを適用して、OpenTelemetry と New Relic を使用して独自のアプリまたはサービスをセットアップできます。詳細については、OpenTelemetry を使用して独自のアプリまたはサービスをセットアップするを参照してください。