← Назад к вопросам
Какие знаешь инструменты APM мониторинга?
3.0 Senior🔥 121 комментариев
#DevOps и инфраструктура
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Инструменты APM мониторинга (Application Performance Monitoring)
APM (Application Performance Monitoring) - это набор инструментов и технологий для мониторинга производительности приложений. Критично для production систем.
Основные инструменты
1. New Relic
Полнофункциональная облачная платформа APM.
# Установка и настройка
# pip install newrelic
import newrelic.agent
newrelic.agent.initialize('newrelic.ini')
from flask import Flask
app = Flask(__name__)
# Автоматическое мониторирование Flask приложения
newrelic.agent.instrument_app(app)
@app.route('/users/<user_id>')
def get_user(user_id):
# Автоматическое отслеживание времени ответа
user = fetch_user_from_db(user_id)
return {'user': user}
# Кастомные метрики
import newrelic.agent
@newrelic.agent.function_trace()
def expensive_operation():
# Эта функция будет отслеживаться
return compute_something()
# Дополнительные параметры
newrelic.agent.add_custom_attribute('user_id', 42)
Плюсы:
- Готовое облачное решение
- Хороший UI для анализа
- Поддержка множества языков и фреймворков
- Alerting система
Минусы:
- Дорого для больших объёмов
- Облачное только (без самохостинга)
2. Datadog
Облачная платформа для мониторинга и аналитики.
from datadog import initialize, api, statsd
import time
# Инициализация
options = {
'api_key': 'YOUR_API_KEY',
'app_key': 'YOUR_APP_KEY'
}
initialize(**options)
# Отправка метрик
statsd.gauge('my_app.users_count', 1000, tags=['env:prod'])
statsd.histogram('my_app.request_duration', 0.5, tags=['endpoint:/api/users'])
statsd.increment('my_app.errors', 1, tags=['error_type:timeout'])
# Трейсинг запросов
from ddtrace import tracer
@tracer.wrap()
def my_function():
return compute_something()
# С FastAPI
from ddtrace.contrib.fastapi import patch_fastapi
patch_fastapi()
Плюсы:
- Мощная аналитика и поиск по логам
- Хорошая интеграция с инфраструктурой
- Поддержка Kubernetes
Минусы:
- Дорого
- Кривая обучения
3. Elastic APM (ELK Stack)
Open-source и самохостинг решение.
# pip install elastic-apm
from elasticapm import Client
# Инициализация
apm_client = Client({
'SERVICE_NAME': 'my_python_app',
'SERVER_URL': 'http://localhost:8200',
})
# FastAPI интеграция
from elastic_apm.contrib.starlette import make_apm_decorator
from fastapi import FastAPI
app = FastAPI()
apm = make_apm_decorator(apm_client)
@app.get('/users/{user_id}')
@apm
async def get_user(user_id: int):
return await fetch_user(user_id)
# Кастомные транзакции
with apm_client.capture_transaction(name='custom_job', transaction_type='task'):
result = process_data()
# Логирование ошибок
try:
risky_operation()
except Exception:
apm_client.capture_exception()
Плюсы:
- Open source (бесплатно)
- Самохостинг
- Встроенная аналитика логов (Elasticsearch)
- Интеграция с Kibana для визуализации
Минусы:
- Требует управления инфраструктурой
- Требует больше ресурсов (Elasticsearch требует памяти)
4. Jaeger (Distributed Tracing)
Open-source трейсинг для микросервисной архитектуры.
from jaeger_client import Config
import logging
# Инициализация
config = Config(
config={
'sampler': {
'type': 'const',
'param': 1,
},
'logging': True,
},
service_name='my-service',
)
tracer = config.initialize_tracer()
# Трейсинг операций
from opentelemetry import trace
tracer = trace.get_tracer('my-tracer')
def process_request(request_id):
with tracer.start_as_current_span('process_request') as span:
span.set_attribute('request_id', request_id)
with tracer.start_as_current_span('database_query') as db_span:
user = fetch_from_db(request_id)
with tracer.start_as_current_span('cache_update') as cache_span:
update_cache(user)
return user
Плюсы:
- Open source
- Стандарт OpenTelemetry
- Отличная визуализация call chains
- Поддержка множества языков
Минусы:
- Требует самохостинга
- Только трейсинг (нет логирования/метрик)
5. Prometheus (Metrics)
Open-source система для метрик.
from prometheus_client import Counter, Histogram, Gauge, start_http_server
import time
# Создание метрик
request_count = Counter(
'http_requests_total',
'Всего HTTP запросов',
['method', 'endpoint', 'status']
)
request_duration = Histogram(
'http_request_duration_seconds',
'Время обработки HTTP запроса',
buckets=(0.1, 0.5, 1.0, 2.0, 5.0)
)
users_online = Gauge(
'users_online',
'Количество онлайн пользователей'
)
# Использование в приложении
from flask import Flask
app = Flask(__name__)
@app.before_request
def before_request():
request.start_time = time.time()
@app.after_request
def after_request(response):
duration = time.time() - request.start_time
request_count.labels(
method=request.method,
endpoint=request.endpoint or 'unknown',
status=response.status_code
).inc()
request_duration.labels(
method=request.method,
endpoint=request.endpoint or 'unknown'
).observe(duration)
return response
@app.route('/metrics')
def metrics():
from prometheus_client import generate_latest
return generate_latest()
# Запуск Prometheus exporter
start_http_server(8000)
Плюсы:
- Open source
- De facto стандарт для метрик
- Отличная интеграция с Grafana
- Низкие накладные расходы
Минусы:
- Только метрики (не логирование/трейсинг)
- Требует настройки хранилища временных рядов
6. Grafana
Платформа для визуализации метрик (работает с Prometheus, Datadog и др).
# Grafana работает с источниками данных
# Установка Dashboard'ов из интерфейса
# Пример: наблюдение за метриками Prometheus
# Изображение будет доступно в Grafana UI
7. OpenTelemetry (Стандарт)
Стандартный инструмент для инструментирования приложений.
from opentelemetry import trace, metrics
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
from opentelemetry.instrumentation.flask import FlaskInstrumentor
from opentelemetry.instrumentation.requests import RequestsInstrumentor
# Настройка трейсинга
jaeger_exporter = JaegerExporter(
agent_host_name='localhost',
agent_port=6831,
)
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(
SimpleSpanProcessor(jaeger_exporter)
)
# Автоматическая инструментация
FlaskInstrumentor().instrument()
RequestsInstrumentor().instrument()
# Ручная инструментация
tracer = trace.get_tracer('my-app')
@app.route('/api/users')
def get_users():
with tracer.start_as_current_span('get_users'):
users = fetch_from_db()
return users
Плюсы:
- Open standard
- Поддержка множества экспортеров (Jaeger, Zipkin, Datadog, etc)
- Единая инструментация для всего стека
Минусы:
- Новинка (эволюционирует)
- Требует понимания концепций
8. Sentry
Специализирован на отслеживании ошибок.
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration
from sentry_sdk.integrations.sqlalchemy import SqlalchemyIntegration
# Инициализация
sentry_sdk.init(
dsn='https://YOUR_KEY@sentry.io/YOUR_PROJECT_ID',
integrations=[
FlaskIntegration(),
SqlalchemyIntegration(),
],
traces_sample_rate=1.0, # Процент трейсирования
)
from flask import Flask
app = Flask(__name__)
@app.route('/error')
def trigger_error():
division_by_zero = 1 / 0 # Автоматически отправится в Sentry
# Ручное уведомление
try:
risky_operation()
except Exception:
sentry_sdk.capture_exception()
# Добавление контекста
sentry_sdk.set_user({'id': 123, 'email': 'user@example.com'})
sentry_sdk.set_tag('version', '1.0.0')
sentry_sdk.set_context('request', {'url': 'https://example.com'})
Плюсы:
- Простая настройка
- Отлично для ошибок и исключений
- Бесплатный план
Минусы:
- Узко сфокусирован на ошибках
- Платно за большой объём
Сравнение инструментов
| Инструмент | Метрики | Трейсинг | Логирование | Ошибки | Стоимость |
|---|---|---|---|---|---|
| New Relic | Да | Да | Да | Да | Дорого |
| Datadog | Да | Да | Да | Да | Дорого |
| Elastic APM | Да | Да | Да | Да | Бесплатно (самохост) |
| Jaeger | Нет | Да | Нет | Нет | Бесплатно |
| Prometheus | Да | Нет | Нет | Нет | Бесплатно |
| Grafana | Визуализация | Нет | Нет | Нет | Бесплатно |
| OpenTelemetry | Да | Да | Да | Да | Бесплатно |
| Sentry | Нет | Нет | Нет | Да | Бесплатно (лимит) |
Стандартный стек для production
Небольшой проект
Prometheus (метрики) + Grafana (визуализация) + Sentry (ошибки)
Средний проект
OpenTelemetry + Jaeger (трейсинг) + Prometheus + ELK (логи)
Большой проект
Datadog или New Relic (всё в одном)
Интеграция в FastAPI
from fastapi import FastAPI
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from prometheus_client import Counter, Histogram, generate_latest
from fastapi.responses import Response
import time
app = FastAPI()
# OpenTelemetry инструментация
FastAPIInstrumentor.instrument_app(app)
# Prometheus метрики
request_count = Counter('requests_total', 'Total requests', ['method', 'path'])
request_duration = Histogram('request_duration_seconds', 'Request duration')
@app.middleware('http')
async def add_metrics(request, call_next):
start = time.time()
response = await call_next(request)
duration = time.time() - start
request_count.labels(method=request.method, path=request.url.path).inc()
request_duration.observe(duration)
return response
@app.get('/metrics')
def metrics():
return Response(generate_latest())
Итог
Выбирай инструмент в зависимости от бюджета и требований:
- Облако: New Relic, Datadog, Sentry
- Самохост: Elastic APM + Jaeger + Prometheus + Grafana
- Кратковременный проект: OpenTelemetry + Prometheus
Golden Rule: начни с Prometheus + Grafana (бесплатно), добавляй остальное по мере необходимости.