Archive for scripting

Calling stored procedures from Mirth

Posted in Computación with tags , , , , , , on 27/October/2010 by Alex Pérez

Mirth JDBC reader/writer are well suited for simplest cases: only one SELECT and (optionally) a UPDATE for each row, but normally you need to use JDBC reader/writer with JS enabled.

Mirth JDBC API when using JS is very basic and does not allow easily deal with stored procedures: there are only executeCachedQuery() and executeUpdate(). If you’re lucky you can use executeUpdate() as long as your SP doesn’t use IN/OUT parameters or returns any resultset. Otherwise you should call the SPs in a java library and then invoke it from Mirth JS. Some time ago I documented how to call custom java classes from Mirth and this may be used to extend its database API. Continue reading

SOAP polling with Mirth

Posted in Computación with tags , , , , , , on 10/October/2010 by Alex Pérez

There are some recurrent problems when developing interfaces with Mirth, and one of the trickiest is SOAP polling. From early versions of Mirth there is a SOAP sender connector, but it doesn’t have any direct connector to poll a webservice. As far as I know polling is considered to be a near-antipattern, but under some circunstances you may be forced to use it if the integration counter-part is closed-source.

To read periodically from a WS you need to setup an interface with these connectors:

  • source: JS Reader
  • destination 1: SOAP Sender
  • postprocessor or destination 2: JS Writer (or any other destination-type with a JS Transformer inside) Continue reading

Using JMeter to test JDBC databases

Posted in Computación with tags , , , , , , , on 17/April/2010 by Alex Pérez

Despite JMeter is a well-known load testing tool when testing web projects, it seems to be unused when testing SQL performance. So I decided to share how to configure a fairly simple SQL test plan involving only one SQL statement.

Download Apache JMeter and Java, if you don’t have them already.

Get a copy of the oracle driver (ojdbc14.jar) or a JDBC driver of your preferred DB, and throw it into the JMETER_HOME/lib directory

  • Open JMeter and create a test plan as shown in fig1. Based on this plan you can complicate it as you want to load your DB and fit it to your needs. There are two JMeter Listeners (red) called “Aggregate Report” and “Summary Report” that will report us some statistical results like mean, median, throughput among others. I recommend you to use the Statistical Aggregate Report listener. Inside the thread group (blue) are two items of type “JDBC Connection Configuration” and “JDBC Request”. As we will see, is where we define the DB connection properties (user, password, driver, IP, SID), and the statement we want to test. Continue reading

XSL basics

Posted in Computación with tags , , , on 12/March/2009 by Alex Pérez

I’ve been playing arround with XML and XSL transformations recently. XSL transformations may be very useful for:

  • transforming XML to XML with different structure.
  • converting XML to another well-known formats, as CSV or SQL. Then, you can pipe the output to another tools like awk/sqlplus or perform some complex querys in a RDBM.
  • simple ordering / extracting node-values from the XML. Do you want to extract only a numeric value from a SOAP-response, if there is no a “soap fault” element?

All the above possible usages make XSL a powerful tool to deal with XML specially when integrating applications.

So, lets see a sample XML file, storing some info about music CDs:

< ?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
<price>10.90</price>
        <year>1985</year>
    </cd>
    <cd>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        <country>UK</country>
        <company>CBS Records</company>
<price>9.90</price>
        <year>1988</year>
    </cd>
....
</catalog>

And a Java class to perform XSL transformation:

public static void main(String[] args)
    throws FileNotFoundException,
    TransformerException {
    File inXMLFile = new File("input.xml");
    File inXSLFile = new File("transformation.xsl");
    File outXMLFile = new File("output.xml");

    javax.xml.transform.TransformerFactory tFactory =
    javax.xml.transform.TransformerFactory.newInstance();

    // Get the XML input document and the stylesheet
    javax.xml.transform.Source xmlSource =
    new javax.xml.transform.stream.StreamSource(inXMLFile);

    javax.xml.transform.Source xslSource =
    new javax.xml.transform.stream.StreamSource(inXSLFile);

    // Generate the transformer.
    javax.xml.transform.Transformer transformer =
    tFactory.newTransformer(xslSource);
    // Perform the transformation, sending the output to the response.
    transformer.transform(xmlSource,
    new javax.xml.transform.stream.StreamResult(outXMLFile));
}

In the code above, there are three files:

  • input.xml: XML input file. We are using the CD catalog as input for our tests.
  • transformation.xsl: XSL sheet. The cornerstone of this test.
  • output.xml: The resulting XML from the XSL processing will be stored here. The output may no be an XML file (csv,txt,…) Continue reading

Exchange, Grupos de Almacenamiento y algo de scripting

Posted in Computación with tags , , , , , , on 19/July/2008 by Alex Pérez

Hace algún tiempo, un servidor MS Exchange me estuvo dando muchos problemas porque los grupos de almacenamiento estaban ocupando gran parte del disco. Después de varios intentos para reducir los grupos de almacenamiento, opté por instalar un SAN para que los alojara y que los servidores Exchange atacaran a los volúmenes de la SAN. Por cierto, los servidores Exchange atacan a la SAN con iSCSI y es un gran invento! iSCSI hace que parezcan unidades locales del servidor, pero realmente se está atacando sobre IP al SAN. El único problema es que las tarjetas de red de los clientes de la SAN deben implementar iSCSI por hardware, o se nota un rendimiento muy bajo …

Después de la migración para mover los grupos a la SAN (que por cierto fue muy limpia: backup, comprobación del backup y bonito asistente de migración) el problema fué que cuando habían cortes de red o por algún motivo había que reiniciar algún servidor Exchange, si al arrancar el server no estaba arrancado y listo el SAN, los grupos de almacenamiento se quedaban desmontados forever and ever, rechazando el correo entrante. 

… Mmmmm …

Houston: we have a problem!

Así que, ya que andaba implementando un sistema de monitorización, me puse a codificar un script en WSHost/VBScript para que comprobara el estado de los grupos de almacenamiento y que si encontrara uno desmontado, lo montara y devolviera un entero en función del estado de los grupos. Pero siguiendo con mi filosofía: el sistema de monitorización debe alertar al administrador, pero las primeras tareas para arreglar el fallo deben ser automáticas, así me ahorro tener que hacer operaciones repetitivas y si se requiere intervención será porque la incidencia realmente así lo requiere. El script está pensado para ser integrado con Zabbix: el agente de Zabbix ejecuta el script que arreglará lo que encuentre y si ha tenido que arreglar algo devuelve 1, sino un 0. Así podemos graficar desde Zabbix cuándo han habido problemas relativos a los grupos de almacenamiento. Continue reading

vbscript, vmware, virtual server y otras hierbas

Posted in Computación with tags , , , , , , on 11/July/2008 by Alex Pérez

Al final resulta que la clave para administrar infraestructura es tener la mayor parte de operaciones automatizadas. Así que para administrar de manera eficiente hay que tener bastantes scripts que te liberen de tareas repetitivas y si puede ser, que arreglen el problema directamente antes que reportarlo.

El script que pondré a continuación tiene sentido cuando estás monitorizando varias decenas de servidores, muchos de ellos con VMWare, Virtual Server o las dos cosas. Para monitorizar lo más práctico IMHO es Zabbix, aunque sé que también hay mucha gente que usa Nagios.
No tengo nada en contra de Nagios: siempre me he regido por el principio de que uno debe usar la herramienta que más se adapta a sus necesidades y en la que se sienta más confortable. Personalmente nunca me gustó de Nagios tener que resetear el servicio para aplicar cambios en la configuración .. pero en fin.

En un entorno donde hay Nagios, Zabbix o lo que sea, si queremos monitorizar equipos donde se están ejecutando tropecientas máquinas virtuales al final de cada “sonda” habrá un pequeño script que hará el trabajo sucio. Y aquí comienza el bello arte del scripting: lo mismo dá si es en Perl, Bash, AWK, VBScript o yo que sé. Lo que cuenta que es hagan su función correctamente (a poder ser, que corrijan el error y que no se limiten a reportarlo) y listo! Continue reading