Dec 12th, 2020: [ES] Tu infraestructura en un mapa

Este artículo es una traducción de Mapping your infrastructure escrito por Thomas Neirynck.

tl;dr;

Esta entrada elabora cómo puedes usar el stack de Elastic para representar datos geoespaciales relativos a IoT, Seguridad y Observabilidad. Este tipo de datos habitualmente no dispone de coordenadas geográficas (longitud y latitud) pero aún así pueden representarse en un mapa en Kibana mediante un "Term Join".

Representado medidas con localizaciones

El stack de Elastic está especialmente capacitado para casos de uso relacionados con Observabilidad y Seguridad, especialmente si disponen de un componente IoT. Algunos ejemplos:

  • Asignar direcciones IP privadas a una oficina o edificio
  • Eventos de seguridad como validaciones de tarjetas de empleado entrando o saliendo de sus lugares de trabajo o la actividad de tornos.
  • Sensores de humedad o temperatura actuando en diferentes partes de una planta.
  • Métricas de robots operando en una factoría.

En estos casos, el objeto es realmente estático e identificable unívocamente (este termómetro o ese torno, ...) mientras que las medidas se repiten a lo largo del tiempo (múltiples medidas de temperatura a lo largo de un intervalo de tiempo, múltiples eventos de un torno a lo largo de una jornada, ...).

Casi siempre, estas lecturas de sensores de tecnologías IoT no disponen de información explícita de localización. No encontrarás termómetros baratos equipados con un GPS. En cualquier caso sería innecesario: este tipo de medidas estacionarias no requieren de georreferenciación explícita.

Este proceso de normalización, en el que se separa la información geográfica del objeto de las medidas que emite es un patrón común de modelización en los Sistemas de Información Geográfica (SIG).

  • La información espacial de las entidades se captura en una "capa". Esta información es estática. Los documentos disponen de una clave primaria que los identifica unívocamente a un objeto del mundo real. Estas entidades pueden ser puntos (p. ej. localizaciones de sensores), o líneas o polígonos (para entidades naturales, por ejemplo). En Elasticsearch, estas entidades estarían almacenadas en un índice con campos de tipo geo_point o geo_shape, mientras que clave primaria se almacenaría en un campo de tipo keyword.

  • Por otro lado dispondríamos de una tabla con las métricas. Esta tabla dispone de una clave ajena que referencia con una entidad geográfica. En Elasticsearch, eso se modelaría como un índice con un campo que serviría de clave ajena, normalmente un campo keyword.

En Kibana, Maps permite enlazar esta "tabla" y esta "capa" utilizando la funcionalidad Term Join.

Ejemplo: cartografiando sensores estáticos

Dado que no quiero compartir con vosotros la localización de mi casa :P, vamos a asumir que he puesto tres sensores de temperatura en la Casa Blanca. Uno en el Despacho Oval, otro en el Porche de Entrada, y otro en el Jardín Rosa.

1. Crear la capa

He usado geojson.io para crear un fichero GeoJSON con los tres sensores.

Los detalles importantes aquí son la clave primaria sensor_id en la sección properties que identifica al sensor, así como su localización.

El fichero sería algo como esto:

{
   "type":"FeatureCollection",
   "features":[
      {
         "type":"Feature",
         "properties":{
            "sensor_id":"dht22_1",
            "location":"Oval office"
         },
         "geometry":{
            "type":"Point",
            "coordinates":[
               -77.03710377216339,
               38.897491797297405
            ]
         }
      },
      {
         "type":"Feature",
         "properties":{
            "sensor_id":"dht22_2",
            "location":"Rose garden"
         },
         "geometry":{
            "type":"Point",
            "coordinates":[
               -77.03740686178207,
               38.89738742299468
            ]
         }
      },
      {
         "type":"Feature",
         "properties":{
            "sensor_id":"dht22_3",
            "location":"Main entry"
         },
         "geometry":{
            "type":"Point",
            "coordinates":[
               -77.03648686408997,
               38.89756485921805
            ]
         }
      }
   ]
}

Para cargar este fichero utilizaremos Kibana Maps. Crea un nuevo mapa, haz clic en add layer y selecciona GeoJSON Upload.

Puedes añadir algunas etiquetas y colores usando el editor de estilo, and voila, aquí tienes la capa de referencia.

Puedes optimizar esta capa desactivando "Apply global filter to layer data". Las localizaciones de estos sensores no van a ser afectadas por ningún filtro del contexto global de Kibana.

2. Monitorización de la temperatura.

Vamos a pasar por alto este punto. La carga de datos de sensorización en Elasticsearch da para otro artículo, además de ser muy dependiente de cada proveedor. Puedes ver algunos ejemplos al respecto:

El detalle relevante aquí es que cada documento contiene una clave ajena en un campo que refiere de vuelta al campo sensor_id de nuestra capa creada en el apartado anterior.

En nuestro índice temperature, el modelo de datos (mapping) debería contener al menos los siguientes campos:

{
   "temperature":{
      "mappings":{
         "properties":{
            "@timestamp":{
               "type":"date"
            },
            "sensor_id":{
               "type":"keyword"
            },
            "temperature":{
               "type":"double"
            }
         }
      }
   }
}

Es importante aquí seleccionar como tipo de campo keyword para sensor_id para actuar como una clave ajena.

También es necesario crear un index-pattern de Kibana para este índice.

3. Configuración del term-join

Vuelve a la aplicación de mapas y selecciona la capa de sensores que hemos creado en el primer paso.

Configura el term-join:

El campo y origen de la izquierda es la capa de los sensores con la información geográfica. El campo y el índice de la derecha es el índice con las métricas de los sensores.

4. Configuración de la métrica de agregación

Para este term-join, podemos calcular todo tipo de métricas. Media aritmética de temperatura o su mínimo o máximo. Kibana es la plataforma perfecta para datos temporales, cualquier mapa siempre será afectado por el rango temporal global de la visualización.

5. Simbolización de los sensores a partir de las métricas

Ya está todo listo para ajustar la simbología a partir de los valores de las métricas. Me gustaría adaptar el tamaño de los puntos y también su color a la media de la temperatura. Para hacer esto es necesario activar el estilo "by value".

Y voila, aquí está el mapa:

Resumen

Este artículo muestra una aproximación de cliente para resolver este problema. También puedes hacer este "join" durante la carga de datos usando el lookup-processor. Este blog post muestra un ejemplo de cómo conseguirlo para direcciones IP privadas. Ambas soluciones son válidas.

La aproximación de cliente mostrada aquí no tiene penalización siempre que el número de entidades en la capa de la izquierda se mantenga relativamente baja (en el orden de los centenares de miles de elementos, como mucho). El índice que almacena las métricas puede crecer sin problema al orden de los millones de registros y más.

Espero que con esto puedas empezar a crear mapas de datos sin una ubicación explícita. Los "Term Joins" son una aproximación muy genérica y relevante para multitud de casos de uso. Hemos usado una escala muy local (una simple vivienda), pero esta técnica funciona a una escala mucho mayor también (p. ej. múltiples centros de datos asignados a rangos de direcciones IP). También funciona bien para datos que no son puntuales, p.ej. planos de oficinas donde una línea representa una puerta.

Para cualquier pregunta relacionada con este tema, nuestro foro es el lugar perfecto, os esperamos..

3 Likes

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.