Qu'est-ce que l'Observabilité et pourquoi en a-t-on besoin en tant que développeur Swift ?
\n\nAvez-vous déjà essayé de comprendre pourquoi votre application Swift sur iOS ralentit précisément sur l'écran du profil, tandis que la partie serveur sur Vapor répond avec un délai de 3 secondes uniquement pour les utilisateurs européens ? Si oui, vous avez déjà rencontré le problème que résout l'observabilité.
\n\nL'observabilité n'est pas simplement de la « journalisation ». C'est la capacité de poser au système toutes les questions sur son état sans avoir à écrire de nouveau code. Les trois piliers de l'observabilité sont : le traçage, les métriques et les logs. Ensemble, ils offrent une image complète de ce qui se passe : de la requête utilisateur jusqu'à l'exécution au cœur de la base de données.
\n\nDans cet article, nous allons voir comment implémenter l'observabilité dans les projets Swift — à la fois côté client (iOS) et côté serveur (Vapor / Hummingbird). Vous découvrirez quelles bibliothèques utiliser, comment écrire des traces et des métriques efficaces, et comment ne pas vous noyer dans les logs.
\n\nPourquoi Swift est-il un candidat idéal pour l'Observabilité ?
\n\nSwift est un langage au typage fort, avec des performances proches du C et un écosystème croissant pour le développement serveur. Mais il y a un détail : la communauté Swift commence seulement à adopter activement l'observabilité. Contrairement à Java ou Go, où OpenTelemetry est déjà un standard, dans le monde Swift, l'observabilité est une tendance récente qui offre un énorme avantage aux premiers adoptants.
\n\nLes principaux défis pour le développeur Swift :
\n- \n
- Asynchronisme : async/await et la concurrence structurée changent les règles du jeu pour le traçage. \n
- Multiplateforme : le code Swift peut fonctionner sur iOS, macOS, serveur et même embarqué. \n
- Absence de standard unique : il n'existe pas encore de « solution miracle » comme dans le monde Java. \n
Mais la bonne nouvelle, c'est que Swift fournit tous les outils nécessaires pour construire une observabilité fiable — il suffit de savoir où regarder.
\n\nTraçage (Tracing) en Swift : de la requête à la réponse
\n\nQu'est-ce que le traçage et pourquoi en a-t-on besoin ?
\nLe traçage (ou traçage distribué) permet de suivre le chemin d'une requête à travers tous les services et fonctions de l'application. Dans le monde des microservices, c'est indispensable. Mais même dans une application iOS monolithique, le traçage aide à comprendre quelle partie du code ralentit.
\n\nOpenTelemetry Swift : votre outil principal
\nOpenTelemetry est un standard ouvert pour l'observabilité. Pour Swift, il existe le paquet opentelemetry-swift. Il prend en charge le traçage, les métriques et les logs, ainsi que l'exportation des données vers n'importe quel backend (Jaeger, Prometheus, Grafana).
Installation via Swift Package Manager :
\n// Package.swift\n.package(url: "https://github.com/open-telemetry/opentelemetry-swift.git", from: "1.10.0")\n\nÉcrire notre première trace en Swift
\nImaginez que vous avez une fonction de chargement du profil utilisateur. Sans traçage, vous ne voyez que le temps d'exécution global. Avec le traçage, vous voyez chaque étape :
\n\nimport OpenTelemetryApi\nimport OpenTelemetrySdk\n\nlet tracer = OpenTelemetry.instance.tracerProvider.get(\n instrumentationName: "ProfileModule",\n instrumentationVersion: "1.0.0"\n)\n\nfunc loadUserProfile(userId: String) async throws -> UserProfile {\n let span = tracer.spanBuilder(spanName: "loadUserProfile")\n .setAttribute(key: "user.id", value: userId)\n .startSpan()\n \n defer {\n span.end()\n }\n \n // Étape 1 : vérification du cache\n let cacheSpan = tracer.spanBuilder(spanName: "checkCache").startSpan()\n let cached = checkCache(for: userId)\n cacheSpan.end()\n \n if let cachedProfile = cached {\n span.setAttribute(key: "cache.hit", value: true)\n return cachedProfile\n }\n \n // Étape 2 : requête à l'API\n let apiSpan = tracer.spanBuilder(spanName: "fetchFromAPI").startSpan()\n let profile = try await api.fetchPro