はじめに
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"]
サンプルコード
https://github.com/mmclsntr/newrelic_cloudrun_python
Cloud Runへデプロイ
Dockerリポジトリには、最近GAとなったArtifact Resistryを使う。
- 対象のGCPプロジェクトのArtifact RegistryからDockerリポジトリを作成。リポジトリ名は「newrelictest」にする。
- Dockerに対する認証の設定を行う
- ローカルからビルド & プッシュ
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_ENABLED
をtrue
にしているため、分散トレーシングの情報についてもこのように表示される。
その他レポートについても通常通り収集される。
まとめ
APMのDockerコンテナへの通常のインストール方法と変わりなく、エージェントをDockerfileに記載して、あとは実行時に任意のNew Relicの環境変数を設定すればOK。気軽に導入できた。