Cloud Run (フルマネージド) にNew Relic APMを入れる


はじめに

Cloud Runで稼働するWebアプリケーションを、New Relic APMでトレースしてみた話。

Cloud Run」はGoogle Cloudのコンピューティングサービスの1つで、Knativeベースのフルマネージドなコンテナ実行サーバーレスプラットフォーム。コンテナでパッケージされたWebアプリを気軽にデプロイ & 公開できる。

Cloud Runには「フルマネージド」と「for Anthos」の2種類があり、今回は「フルマネージド」のCloud RunにNew Relic APMを導入した。

参考 : Cloud Run for Anthosへの導入については、New RelicさんのBlogで紹介されている

実装

デモ用にWebアプリケーションを実装し、トレースするためのNew Relic APMを導入する。

Webアプリケーション

  • Python 3.8.6
  • フレームワーク : Fast API

また、外部との通信をデモするためhttpbin.orgを活用する。

以下、今回のサンプルコード

app.py
from fastapi import FastAPI
import requests

app = FastAPI()


@app.get("/")
def get_root():
    return {"Hello": "World"}


@app.get("/delay/{sec}")
def get_delay(sec: int):
    """
    sec秒遅延させる
    """
    requests.get("https://httpbin.org/delay/{}".format(sec))
    return {"sec": sec}


@app.post("/anything")
def post_anything():
    """
    情報を返す
    """
    r = requests.post("https://httpbin.org/anything")
    return r.json()

動作確認 実行

pip install fastapi
pip install uvicorn
pip install requests
uvicorn app:app --reload --host 0.0.0.0 --port 8000

New Relic APM設定

インストールの仕方はDockerコンテナへの通常のインストール方法と同じ。

Install the Python agent for Docker

newrelicモジュールをインストールし、newrelic-admin run-programを先頭につけて実行することで、APMエージェントによってトレースがされる。

Dockerfileは以下の通り。

Dockerfile
FROM python:3.8.6-alpine

# Allow statements and log messages to immediately appear in the Knative logs
ENV PYTHONUNBUFFERED True

WORKDIR /opt/app
COPY . .

RUN pip install --no-cache-dir -r requirements.txt

EXPOSE 8000

CMD ["newrelic-admin", "run-program", "uvicorn", "app:app", "--reload", "--host", "0.0.0.0", "--port", "8000"]

サンプルコード

Cloud Runへデプロイ

Dockerリポジトリには、最近GAとなったArtifact Resistryを使う。

  • 対象のGCPプロジェクトのArtifact RegistryからDockerリポジトリを作成。リポジトリ名は「newrelictest」にする。

docker build -t newrelic-cloudrun-python .
docker tag newrelic-cloudrun-python asia-northeast1-docker.pkg.dev/{GCP ProjectID}/newrelictest/newrelic-cloudrun-python
docker push asia-northeast1-docker.pkg.dev/{GCP ProjectID}/newrelictest/newrelic-cloudrun-python
  • Cloud Runへデプロイする。今回はArtifact Registry画面からデプロイする。




ポートは8000に設定。

環境変数にNew Relic設定用のパラメータを指定。

パラメータ (一例)

名前 説明
NEW_RELIC_LICENSE_KEY ライセンスキー (必須)
NEW_RELIC_APP_NAME アプリ名 (必須)
NEW_RELIC_DISTRIBUTED_TRACING_ENABLED 分散トレーシングのON/OFF (任意)

参考


今回は未認証(公開)に設定。

デプロイ。
デプロイ成功。

生成されたURLに、いくつかリクエストを送っておく

curl https://newrelic-cloudrun-python-xxxxxx-an.a.run.app
curl https://newrelic-cloudrun-python-xxxxxx-an.a.run.app/delay/4
curl https://newrelic-cloudrun-python-xxxxxx-an.a.run.app/anything -X POST

APM画面

トレース情報がNew Relicに送られているかどうか、New Relic APMの画面を確認する。

以下のような形で、リクエストイベントがトレースされ情報が表示される。

ホスト名はlocalhostで認識される模様

今回NEW_RELIC_DISTRIBUTED_TRACING_ENABLEDtrueにしているため、分散トレーシングの情報についてもこのように表示される。

その他レポートについても通常通り収集される。

まとめ

APMのDockerコンテナへの通常のインストール方法と変わりなく、エージェントをDockerfileに記載して、あとは実行時に任意のNew Relicの環境変数を設定すればOK。気軽に導入できた。