Métricas Prometheus em Swift (iOS/macOS): monitoramento de aplicativos móveis e desktop
Prometheus é um sistema de monitoramento e alerta de código aberto que coleta métricas na forma de séries temporais. No ecossistema Apple (iOS e macOS), o uso do Prometheus permite rastrear o desempenho dos aplicativos, o comportamento do usuário, o estado da rede e outros indicadores importantes. Neste artigo, veremos como implementar métricas Prometheus em projetos Swift, quais bibliotecas existem para isso e como configurar a exportação de dados.
Por que usar métricas Prometheus em aplicativos móveis?
Aplicativos móveis e desktop geralmente operam em condições de recursos limitados e conexão instável. A coleta de métricas ajuda a:
- Identificar gargalos de desempenho (atrasos na UI, vazamentos de memória)
- Rastrear a frequência e os tipos de erros (crash, erros de rede)
- Analisar o comportamento do usuário (tempo de sessão, telas)
- Configurar alertas para valores críticos (por exemplo, tempo de resposta da API > 5 seg)
Principais tipos de métricas Prometheus
Prometheus suporta quatro tipos principais de métricas que podem ser implementadas em Swift:
- Counter (contador) — valor monotonicamente crescente (número de requisições, erros)
- Gauge (medidor) — valor arbitrário que pode aumentar e diminuir (memória atual, usuários ativos)
- Histogram (histograma) — distribuição de valores em intervalos definidos (tempo de execução de funções)
- Summary (sumário) — distribuição com quantis (latências)
Bibliotecas para Swift
Atualmente, a biblioteca mais popular para trabalhar com Prometheus em Swift é SwiftPrometheus. Ela fornece uma API simples para criar e registrar métricas, além de suportar exportação no formato compatível com Prometheus.
Instalação via Swift Package Manager:
// Package.swiftdependencies: [ .package(url: "https://github.com/reddavis/SwiftPrometheus.git", from: "1.0.0")]Exemplos de código em Swift
1. Criando um contador de requisições à API
import SwiftPrometheus
let prometheus = Prometheus()let apiRequests = prometheus.createCounter( named: "api_requests_total", help: "Total number of API requests", labels: ["endpoint"])
// Incremento a cada requisiçãoapiRequests.inc(["endpoint": "/users"])apiRequests.inc(["endpoint": "/posts"])2. Gauge para monitoramento de memória
let memoryGauge = prometheus.createGauge( named: "app_memory_bytes", help: "Current memory usage in bytes")
// Atualização quando a memória mudamemoryGauge.set(Double(reportMemoryUsage()))3. Histograma de tempo de carregamento de dados
let loadDuration = prometheus.createHistogram( named: "data_load_duration_seconds", help: "Histogram of data loading time", buckets: [0.1, 0.5, 1.0, 2.0, 5.0])
let start = CFAbsoluteTimeGetCurrent()// ... carregamento de dadoslet elapsed = CFAbsoluteTimeGetCurrent() - startloadDuration.observe(elapsed)Exportação de métricas para Prometheus
Para que o Prometheus possa coletar métricas, seu aplicativo deve fornecer um endpoint que retorne dados no formato de texto simples (plain text exposition format). Para iOS/macOS, isso pode ser feito através de um servidor HTTP local (por exemplo, usando Network.framework ou bibliotecas de terceiros).
Exemplo de um servidor HTTP simples para exportação:
import SwiftPrometheusimport Network
class MetricsServer { let prometheus: Prometheus var listener: NWListener? init(prometheus: Prometheus, port: UInt16 = 9090) { self.prometheus = prometheus startServer(port: p