Sabemos que una de las mayores ventajas de SAP Integration Suite es la funcionalidad del monitor. Puede monitorear diferentes cifras de KPI, como cuántos mensajes se completaron en las últimas 12 horas o cuántos mensajes fallaron en la última hora, como muestra la siguiente captura de pantalla.
Sin embargo, a veces no queremos verificar manualmente todos los días para ver si algo sale mal con los mensajes. Queremos tener algún mecanismo de notificación que cuando, por ejemplo, el conteo de mensajes supere algún umbral, recibamos una notificación por correo electrónico. Y el servicio de notificación de alertas de SAP puede ayudar aquí.
El IFlow se verá así.
En primer lugar, necesitamos tener alguna API que pueda mostrar el estado del mensaje durante las últimas 12 horas, por ejemplo. Afortunadamente, SAP ya ha proporcionado este tipo de API llamada Registros de procesamiento de mensajes.
El primero le dará todos los detalles del mensaje dada la condición del filtro, por ejemplo, puede configurar Status eq 'FAILED'
que devuelve registros de procesamiento de mensajes con el estado ‘FALLIDO’. Probemos el tercero simple, que puede aprovechar para devolver el recuento de mensajes dada la información del filtro.
Puede probar esta API a través del cartero de manera muy conveniente.
También necesitamos tener SAP Alert Notification Service (ANS) ejecutándose para que, si el recuento de mensajes en las últimas 12 horas supera el umbral que especificamos, recibamos un correo electrónico. SAP ANS no es complicado y puede buscar en la comunidad de SAP información sobre cómo crear una instancia y cómo configurarla y, finalmente, cómo probarla. Por ejemplo, aquí hay un buen entrada en el blog diciendo cómo configurarlo en el entorno de Cloud Foundry. Con respecto al costo y el precio, puede consultar Centro de descubrimiento. Una vez que tenga lista la instancia de SAP ANS, puede completar el asunto del correo electrónico y la carga útil y enviarlo a SAP ANS y luego SAP ANS envió el correo electrónico a la persona especificada en SAP ANS.
Aquí está la condición de evento que establecí.
Ahora tenemos el extremo de la API para registros de mensajes y SAP ANS para enviar correos electrónicos de notificación.
Comencemos a componer el flujo de integración, comenzando con un temporizador, que activará este IFlow cada 12 horas.
También puse un modificador de contenido llamado «Inicializar», que es bastante simple, para que pueda especificar el umbral del mensaje. Si el recuento de mensajes dentro de las 12 horas supera este umbral, activamos la notificación; de lo contrario, no hacemos nada. Este es un parámetro externalizado y puede configurarlo cada vez que desee cambiarlo a algún valor nuevo.
El siguiente paso es calcular el intervalo de tiempo de las últimas 12 horas a través de un script maravilloso. Aquí está el código que usé. Y necesitamos consumir las dos propiedades llamadas «CURRENT_TIME_FRAME_START» y «CURRENT_TIME_FRAME_END» para el filtro de punto final de la API de registros de mensajes. También puede ver que establecemos 12 horas para «MAX_TIME_FRAME_SIZE_MS».
import com.sap.gateway.ip.core.customdev.util.Message
import groovy.transform.Field
import java.text.ParseException
import java.text.SimpleDateFormat
@Field final String TIME_ZONE = "UTC"
@Field final String TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss"
@Field final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat(TIME_FORMAT)
@Field final String LOG_PROPERTY_KEY = 'Log'
@Field final String LAST_TIME_FRAME_END_HEADER_NAME = "LAST_TIME_FRAME_END"
@Field final String CURRENT_TIME_FRAME_END_HEADER_NAME = "CURRENT_TIME_FRAME_END"
@Field final String CURRENT_TIME_FRAME_START_HEADER_NAME = "CURRENT_TIME_FRAME_START"
@Field final Integer MAX_TIME_FRAME_SIZE_MS = 12 * 60 * 60 * 1000
Message processData(Message message) {
StringBuilder logMessage = new StringBuilder('Calculate Time Frame:\n')
configureDateFormatter()
Calendar now = Calendar.getInstance()
String currentTimeFrameStart = DATE_FORMATTER.format(retrieveCurrentTimeFrameStart(message, now))
String currentTimeFrameEnd = DATE_FORMATTER.format(retrieveCurrentTimeFrameEnd(now))
logMessage.append("Executing for time frame: ${currentTimeFrameStart} - ${currentTimeFrameEnd}\n")
message.setHeader(CURRENT_TIME_FRAME_START_HEADER_NAME, currentTimeFrameStart)
message.setHeader(CURRENT_TIME_FRAME_END_HEADER_NAME, currentTimeFrameEnd)
message.setProperty(LOG_PROPERTY_KEY, logMessage.toString())
return message
}
void configureDateFormatter() {
DATE_FORMATTER.setTimeZone(TimeZone.getTimeZone(TIME_ZONE))
}
Date retrieveCurrentTimeFrameStart(Message message, Calendar now) {
String lastTimeFrameEnd = getStringHeader(message, LAST_TIME_FRAME_END_HEADER_NAME)
if (lastTimeFrameEnd?.trim()) {
return getCurrentTimeFrameStart(lastTimeFrameEnd, now)
} else {
return getDefaultCurrentTimeFrameStart(now)
}
}
Date getCurrentTimeFrameStart(String lastTimeFrameEnd, Calendar now) {
try {
Date currentTimeFrameStart = DATE_FORMATTER.parse(lastTimeFrameEnd)
return getTimeFrameSize(now.getTime(), currentTimeFrameStart) > MAX_TIME_FRAME_SIZE_MS ? getDefaultCurrentTimeFrameStart(now) : currentTimeFrameStart
} catch (ParseException e) {
return getDefaultCurrentTimeFrameStart(now)
}
}
Date getDefaultCurrentTimeFrameStart(Calendar now) {
Calendar nowClone = now.clone() as Calendar
nowClone.add(Calendar.MILLISECOND, MAX_TIME_FRAME_SIZE_MS * -1)
return nowClone.getTime()
}
static long getTimeFrameSize(Date to, Date from) {
return to.getTime() - from.getTime()
}
static Date retrieveCurrentTimeFrameEnd(Calendar now) {
return now.getTime()
}
static String getStringHeader(Message message, String headerName) {
return message.getHeader(headerName, String.class)
}
A continuación, arrastremos un adaptador de «solicitud y respuesta» para llamar a la API de registros de mensajes. Aquí están los detalles de la conexión. Como puede ver, los dos parámetros del último paso se han rellenado en el filtro API.
Para las credenciales, como se mencionó, es lo mismo que sus otros iflows. Aquí usamos la autenticación OAuth2.
A continuación, arrastramos un adaptador de «modificador de contenido» y lo nombramos «Establecer recuento de mensajes», lo que significa que obtuvimos el número de recuento después de la llamada API y lo configuramos en propiedades.
Ahora que tenemos el recuento de mensajes en las últimas 12 horas y hemos especificado el umbral de mensajes al principio, podemos comparar los dos valores. Arrastremos un adaptador de «Router» y demos una condición como esta ${property.MessageCount} > ${property.MessageThreshold}. Esto significa que enviaremos la notificación por correo electrónico solo bajo esta condición.
Arrastremos otro modificador de contenido y asígnele el nombre «Preparar cuerpo de notificación», donde estableceremos el asunto y el cuerpo del correo electrónico.
Aquí está el cuerpo completo.
{
"eventType": "CPIIntegrationFlowExecutionFailure",
"resource": {
"resourceName": "Spark Usage Integration Flow",
"resourceType": "flow",
"tags": {
"env": "develop environment"
}
},
"severity": "FATAL",
"category": "ALERT",
"subject": "Spark Usage Detected - Alert",
"body": "Integration flow message number increases by 10% yesterday",
"tags": {
"ans:correlationId": "30118",
"ans:status": "CREATE_OR_UPDATE",
"customTag": "42"
}
}
y Finalmente, arrastremos otro adaptador de «solicitud de respuesta» para llamar al punto final de SAP ANS. Aquí están los detalles de la conexión.
No hay magia aquí, excepto que necesita conocer el punto final de SAP ANS y la información de la credencial, ambos se pueden obtener dentro de la instancia de SAP ANS.
Hagamos una prueba sencilla. Establezca el valor del umbral del mensaje para que sea más pequeño, como 0, y aplique el iflow. Con fines de prueba, puede configurar el temporizador para que se ejecute una vez después de la implementación. Luego, debería recibir un correo electrónico de notificación siempre que tenga mensajes de iflow en las últimas 12 horas.
Este es solo un caso de uso simple y puede ampliarlo según sus propios requisitos. Por ejemplo, desea monitorear el mensaje «Error» en la última hora. Pero tenga en cuenta que este es un iflow personalizado, lo que significa que este iflow de notificación aún le costará el volumen de su mensaje.
Supongamos que no desea gastar dinero en SAP ANS, también puede aprovechar otro correo electrónico, por ejemplo, Gmail, para enviar la notificación.
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073