Cómo exportar los datos de uso de red de macOS
Cómo exportar y analizar los datos de uso de red de macOS: comandos integrados, formatos comunes y one-liners útiles.
- Developer tools
- macOS
- Bandwidth
- Tutorial
Por fin atrapaste el pico. Durante tres días te has estado preguntando por qué tu uso de internet doméstico saltaba a horas aleatorias, y por fin tienes una herramienta abierta en el momento adecuado para verlo. ¿Y ahora qué? Quieres estos datos fuera de la interfaz en vivo y dentro de algo que puedas analizar, compartir con un compañero, o correlacionar con un log de servidor. La capacidad de exportar el uso de red de macOS importa más de lo que la gente cree, y macOS tiene opciones decentes una vez sabes dónde mirar.
Este artículo recorre los caminos prácticos: nettop -L para capturas cortas, el log unificado para eventos de red del lado del sistema, scripts de muestreo para CSV, y dónde almacena ova sus datos en disco.
Por qué exportar el uso de red de macOS, en absoluto
Algunos casos reales:
- Investigación de anomalías — viste una subida de 2 GB a las 3 AM, quieres graficar el proceso de origen a lo largo de la noche.
- Planificación de capacidad — estás en una conexión medida o limitada (Starlink Roam, Wi-Fi de hotel, tethering móvil) y quieres saber qué es seguro dejar activo.
- Depuración de rendimiento — tu equipo de servidores pregunta cuándo empezaron las peticiones lentas, y quieres superponer el uso de red del lado cliente sobre sus logs de servidor.
- Presupuesto de ancho de banda por proyecto — facturas a clientes por hora y quieres una verificación de cordura sobre lo que sus pipelines de build subieron ayer.
- Curiosidad — simplemente quieres mirar tus propios datos.
Para todos estos, "abrir Monitor de Actividad y mirar fijamente" no basta. Necesitas datos en disco, en un formato que puedas manipular.
Opción 1: modo log de nettop
La ruta de exportación más simple está integrada. nettop -L <conteo> corre en modo log durante <conteo> muestras, volcando cada muestra como una línea de texto, y sale. Combinado con -J para elegir columnas y -s para fijar el intervalo, obtienes salida limpia que puedes canalizar a un archivo.
nettop -L 600 -s 1 -P -J bytes_in,bytes_out,interface,state \
> ~/Desktop/nettop-10min.txtEso son 600 muestras a intervalos de un segundo: diez minutos de captura. Cada muestra lista cada proceso activo con las columnas que pediste.
La salida no es exactamente CSV: tiene una cabecera por muestra, líneas en blanco entre muestras, y nombres de proceso con espacios. Pero es parseable. Un script corto en awk o Python lo convertirá en una tabla limpia.
Límites del logging de nettop
- Solo captura mientras corre. Si querías saber qué pasó ayer, no hay suerte.
- Reporta acumulado-desde-arranque-del-proceso por defecto; tú calculas los deltas.
- Los procesos auxiliares aparecen como filas separadas (sin agrupación).
- El formato de muestra no es CSV de primera clase; espera escribir un parser.
Para capturas puntuales de una ventana de tiempo específica —"voy a hacer push a GitHub, déjame capturar cinco minutos alrededor"— nettop -L es genial. Para datos continuos, quieres algo más.
Opción 2: el log unificado
El log unificado de macOS captura eventos estructurados de los frameworks del sistema, incluida la red. CFNetwork (la capa URLSession) y Network.framework ambos emiten líneas de log para el ciclo de vida de la conexión, handshake TLS, reintentos y fallos. Puedes extraerlos a posteriori.
Para ver qué hay ahora, consulta la última hora:
log show --last 1h --predicate 'subsystem == "com.apple.CFNetwork"' \
--info --debugPara exportar a un archivo:
log show --last 24h --predicate 'subsystem == "com.apple.CFNetwork"' \
--style compact > ~/Desktop/cfnetwork-day.logPredicados útiles:
subsystem == "com.apple.CFNetwork"— peticiones URLSession, TLS, redireccionessubsystem == "com.apple.network"— cambios de ruta de Network.framework, estado de conexiónprocess == "TuApp"— restringe a una appeventMessage CONTAINS "443"— búsqueda de texto dentro de los mensajes de log
El log unificado mantiene aproximadamente los últimos varios días de eventos del sistema, dependiendo del volumen. No está diseñado para contabilidad de bytes, está diseñado para auditoría de eventos. Pero si tu pregunta es "¿la conexión a api.example.com falló a las 14:23?", el log unificado lo sabe.
log show vs log stream
log show lee el log histórico. log stream observa los nuevos eventos en vivo. Usa log stream cuando quieras dejar un terminal corriendo y observar eventos según pasan:
log stream --predicate 'subsystem == "com.apple.network"' --level debugCanaliza a un archivo con >> para añadir una captura rotativa.
Opción 3: un script de muestreo personalizado
Si quieres salida CSV de ancho de banda por proceso (el objetivo real para la mayoría) puedes construirlo en 20 líneas de shell. La idea: sondea cada N segundos, calcula la diferencia de los conteos acumulados de bytes, emite CSV.
#!/usr/bin/env bash
# Muestreador ingenuo de ancho de banda por proceso.
INTERVAL=5
echo "timestamp,pid,process,delta_in,delta_out"
declare -A prev_in prev_out
while true; do
ts=$(date +%s)
while IFS=, read pid name in_bytes out_bytes; do
pi=${prev_in[$pid]:-0}
po=${prev_out[$pid]:-0}
di=$((in_bytes - pi))
do_=$((out_bytes - po))
if (( di > 0 || do_ > 0 )); then
echo "$ts,$pid,$name,$di,$do_"
fi
prev_in[$pid]=$in_bytes
prev_out[$pid]=$out_bytes
done < <(nettop -P -L 1 -J pid,interface,bytes_in,bytes_out 2>/dev/null \
| awk 'NR>2 {print $2","$1","$3","$4}')
sleep $INTERVAL
doneEsto es un esbozo —el código de producción manejaría salidas de procesos, agrupación de auxiliares, rotación de logs y el hecho de que el formato de salida de nettop es molesto de parsear— pero muestra la forma. Muestreas, calculas el delta, emites CSV. Ejecútalo bajo caffeinate o como un agente launchd si quieres que sobreviva al sueño.
Ve ova en acción
Un monitor de ancho de banda en la barra de menú visible de un vistazo: local, firmado, ~3 MB.
Opción 4: la base de datos local de ova
Un monitor de ancho de banda hecho a propósito te ahorra escribir el script de arriba. ova mantiene una base de datos SQLite en:
~/Library/Application Support/ova/El contenido son los mismos datos de series temporales que ves en la interfaz: bytes entrantes y salientes por app, muestreados aproximadamente a 1 Hz, con los procesos auxiliares agrupados bajo su app padre. Es local, sin sincronización en la nube, sin telemetría. Tú eres el dueño del archivo.
Como es SQLite, cualquier cosa que pueda leer SQLite puede leerlo: el CLI sqlite3, el módulo sqlite3 de Python, DB Browser for SQLite o una consulta rápida en DuckDB. Puedes:
- Exportar todo el historial a CSV con un comando
- Ejecutar agregaciones ("qué app usó más ancho de banda esta semana, por hora")
- Hacer joins contra tus propios logs (pipelines de build, logs de acceso a servidor, eventos de calendario)
- Hacer copia de seguridad a tu destino habitual de copia
Una exportación típica a CSV usando sqlite3:
sqlite3 -header -csv \
~/Library/Application\ Support/ova/<archivo>.sqlite \
"SELECT timestamp, app, bytes_in, bytes_out FROM samples \
WHERE timestamp > strftime('%s','now','-7 days') \
ORDER BY timestamp" > ~/Desktop/ultima-semana.csvRecetas prácticas, joins y privacidad
Una vez tienes un CSV, de cualquier fuente, unas cuantas consultas pagan el esfuerzo.
Apps top por semana
SELECT app,
SUM(bytes_in) / (1024*1024) AS mb_down,
SUM(bytes_out) / (1024*1024) AS mb_up
FROM samples
WHERE timestamp > strftime('%s','now','-7 days')
GROUP BY app
ORDER BY (mb_down + mb_up) DESC
LIMIT 20;Casi siempre cuenta una historia clara. Navegador arriba, apps de sincronización en medio, servicios del sistema abajo.
Heatmap por hora
SELECT strftime('%H', timestamp, 'unixepoch', 'localtime') AS hour,
SUM(bytes_in + bytes_out) / (1024*1024) AS mb
FROM samples
WHERE timestamp > strftime('%s','now','-30 days')
GROUP BY hour
ORDER BY hour;Te muestra cuándo hace pico tu tráfico. Para la mayoría: 9 AM, 1 PM y 4 PM, con una larga cola de sincronización en la nube por la noche.
Detección de anomalías
SELECT app,
date(timestamp, 'unixepoch', 'localtime') AS day,
SUM(bytes_out) / (1024*1024) AS mb_up
FROM samples
GROUP BY app, day
HAVING mb_up > 500
ORDER BY mb_up DESC;Marca cualquier app-día con más de 500 MB de subida. Un puñado es normal (Time Machine a un destino de red, sincronización de fotos, transferencias de archivos grandes). Una lista entera de apps no familiares vale la pena investigar.
Combinar fuentes
El flujo más fuerte usa varias fuentes a la vez.
- ova para contabilidad de bytes — qué se usó, por qué app, cuándo
- Log unificado para eventos — cuándo empezaron, fallaron, reintentaron las conexiones
tcpdumppara el cable — cuando algo es genuinamente misterioso
Puedes hacer join por marca de tiempo. Si ova muestra una subida de 200 MB por cloudd a las 3:14 AM, el log unificado muestra qué estaba sincronizando cloudd, y (si tenías una captura de paquetes corriendo) tcpdump muestra el espacio IP de destino confirmando que era iCloud.
Una nota sobre privacidad
Cualquier cosa que exporte datos de red puede filtrar información que no pretendías compartir. Nombres de host, incluso rutas en el log unificado, pueden revelar qué servicios usas. Antes de enviar logs a un compañero o pegarlos en un chat:
- Quita las direcciones IP si identifican tu red doméstica
- Redacta los nombres de host que revelan servicios personales
- Elimina los nombres de proceso que revelan apps que preferirías no anunciar
Esta es también la razón por la que las herramientas solo locales importan. ova no envía tus datos a ningún sitio, se quedan en tu disco. Lo que exportas es tu decisión.
Para terminar
Para exportar datos de uso de red de macOS, tienes varias rutas razonables: nettop -L para capturas cortas, el log unificado para auditoría de eventos, scripts de muestreo personalizados para control total, y un monitor con respaldo SQLite local como ova para contabilidad continua por app. Elige según si necesitas eventos o bytes, y qué ventana de tiempo te importa.
Para un camino de bajo esfuerzo que captura continuamente y te permite consultar después, instala ova: unos 3 MB, macOS 14+, Apple Silicon e Intel, muestrea aproximadamente a 1 Hz. Los datos viven en tu directorio ~/Library/Application Support/ova/ en SQLite, así que cualquier herramienta de análisis que ya conozcas puede leerlos.