Contenedor de KPs en Sofia2

El contenedor de KPs de Sofia2 consiste en un nuevo módulo de la plataforma que permite el despliege de Apps Sofia2, gestionando su ejecución y encargándose del envio al SIB de la información generada por el mismo.

Un programador que desee desplegar sus KPs en el contenedor de Sofia2 deberá realizar una serie de consideraciones durante la programación de los mismos para conseguir una integración plena con el contenedor, y posteriormente deberá registrarlo desde la consola de administración, donde podrá subir el código de su KP al contenedor, así como configurar ciertos aspectos.

A continuación vamos a dar mayor información acerca de los tipos de KPs soportados por el contenedor, así como ciertas consideraciones que deberá cumplir un KP para integrarse con el contenedor. Para mayor información se puede consultar la guía Sofia2-Contenedor de KPs

Tipos de KPs:

Actualmente el contenedor de KPs soporta 3 tipos de KPs:

  • KPs Python: Scripts en lenguaje de programación Python.
  • KPs Java: Ficheros jar comprimidos como jar ejecutables.
  • KPs URL: URL accesible desde el contenedor de KPs (internet o intranet) que ante una petición HTTP devuelva uno o varios mensajes a enviar al SIB.

La ejecución de un KP consiste en invocaciones periodicas programadas mediante una expresión CRON. Una vez se cumple la condición temporal del CRON, el contenedor invoca al KP para su ejecución. Una vez finaliza la ejecución un KP, el contenedor procede a recuperar los mensajes generados y los envía al SIB.

Un KP de tipo Python o Java se despliega físicamente en el contenedor de en un directorio propio donde puede crear ficheros (logs y mensajes) y leer recursos (properties).

Mensajes generados y forma de envio al SIB:

Un Kp administrado en el contenedor de KPs generará mensajes para enviar a un SIB, pero será contenedor de KPs quien envie los mensajes generados por los KPs al SIB.

El contenedor implementando toda la lógica de persistencia de mensajes para evitar la perdida de mensajes en caso de que el SIB no se encuentre disponible. De manera que el programador de un KP deberá delegar el envio de mensajes al contenedor, siendo el contenedor quien asegure el envío al SIB.

Los mensajes recogidos por el contenedor serán enviados en nombre del KP al SIB. Esto es, a efectos de autenticación/autorización se utilizarán las credenciales del propio KP.

Los mensajes se informan al SIB tras la ejecución de la siguiente manera:

  • KPs Java y Python: Creando el propio KP uno o varios ficheros de mensajes, que el contenedor identificará por el nombre, ya que durante el alta del KP en la consola de administración, se informará el prefijo en el nombre de estos ficheros.
  • URL: Devolviendo en el cuerpo de la respuesta HTTP el listado de mensajes a enviar al SIB.

En el caso de mensajes informados por ficheros, será el propio contenedor de KPs quien borre tales ficheros una vez haya leído los mensajes y persistido para su envío al SIB.

Cada mensaje generado por un KP tras su ejecución para ser recogidos por el contenedor de KPs, tendrá el siguiente formato de objeto JSON, siendo el contenedor quien construya y envíe al SIB un mensaje SSAP INSERT con la información del mensaje:

{<ontologia>:{<instancia_ontologia}}

Por ejemplo el siguiente objeto representaria un mensaje SSAP INSERT sobre la ontologia SensorTemperatura:

{“SensorTemperatura”:{ “Sensor”: { “geometry”: { “coordinates”: [ 40.512967, -3.67495 ], “type”: “Point” }, “assetId”: “S_Temperatura_00066”, “measure”: 25, “timestamp”: { “$date”: “2014-04-29T08:24:54.005Z”}}}}}

Dependiendo del tipo de KP, los mensajes serán informados al contenedor de una forma u otra:

  • KPs Java y Python: Se utilizaránficheros de texto donde cada línea contiene un objeto JSON representando un mensaje. Tras finalizar la ejecución del KP, el contenedor leerá el fichero de texto generado línea a línea, construyendo un mensaje SSAP INSERT con cada una. En un mismo fichero es posible generar mensajes haciendo referencia a diferentes ontologías. Por ejemplo, el siguiente fichero seria un fichero válido:

{“SensorTemperatura”:{ “Sensor”: { “measure”: 25, “timestamp”: { “$date”: “2014-04-29T08:24:55.005Z”}}}}

{“SensorTemperatura”:{ “Sensor”: { “measure”: 24, “timestamp”: { “$date”: “2014-04-29T08:25:25.005Z”}}}}

{“SensorTemperatura”:{ “Sensor”: { “measure”: 25, “timestamp”: { “$date”: “2014-04-29T08:25:55.005Z”}}}}

{“SensorTemperatura”:{ “Sensor”: { “measure”: 26, “timestamp”: { “$date”: “2014-04-29T08:26:25.005Z”}}}}

{“SensorTemperatura”:{ “Sensor”: { “measure”: 27, “timestamp”: { “$date”: “2014-04-29T08:26:55.005Z”}}}}

{“SensorTemperatura”:{ “Sensor”: { “measure”: 26, “timestamp”: { “$date”: “2014-04-29T08:27:25.005Z”}}}}

  • KPs URL: Respuesta HTTP de tipo mime application/json conteniendo en el cuerpo de la misma un Array JSON con cada uno de los objetos respresentando un mensaje a enviar al SIB. Por ejemplo, el siguiente Array JSON en el cuerpo de la respuesta seria una respuesta válida:

[

{“SensorTemperatura”:{ “Sensor”: { “measure”: 25, “timestamp”: { “$date”: “2014-04-29T08:24:55.005Z”}}}},

{“SensorTemperatura”:{ “Sensor”: { “measure”: 24, “timestamp”: { “$date”: “2014-04-29T08:25:25.005Z”}}}},

{“SensorTemperatura”:{ “Sensor”: { “measure”: 25, “timestamp”: { “$date”: “2014-04-29T08:25:55.005Z”}}}},

{“SensorTemperatura”:{ “Sensor”: { “measure”: 26, “timestamp”: { “$date”: “2014-04-29T08:26:25.005Z”}}}},

{“SensorTemperatura”:{ “Sensor”: { “measure”: 27, “timestamp”: { “$date”: “2014-04-29T08:26:55.005Z”}}}},

{“SensorTemperatura”:{ “Sensor”: { “measure”: 26, “timestamp”: { “$date”: “2014-04-29T08:27:25.005Z”}}}}

]

Codigos de retorno de un KP al finalizar su ejecución:

Un KP ejecutado en el contenedor de KPs debe finalizar siempre su ejecución tras un tiempo determinado. En caso de no finalizar en el tiempo que tenga asignado, será el contenedor de KPs quien aborte su ejecución.

Los códigos de respuesta válidos interpretables por el contenedor de KPs son:

  • KPs Java y Python: Finalizarán su ejecución devolviendo en la función main un entero interpretable por el contenedor de KPs:
    • 0 (EXIT_SUCCESS): Finalización satisfactoria. El contenedor de KPs contabilizara la ejecución como satisfactoria y procederá a leer los ficheros de mensajes generados para generar los mensajes de INSERT.
    • 1 (EXIT_FAILURE_WITH_MESSAGES): Finalización errónea pero con mensajes. El contenedor de KPs contabilizará la ejecución como errónea, pero considerará que los ficheros de mensajes generados contienen mensajes a enviar al SIB y procederá a su lectura.
    • 2 (EXIT_FAILURE_DISCARDING_MESSAGES): Finalización errónea. El contenedor de KPs contabilizará la ejecución como errónea y descartará los ficheros de mensajes generados por el KP durante la ejecución.
  • KPs URL: Devolverán un código HTTP de respuesta:
    • 200 (HTTP_OK): Finalización satisfactoria. El contenedor de KPs contabilizará la ejecución como satisfactoria y leerá el cuerpo de la respuesta para generar los mensajes de INSERT.
    • Otro código: Finalización errónea. El contenedor de KPs contabilizará le ejecución como errónea y no generará mensajes de INSERT.

Programa Ejecutable del KP:

Los Kps Python y Java necesitan la subida al contenedor de un fichero ejecutable, de manera que debe cumplir ciertas características para poder ser ejecutado por el Runtime correpondiente.

  • KPs Java: Deben ser empaquetados en un fichero JAR autoejecutable. Esto es:
    • Dentro del JAR se deben incluir todas aquellas clases necesarias para la ejecución del KP que no estén incluidas en las librerías de la JRE del contenedor.
    • Debe incluirse un punto de entrada al programa. Esto es, una clase con un método main que controla el inicio y finalización del programa.
    • Debe indicarse el punto de entrada al programa en un fichero MANIFEST.MF indicando la clase donde está el método main mediante la propiedad Main-Class:

Main-Class: com.indra.kp.Main

Por ejemplo, un KP java a desplegar en el contenedor tendría esta estructura:

Donde:

Main.class: Clase que contiene el método main que actua de punto de entrada al programa Java.

MANIFEST.MF: Descriptor del ejecutable Java:

Manifest-Version: 1.0

Class-Path: .

Main-Class: com.indra.kp.Main

  • KPs Python: Deben ser desplegados como scripts Python. Esto es, Deben desplegarse en un fichero que contenga una función main que actue de punto de entrada al programa e incluir todos los import y funciones necesarias para su ejecución.

Propiedades durante la ejecución

Durante el alta de un KP en el contenedor de KPs es posible registrar en la consola de administración un conjunto de propiedades que podrá leer el KP durante su ejecución.

En función del tipo de KP de que se trate, las propiedades serán interpretadas por el contenedor de una forma o otra:

  • KPs Java y Python: El contenedor de KPs creará en el directorio de ejecución del KP un fichero que contendrá todas las propiedades registradas en formato:

<nombre_propiedad>=<valor>

Por ejemplo:

Propiedad1=valor1

Propiedad2=valor2

Propiedad3=valor3

De manera que el programador del KP podrá leer dichas propiedades leyendo el fichero de propiedades creado por el KP en su directorio de ejecución.

El contenedor de KPs creará el fichero de propiedades con el mismo nombre que el KP, pero con extensión .properties

  • KPs URL: En este tipo de KPs se diferencian dos tipos de propiedades:
    • Argumentos de Cabecera: El contenedor de KPs añadirá a la cabecera de la petición HTTP las propiedades de este tipo.
    • Argumentos de Consulta: El contenedor de KPs añadirá a la URL los parámetros indicados de este tipo.

Gestion de KPs en el Contenedor de Sofia2

La gestión de los KPs en el contenedor de Sofia2, se realiza desde la consola de administración de Sofia2

Para dar de alta un nuevo KP en el contenedor de KPs de Sofia2 se dispone en la consola de administración la opción: Contenedor KP’s/APPs > Crear KPs/APPs en contenedor

En esta pantalla es necesario especificar información acerca del KP que se va a dar de alta.

La información común independientemente del tipo de KP es:

  • KP: Identificador del KP registrado en Sofia2 al que pertenece el KP a registrar en el contenedor.
  • Instancia de KP: Identificador de KP a registrar en el contenedor
  • Tipo de contenedor de KP: En la versión actual todos son los KPs son temporizados y se lanzan periódicamente conforme a la expresión CRON.
  • Lenguaje: Lenguaje de programación del KP, permite al contenedor seleccionar el runtime con el que lanzar el KP.
  • Timeout: Tiempo en segundos que el contenedor asigna al KP para completar su ejecución. Si el KP no finaliza en dicho tiempo, el contenedor aborta la ejecución.
  • Descripción: Descripción informativa del contenedor.

En función del lenguaje elegido será necesario informar también:

  • Lenguaje Java o Python:
    • Programa: Fichero ejecutable con el código del programa a ejecutar por el contenedor.
    • Nombre del programa: Nombre que el contenedor dará al programa en el contenedor.
    • Prefijo de ficheros de mensajes: Prefijo que tendrán los ficheros de mensajes generados por el fichero ejecutable. Será lo que el contenedor utilice para
    • Propiedades: Pares de clave-valor con las propiedades que necesita el programa. Estas propiedades se utilizan por el contenedor de KPs para crear un fichero en el directorio de ejecución con dichas propiedades. El fichero de propiedades tendrá el mismo nombre que el programa junto con la extensión .properties.

De este modo si se definen para el programa MiPrograma las siguientes propiedades:

El contenedor creará el fichero MiPrograma.properties en su directorio de ejecución con el siguiente contenido:

Propiedad2=valor2

Propiedad3=valor3

Propiedad1=valor1

  • Lenguaje de tipo URL:
    • URL: Dirección a la que el contenedor hará las peticiones HTTP GET cada vez que se ejecute.
    • Parámetros Cabecera HTTP: Lista de pares clave-valor a incluir en la cabecera de la petición HTTP GET.
    • Parámetros de la petición HTTP: Lista de pares clave-valor con los query param a añadir a la petición HTTP.

Para consultar el listado de KPs en el contenedor de KPs de Sofia2 se dispone en la consola de administración la opción: Contenedor KP’s/APPs > Mis KPs/APPs en Contenedor

Desde esta pantalla es posible buscar filtrando por nombre e identificador de instancia, la lista de KPs que tenemos registrados en el contenedor de KPs.

Asimismo, desde la lista de KPs tenemos acceso a las opciones de Consulta, Actualización y borrado de un KP en el contenedor.

Para consultar el detalle de un KP, desde la pantalla de listado es posible visualizar un KP con el estado actual de todas sus propiedades:

Así como administrar ciertos aspectos de su ejecución tales como:

  • Logs: Es posible descargar en un fichero zip los ficheros de logs generados por un KP así como borrarlos.
  • Mensajes Erroneos: Son mensajes generados por el KP y que tras intentar su envio al SIB como un mensaje de tipo INSERT, el contenedor de KPs ha descartado por alguna razón Es posible tanto descargar en un fichero estos mensajes, como borrarlos.
  • Estado: Es posible detener la ejecución de un KP de manera que mientras se encuentre detenido, el contenedor de KPs no procederá ejecutarlo aunque se cumplan las condiciones especificadas en la expresión CRON.

Y monitorizar la ejecución del KP obteniendo la siguiente información:

  • Número total de ejecuciones.
  • Número de ejecuciones abortadas por el contenedor
  • Número de ejecuciones finalizadas devolviendo un código de error.
  • Tiempo total de ejecución consumido por el KP en el contenedor.
  • Tiempo médio de cada ejecución.
  • Número de mensajes enviados satisfactoriamente al SIB.
  • Número de mensajes leidos por el contenedor y almacenados para envio al SIB.
  • Número de mensajes erroneos tras su envio al SIB

Contenedor de KPs en Sofia2

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s