1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonランタイム環境のCloud FunctionsでNew Relic APMを導入しトレースデータを取得する方法

Last updated at Posted at 2024-04-18

概要

Google Cloudのサーバーレスサービスの1つであるCloud Functions(Pythonランタイム環境)のトレースデータをNew Relicを使って取得できたので、その内容をまとめようと思います。

今回の検証環境

Cloud Functions側は以下の条件で検証。

  • リージョン: us-central1
  • Cloud Functions: V2(第二世代)
  • ランタイム: Python 3.12
  • トリガー: HTTPS

New Relic

  • フリーアカウントの作成
    • お持ちでない場合は、こちらから作成
  • ライセンスキー(INGEST Type)

手順

①New Relic APMライブラリのインストール

PythonランタイムのCloud Functionではrequirements.txtが用意されております。
このrequirements.txtにNew Relicライブラリを読み込むように追記します。

requirements.txt
functions-framework==3.*
newrelic==9.7.0  <---追加

スクリーンショット 2024-04-18 21.52.53.png

※現時点(2024/04)での最新のライブラリバージョンを指定しております。適宜変更ください。

②New Relic APMエージェントの設定

New Relic APMエージェントは通常newrelic.iniというファイルで細かな設定を行いますが、環境変数でも設定可能です。

設定する項目は以下の3つです。

環境変数で行うNew Relicエージェントの設定行項目.
NEW_RELIC_LICENSE_KEY: xxxx  <--- (New RelicのLicense keyを指定)
NEW_RELIC_APP_NAME: yyy  <--- (ご自身のCloud Functionsの名前を指定)
NEW_RELIC_DISTRIBUTED_TRACING_ENABLED: TRUE

スクリーンショット 2024-04-18 22.21.44.png

③main.pyにコードを追記する

最低限の設定としては3つあり、New Relicライブラリの読み込みとNew Relic Agentの初期化、そしてデコレーターの設定を行います。これで最低限動きます。
以下のサンプルコードでは、Cloud FunctionのPythonランタイムで提供される初期のコードを使ってNew Relicで計装するときの例です。

  import functions_framework
+ import newrelic.agent # newrelicライブラリの読み込み

+ newrelic.agent.initialize() #newrelic-agentの初期化

  @functions_framework.http
+ @newrelic.agent.function_trace() #計測対象の関数に対しデコレーターを設定
  def hello_http(request):
      """HTTP Cloud Function.
      Args:
          request (flask.Request): The request object.
          <https://flask.palletsprojects.com/en/1.1.x/api/#incoming-request-data>
      Returns:
          The response text, or any set of values that can be turned into a
          Response object using `make_response`
          <https://flask.palletsprojects.com/en/1.1.x/api/#flask.e_response>.
      """
      request_json = request.get_json(silent=True)
      request_args = request.args

      if request_json and 'name' in request_json:
          name = request_json['name']
      elif request_args and 'name' in request_args:
          name = request_args['name']
      else:
          name = 'World'

      return 'Hello {}!'.format(name)

④リクエスト発生させて、テレメトリデータをNew Relic上で確認する

リクエストを発生させて、New Relic APMエージェントにテレメトリデータを収集させます。
収集されたデータはNew Relic上で以下のように確認できます。ただし、初回アクセスに限りリクエスト発生か約5分ほどの時間がかかりますが、それ以降はリアルタイムにデータが表示されます。

スクリーンショット 2024-04-18 22.31.36.png

また、以下はCloud Function でエラーが観測された時の画面になります。この画面からメトリック、スタックトレース、ログなどの基本的なテレメトリデータが計測できていることがわかります。

スクリーンショット 2024-04-18 22.37.08.png

まとめ

New Relic APMを使ってCloud FunctionsのPythonランタイム環境を計測できました。
ライブラリのインストール、環境変数の設定、コードへの追加(今回は2行の追記)のみで実装できたので、作業負荷は思ったよりも高くなかったです。今回のケースは、Google Cloudと他のクラウドプラットフォーム、またはオンプレを併用している場合、New Relicのようなサービスを使うことで各種プラットフォームを跨いで観測できるケースがマッチすると思います。ご参考になれば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?