Observabilité en Swift : traçage, métriques et logs pour les pros

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Qu'est-ce que l'Observabilité et pourquoi en a-t-on besoin en tant que développeur Swift ?

\n\n

Avez-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\n

L'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\n

Dans 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\n

Pourquoi Swift est-il un candidat idéal pour l'Observabilité ?

\n\n

Swift 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\n

Les 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
\n\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\n

Traçage (Tracing) en Swift : de la requête à la réponse

\n\n

Qu'est-ce que le traçage et pourquoi en a-t-on besoin ?

\n

Le 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\n

OpenTelemetry Swift : votre outil principal

\n

OpenTelemetry 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).

\n\n

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

\n

Imaginez 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\n
import 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                

Blogs

Book Recommendations