New RelicはOpenTelemetryを使っている向けに、New RelicのAgentをインストールすることなくOpenTelemetryのままNew Relicを利用するために、exporterを提供しています。先日Python向けのNew Relic OpenTelemetry Python Exporterを公開しました。今回はOpenTelemetryを活用できる事例として、このExporterを使ってPythonで書いたAzure Functionの関数を計測してみたいと思います。
今回はサンプルということで、Azure Function Pythonを最初に作るときに作成されるテンプレートのコードを使って、コードの実行にかかる時間を計測します。加えて、HTTP Triggerで実行される場合に呼び出す側が分散トレーシングのTrace Contextを送信した場合にトレースがつながるようにします。ドキュメントとしては、計測のところは主にopnetelemetry-pythonを、New Relicに送信するところはNew Relic OpenTelemetry Python Exporterを参考にします。
サンプルコードはGitHubで公開しています。まず、TraceProviderを設定する部分ではサービス名を設定しますが、context.function_name
を指定すること関数名を設定しています。任意の文字列で指定することも可能です。Trace Contextを設定する部分はtracer.start_as_current_span
のcontext引数の部分にあります。OpenTelemetryが用意しているpropagators.extract
メソッドを利用し、HTTPヘッダーからW3c準拠のTrace Contextを抽出しTraceに設定します。
関数の呼び出しとトレースをひもづけるために、呼び出しごとに一意なcontext.invocation_id
をスパンに設定してします。そして、最後に重要な点ですが、関数が完了するとTelemetryのデータを送信する機会がなくなってしまうため、完了する前に明示的にnewrelic.shutdown
メソッドを呼び出しデータを送信します。
これをAzure Functionで実行し、ブラウザやcurlコマンドでアクセスすると分散トレーシングのデータが送信され、New RelicのDistributed TracingのUIで確認できます。ただ、これだけだとTrace Contextデータの設定が動作しているかわからないので、適当な静的ページからAJAXリクエストで呼び出すようにします。サンプルは同じリポジトリにありますので、Browser Agent有効化のscriptタグを置き換えて試してみてください。すると次のようにBrowserアプリであるAzureFunctionSPAからAzure FunctionのMyHttpPythonFunctionにトレースがつながることが確認できます。
現状、MicrosoftはAzure Function PythonでのOpenTelemetryをネイティブでサポートする予定はないため、計装する場合今回のようにreturnの直前でexporterのshutdownを呼ぶなど自前でコードを書く必要があります。しかし、OpenTelemetryを使うことで、今回はexporterにNew Relicを指定しましたが、exporterを差し替えるだけで好きなオブザーバビリティプラットフォームにデータを送信し計測することが容易になります。
이 블로그에 표현된 견해는 저자의 견해이며 반드시 New Relic의 견해를 반영하는 것은 아닙니다. 저자가 제공하는 모든 솔루션은 환경에 따라 다르며 New Relic에서 제공하는 상용 솔루션이나 지원의 일부가 아닙니다. 이 블로그 게시물과 관련된 질문 및 지원이 필요한 경우 Explorers Hub(discuss.newrelic.com)에서만 참여하십시오. 이 블로그에는 타사 사이트의 콘텐츠에 대한 링크가 포함될 수 있습니다. 이러한 링크를 제공함으로써 New Relic은 해당 사이트에서 사용할 수 있는 정보, 보기 또는 제품을 채택, 보증, 승인 또는 보증하지 않습니다.