Мониторинг Swift приложений: метрики и алерты для iOS/macOS

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Почему мониторинг критичен для 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

Добавьте скрипт, который анализирует мет

Блоги

Рекомендаций по книгам