Введение: Почему мониторинг критичен для Swift приложений
Современные приложения на Swift для iOS и macOS работают в условиях высокой конкуренции. Пользователи ожидают мгновенного отклика, стабильной работы и отсутствия сбоев. Без системы мониторинга вы рискуете узнать о падении сервера или критической ошибке только после жалоб клиентов. В этой статье мы разберем, как организовать эффективный мониторинг Swift-приложений: какие метрики собирать, как настроить алерты и автоматизировать процессы.
1. Ключевые метрики для Swift приложений
Мониторинг начинается с выбора правильных метрик. Для iOS и macOS приложений важно отслеживать три группы показателей.
1.1. Производительность и UI
- FPS (Frame Per Second) — частота кадров. Падение ниже 30 FPS сигнализирует о проблемах с анимацией или рендерингом.
- Время запуска — холодный и горячий старт. Замеряется от начала загрузки до первого кадра.
- Потребление памяти — отслеживайте утечки через Instruments или встроенные метрики Xcode.
import MetricKit
class PerformanceMonitor: NSObject, MXMetricManagerSubscriber {
override init() {
super.init()
MXMetricManager.shared.add(self)
}
func didReceive(_ payloads: [MXMetricPayload]) {
for payload in payloads {
if let fpsData = payload.applicationLaunchMetrics {
print("Средний FPS: \(fpsData.histogrammedApplicationResumeTime)")
}
}
}
}
1.2. Сетевые запросы и API
- Время ответа сервера (latency).
- Коды ошибок (4xx, 5xx).
- Количество успешных/неуспешных запросов.
import Foundation
class NetworkMonitor {
static func trackRequest(_ url: URL, duration: TimeInterval, statusCode: Int) {
let metrics: [String: Any] = [
"url": url.absoluteString,
"duration_ms": duration * 1000,
"status": statusCode
]
// Отправка в аналитику
AnalyticsService.sendEvent("network_request", parameters: metrics)
}
}
1.3. Крэши и ошибки
Используйте Crashlytics (Firebase) или собственный обработчик. Важно фиксировать не только фатальные ошибки, но и recoverable errors.
import Crashlytics
class CrashHandler {
static func logError(_ error: Error, context: String) {
Crashlytics.crashlytics().record(error: error, userInfo: ["context": context])
}
}
2. Инструменты для сбора метрик
Выбор инструмента зависит от масштаба проекта. Рассмотрим три популярных варианта.
2.1. Firebase Crashlytics + Performance
Бесплатный инструмент от Google. Позволяет отслеживать крэши, сетевые запросы и пользовательские метрики. Интеграция через Swift Package Manager.
// Установите через SPM: firebase-ios-sdk
import FirebasePerformance
class PerformanceTracer {
static func startTrace(name: String) -> Trace {
let trace = Performance.startTrace(name: name)
return trace
}
static func stopTrace(_ trace: Trace) {
trace.stop()
}
}
2.2. Sentry
Продвинутая система с поддержкой распределенной трассировки. Подходит для enterprise-решений.
import Sentry
SentrySDK.start { options in
options.dsn = "https://examplePublicKey@o0.ingest.sentry.io/0"
options.tracesSampleRate = 1.0 // 100% трассировка
}
// Ручной захват ошибки
SentrySDK.capture(error: NSError(domain: "com.example", code: 404))
2.3. New Relic
Мощный инструмент для мониторинга производительности в реальном времени. Поддерживает SwiftUI и UIKit.
// Интеграция через CocoaPods: pod 'NewRelicAgent'
import NewRelic
NewRelic.start(withApplicationToken: "YOUR_TOKEN")
NewRelic.recordMetric(forName: "custom_metric", value: 42)
3. Настройка алертов: от теории к практике
Алерты должны быть умными — без ложных срабатываний, но с быстрой реакцией на реальные проблемы.
3.1. Базовые правила алертинга
- Пороговые значения: FPS < 30, время запуска > 5 секунд, ошибки 5xx > 1%.
- Временные окна: алерт срабатывает только если метрика превышает порог 5 минут подряд.
- Эскалация: сначала уведомление в Slack/Telegram, через 15 минут — SMS/звонок.
3.2. Пример алерта для Firebase
// Настройка в консоли Firebase:
// 1. Перейдите в Performance → Alerts
// 2. Создайте алерт "Slow rendering"
// 3. Условие: средний FPS < 25 для 90% пользователей
// 4. Действие: отправка в Slack через webhook
// Код для автоматической отправки метрик
func checkPerformanceAndAlert(fps: Double) {
if fps < 25 {
let alert = [
"text": "⚠️ Низкий FPS: \(fps) у \(UserDefaults.standard.string(forKey: "user_id") ?? "unknown")"
]
sendSlackMessage(alert)
}
}
3.3. Кастомные алерты через Combine
Используйте фреймворк Combine для реактивной обработки метрик.
import Combine
class AlertPublisher {
private var cancellables = Set()
let metricSubject = PassthroughSubject()
func setupAlert(threshold: Double) {
metricSubject
.debounce(for: .seconds(5), scheduler: DispatchQueue.main)
.filter { $0 < threshold }
.sink { value in
sendAlert("Метрика упала ниже \(threshold): \(value)")
}
.store(in: &cancellables)
}
}
4. Автоматизация мониторинга в CI/CD
Интегрируйте проверки в пайплайн сборки, чтобы ловить регрессии до выхода в продакшн.
4.1. Bitrise + Danger
Добавьте скрипт, который анализирует мет