1. Descripción general
WIS2 Downloader expone una REST API para gestionar suscripciones y monitorizar el sistema.
-
URL base:
http://localhost:5002 -
Especificación OpenAPI:
http://localhost:5002/openapi -
Swagger UI:
http://localhost:5002/swagger
2. Autenticación
Actualmente, la API no requiere autenticación. En producción, considere colocarla detrás de un proxy inverso con autenticación.
3. API de suscripciones
3.1. Listar suscripciones
Devuelve todas las suscripciones activas.
GET /subscriptions
3.1.1. Respuesta
| Estado | Descripción |
|---|---|
200 |
Éxito — devuelve un mapa de topic a detalles de suscripción |
503 |
Redis no disponible |
3.1.2. Ejemplo
curl http://localhost:5002/subscriptions
{
"cache/a/wis2/+/data/core/weather/surface-based-observations/#": {
"topic": "cache/a/wis2/+/data/core/weather/surface-based-observations/#",
"save_path": "surface-obs",
"filters": {
"accepted_media_types": ["application/bufr", "application/grib"]
}
}
}
3.2. Crear suscripción
Crea una nueva suscripción a un topic WIS2.
POST /subscriptions
Content-Type: application/json
3.2.1. Cuerpo de la solicitud
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
|
string |
Sí |
Patrón de topic MQTT de WIS2. Admite comodines |
|
string |
No |
Subdirectorio bajo |
|
object |
No |
Configuración de filtros. |
|
array |
No |
Lista de tipos MIME permitidos. Admite comodines (p. ej., |
3.2.2. Respuesta
| Estado | Descripción |
|---|---|
202 |
Aceptado — suscripción en cola para procesamiento |
400 |
Solicitud incorrecta — topic faltante o no válido |
503 |
Servicio no disponible — fallo en la conexión con Redis |
3.2.3. Cabeceras de respuesta
| Cabecera | Descripción |
|---|---|
|
URL para obtener los detalles de la suscripción |
3.2.4. Ejemplo
curl -X POST http://localhost:5002/subscriptions \
-H "Content-Type: application/json" \
-d '{
"topic": "cache/a/wis2/+/data/core/weather/surface-based-observations/#",
"target": "surface-obs",
"filters": {
"accepted_media_types": ["application/bufr", "application/grib"]
}
}'
{
"status": "accepted",
"topic": "cache/a/wis2/+/data/core/weather/surface-based-observations/#",
"target": "surface-obs"
}
3.3. Obtener suscripción
Devuelve los detalles de una suscripción específica.
GET /subscriptions/{topic}
3.3.1. Parámetros de ruta
| Parámetro | Tipo | Descripción |
|---|---|---|
|
string |
Topic WIS2 (solo |
3.3.2. Codificación de URL
Solo el carácter # requiere codificación URL:
| Carácter | Codificado | Motivo |
|---|---|---|
|
|
De lo contrario se interpreta como fragmento de URL |
Las barras (/) y el + no requieren codificación en la ruta.
|
3.3.3. Respuesta
| Estado | Descripción |
|---|---|
200 |
Éxito |
400 |
Topic no válido |
404 |
Suscripción no encontrada |
503 |
Redis no disponible |
3.3.4. Ejemplo
curl "http://localhost:5002/subscriptions/cache/a/wis2/+/data/core/weather/surface-based-observations/%23"
{
"topic": "cache/a/wis2/+/data/core/weather/surface-based-observations/#",
"save_path": "surface-obs",
"filters": {
"accepted_media_types": ["application/bufr", "application/grib"]
}
}
3.4. Eliminar suscripción
Elimina una suscripción.
DELETE /subscriptions/{topic}
3.4.1. Parámetros de ruta
| Parámetro | Tipo | Descripción |
|---|---|---|
|
string |
Topic WIS2 codificado en URL |
3.4.2. Respuesta
| Estado | Descripción |
|---|---|
200 |
Eliminado correctamente |
400 |
Topic no válido |
503 |
Redis no disponible |
3.4.3. Ejemplo
curl -X DELETE "http://localhost:5002/subscriptions/cache/a/wis2/+/data/core/weather/surface-based-observations/%23"
{
"status": "deleted",
"topic": "cache/a/wis2/+/data/core/weather/surface-based-observations/#"
}
4. API de monitorización
4.1. Verificación de salud
Devuelve el estado de salud del servicio.
GET /health
4.1.1. Respuesta
Siempre devuelve 200. Compruebe el campo status para conocer el estado real.
| Campo | Valores |
|---|---|
|
|
4.1.2. Ejemplo
curl http://localhost:5002/health
{"status": "healthy"}
4.2. Métricas de Prometheus
Devuelve métricas en formato de texto Prometheus.
GET /metrics
4.2.1. Respuesta
| Estado | Descripción |
|---|---|
200 |
Métricas en formato de texto Prometheus |
500 |
Error al generar las métricas |
4.2.2. Métricas disponibles
| Métrica | Tipo | Etiquetas | Descripción |
|---|---|---|---|
|
Counter |
status |
Total de notificaciones procesadas |
|
Counter |
cache, media_type |
Archivos descargados correctamente |
|
Counter |
cache, media_type |
Total de bytes descargados |
|
Counter |
reason |
Notificaciones omitidas por motivo |
|
Counter |
cache, reason |
Descargas fallidas |
|
Gauge |
queue_name |
Tareas actuales en la cola de Celery |
4.2.3. Ejemplo
curl http://localhost:5002/metrics
# HELP wis2downloader_downloads_total Total number of files downloaded.
# TYPE wis2downloader_downloads_total counter
wis2downloader_downloads_total{cache="example.cache.com",media_type="application/bufr"} 42.0
# HELP wis2downloader_notifications_total Total notifications processed.
# TYPE wis2downloader_notifications_total counter
wis2downloader_notifications_total{status="success"} 42.0
wis2downloader_notifications_total{status="skipped"} 5.0
4.3. Especificación OpenAPI
Devuelve la especificación OpenAPI 3.0 en formato JSON.
GET /openapi
4.4. Swagger UI
Documentación interactiva de la API.
GET /
GET /swagger
5. Respuestas de error
Todas las respuestas de error siguen este formato:
{
"error": "Error message describing the problem"
}
5.1. Mensajes de error comunes
| Estado | Error | Causa |
|---|---|---|
400 |
"No topic provided" |
POST /subscriptions sin campo topic |
400 |
"No topic passed" |
GET/DELETE con topic vacío |
404 |
"Subscription for topic X not found" |
Topic no suscrito |
503 |
"Failed to connect to Redis: …" |
Redis no disponible |
503 |
"Failed to queue subscription command…" |
Fallo en Redis pub/sub |
503 |
"Failed to persist subscription…" |
Fallo de escritura en Redis |
6. Esquemas de datos
6.1. Suscripción
{
"topic": "string (required) - WIS2 MQTT topic pattern",
"save_path": "string | null - Subdirectory for downloads",
"filters": {
"accepted_media_types": ["array of MIME type strings"]
}
}
6.2. Filtros
{
"accepted_media_types": [
"application/bufr",
"application/grib",
"application/x-netcdf*"
]
}
6.2.1. Tipos de medios aceptados por defecto
Cuando no se especifica ningún filtro, se aceptan estos tipos:
[
"image/gif", "image/jpeg", "image/png", "image/tiff",
"application/pdf", "application/postscript",
"application/bufr", "application/grib",
"application/x-hdf", "application/x-hdf5",
"application/x-netcdf", "application/x-netcdf4",
"text/plain", "text/html", "text/xml", "text/csv",
"text/tab-separated-values"
]
7. Referencia de patrones de topic
7.1. Estructura del topic WIS2
{origin|cache}/a/wis2/{centre-id}/data/{data-policy}/{earth-system-domain}/{category}/...
-
origin- Datos originales del proveedor de datos -
cache- Copia en caché desde un Global Cache (recomendado para mayor fiabilidad) -
{centre-id}- Código de país/organización, precedido del código de país ISO2C (p. ej.,de-dwd) -
{data-policy}- Política unificada de datos de la WMO:coreorecommended -
{earth-system-domain}- Dominio del sistema terrestre según la Política unificada de datos de la WMO
7.2. Comodines
| Patrón | Símbolo | Descripción |
|---|---|---|
Un nivel |
|
Coincide exactamente con un nivel |
Multinivel |
|
Coincide con cero o más niveles (debe ir al final) |
7.3. Ejemplos
| Patrón | Coincide con |
|---|---|
|
Todos los datos del Deutscher Wetterdienst |
|
Observaciones de superficie de todos los centros |
|
Todos los datos core de cualquier centro |
|
Todos los datos meteorológicos (cualquier política) de cualquier centro |