はじめに
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を活用する。
以下、今回のサンプルコード
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は以下の通り。
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に対する認証の設定を行う
- ローカルからビルド & プッシュ
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の画面を確認する。
以下のような形で、リクエストイベントがトレースされ情報が表示される。
今回NEW_RELIC_DISTRIBUTED_TRACING_ENABLED
をtrue
にしているため、分散トレーシングの情報についてもこのように表示される。
まとめ
APMのDockerコンテナへの通常のインストール方法と変わりなく、エージェントをDockerfileに記載して、あとは実行時に任意のNew Relicの環境変数を設定すればOK。気軽に導入できた。