Python アプリケーション向け New Relic APM 設定ガイド
Python アプリケーションでの New Relic APM 導入は、動的な言語特性を活かした柔軟な監視ソリューションを提供します。Python エージェントは、Django、Flask、FastAPI などの主要フレームワークとの深い統合により、アプリケーションの実行時動作を詳細に追跡できます。
Python エージェントの特徴
Python エージェントの概要
New Relic Python エージェントは、インタープリターレベルでの動的計測により、アプリケーションの実行時動作を詳細に追跡します。デコレータベースの計測システムにより、Pythonic な監視実装を可能にします。
エージェントは以下の情報を自動的に収集します:
- HTTP リクエストとレスポンスの処理時間
- データベースクエリの実行時間(SQLAlchemy、Django ORM等)
- 非同期処理(asyncio)の追跡
- エラーとスタックトレース
事前準備
システム要件
対応 Python バージョン:
- 推奨: Python 3.11+ (最新のパフォーマンス最適化)
- 最小要件: Python 3.8+ (セキュリティサポート期間内)
- 対応バージョン: CPython 3.8, 3.9, 3.10, 3.11, 3.12+
- PyPy: PyPy3.8+ (一部制限あり)
- 注意: Python 3.7以前は非推奨(セキュリティリスク)
Python エージェントを導入する前に、以下の要件を確認してください:
- Python 3.7 以降(Python 3.9 以降を推奨)
- CPython、PyPy3 をサポート
- 仮想環境の使用を推奨(venv、Poetry、conda等)
- メモリオーバーヘッド: 通常 30-80MB
New Relic アカウントの準備
New Relic のアカウント作成とライセンスキーの取得が必要です。アカウント作成後、「APM & Services」から新しいアプリケーションを追加し、Python を選択してライセンスキーを取得してください。
エージェントのインストール
pip を使用したインストール
pip install newrelic
requirements.txt への追加
newrelic>=9.12.0 # 2025年最新版(Python 3.12+ 完全対応)
Poetry プロジェクトでの追加
poetry add newrelic
基本設定
設定ファイルの生成
New Relic エージェントの設定ファイルを生成します:
newrelic-admin generate-config YOUR_LICENSE_KEY newrelic.ini
設定ファイルの編集
生成された newrelic.ini
ファイルを編集し、アプリケーション固有の設定を行います:
[newrelic]
license_key = YOUR_LICENSE_KEY
app_name = My Python Application
# ログ設定
log_file = /tmp/newrelic-python-agent.log
log_level = info
# トランザクション設定
transaction_tracer.enabled = true
transaction_tracer.transaction_threshold = 2.0
transaction_tracer.record_sql = obfuscated
# エラー収集設定
error_collector.enabled = true
New Relic Python エージェント 包括的設定パラメータ
Python エージェントでは、100を超える詳細な設定パラメータが利用可能です。以下に主要なカテゴリごとに分類した包括的な設定パラメータ表を示します。
コア設定パラメータ
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
license_key | New Relicアカウントのライセンスキー(必須) | String | なし | your_license_key_here | 全環境 |
app_name | New Relic UIに表示されるアプリケーション名 | String | Python Application | MyApp (Production) | 全環境 |
monitor_mode | パフォーマンスデータ収集の有効/無効 | Boolean | true | false (開発環境) | 環境別 |
developer_mode | オフライン開発モード(データ送信なし) | Boolean | false | true | 開発環境 |
enabled | エージェント全体の有効/無効 | Boolean | true | false | 全環境 |
ログ設定パラメータ
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
log_file | ログファイルのパス | String | stderr | /var/log/newrelic/python.log | 全環境 |
log_level | ログレベル設定 | String | info | debug , warning , error | 全環境 |
audit_log_file | 監査ログファイルのパス | String | なし | /var/log/newrelic/audit.log | 本番環境 |
セキュリティ設定パラメータ
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
high_security | 高セキュリティモード | Boolean | false | true | 本番環境 |
ssl | HTTPS通信の強制 | Boolean | true | false (開発環境) | 全環境 |
capture_params | クエリパラメータの収集 | Boolean | false | true | 全環境 |
ignored_params | 除外するパラメータ名 | List | なし | password,credit_card,api_key | 全環境 |
strip_exception_messages.enabled | 例外メッセージの削除 | Boolean | false | true | セキュア環境 |
トランザクショントレーサー設定
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
transaction_tracer.enabled | トランザクション追跡の有効/無効 | Boolean | true | false | 全環境 |
transaction_tracer.transaction_threshold | 追跡開始閾値(秒) | Float | apdex_f | 2.0 | 全環境 |
transaction_tracer.record_sql | SQL記録モード | String | obfuscated | raw , off | 全環境 |
transaction_tracer.stack_trace_threshold | スタックトレース閾値(秒) | Float | 0.5 | 1.0 | 全環境 |
transaction_tracer.explain_enabled | SQL実行計画の取得 | Boolean | true | false | 全環境 |
transaction_tracer.explain_threshold | 実行計画取得閾値(秒) | Float | 0.5 | 1.0 | 全環境 |
transaction_tracer.function_trace | カスタム関数の追跡 | List | なし | mymodule:myfunction | 全環境 |
transaction_tracer.top_n | 保持する最大トレース数 | Integer | 20 | 10 | 全環境 |
エラーコレクター設定
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
error_collector.enabled | エラー収集の有効/無効 | Boolean | true | false | 全環境 |
error_collector.ignore_errors | 無視するエラータイプ | List | なし | requests.exceptions.ConnectionError | 全環境 |
error_collector.ignore_status_codes | 無視するHTTPステータスコード | List | 404 | 401,403,404,405 | 全環境 |
error_collector.max_stack_trace_lines | スタックトレースの最大行数 | Integer | 50 | 30 | 全環境 |
スロークエリ設定
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
slow_sql.enabled | スロークエリ追跡の有効/無効 | Boolean | true | false | 全環境 |
slow_sql.threshold | スロークエリの閾値(秒) | Float | 0.5 | 1.0 | 全環境 |
ブラウザ監視設定
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
browser_monitoring.auto_instrument | RUMスクリプトの自動挿入 | Boolean | true | false | Web環境 |
browser_monitoring.loader | RUMローダータイプ | String | rum | spa | Web環境 |
分散トレーシング設定
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
distributed_tracing.enabled | 分散トレーシングの有効/無効 | Boolean | true | false | 全環境 |
distributed_tracing.exclude_newrelic_header | New Relicヘッダーの除外 | Boolean | false | true | 全環境 |
インストルメンテーション設定
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
thread_profiler.enabled | スレッドプロファイラの有効/無効 | Boolean | true | false | 全環境 |
xray_session.enabled | X-Rayセッションの有効/無効 | Boolean | false | true | 全環境 |
データベース設定
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
database_name_reporting.enabled | データベース名の報告 | Boolean | true | false | 全環境 |
datastore_tracer.instance_reporting.enabled | データストアインスタンス情報の報告 | Boolean | true | false | 全環境 |
datastore_tracer.database_name_reporting.enabled | データベース名の報告(詳細) | Boolean | true | false | 全環境 |
パフォーマンス最適化設定
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
agent_limits.transaction_traces_nodes | トレースノードの最大数 | Integer | 2000 | 1000 | 全環境 |
agent_limits.sql_query_length_maximum | SQL文の最大長 | Integer | 16384 | 8192 | 全環境 |
agent_limits.stack_trace_lines | スタックトレースの最大行数 | Integer | 50 | 30 | 全環境 |
属性設定
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
attributes.enabled | 属性収集の有効/無効 | Boolean | true | false | 全環境 |
attributes.exclude | 除外する属性パターン | List | なし | request.headers.authorization | 全環境 |
attributes.include | 含める属性パターン | List | なし | request.parameters.* | 全環境 |
イベント設定
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
transaction_events.enabled | トランザクションイベントの収集 | Boolean | true | false | 全環境 |
transaction_events.max_samples_stored | 保存する最大サンプル数 | Integer | 1200 | 800 | 全環境 |
custom_insights_events.enabled | カスタムイベントの収集 | Boolean | true | false | 全環境 |
custom_insights_events.max_samples_stored | カスタムイベントの最大保存数 | Integer | 1200 | 800 | 全環境 |
ネットワーク・接続設定
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
proxy_host | プロキシサーバーホスト | String | なし | proxy.company.com | 企業環境 |
proxy_port | プロキシサーバーポート | Integer | なし | 8080 | 企業環境 |
proxy_user | プロキシ認証ユーザー | String | なし | proxyuser | 企業環境 |
proxy_pass | プロキシ認証パスワード | String | なし | proxypass | 企業環境 |
startup_timeout | 起動タイムアウト(秒) | Float | 0.0 | 10.0 | 全環境 |
shutdown_timeout | シャットダウンタイムアウト(秒) | Float | 2.5 | 5.0 | 全環境 |
機械学習・AI設定
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
machine_learning.enabled | 機械学習監視の有効/無効 | Boolean | true | false | 全環境 |
machine_learning.inference_events_value.enabled | 推論イベント値の収集 | Boolean | true | false | ML環境 |
デバッグ・診断設定
パラメータ名 | 説明 | データ型 | デフォルト値 | 使用例 | 適用範囲 |
---|---|---|---|---|---|
debug.disable_ssl | SSL無効化(デバッグ用) | Boolean | false | true | 開発環境 |
debug.log_data_collector_payloads | データコレクターペイロードのログ出力 | Boolean | false | true | 開発環境 |
debug.log_transaction_trace_payload | トランザクショントレースペイロードのログ出力 | Boolean | false | true | 開発環境 |
環境変数による設定
上記のすべてのパラメータは、設定ファイル以外にも環境変数で設定可能です。環境変数名は NEW_RELIC_
プレフィックスに続けて、パラメータ名をアッパーケースで記述します。
# 例:環境変数による設定
export NEW_RELIC_LICENSE_KEY="your_license_key"
export NEW_RELIC_APP_NAME="MyApp (Production)"
export NEW_RELIC_HIGH_SECURITY="true"
export NEW_RELIC_TRANSACTION_TRACER_RECORD_SQL="obfuscated"
フレームワーク別設定
Django アプリケーション
Django プロジェクトでは、WSGI ファイルまたは manage.py での初期化を行います。
settings.py での設定
# settings.py
import newrelic.agent
# New Relic エージェントの初期化
newrelic.agent.initialize('/path/to/newrelic.ini')
# Django設定
INSTALLED_APPS = [
# その他のアプリ
]
# ミドルウェア設定(任意)
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
# その他のミドルウェア
]
wsgi.py での設定
# wsgi.py
import os
import newrelic.agent
# New Relic設定の初期化
newrelic.agent.initialize()
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = get_wsgi_application()
# WSGIアプリケーションのラップ
application = newrelic.agent.wsgi_application()(application)
Flask アプリケーション
Flask アプリケーションでは、アプリケーション初期化時にエージェントを設定します:
# app.py
import newrelic.agent
newrelic.agent.initialize()
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
FastAPI アプリケーション
FastAPI では ASGI アプリケーションとしてエージェントを統合します:
# main.py
import newrelic.agent
newrelic.agent.initialize()
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
# ASGI アプリケーションのラップ
app = newrelic.agent.asgi_application()(app)
アプリケーション起動方法
環境変数による設定(推奨)
本番環境では設定ファイルの代わりに環境変数を使用することでセキュリティを向上できます:
# セキュアな環境変数設定
export NEW_RELIC_LICENSE_KEY="your_license_key_here"
export NEW_RELIC_APP_NAME="MyPythonApp (Production)"
export NEW_RELIC_ENVIRONMENT="production"
export NEW_RELIC_LOG_LEVEL="info"
export NEW_RELIC_DISTRIBUTED_TRACING_ENABLED="true"
export NEW_RELIC_HIGH_SECURITY="true" # セキュリティ強化モード
# アプリケーション起動
python app.py
.env ファイルでの管理(開発環境)
開発環境では .env
ファイルを使用して環境変数を管理できます:
# .env ファイル(.gitignoreに追加必須)
NEW_RELIC_LICENSE_KEY=your_license_key_here
NEW_RELIC_APP_NAME=MyPythonApp (Development)
NEW_RELIC_ENVIRONMENT=development
NEW_RELIC_LOG_LEVEL=debug
NEW_RELIC_MONITOR_MODE=false
Python-dotenv での読み込み:
import os
from dotenv import load_dotenv
import newrelic.agent
# .envファイルの読み込み
load_dotenv()
# 環境変数からの設定
newrelic.agent.initialize()
newrelic-admin コマンドによる起動
newrelic-admin run-program python app.py
Gunicorn での起動
newrelic-admin run-program gunicorn --bind 0.0.0.0:8000 myapp:app
カスタム計測の基本
デコレータベースの計測
重要な関数やメソッドにカスタム計測を追加できます:
import newrelic.agent
@newrelic.agent.function_trace()
def important_business_logic():
# ビジネスロジック
pass
@newrelic.agent.background_task()
def background_process():
# バックグラウンド処理
pass
カスタムメトリクスの記録
import newrelic.agent
def record_business_metrics(order_data):
# カスタムメトリクスの記録
newrelic.agent.record_custom_metric('Custom/Revenue', order_data['amount'])
newrelic.agent.record_custom_metric('Custom/OrdersProcessed', 1)
# カスタムイベントの記録
newrelic.agent.record_custom_event('OrderCompleted', {
'order_id': order_data['id'],
'amount': order_data['amount']
})
監視データの確認
New Relic UI でのデータ確認
エージェント導入後、数分で New Relic のダッシュボードにデータが表示されます。確認できる主要な情報:
- 概要: アプリケーションの全体的なパフォーマンス
- トランザクション: 各エンドポイントやビューの処理時間
- データベース: SQLクエリの実行時間と N+1 問題の検出
- エラー: Python 例外とエラーの詳細
基本的なメトリクス
自動的に収集される基本メトリクス:
- 平均レスポンス時間
- スループット(RPM: Requests Per Minute)
- エラー率
- Apdex スコア(ユーザー満足度指標)
よくある問題と解決方法
エージェントが動作しない場合
- インポート順序: newrelic.agent.initialize() が最初に呼び出されているか確認
- ライセンスキー: 正しいキーが設定されているか確認
- 設定ファイルのパス: newrelic.ini のパスが正しいか確認
- ログの確認: エージェントログでエラーを確認
パフォーマンスへの影響を最小化
本番環境での設定例:
[newrelic]
# パフォーマンス影響を最小化する設定
transaction_tracer.top_n = 20
error_collector.max_stack_trace_lines = 50
agent_limits.transaction_traces_nodes = 2000
セキュリティ設定
機密情報を保護するための基本設定:
[newrelic]
# 機密情報の自動難読化
capture_params = false
ignored_params = password,credit_card,ssn,api_key,token
# SSL通信の強制
ssl = true
# 属性から機密情報を除外
attributes.exclude = request.headers.authorization,
request.parameters.password
Docker での設定
Docker コンテナでの使用例:
セキュリティ強化された Docker 設定例:
# セキュリティ強化されたマルチステージビルド
FROM python:3.11-slim as builder
# セキュリティベストプラクティス
RUN groupadd -r appuser && useradd -r -g appuser appuser
# 依存関係のインストール
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt
# 本番イメージ
FROM python:3.11-slim
# 非rootユーザーの作成
RUN groupadd -r appuser && useradd -r -g appuser appuser
# ユーザーライブラリのコピー
COPY --from=builder /root/.local /home/appuser/.local
ENV PATH=/home/appuser/.local/bin:$PATH
# アプリケーションファイルのコピー
WORKDIR /app
COPY --chown=appuser:appuser app.py .
COPY --chown=appuser:appuser newrelic.ini .
# 非rootユーザーに切り替え
USER appuser
# セキュリティ設定
ENV NEW_RELIC_HIGH_SECURITY=true
ENV NEW_RELIC_SECURITY_POLICIES_TOKEN=""
# ヘルスチェック
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
CMD python -c "import requests; requests.get('http://localhost:8000/health')"
# アプリケーション起動
CMD ["newrelic-admin", "run-program", "python", "app.py"]
Docker Compose 設定例
version: '3.8'
services:
python-app:
build: .
environment:
- NEW_RELIC_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY}
- NEW_RELIC_APP_NAME=MyPythonApp (Docker)
- NEW_RELIC_ENVIRONMENT=production
- NEW_RELIC_HIGH_SECURITY=true
- NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
ports:
- "8000:8000"
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
user: "1001:1001" # 非rootユーザー
Kubernetes での設定
セキュリティ強化された Kubernetes デプロイメント:
# Secret リソース
apiVersion: v1
kind: Secret
metadata:
name: newrelic-secret
type: Opaque
data:
license-key: <base64_encoded_license_key>
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: python-app
labels:
app: python-app
version: v1.0.0
spec:
replicas: 3
selector:
matchLabels:
app: python-app
template:
metadata:
labels:
app: python-app
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8000"
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1001
runAsGroup: 1001
fsGroup: 1001
containers:
- name: app
image: myapp:latest
imagePullPolicy: Always
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
env:
- name: NEW_RELIC_LICENSE_KEY
valueFrom:
secretKeyRef:
name: newrelic-secret
key: license-key
- name: NEW_RELIC_APP_NAME
value: "MyPythonApp (K8s)"
- name: NEW_RELIC_ENVIRONMENT
value: "production"
- name: NEW_RELIC_HIGH_SECURITY
value: "true"
- name: NEW_RELIC_DISTRIBUTED_TRACING_ENABLED
value: "true"
- name: NEW_RELIC_LOG_LEVEL
value: "info"
ports:
- containerPort: 8000
name: http
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
readinessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 10
periodSeconds: 5
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
volumeMounts:
- name: tmp-volume
mountPath: /tmp
volumes:
- name: tmp-volume
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: python-app-service
spec:
selector:
app: python-app
ports:
- protocol: TCP
port: 80
targetPort: 8000
type: ClusterIP
トラブルシューティング
診断フローチャート
一般的な問題と解決方法
1. データが New Relic に表示されない
症状: アプリケーションが New Relic ダッシュボードに表示されない
診断スクリプト:
import newrelic.agent
import sys
import os
def diagnose_newrelic():
"""New Relic エージェント診断"""
print("=== New Relic Python エージェント診断 ===")
# バージョン確認
print(f"Agent version: {newrelic.agent.version}")
print(f"Python version: {sys.version}")
# 設定確認
try:
config = newrelic.agent.global_settings()
print(f"App name: {config.app_name}")
print(f"License key: {'*' * 32 + config.license_key[-8:] if config.license_key else 'Not set'}")
print(f"Monitor mode: {config.monitor_mode}")
print(f"High security: {config.high_security}")
print(f"Log level: {config.log_level}")
except Exception as e:
print(f"Configuration error: {e}")
# アプリケーション状態確認
try:
application = newrelic.agent.application()
print(f"Application object: {application}")
print(f"Application name: {application.name}")
print(f"Active: {application.active}")
except Exception as e:
print(f"Application error: {e}")
# 環境変数確認
print("\n=== 環境変数 ===")
env_vars = [
'NEW_RELIC_LICENSE_KEY',
'NEW_RELIC_APP_NAME',
'NEW_RELIC_ENVIRONMENT',
'NEW_RELIC_CONFIG_FILE',
'NEW_RELIC_LOG_LEVEL'
]
for var in env_vars:
value = os.environ.get(var, 'Not set')
if 'LICENSE_KEY' in var and value != 'Not set':
value = '*' * 32 + value[-8:]
print(f"{var}: {value}")
# 診断実行
if __name__ == "__main__":
diagnose_newrelic()
2. パフォーマンス影響が大きい
症状: APM エージェント導入後にアプリケーションが重くなる
解決方法:
[newrelic]
# パフォーマンス最適化設定
transaction_tracer.top_n = 10 # デフォルト: 20
error_collector.max_stack_trace_lines = 30 # デフォルト: 50
agent_limits.transaction_traces_nodes = 1000 # デフォルト: 2000
# 詳細なSQL監視を無効化(必要に応じて)
transaction_tracer.explain_enabled = false
slow_sql.enabled = false
# ブラウザ監視を無効化(必要に応じて)
browser_monitoring.auto_instrument = false
3. Django で静的ファイルが監視される
症状: 静的ファイルのリクエストがトランザクションとして記録される
解決方法:
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# New Relic ミドルウェアは静的ファイルミドルウェアの後に配置
'django.middleware.common.CommonMiddleware',
'newrelic.agent.django_middleware', # ここに配置
# その他のミドルウェア
]
# 静的ファイルのパスを除外
import newrelic.agent
@newrelic.agent.function_trace('StaticFileExclusion')
def static_file_filter(environ, start_response):
"""静的ファイルを New Relic 監視から除外"""
path = environ.get('PATH_INFO', '')
# 静的ファイルパスの場合は監視しない
if path.startswith('/static/') or path.startswith('/media/'):
newrelic.agent.ignore_transaction()
return app(environ, start_response)
4. 非同期タスクが追跡されない
症状: Celery タスクや asyncio 処理が New Relic に表示されない
解決方法:
import newrelic.agent
import asyncio
from celery import Celery
# Celery タスクの監視
app = Celery('tasks')
@app.task
@newrelic.agent.background_task() # 必須デコレータ
def async_task(param):
# バックグラウンドタスク処理
newrelic.agent.record_custom_metric('Custom/BackgroundTask', 1)
return result
# asyncio タスクの監視
@newrelic.agent.background_task()
async def async_function():
"""非同期関数の監視"""
with newrelic.agent.FunctionTrace('AsyncOperation'):
await some_async_operation()
# カスタムメトリクスの記録
newrelic.agent.record_custom_metric('Custom/AsyncTask', 1)
# asyncio イベントループでの実行
async def main():
await async_function()
if __name__ == "__main__":
asyncio.run(main())
詳細ログの有効化
問題を特定するため、詳細ログを有効にします:
[newrelic]
log_file = /var/log/newrelic/python-agent.log
log_level = debug # 本番環境では info に戻す
audit_log_file = /var/log/newrelic/python-audit.log
# デバッグ用追加設定
debug.disable_ssl = false
debug.log_data_collector_payloads = false
debug.log_transaction_trace_payload = false
パフォーマンス監視の最適化
import newrelic.agent
from functools import wraps
def performance_monitor(threshold_seconds=1.0):
"""パフォーマンス閾値監視デコレータ"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
with newrelic.agent.FunctionTrace(f'Performance/{func.__name__}'):
import time
start_time = time.time()
try:
result = func(*args, **kwargs)
duration = time.time() - start_time
# 閾値を超えた場合の警告
if duration > threshold_seconds:
newrelic.agent.record_custom_metric(
'Custom/SlowFunction',
duration
)
newrelic.agent.record_custom_event('SlowFunction', {
'function_name': func.__name__,
'duration': duration,
'threshold': threshold_seconds
})
return result
except Exception as e:
newrelic.agent.notice_error(attributes={
'function_name': func.__name__,
'error_type': type(e).__name__
})
raise
return wrapper
return decorator
# 使用例
@performance_monitor(threshold_seconds=0.5)
def slow_database_operation():
"""データベース処理の監視"""
# 処理内容
pass
Python アプリケーションでの New Relic APM 導入により、動的な言語特性を活かした詳細なパフォーマンス監視を実現できます。適切な設定と統合により、Python エコシステムの多様な実行パターンに対応した包括的な監視システムを構築できます。
関連記事