Help us understand the problem. What is going on with this article?

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"]

サンプルコード

https://github.com/mmclsntr/newrelic_cloudrun_python

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。気軽に導入できた。

cloudpack
Amazon Web Services (AWS) の導入設計、環境構築、運用・保守をサポートするマネジドホスティングサービス
https://cloudpack.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away