Métricas de Prometheus en Swift (iOS/macOS): monitoreo de aplicaciones móviles y de escritorio
Prometheus es un sistema de monitoreo y alerta de código abierto que recopila métricas en forma de series temporales. En el ecosistema de Apple (iOS y macOS), el uso de Prometheus permite rastrear el rendimiento de las aplicaciones, el comportamiento de los usuarios, el estado de la red y otros indicadores importantes. En este artículo, veremos cómo implementar métricas de Prometheus en proyectos Swift, qué bibliotecas existen para ello y cómo configurar la exportación de datos.
¿Por qué son necesarias las métricas de Prometheus en aplicaciones móviles?
Las aplicaciones móviles y de escritorio a menudo funcionan en condiciones de recursos limitados y conexión inestable. La recopilación de métricas ayuda a:
- Identificar cuellos de botella en el rendimiento (retrasos en la UI, fugas de memoria)
- Rastrear la frecuencia y los tipos de errores (crash, errores de red)
- Analizar el comportamiento del usuario (duración de la sesión, pantallas)
- Configurar alertas sobre valores críticos (por ejemplo, tiempo de respuesta de la API > 5 seg)
Tipos principales de métricas de Prometheus
Prometheus admite cuatro tipos principales de métricas que se pueden implementar en Swift:
- Counter (contador) — valor que aumenta monótonamente (número de solicitudes, errores)
- Gauge (indicador) — valor arbitrario que puede aumentar y disminuir (memoria actual, usuarios activos)
- Histogram (histograma) — distribución de valores en intervalos definidos (tiempo de ejecución de funciones)
- Summary (resumen) — distribución con cuantiles (latencia)
Bibliotecas para Swift
Actualmente, la biblioteca más popular para trabajar con Prometheus en Swift es SwiftPrometheus. Proporciona una API simple para crear y registrar métricas, y también admite la exportación en un formato compatible con Prometheus.
Instalación a través de Swift Package Manager:
// Package.swiftdependencies: [ .package(url: "https://github.com/reddavis/SwiftPrometheus.git", from: "1.0.0")]Ejemplos de código en Swift
1. Creación de un contador de solicitudes a la API
import SwiftPrometheus
let prometheus = Prometheus()let apiRequests = prometheus.createCounter( named: "api_requests_total", help: "Total number of API requests", labels: ["endpoint"])
// Incremento en cada solicitudapiRequests.inc(["endpoint": "/users"])apiRequests.inc(["endpoint": "/posts"])2. Gauge para rastrear la memoria
let memoryGauge = prometheus.createGauge( named: "app_memory_bytes", help: "Current memory usage in bytes")
// Actualización al cambiar la memoriamemoryGauge.set(Double(reportMemoryUsage()))3. Histograma del tiempo de carga de datos
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()// ... carga de datoslet elapsed = CFAbsoluteTimeGetCurrent() - startloadDuration.observe(elapsed)Exportación de métricas a Prometheus
Para que Prometheus pueda recopilar métricas, su aplicación debe proporcionar un endpoint que devuelva datos en formato de texto plano (plain text exposition format). Para iOS/macOS, esto se puede hacer a través de un servidor HTTP local (por ejemplo, usando Network.framework o bibliotecas de terceros).
Ejemplo de un servidor HTTP simple para exportación:
import SwiftPrometheusimport Network
class MetricsServer { let prometheus: Prometheus var listener: NWListener? init(prometheus: Prometheus, port: UInt16 = 9090) { self.prometheus = prometheus startServer(port: p