O que é Observabilidade e por que ela é necessária para um desenvolvedor Swift?
\n\nVocê já tentou entender por que seu aplicativo Swift no iOS está lento exatamente na tela de perfil, e a parte do servidor em Vapor responde com um atraso de 3 segundos apenas para usuários da Europa? Se sim — você já enfrentou o problema que a observabilidade resolve.
\n\nObservabilidade não é apenas "registro em log". É a capacidade de fazer qualquer pergunta ao sistema sobre seu estado sem precisar escrever novo código. Os três pilares da observabilidade são: rastreamento (tracing), métricas e logs. Juntos, eles fornecem uma imagem completa do que está acontecendo: desde a solicitação do usuário até a execução no fundo do banco de dados.
\n\nNeste artigo, vamos abordar como implementar observabilidade em projetos Swift — tanto no cliente (iOS) quanto no servidor (Vapor / Hummingbird). Você aprenderá quais bibliotecas usar, como escrever traces e métricas eficientes e como não se afogar em logs.
\n\nPor que Swift é o candidato ideal para Observabilidade?
\n\nSwift é uma linguagem com tipagem forte, desempenho no nível de C e um ecossistema crescente para desenvolvimento no servidor. Mas há um detalhe: a comunidade Swift está apenas começando a adotar ativamente a observabilidade. Ao contrário de Java ou Go, onde o OpenTelemetry já se tornou padrão, no Swift o mundo da observabilidade é uma tendência recente que dá aos primeiros adeptos uma enorme vantagem.
\n\nPrincipais desafios para o desenvolvedor Swift:
\n- \n
- Assincronicidade: async/await e Structured Concurrency mudam as regras do jogo para o rastreamento. \n
- Multiplataforma: o código Swift pode rodar em iOS, macOS, servidor e até mesmo em sistemas embarcados. \n
- Falta de um padrão único: ainda não existe uma "bala de prata" como no mundo Java. \n
Mas a boa notícia é que o Swift fornece todas as ferramentas para construir uma observabilidade robusta — você só precisa saber onde olhar.
\n\nRastreamento (Tracing) em Swift: da solicitação à resposta
\n\nO que é rastreamento e para que serve?
\nO rastreamento (ou rastreamento distribuído) permite rastrear o caminho de uma única solicitação através de todos os serviços e funções do aplicativo. No mundo dos microsserviços, isso é indispensável. Mas mesmo em um aplicativo iOS monolítico, o rastreamento ajuda a entender qual parte específica do código está lenta.
\n\nOpenTelemetry Swift: sua principal ferramenta
\nOpenTelemetry é um padrão aberto para observabilidade. Para Swift, existe o pacote opentelemetry-swift. Ele suporta rastreamento, métricas e logs, além de exportar dados para qualquer backend (Jaeger, Prometheus, Grafana).
Instalação via Swift Package Manager:
\n// Package.swift\n.package(url: "https://github.com/open-telemetry/opentelemetry-swift.git", from: "1.10.0")\n\nEscrevendo o primeiro trace em Swift
\nImagine que você tem uma função para carregar o perfil do usuário. Sem rastreamento, você vê apenas o tempo total de execução. Com rastreamento — cada etapa:
\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 // Passo 1: verificação de 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 // Passo 2: solicitação à API\n let apiSpan = tracer.spanBuilder(spanName: "fetchFromAPI").startSpan()\n let profile = try await api.fetchPro