Реализация Custom Alerting Rules (по бизнес-метрикам) для сайта
Технические алерты на CPU и latency важны, но бизнес часто не понимает их значимость. Алерт «Количество завершённых заказов упало на 40% за последние 15 минут» понятен всем — и разработчику, и CEO. Алерты на бизнес-метрики закрывают разрыв между техническим мониторингом и бизнес-последствиями.
Бизнес-метрики для алертинга
Метрики зависят от типа продукта, но типичные категории:
E-commerce:
- Количество завершённых заказов в час (резкое снижение)
- Конверсия из корзины в оплату (если < baseline на X%)
- Объём выручки за скользящий час
- Количество ошибок при оплате (абсолютное значение)
SaaS:
- Регистрации новых пользователей (нулевые за последние N часов)
- Активные пользователи онлайн (неожиданный провал)
- API-запросы от ключевых клиентов (аномальный рост или падение)
Контентные проекты:
- Просмотры страниц (резкое снижение = SEO или CDN проблема)
- Bounce rate (резкий рост)
- Формы отправленные (нулевые за N часов)
Реализация через Prometheus
Бизнес-события в коде приложения:
from prometheus_client import Counter, Histogram
# Инициализация метрик
orders_completed = Counter(
'orders_completed_total',
'Total completed orders',
['payment_method', 'product_category']
)
order_value = Histogram(
'order_value_rub',
'Order value in rubles',
buckets=[100, 500, 1000, 2500, 5000, 10000, 25000, 50000]
)
payment_errors = Counter(
'payment_errors_total',
'Payment processing errors',
['error_code', 'payment_provider']
)
# В коде оформления заказа
async def complete_order(order_data: dict):
try:
result = await payment_gateway.charge(order_data)
orders_completed.labels(
payment_method=order_data['payment_method'],
product_category=order_data['category']
).inc()
order_value.observe(order_data['total_amount'])
except PaymentError as e:
payment_errors.labels(
error_code=e.code,
payment_provider='stripe'
).inc()
raise
Alerting Rules для бизнес-метрик:
groups:
- name: business_alerts
rules:
# Нет заказов за 30 минут в рабочие часы
- alert: NoOrdersReceived
expr: |
(
rate(orders_completed_total[30m]) == 0
and
hour() >= 9 and hour() <= 22
)
for: 5m
labels:
severity: critical
team: business
annotations:
summary: "No orders completed in last 30 minutes during business hours"
runbook_url: "https://wiki.company.com/runbooks/no-orders"
# Резкое падение конверсии
- alert: ConversionDropped
expr: |
rate(orders_completed_total[1h])
/
rate(cart_checkout_started_total[1h])
< 0.3 # Конверсия упала ниже 30% (была ~60%)
for: 15m
labels:
severity: warning
annotations:
summary: "Checkout conversion dropped to {{ $value | humanizePercentage }}"
# Рост ошибок оплаты
- alert: PaymentErrorRateHigh
expr: |
rate(payment_errors_total[5m]) > 0.5
for: 3m
labels:
severity: critical
annotations:
summary: "{{ $value }} payment errors/sec — potential payment gateway issue"
Реализация через CloudWatch (AWS)
import boto3
from datetime import datetime
cw = boto3.client('cloudwatch')
def track_order_completed(order_amount: float, payment_method: str):
cw.put_metric_data(
Namespace='MyApp/Business',
MetricData=[
{
'MetricName': 'OrdersCompleted',
'Value': 1,
'Unit': 'Count',
'Dimensions': [
{'Name': 'PaymentMethod', 'Value': payment_method},
{'Name': 'Environment', 'Value': 'production'}
]
},
{
'MetricName': 'OrderRevenue',
'Value': order_amount,
'Unit': 'None',
'Dimensions': [
{'Name': 'Environment', 'Value': 'production'}
]
}
]
)
resource "aws_cloudwatch_metric_alarm" "no_orders" {
alarm_name = "no-orders-30min"
comparison_operator = "LessThanThreshold"
evaluation_periods = 1
metric_name = "OrdersCompleted"
namespace = "MyApp/Business"
period = 1800 # 30 минут
statistic = "Sum"
threshold = 1
treat_missing_data = "breaching" # Отсутствие данных = 0 заказов
dimensions = {
Environment = "production"
}
alarm_description = "No orders in 30 minutes"
alarm_actions = [aws_sns_topic.critical_alerts.arn]
}
Anomaly Detection для бизнес-метрик
Фиксированные пороги плохо работают для метрик с сезонностью. В пятницу вечером заказов в 3 раза больше, чем в понедельник утром — разные пороги для одного алерта неэффективны.
CloudWatch Anomaly Detection:
resource "aws_cloudwatch_metric_alarm" "orders_anomaly" {
alarm_name = "orders-anomaly"
comparison_operator = "LessThanLowerOrGreaterThanUpperThreshold"
evaluation_periods = 2
threshold_metric_id = "e1"
metric_query {
id = "e1"
expression = "ANOMALY_DETECTION_BAND(m1, 2)"
return_data = true
}
metric_query {
id = "m1"
return_data = false
metric {
metric_name = "OrdersCompleted"
namespace = "MyApp/Business"
period = 300
stat = "Sum"
}
}
}
Маршрутизация бизнес-алертов
Бизнес-алерты не должны будить разработчика ночью если это не технический сбой. Маршрутизация через Alertmanager:
routes:
- match:
team: business
severity: critical
receiver: business-slack # В Slack #alerts-business, не звонить
- match:
team: business
alertname: PaymentErrorRateHigh
receiver: pagerduty-oncall # Ошибки оплаты = техническая проблема, будить
Дашборд бизнес-метрик
Отдельный дашборд для бизнеса (read-only доступ через Grafana):
- Revenue per hour сегодня vs вчера vs прошлая неделя
- Orders funnel: просмотр → корзина → checkout → оплата
- Real-time счётчик заказов
- Аномалии последних 24 часов
Сроки реализации
- Инструментирование кода метриками — 2-4 дня
- Alerting rules + маршрутизация — 1-2 дня
- Anomaly Detection — 1 день
- Бизнес-дашборд — 1-2 дня







