Introduction : Pourquoi la surveillance des applications Swift est une nécessité
\nDévelopper des applications Swift pour iOS et macOS n'est que la moitié du succès. Dans le monde moderne de l'expérience utilisateur (UX), il est crucial non seulement d'écrire du code, mais aussi d'assurer son fonctionnement stable en production. Sans système de surveillance, vous risquez de manquer une baisse de performance, une fuite mémoire ou un dysfonctionnement dans un module critique. Dans cet article, nous allons voir comment configurer la surveillance des applications Swift de zéro : de la collecte de métriques à la configuration d'alertes. Vous découvrirez les meilleures pratiques, les outils et des exemples de code qui aideront votre application à fonctionner comme sur des roulettes.
\n\nMétriques principales pour les applications Swift
\nLa surveillance commence par la compréhension de ce qu'il faut mesurer. Pour les applications Swift (iOS/macOS), les métriques clés sont :
\n- \n
- Temps de démarrage (Cold Start / Warm Start) — indicateur de la première impression de l'utilisateur. \n
- Utilisation de la mémoire (Memory footprint) — prévention des plantages Out-of-Memory (OOM). \n
- FPS (Frames Per Second) — fluidité des animations et de l'interface. \n
- Requêtes réseau — temps de réponse, nombre d'erreurs (4xx, 5xx). \n
- Journaux de plantage — nombre et type de crashs de l'application. \n
Ces métriques peuvent être collectées à la fois par des moyens intégrés (Xcode Metrics) et à l'aide de SDK tiers (par exemple, Firebase Crashlytics, New Relic, Datadog). Cependant, pour un contrôle total, il est préférable d'utiliser vos propres outils.
\n\nExemple : collecte du temps de démarrage avec SwiftMetrics
\nPour collecter des métriques en Swift, il est pratique d'utiliser la bibliothèque SwiftMetrics (partie du package swift-metrics). Installez-la via Swift Package Manager :
// Package.swift\ndependencies: [\n .package(url: "https://github.com/apple/swift-metrics.git", from: "2.4.0")\n]\nExemple de code pour mesurer le temps de démarrage à froid :
\nimport Metrics\n\nclass AppMetrics {\n static let shared = AppMetrics()\n \n func recordLaunchTime() {\n let startTime = CFAbsoluteTimeGetCurrent()\n // Initialisation de l'application...\n let elapsed = (CFAbsoluteTimeGetCurrent() - startTime) * 1000 // en millisecondes\n Counter(label: "app.launch_time_ms").increment(by: Int(elapsed))\n }\n}\nCe code crée un compteur qui peut être envoyé à un système de surveillance (par exemple, Prometheus ou Grafana).
\n\nConfiguration des alertes : de la réaction à la proactivité
\nLa collecte de métriques est inutile sans système d'alerte. Les alertes permettent de réagir aux problèmes avant qu'ils ne deviennent critiques. Dans les applications Swift, les alertes se divisent en deux types :
\n- \n
- Locales — se déclenchent sur l'appareil de l'utilisateur (par exemple, en cas de dépassement du seuil de mémoire). \n
- Serveur — sont envoyées à votre tableau de bord (par exemple, en cas d'augmentation du nombre d'erreurs). \n
Examinons la configuration d'une alerte locale en cas de dépassement de mémoire en utilisant os.log et NotificationCenter :
import Foundation\nimport os.log\n\nclass MemoryMonitor {\n static let shared = MemoryMonitor()\n private let memoryWarningThreshold: UInt64 = 500_000_000 // 500 MB\n \n func startMonitoring() {\n NotificationCenter.default.addObserver(\n self,\n selector: #selector(handleMemoryWarning),\n name: UIApplication.didReceiveMemoryWarningNotification,\n object: nil\n )\n }\n \n @objc private func handleMemoryWarning() {\n let memoryUsed = reportMemoryUsage()\n if memoryUsed > memoryWarningThreshold {\n os_log(.error, "Memory usage critical: %llu MB", memoryUsed / 1_000_000)\n // Ici, on peut envoyer une alerte au serveur ou l'afficher à l'utilisateur\n }\n }\n \n private func reportMemoryUsage() -> UInt6