Saltar al contenido principal

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.

Confianza TLS y riesgos de destinos on-prem

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.

Administración de usuarios locales e identidades AD

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:

FamiliaDefaultContenido
Metrics300 sCCMS y métricas Operations
CCMS events300 sEventos normalizados
Jobs300 sRuns y líneas de log
Program statistics300 sEjecuciones y dependencias estándar por programa ABAP
Work processes300 sSnapshots de procesos
ABAP dumps300 sEvidencia ST22 saneada
RFC failures300 stRFC/aRFC/qRFC/bgRFC sin payload
Certificates86400 sInventario 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:

  1. asigna una zona IANA válida a cada target SAP habilitado;
  2. configura una API key writer limitada a los cuatro destinos ML mostrados;
  3. pulsa Run ML preflight en Elasticsearch read scopes;
  4. 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.

Preflight de ML externo por read scope

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.