Configuración operativa
SPOT 2.0 separa claramente productor y lector: el agente publica telemetría SAP
schema v2 en metrics y logs; el backend lee esos mismos Data Streams. No
existen campos de configuración para índices Jobs, Events o WPInfo.
Targets SAP y storage
En todo SPOT, target significa una instancia SAP. El valor de
sapconnection[].id se publica como source_id y se usa como targetId en la
API, el selector global, alertas, thresholds, ML e IA. Es obligatorio, se
compara exactamente después de recortar espacios y nunca se resuelve por alias.
Un read scope es una URL Elasticsearch, un namespace y credenciales de sólo
lectura. No aparece como target en la cabecera. Un backend on-prem puede tener
varios scopes y un mismo namespace puede contener varios SAP, separados siempre
por source_id.
Los IDs de target y read scope usan
^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$ después de recortar espacios y son
case-sensitive. Configuración guarda los read scopes en orden, uno a uno; si
uno falla, conserva los siguientes como borrador e indica cuántos quedaron
pendientes, evitando actualizaciones concurrentes perdidas.
/etc/spot/spot.yaml:
setup:
elastic_mode: external
connector_mode: hybrid
local_connector_read_scope_id: elastic-pro
target_catalog_path: /var/lib/spot/targets/catalog.json
elasticsearch_read_scopes:
- id: elastic-pro
alias: Producción
url: https://elastic.example.local:9200
namespace: PRO
enabled: true
/etc/spot/.spot-agent-sap.yaml:
elasticsearch:
url: https://elastic.example.local:9200
namespace: PRO
manage_data_streams_ilm: false
enabled: true
sapconnection:
- id: sap-financiero
alias: SAP Financiero
system_id: FIN
client: "100"
- id: sap-asistencial
alias: SAP Asistencial
system_id: ASI
client: "100"
Ambos SAP escriben en spot-integration-PRO-metrics y
spot-integration-PRO-logs, pero cada consulta exige el targetId SAP y filtra
tenant_id=onprem + source_id=targetId. Un scope caído no afecta a los targets
de otros scopes y SPOT nunca prueba otro Elasticsearch como alternativa.
El catálogo persiste en /var/lib/spot/targets/catalog.json, sin secretos, y se
conserva en backup, restore y upgrade. Un mismo source_id en dos scopes queda
en target_binding_conflict; un ID con SID/client incompatibles queda en
target_identity_conflict. El target sigue visible, pero no es consultable
hasta corregir el connector.
Un target sin observaciones recientes pasa a stale: permanece visible y
consultable con su binding conocido. Si su read scope no responde, pasa a
unreachable; las APIs de ese target devuelven
503 target_storage_unavailable, mientras los targets de otros scopes siguen
operativos. SPOT conserva el último catálogo válido y nunca rebindea ni borra un
SAP por una caída temporal.
No se aceptan elasticsearch_targets, default_elasticsearch_target_id,
use_connector_target, connector_elasticsearch_target_id, IDs generados
sap-N ni migración automática. Una configuración antigua debe regenerarse
desde setup.
En Configuración, las tarjetas Elasticsearch de lectura permiten añadir, editar, probar y eliminar scopes con validación de dependencias. Conector local muestra modo y writer; en remote recuerda que los standalone se configuran en sus hosts. Targets SAP agrupa por scope cuando ayuda, muestra alias, ID, SID, client, origen, última recepción y estado, y sólo permite editar alias, enabled o la zona horaria IANA. ID y binding son de sólo lectura. La zona se valida antes de activar ML externo para ese target.
Confianza TLS y secretos ligados al destino
Las CAs corporativas se importan desde Configuración > Trust store. SPOT muestra nombre, fingerprint SHA-256, sujeto, emisor, expiración y destinos que la usan. En paquetes system se guardan bajo /etc/spot/tls; en portable, bajo $SPOT_HOME/config/tls. La UI no acepta rutas arbitrarias y no permite borrar una CA asignada.

En Elastic externo, LDAP/AD e IA HTTPS puedes validar con las CAs del sistema, seleccionar una CA importada o activar explícitamente insecure_skip_verify. La excepción nunca cambia HTTPS por HTTP, no permite redirects y no desactiva los controles DNS/IP. Mientras esté activa, la tarjeta y el estado general muestran un warning persistente y Save/Test quedan auditados.
Una credencial enmascarada pertenece a la identidad exacta del destino. Si cambias protocolo, host, puerto, base path, autenticación, usuario/bind DN, SNI, CA o política TLS, introduce el secreto completo. Test y Save aplican la misma regla y nunca prueban un secreto antiguo contra un destino nuevo.
LDAP y Active Directory
Se admiten LDAPS y StartTLS, incluidos destinos RFC1918. Elige validación estricta, CA importada o verificación desactivada. La contraseña bind queda ligada a protocolo, host, puerto, bind DN, SNI y política TLS. Los redirects no aplican y SPOT fija la IP validada durante la conexión para evitar DNS rebinding.
Usuarios locales y AD
Abre Configuración > Local users con una cuenta administradora. Puedes crear, renombrar, habilitar o deshabilitar, cambiar el rol, restablecer la contraseña y eliminar cuentas locales. Las cuentas nuevas reciben exactamente uno de estos roles:
- admin: configuración y administración completas;
- viewer: consulta de dashboards y evidencia, sin mutaciones.
La vista de Configuración de un viewer no monta navegación, formularios,
pruebas ni botones de guardado. Si hay configuración ya cargada, sólo presenta
un resumen de estado de lectura; la administración permanece reservada a
admin.
SPOT no permite borrar, deshabilitar ni degradar el último administrador local habilitado. Cambiar contraseña, rol o estado revoca las sesiones anteriores de esa cuenta. Las identidades que ya iniciaron sesión mediante Active Directory aparecen en la misma tabla con provider AD, pero son de sólo lectura: sus credenciales y ciclo de vida se gestionan en el directorio y sus permisos proceden del mapeo de grupos.
Un mismo username puede existir una vez como Local y otra como AD sin mezclar identidades. On-prem no usa SAML; SAML sigue siendo una integración SaaS.

Proveedores de IA
Los proveedores con API key requieren HTTPS. Pueden usar CA válida o verificación desactivada, sin redirects. HTTP loopback se permite únicamente sin API key. HTTP privado sobre LAN también exige no usar API key y aceptar expresamente su aviso; este riesgo es distinto de HTTPS sin verificación y la interfaz los muestra por separado.
En Elastic embebido, setup activa manage_data_streams_ilm. En un target
externo queda desactivado: bootstrap sólo comprueba conectividad y no crea
templates, políticas ni Data Streams. Si se activa explícitamente, SPOT gestiona
únicamente metrics y logs.
Conexiones y colecciones
Cada conexión SAP tiene ID estable, zona IANA y ocho colecciones:
| Familia | Default | Contenido |
|---|---|---|
| Metrics | 300 s | CCMS y métricas Operations |
| CCMS events | 300 s | Eventos normalizados |
| Jobs | 300 s | Runs y líneas de log |
| Program statistics | 300 s | Ejecuciones y dependencias estándar por programa ABAP |
| Work processes | 300 s | Snapshots de procesos |
| ABAP dumps | 300 s | Evidencia ST22 saneada |
| RFC failures | 300 s | tRFC/aRFC/qRFC/bgRFC sin payload |
| Certificates | 86400 s | Inventario y transiciones públicas |
Cada intervalo es una frecuencia fija alineada al reloj. Con 300 segundos, las familias comienzan en fases deterministas dentro del primer minuto de cada bloque de cinco minutos. Cada source/familia se ejecuta de forma independiente: una llamada lenta no desplaza las demás. Al arrancar o recargar configuración, el agente hace una primera extracción escalonada y consolida los ciclos perdidos sin crear una cola de ejecuciones atrasadas.
El probe por familia muestra supported, partial, unsupported,
unauthorized, unavailable o error, último éxito y error saneado. En
Program statistics, partial conserva todas las medidas principales del
intervalo confirmado y declara batchstep, rfc, http y epp como no
disponibles. Su ausencia no afirma que esos pasos, llamadas o contextos no
ocurrieran. El usuario RFC necesita
S_RFC mínimo para la función estándar SWNC_GET_STATRECS_FRAME de
SCSM_NW_WORKLOAD; no se instala ningún transport ni artefacto ABAP. La release
debe exponer la ventana remota READ_START_DATE/TIME, READ_END_DATE/TIME,
READ_TIME_ZONE, MAX_RECORDS y READ_ONLY_MAINRECORDS. SPOT exige en el
descriptor de la misma invocación MAX_RECORDS como IMPORT INT
opcional/default -1, READ_ONLY_MAINRECORDS como IMPORT CHAR y los outputs
como EXPORT TABLE; envía READ_ONLY_MAINRECORDS="X", omite MAX_RECORDS y no
envía un límite artificial. Cada ciclo
relee 15 minutos e intenta avanzar hasta 30, en frames de como máximo 60
segundos. Una hoja completa con más de 400 registros principales conserva todas
sus ejecuciones y reduce sólo el máximo futuro de esa fuente; exactamente 400
no lo reduce. El count no indica truncación. El protocolo puede estar vacío o
contener sólo filas estándar de finalización con RC decimal cero; si falta,
es ambiguo, tiene otra forma o un RC no cero, la hoja queda pendiente y su
texto de error no se registra. La truncación explícita también deja la hoja pendiente y puede subdividirse
hasta un segundo, con hasta 32 lecturas RFC de Programs por ventana móvil de 60 segundos entre todas las fuentes. El presupuesto persiste tras reinicio; al agotarse, la continuación espera sin reservar conexión SAP ni iniciar otro worker. El ACK de cada hoja confirma sólo su límite leído. Cada horizonte avanza como máximo 30 minutos; si el atraso supera el intervalo de colección más 120 segundos, el siguiente empieza inmediatamente. Comprueba el último instante SAP confirmado y no sólo la llegada.
Saturación mínima u otro error de lectura/validación deja la ronda sin documentos
exportables ni checkpoint. Si la cancelación o el fallo de ACK ocurre durante la
exportación, el cursor queda sin confirmar aunque el destino pueda conservar
documentos deduplicables ya recibidos. Ningún tramo no leído se declara
cubierto. Cada resultado RFC se decodifica con un
presupuesto máximo de 20.000 filas y 64 MiB. El ciclo retiene
como máximo 50.000 documentos y 32 MiB de contenido normalizado serializado,
incluido el manifiesto. Superar un límite o repetir una identidad con contenido
incompatible descarta el ciclo entero sin export ni cursor. Estos límites no
acotan la memoria interna del invoke RFC nativo. Cada hoja válida conserva todos
los registros principales y un manifiesto con conteo y ventana exactos; sólo el
ACK confirma su extremo.
Antes de iniciar el hijo, la admisión de la fuente tiene un límite
independiente de 30 segundos. Sólo después de obtenerla procesa una única
subventana con un presupuesto nuevo de 240 segundos y reservas finitas para
terminar y recoger el worker; no hereda tiempo residual. Si la admisión vence o se cancela, no se ejecuta el
worker, no se subdivide la ventana, no se exporta, no se confirma ACK ni se mueve
el cursor; la siguiente fuente en cola puede continuar. El padre
conserva fronteras saneadas de descriptor, preparación de parámetros,
selección de outputs, invocación y decodificación aunque falte el terminal:
duración cero marca entrada y una positiva, finalización. Sólo incluyen fase y
duración; ayudan a diagnosticar y nunca sustituyen exportación, ACK o
checkpoint. Si el hijo alcanza exactamente su deadline de 240 segundos y la subventana
activa aún es divisible, el coordinador no exporta y mantiene intactos el
cursor y los ACK previos. Sustituye duraderamente sólo esa subventana por dos
mitades contiguas, conserva el resto de la cola y el backoff, y reencola la
continuación inmediatamente con reparto justo. Una cancelación por recarga prevalece, nunca autoriza esta
división y se conserva como cancelación de la colección, no como fallo de
handoff. Una
subcapacidad ausente no detiene el resto.
Una lectura completa que tarda al menos 60 segundos o devuelve más de 400 registros principales reduce a la mitad el máximo durable de las próximas subventanas de esa fuente, desde 60 segundos hasta un segundo. El valor sobrevive al reinicio, no altera fronteras confirmadas ni se comparte con otro source. Ocho hojas seguidas del tamaño aprendido, completas y confirmadas, de menos de diez segundos, hasta 100 registros principales y 8 MiB normalizados cada una, pueden duplicarlo hasta 60 segundos sólo para el siguiente horizonte. Fallos reinician la racha; timeout o saturación impone 15 minutos sin crecimiento. Las hojas menores pueden consumir antes las 32 admisiones por minuto; la continuación espera capacidad de forma durable. Reduce el working set esperado, pero no garantiza un techo universal de memoria.
El error saneado separa agotamiento de llamadas, saturación en el frame mínimo, ventana inválida, presupuesto agregado y conflicto de identidad/sistema. Sólo una versión que reporte esa clase permite atribuirla; un error genérico anterior no identifica la causa.
Estos límites reducen el trabajo de fuente y decoder. Ante presión sostenida,
conserva la configuración anterior, deshabilita temporalmente sólo
program_statistics y confirma que el resto de familias continúa avanzando.
Instala una versión corregida y soportada del connector; mide el proceso completo
con carga SAP real y el headroom del host antes de volver a habilitar la
colección. No eleves límites de recursos como primer paso.
Si manage_data_streams_ilm=false, bootstrap sólo comprueba los mappings de
todos los backing indices. Si faltan campos de Programs, devuelve
program_template_update_required: actualiza el template externo antes de
ingerir Programs. Esta acción está separada de template_update_required de Job
Logs y no deshabilita logs de Jobs cuyos mappings ya son válidos.
Las contraseñas SAP son de sólo escritura. SPOT conserva la contraseña guardada al editar otros campos únicamente si no cambian el ID, ASHOST, system number, client ni usuario RFC. Si cambia cualquiera de esos datos, vuelve a introducir la contraseña completa; una máscara o un campo vacío no reutiliza la credencial anterior para el nuevo destino.
Los mismos controles bloquean metadata cloud, link-local, multicast y direcciones unspecified. RFC1918 se permite en on-prem; insecure_skip_verify no omite estos límites.
Estado incremental
Los watermarks y capacidades están bajo /var/lib/spot-agent-sap (o
$SPOT_HOME/data). El agente pagina hasta agotar SAP, conserva solape y
deduplica con event_id. El backfill inicial de Jobs, dumps y RFC abarca 24
horas.
Privacidad y permisos
- Dumps: no se recogen variables de memoria ni datos de negocio.
- RFC: no se recoge el payload de las llamadas.
- Certificados: nunca se recogen claves privadas.
- Viewer y admin pueden consultar evidencia dentro de su source; sólo admin cambia configuración.
- Ninguna API o tool AI acepta índices, URL Elastic o scope arbitrario.
ML, alertas e IA
Dumps y RFC producen conteos sparse para ML; certificados usan thresholds deterministas y no tienen forecast. AI consulta dumps, RFC y certificados con tools read-only y source-scoped. Configura reglas y conectores en Configuración → Alertas.
Activar ML con Elasticsearch externo
La presencia de datos no habilita ML automáticamente. Para cada read scope externo:
- asigna una zona IANA válida a cada target SAP habilitado;
- configura una API key writer limitada a los cuatro destinos ML mostrados;
- pulsa Run ML preflight en Elasticsearch read scopes;
- habilita ML y guarda sólo cuando el resultado sea ML ready.
El preflight es de sólo lectura: exige que
spot-integration-<namespace>-metrics y
spot-integration-<namespace>-logs existan como Data Streams nativos exactos;
un índice, un alias o una sola familia no bastan. Consulta las series canónicas
entrenables para ese target y requiere que al menos una alcance 21 días, tres
ciclos semanales y 70 % de cobertura dentro de una ventana de 42 días. La mera
presencia de otros documentos schema v2 no declara ML ready. También comprueba
la zona IANA, el aislamiento por target y los permisos efectivos. No crea
índices, templates, pipelines, Data Streams ni ILM.
Después de habilitar, el backend SPOT ejecuta inferencia cada cinco minutos,
actualiza forecasts cada hora y entrena diariamente. El connector externo sigue
siendo únicamente el productor de telemetría. SPOT escribe sólo modelos,
baselines, forecasts y anomalías derivados, siempre con el source_id exacto;
nunca modifica los streams metrics o logs.

Esquema del productor
El backend filtra sólo schema_version=2 dentro del read scope asignado y para
el source_id exacto. Los documentos de un productor antiguo se ignoran; no se
migran ni activan un fallback. Si no existe una señal v2 genuina, la UI muestra
Sin datos o UNKNOWN según la semántica de la vista, nunca un cero
sintético. En remote y hybrid, el estado del journal del conector local no
participa en las consultas de targets standalone.