Estadísticas de tiempo de un servicio en el ESB 10gR3
13/10/2010 -
A veces, querremos obtener una pequeña estadística de tiempos de llamada a nuestros servicios. Si hemos publicado y consumimos estos servicios en Oracle Enterprise Service Bus 10g, éste nos ofrece la posibilidad de darnos el tiempo en milisegundos que ha consumido cada uno de los servicios implicados en el servicio:
Por tanto, a través de la consola podríamos hipotéticamente filtrar todas las llamadas a servicios de nuestro interés e, instancia a instancia, recopilar los tiempos que cada una de ellas ha tardado en procesarse y sacar la estadística a partir de estos datos. Es decir, un proceso largo y tedioso.
¿Es posible obtener estos datos de una forma más automatizada? La respuesta es que sí. Hay que ir a la fuente de los datos.
El ESB almacena los datos de las instancias procesadas en un repositorio, habitualmente en Base de Datos. Si esta es nuestra configuración, podemos obtener los datos mediante una sentencia SQL sobre el esquema de base de datos correspondiente al repositorio.
Para obtener los tiempos mínimos, máximos y medios de proceso del ESB y del servicio llamado para el caso típico de un servicio que es llamado por un proxy generado en el ESB, la sentencia SQL a ejecutar sería la siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
select servicio, operacion, count (*) numeroOperaciones, max (tiempoWS) maximoOperacionWS, min (tiempoWS) minimoOperacionWS, avg (tiempoWS) mediaOperacionWS, max (tiempoTotal - tiempoWS) maximoOperacionESB, min (tiempoTotal - tiempoWS) minimoOperacionESB, avg (tiempoTotal - tiempoWS) mediaOperacionESB from ( select peticion, servicio, operacion, max (tiempo) tiempoTotal, min (tiempo) tiempoWS from ( select flows.flow_id as peticion, flows.source, operaciones. name operacion, servicios. name servicio, max (flows. timestamp ) - min (flows. timestamp ) tiempo from oraesb.esb_activity flows, oraesb.wf_events operaciones, oraesb.wf_events servicios where --Si queremos los datos de una única instancia XXX de la consola: flows.flow_id = 'XXX' and flows.operation_guid = operaciones.guid and operaciones.type = 'EVENT' and -- Filtro por Soap Invocation operaciones.owner_guid = servicios.guid and servicios.type = 'GROUP' and servicios. name = 'servicioInvocado_SI' and -- Filtro por periodo de estudio (To_Date( '01.01.1970 00:00:00' , 'DD.MM.YYYY HH24:Mi:Ss' ) + flows. timestamp / 86400000) > (sysdate - 15) group by flows.flow_id, flows.source, operaciones. name , servicios. name order by source nulls last ) group by peticion, servicio, operacion ) group by servicio, operacion |
A partir de esta select de ejemplo, enfocada a sacar la estadística para un servicio con un proxy service y un business service, podéis realizar las modificaciones oportunas para adaptarla a vuestra casuística.