Nouvelle publication

Rechercher

Article
· Avr 26, 2024 3m de lecture

Geo Vector Search #2

Technical surprises using VECTORs
>>> UPDATED

Building my tech. example provided me with a bunch of findings htt I want to share.
The first vectors I touched appeared with text analysis and more than 200  dimensions.
I have to confess that I feel well with Einstein's 4 dimensional world.
7 to 15 dimensions populating the String Theory are somewhat across the border.
But 200 and more is definitely far beyond my mathematical horizon.

So I looked to our Globe and found a vector of (latitude,longitude) with 2 dimension is enough for testing.
A handy table of capitals was found and provided sample test data (shortened).

CAPITAL COUNTRY LATITUDE LONGITUDE
Kabul Afghanistan 34.28N 69.11E
Tirana Albania 41.18N 19.49E
Algiers Algeria 36.42N 03.08E
Pago Pago American Samoa 14.16S 170.43W
Andorra la Vella Andorra 42.31N 01.32E
Luanda Angola 08.50S 13.15E
Saint John's Antigua and Barbuda 17.127N 61.846W
Buenos Aires Argentina 36.30S 60.00W
Yerevan Armenia 40.10N 44.31E
Oranjestad Aruba 12.32N 70.02W
Canberra Australia 35.15S 149.08E
Vienna Austria 48.12N 16.22E
Baku Azerbaijan 40.29N 49.56E
Nassau Bahamas 25.05N 77.20W
Manama Bahrain 26.10N 50.30E
Dhaka Bangladesh 23.43N 90.26E
Bridgetown Barbados 13.05N 59.30W
Minsk Belarus 53.52N 27.30E
Brussels Belgium 50.51N 04.21E

#1
 Loading that TAB separated text file with LOAD DATA (SQL) worked perfect

#2
Transforming the geo coordinates int INT was a minor coding exercises
It resulted in a ClassMethod projected as SQL Procedure used inana UPDATE over the table.

#3
As geo coordinates refer to (0°N,0°W) somewhere in the Atlantic this is just a theoretical base for my vectors.
IRIS supports some VECTOR functions but I found no AddVector() or SubtractVector() function.
so this was done "manually" from the input coordinates.
The need arises from transforming coordinates to a useful base point for later comparing vectors
So you see static BASE coordinates and active WORK coordinates.

Getting the Vector's values is easy with SQL using %EXTERNAL() function
while in ObjectScript I ended up with
        set vectorvalues=##class(%Vector).LogicalToOdbc(vectorvariable) 
this was less impressive for working with Vectors.

#4
Similarity is calculated with VECTOR_COSINE() function.
You calculate the angle between 2 Vectors and COSINE norm it between +1 and -1
The input needs 2 Vectors of the same type and same dimension.
Examples as in documentation work fine if you compose your SQL String as suggested
and TO_VETOR(?,type,size) is OK  with  %SQLStatement  for execution.
BUT:
I tried it with embedded SQL.
Code checking signalled some disagreement but compiled without problem
At runtime it turned out that host variables in TO_VECTOR(:myvec,INT,2) failed
whatever combination of quotes, braces, .... I tried.
So be warned. I returned to  %SQLStatement to get my VCOS done.

UPDATE:  TO_VECTOR(:myvec,INT,2)
     set myvec="1314,-7979" 

Nothing special: Just a plain String with comma-separated values
It seems I couldn't believe that simple approach.
My apologizes to ISC Engineering.

#5
It was a surprise to learn how wide VECTOR_COSINE is spreading.
checking the vector Paris >> Bucuresti  traced half of Middle and East Asia.
So limiting the results to > 0.999 is a good practice in this scenario.

Video

GitHub
 

4 Comments
Discussion (4)1
Connectez-vous ou inscrivez-vous pour continuer
Question
· Avr 26, 2024

SQL Cached Queries understanding

Hello Community,

I'm executing the same query with same  column name but in different case. An unique cached query generated while query executed first time. The query preparser only normalize the keywords and send to the SQL engine generates the Hash. Eventually use the cached query next use.

Now my question, The hash values are same for both of the queries. Then why it creates two cached queries.

Query1: select * from MyLearn.Test where Name['Kev1'

Query2: select * from MyLearn.Test where NamE['Kev1'

Thanks!

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer
Article
· Avr 26, 2024 5m de lecture

Rastreos de OpenTelemetry implementados por Servicios Web SOAP en IRIS

Un cliente preguntó recientemente si IRIS soporta OpenTelemetry, dado que estaban buscando medir el tiempo que los servicios SOAP implementados por IRIS tardan en completarse, y  el cliente ya tenía varias otras tecnologías que soportan OpenTelemetry para el seguimiento de procesos.

Si bien, a día de hoy, InterSystems IRIS (IRIS) no soporta de forma nativa OpenTelemetry, es justo decir que la plataforma de datos IRIS tiene varias maneras de capturar, registrar y analizar el rendimiento de una instancia en ejecución. Esta información no fluye fuera de IRIS a través de otros componentes, como serían los Agentes o Colectores dentro de una arquitectura OpenTelemetry implementada. Lo cierto es que OpenTelemetry parece estar convirtiéndose en un estándar de facto para la observabilidad.

Aunque ya hay un desarrollo en curso para apoyar de forma nativa esta capacidad en futuras versiones de IRIS, este artículo explica cómo, con la ayuda de Python embebido y las correspondientes bibliotecas de Python, los desarrolladores de aplicaciones IRIS pueden empezar a publicar eventos de rastreo a su OpenTelemetry back-ends con el mínimo esfuerzo. Más importante aún, esto le da a mi cliente algo para ponerse en marcha con el día de hoy. 

 

Observabilidad. 


En general, la observabilidad comprende tres aspectos principales:

  • Captura de métricas, que es la captura de medidas cuantitativas sobre el rendimiento y el comportamiento de un sistema, similar a lo que IRIS publica a través de su /api/monitor/metrics api
  • Logging, que consiste en capturar y almacenar información relevante generada por una aplicación o sistema, como la que aparece en las salidas de System Log, o en el fichero messages.log generado por las instancias IRIS.
  • Tracing o Rastreo: que implica seguir el flujo de una solicitud de servicio o transacción a medida que se mueve a través de varios componentes de una solución. El rastreo distribuido permite seguir la ruta de una solicitud a través de múltiples servicios, proporcionando una representación visual de todo el flujo de la transacción.

Este artículo y la aplicación que lo acompaña se centran únicamente en el rastreo o tracing de servicios SOAP.

 

Un Trace (rastreo) identifica una operación dentro de una solución que, de hecho, puede satisfacerse a través de múltiples tecnologías en una arquitectura, como navegador, balanceador de carga, servidor web, servidor de base de datos, etc.
Un Span representa una única unidad de trabajo, como una actualización o consulta de una base de datos. Un Span es el bloque de construcción de un rastreo, y un rastreo comienza con un Span raíz, y opcionalmente spans anidados, o spans hermanos.

En esta implementación, que sólo utiliza IRIS como tecnología para generar telemetría, se inicia un Rastreo y un Span raíz cuando se inicia el Servicio SOAP.

Enfoque para la aplicación

Transformar la clase IRIS %SOAP.WebService con la lógica de implementación de OpenTelemetry y las funciones de la librería Python en una nueva clase llamada SOAP.WebService. Incluir macros que se pueden utilizar en el código de usuario para contribuir aún más a la observabilidad y la trazabilidad. 
Solo deberían ser necesarios cambios mínimos en la implementación SOAP existente (sustituir el uso de %SOAP.WebService por SOAP.WebService como superclase de servicio web para implementar SOAP.
El siguiente diagrama ilustra este enfoque:

 

Características de esta aplicación:

  • Por defecto, cada servicio SOAP será rastreado y reportará información de seguimiento.
  • Cuando se utiliza un servicio SOAP por primera vez, la implementación inicializará un objeto de rastreo OpenTelemetry. Una combinación del nombre del servidor IRIS y la instancia se proporciona como la fuente de telemetría, y la acción SOAP se utiliza como el nombre del span raíz por defecto que rastrea el servicio SOAP.
  • Los rastreos de telemetría y el span por defecto se cerrarán automáticamente cuando finalice la llamada al método SOAP.
  • En el momento de la creación, pueden añadirse pares de atributos clave/valor al span raiz predeterminado, como el identificador de sesión CSP o el número de trabajo.
  • Los usuarios pueden usar $$$OTELLog(...), para añadir un registro manual arbitrario en un span, usando una simple cadena o array de pares clave-valor.
  • Los usuarios pueden utilizar $$$OTELPushChildSpan(...)/$$$OTELPopChildSpan(...) para crear spans no raíz alrededor de secciones de código que quieran identificar independientemente con su lógica.

 

Instalación y prueba

  • Con clone/git extraed el repositorio en cualquier directorio local
$ git clone https://github.com/pisani/opentelemetry-trace-soap.git
  • Abrid una ventana de terminal en este directorio y escribid lo siguiente para construir las imágenes IRIS con código de ejemplo:
$ docker-compose build
  • Una vez construida la imagen iris, en el mismo directorio escribid lo siguiente para iniciar los contenedores Jaeger e IRIS:
$ docker-compose up -d

Esto pondrá en marcha dos contenedores - el contenedor de Jaeger OpenTelemetry back-end objetivo (también la exposición de una interfaz de usuario), y, una instancia de IRIS que servirá como punto final del servidor de servicios web SOAP.  Tres servicios web simples se han desarrollado en la instancia IRIS para probar la solución.

 

  • Utilizad vuestro navegador para acceder a las páginas de información y pruebas de SOAP a través de esta URL, iniciando sesión como superusuario/SYS si se os solicita:
http://localhost:52773/csp/irisapp/SOAP.MyService.cls

(Nota: Estas páginas no están habilitadas por defecto y la seguridad dentro de la instancia IRIS en ejecución tuvo que ser relajada para habilitar esta característica, para facilitar las pruebas)

Seleccionad cada uno de los métodos web que deseáis probar, con el fin de generar actividad SOAP.  Para ver cómo esta implementación genera un Error en los rastreos observados, utilizad cero (0) como segundo número en el método SOAP Divide() para forzar un error <DIVDE>.

  • Abrid otra pestaña del navegador y acceded a la interfaz de usuario de Jaeger a través de la siguiente URL
http://localhost:16686
  • La página de destino resultante muestra todos los servicios que contribuyen con lecturas de telemetría y debería parecerse a la siguiente captura de pantalla:  

 

Conclusión

En resumen, este artículo demuestra cómo Embedded Python, podría ser utilizado para añadir características adicionales a IRIS, en mi caso, para implementar rastreo de observabilidad para servicios SOAP.  Las opciones disponibles a través de Python y la capacidad de IRIS para aprovechar estas bibliotecas de Python es verdaderamente potente.

Se puede trabajar para crear una clase de soporte OpenTelemetry más genérica que implemente lo mismo para los servicios REST, así como extender las firmas de los métodos de clase para rastrear el tiempo de cualquier método de clase por este marco.

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer
Article
· Avr 26, 2024 2m de lecture

Geo Vector Search #1

Geographic use of vector search

The basic idea is to use Vectors in the mathematical sense.
I used geographic coordinates. These are of course only 2-dimensional
but much easier to follow as vectors in text analysis with >200 dimensions.

The example loads a list of worldwide capitals with their coordinates
The coordinates are interpreted as vectors from geographic point 0°N/0 W
(some very wet spot in the Gulf of Guinea, >400 km from the African Coast)
Finding common directions from that spot is a quite theoretical case.
So adjustment to your preferred starting point is implemented.
Now finding similar directions for some target city makes sense.
It's a methematical use of VECTOR_COSINE() function other than text search.

And as this is just 2 dimensional COSINE is just what we (hopefully) learned at school.
So the results are far better to understand: 

  • 1  =  total match, same direction 0° deviation from original
  • 0  = no match at all,  direction points 90° away from original
  • -1 = total opposite direction pointing backward by 180° from original
  •  ~0.999  = quite close to original 

You just get information on the direction, not on the size.
So your vector from Paris to Budapest  points also to Minsk or someplace In Asia

The demo is controlled by a rathrer simple menu:

  Use Geographc Vectors
=========================
     1 - Initialize Tables
     2 - Import Data
     3 - Set Base Location
     4 - Generate Vectors
     5 - Select Target Location
     6 - Show Best Matches
Select Function or * to exit :

for multiple retries, you always restart at

  • #3 set your starting location
  • #4 adjust coordinates to your selected base
  • #5 set your target location  defining your base vector
  • #6 see what's in between or in front of your vector
    • adjust tolerance from -1...+1

GitHub

Video

DemoServer Mgmt Portal
DemoServer WebTerminal
 

3 Comments
Discussion (3)1
Connectez-vous ou inscrivez-vous pour continuer
Question
· Avr 26, 2024

How to read XML data in a routing rule

I am receiving an XML input to my router and in the routing rule I need to traverse through the xml data , apply a for loop and fetch data.

How can I do that ?

Input :

 

<?xml version="1.0" encoding="UTF-8"?>
<Input>
   <data>
      <Ids>
         <Id>
            <Type>A</Type>
            <Value>123</Value>
         </Id>
         <Id>
            <Type>B</Type>
            <Value>456</Value>
         </Id>
      </Ids>
   </data>
</Input>

 

I would like to read 123 from above xml in a rule ..

3 Comments
Discussion (3)1
Connectez-vous ou inscrivez-vous pour continuer