Spaces:
Runtime error
Runtime error
docs: documenta telemetria (tabla events, EVENTS_PERSIST, endpoints)
Browse files- .env.example +8 -0
- docs/db/diseno_db.md +15 -0
- docs/ejecucion.md +3 -1
.env.example
CHANGED
|
@@ -57,6 +57,14 @@ MODEL_ARCHITECTURE=yolo26n # yolo26n | rfdetr_nano (define el ada
|
|
| 57 |
HF_MODEL_REPO=<org>/agrovision-plantcount
|
| 58 |
HF_TOKEN=
|
| 59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
# -----------------------------------------------------------------------------------
|
| 61 |
# 6) Supabase (BD PostGIS + Storage + Queues) — PLATAFORMA COMPLETA
|
| 62 |
# Project Settings -> API / Database. SERVICE_ROLE es SECRETO (solo backend, nunca UI).
|
|
|
|
| 57 |
HF_MODEL_REPO=<org>/agrovision-plantcount
|
| 58 |
HF_TOKEN=
|
| 59 |
|
| 60 |
+
# -----------------------------------------------------------------------------------
|
| 61 |
+
# 6) Telemetría de UI (Fase 9)
|
| 62 |
+
# Los eventos siempre se loguean en stdout y se guardan en un buffer en memoria
|
| 63 |
+
# (GET /api/events/recent). EVENTS_PERSIST=true además los persiste en la tabla
|
| 64 |
+
# `events` de Supabase (best-effort; requiere DATABASE_URL). Nunca contiene secretos.
|
| 65 |
+
# -----------------------------------------------------------------------------------
|
| 66 |
+
EVENTS_PERSIST=false # true para volcar la telemetría a la tabla events
|
| 67 |
+
|
| 68 |
# -----------------------------------------------------------------------------------
|
| 69 |
# 6) Supabase (BD PostGIS + Storage + Queues) — PLATAFORMA COMPLETA
|
| 70 |
# Project Settings -> API / Database. SERVICE_ROLE es SECRETO (solo backend, nunca UI).
|
docs/db/diseno_db.md
CHANGED
|
@@ -141,6 +141,19 @@ erDiagram
|
|
| 141 |
|
| 142 |
---
|
| 143 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 144 |
## 4. Matriz de Accesos y CRUD por Componente
|
| 145 |
|
| 146 |
| Tabla | Gateway (FastAPI) | Worker Asíncrono | UI (Shiny) | Permisos | Notas de Diseño |
|
|
@@ -149,6 +162,7 @@ erDiagram
|
|
| 149 |
| `ndvi_timeseries` | `RemoteSensingService` (write, mensual) | *Ninguno* | lectura vía API (*Teledetección*, *Resumen*) | `API: Read/Write` | Escritura tras estadística zonal + agregación mensual; idempotente por `UNIQUE(field_id,date)`. |
|
| 150 |
| `plant_counts` | `CountService` (read) | `InferenceWorker` (write) | lectura vía API | `API: Read` <br> `Worker: Write` | **En desarrollo:** sin escrituras hasta `COUNTING_ENABLED=true`. |
|
| 151 |
| `chat_messages` | `AgentService` | *Ninguno* | lectura vía API (*Asistente*) | `API: Read/Write` | Memoria del agente (Memory Buffer). |
|
|
|
|
| 152 |
| `pgmq.count_tasks` (cola) | `CountService` (produce) | `InferenceWorker` (consume) | — | `API: send` <br> `Worker: read/archive` | **En desarrollo:** cola creada pero inactiva hasta activar el conteo. |
|
| 153 |
|
| 154 |
> **NDVI raster / heatmap:** el endpoint `POST /api/ndvi/raster` genera un PNG colorizado **on-demand** (no escribe en BD ni en Storage; se regenera). No aparece en la matriz por no tocar persistencia.
|
|
@@ -164,6 +178,7 @@ erDiagram
|
|
| 164 |
* **`ndvi_field_date_idx`** en `ndvi_timeseries (field_id, date)` — optimiza filtros de fecha del agente.
|
| 165 |
* **`plant_counts_json_gin_idx`** en `plant_counts USING gin (result_json)` — búsquedas/agregaciones sobre el JSONB de detecciones.
|
| 166 |
* **`chat_session_history_idx`** en `chat_messages (session_id, created_at)` — recuperación ordenada del historial.
|
|
|
|
| 167 |
|
| 168 |
### 5.2 Control de Concurrencia y Seguridad
|
| 169 |
* **Row Level Security (RLS):** políticas `auth.uid() = user_id` en todas las tablas para aislar usuarios dentro del mismo proyecto Supabase.
|
|
|
|
| 141 |
|
| 142 |
---
|
| 143 |
|
| 144 |
+
### 3.5 Tabla: `events` (Telemetría de UI — Fase 9, persistencia **opcional**)
|
| 145 |
+
* **Descripción:** Traza de acciones de la UI para depurar. Se escribe **solo** si `EVENTS_PERSIST=true` (best-effort; un fallo de BD nunca rompe la UI). El backend **redacta** `meta` antes de insertar: **nunca** contiene secretos. Por defecto la telemetría vive solo en stdout + un ring buffer en memoria (`GET /api/events/recent`).
|
| 146 |
+
|
| 147 |
+
| Campo | Tipo de Dato | Modificadores | Descripción / Regla de Negocio |
|
| 148 |
+
| :--- | :--- | :--- | :--- |
|
| 149 |
+
| `id` | `BIGSERIAL` | `PK` | Identificador secuencial. |
|
| 150 |
+
| `action` | `TEXT` | `NOT NULL` | Acción (`nav`, `creds_set`, `parcel_create`, `chart_view`, `api_error`…). |
|
| 151 |
+
| `session_id` | `TEXT` | `NOT NULL` | Correlación por sesión de UI. |
|
| 152 |
+
| `meta` | `JSONB` | `NOT NULL DEFAULT '{}'` | Contexto **ya redactado** (contadores, pestaña, status…). |
|
| 153 |
+
| `created_at` | `TIMESTAMP` | `DEFAULT now()` | Orden temporal. |
|
| 154 |
+
|
| 155 |
+
---
|
| 156 |
+
|
| 157 |
## 4. Matriz de Accesos y CRUD por Componente
|
| 158 |
|
| 159 |
| Tabla | Gateway (FastAPI) | Worker Asíncrono | UI (Shiny) | Permisos | Notas de Diseño |
|
|
|
|
| 162 |
| `ndvi_timeseries` | `RemoteSensingService` (write, mensual) | *Ninguno* | lectura vía API (*Teledetección*, *Resumen*) | `API: Read/Write` | Escritura tras estadística zonal + agregación mensual; idempotente por `UNIQUE(field_id,date)`. |
|
| 163 |
| `plant_counts` | `CountService` (read) | `InferenceWorker` (write) | lectura vía API | `API: Read` <br> `Worker: Write` | **En desarrollo:** sin escrituras hasta `COUNTING_ENABLED=true`. |
|
| 164 |
| `chat_messages` | `AgentService` | *Ninguno* | lectura vía API (*Asistente*) | `API: Read/Write` | Memoria del agente (Memory Buffer). |
|
| 165 |
+
| `events` | `events` router (write best-effort) | *Ninguno* | escritura vía `POST /api/events` (telemetría) | `API: Write` <br> (opcional) | **Opcional** (`EVENTS_PERSIST=true`). Sin secretos (redactado). Por defecto solo buffer en memoria. |
|
| 166 |
| `pgmq.count_tasks` (cola) | `CountService` (produce) | `InferenceWorker` (consume) | — | `API: send` <br> `Worker: read/archive` | **En desarrollo:** cola creada pero inactiva hasta activar el conteo. |
|
| 167 |
|
| 168 |
> **NDVI raster / heatmap:** el endpoint `POST /api/ndvi/raster` genera un PNG colorizado **on-demand** (no escribe en BD ni en Storage; se regenera). No aparece en la matriz por no tocar persistencia.
|
|
|
|
| 178 |
* **`ndvi_field_date_idx`** en `ndvi_timeseries (field_id, date)` — optimiza filtros de fecha del agente.
|
| 179 |
* **`plant_counts_json_gin_idx`** en `plant_counts USING gin (result_json)` — búsquedas/agregaciones sobre el JSONB de detecciones.
|
| 180 |
* **`chat_session_history_idx`** en `chat_messages (session_id, created_at)` — recuperación ordenada del historial.
|
| 181 |
+
* **`events_session_created_idx`** en `events (session_id, created_at)` — traza de una sesión ordenada (depuración; tabla opcional).
|
| 182 |
|
| 183 |
### 5.2 Control de Concurrencia y Seguridad
|
| 184 |
* **Row Level Security (RLS):** políticas `auth.uid() = user_id` en todas las tablas para aislar usuarios dentro del mismo proyecto Supabase.
|
docs/ejecucion.md
CHANGED
|
@@ -128,7 +128,9 @@ Abre **http://localhost:4321/**. *(UI Shiny legacy, opcional: `.\scripts\run_ui.
|
|
| 128 |
5. [ ] (Con `DATABASE_URL` + Copernicus configurados) **Creación de Parcelas**: dibujar un polígono, nombrarlo y *Guardar* → aparece en la lista; tras unos segundos, en **Teledetección** se ve la serie NDVI de 5 años.
|
| 129 |
6. [ ] (Con Groq) **Asistente**: preguntar *"¿cómo evolucionó el NDVI de \<parcela\>?"* → responde citando la herramienta usada.
|
| 130 |
|
| 131 |
-
> **Pruebas en vivo del backend** (sin la UI): `http://127.0.0.1:8000/docs` (Swagger) lista `/api/fields`, `/api/ndvi`, `/api/ndvi/raster`, `/api/weather`, `/api/chat`. Recuerda aplicar migraciones (`uv run python -m backend.db.migrate`) antes de usar parcelas.
|
|
|
|
|
|
|
| 132 |
|
| 133 |
### 3.5 (Opcional) Demostrar el Conteo con Datos Mock
|
| 134 |
|
|
|
|
| 128 |
5. [ ] (Con `DATABASE_URL` + Copernicus configurados) **Creación de Parcelas**: dibujar un polígono, nombrarlo y *Guardar* → aparece en la lista; tras unos segundos, en **Teledetección** se ve la serie NDVI de 5 años.
|
| 129 |
6. [ ] (Con Groq) **Asistente**: preguntar *"¿cómo evolucionó el NDVI de \<parcela\>?"* → responde citando la herramienta usada.
|
| 130 |
|
| 131 |
+
> **Pruebas en vivo del backend** (sin la UI): `http://127.0.0.1:8000/docs` (Swagger) lista `/api/fields`, `/api/ndvi`, `/api/ndvi/raster`, `/api/weather`, `/api/chat` y `/api/events` (telemetría: `POST /api/events`, `GET /api/events/recent?session_id=`). Recuerda aplicar migraciones (`uv run python -m backend.db.migrate`) antes de usar parcelas.
|
| 132 |
+
>
|
| 133 |
+
> **Telemetría (Fase 9):** cada acción de la UI emite un evento (sin secretos) que se loguea en stdout y se guarda en un buffer en memoria, consultable en `GET /api/events/recent`. Para depurar una sesión: `GET /api/events/recent?session_id=<id>`. La persistencia en la tabla `events` es **opcional** (`EVENTS_PERSIST=true`).
|
| 134 |
|
| 135 |
### 3.5 (Opcional) Demostrar el Conteo con Datos Mock
|
| 136 |
|