# Elastic Stack

## Introducción

Este manual describe el procedimiento de instalación del **Elastic Stack (ELK)**.

## Preparativos para la Instalación

Esta sección abarca los pasos esenciales necesarios para la instalación.

{% hint style="warning" %}
Todos los pasos deben ejecutarse con privilegios de root en todos los nodos, salvo indicación en contrario.
{% endhint %}

Para instalar el ELK, necesitará:

* Permiso de root en el servidor
* GBDS instalado en el servidor

{% hint style="info" %}
Si no tiene el archivo, póngase en contacto con el equipo de soporte de Griaule.
{% endhint %}

Luego, siga los pasos presentados a continuación.

1. Inicie sesión en el servidor como *root*.
2. [Prepare el Repositorio](#prepare-o-repositorio).
3. [Instale y Configure Elasticsearch](#instalando-e-configurando-o-elasticsearch).
4. [Instale y Configure Kibana](#instalando-e-configurando-o-kibana).
5. [Instale y Configure Logstash](#instalando-e-configurando-o-logstash).
6. [Configure ELK con SmartSense](#configurando-o-elk-com-o-smartsense).

## Prepare el Repositorio

Para instalar ELK, primero el repositorio debe ser agregado al servidor.

Para ello, importe la clave GPG:

```bash
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
```

Cree el archivo del repositorio:

```bash
vim /etc/yum.repos.d/elasticsearch.repo
```

Agregue el siguiente contenido al archivo y guárdelo:

```properties
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
```

Luego, actualice la caché del gestor de paquetes. Comience limpiando la caché:

```bash
yum clean all
```

Finalmente, haga un rebuild de la caché de paquetes:

```bash
yum makecache
```

## Instalando ELK

### Instalando y Configurando Elasticsearch

Instale el paquete Elasticsearch:

```bash
yum install elasticsearch -y
```

Luego, abra el archivo de configuración de Elasticsearch:

```bash
vim /etc/elasticsearch/elasticsearch.yml
```

En la sección *Network*, busque la línea que comienza con `#network.host:`. Descomente la línea y cambie su valor a:

{% hint style="info" %}
Asegúrese de sustituir `<host-ip>` por la dirección IP del servidor.
{% endhint %}

```yml
network.host: <host-ip>
              ^^^^^^^^^
```

A continuación, desactive el SSL cambiando las siguientes configuraciones a `false`:

```yml
xpack.security.enabled: false

xpack.security.enrollment.enabled: false

# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
  enabled: false
  keystore.path: certs/http.p12

# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
  enabled: false
```

Entonces, inicie el servicio de Elasticsearch:

```bash
sudo systemctl start elasticsearch
```

Y habilite el servicio de Elasticsearch para que inicie automáticamente al arranque de la máquina:

```bash
sudo systemctl enable elasticsearch
```

Finalmente, verifique que el servicio de Elasticsearch esté en ejecución:

{% hint style="info" %}
Asegúrese de sustituir `<host-ip>` por la dirección IP del servidor.
{% endhint %}

```bash
curl -X GET "<host-ip>:9200"
             ^^^^^^^^^
```

El resultado debe ser similar a:

```json
{
	"name": "QDexH8a",
	"cluster_name": "elasticsearch",
	"cluster_uuid": "gAAIqERvS_msO7Y1_759Ja",
	"version": {
		"number": "6.8.23",
		"build_flavor": "default",
		"build_type": "rpm",
		"build_hash": "4f67856",
		"build_date": "2022-01-06T21:30:50.087716Z",
		"build_snapshot": false,
		"lucene_version": "7.7.3",
		"minimum_wire_compatibility_version": "5.6.0",
		"minimum_index_compatibility_version": "5.0.0"
	},
	"tagline": "You Know, for Search"
}
```

### Instalando y Configurando Kibana

Instale el paquete Kibana:

```bash
yum install kibana -y
```

Luego, abra el archivo de configuración de Kibana:

```bash
vim /etc/kibana/kibana.yml
```

Busque la línea que comienza con `#server.host:`. Descomente la línea y cambie su valor a:

{% hint style="info" %}
Asegúrese de sustituir `<hostname>` por el nombre de host del servidor. Mantenga las comillas dobles.
{% endhint %}

```yml
server.host: "<hostname>"
              ^^^^^^^^^^
```

A continuación, busque la línea que comienza con `#elasticsearch.hosts:`. Descomente la línea y cambie su valor a:

{% hint style="info" %}
Asegúrese de sustituir `<elasticsearch-host-ip>` por la dirección IP configurada en Elasticsearch. Mantenga las comillas dobles.
{% endhint %}

```yml
elasticsearch.hosts: ["http://<elasticsearch-host-ip>:9200"]
                              ^^^^^^^^^^^^^^^^^^^^^^^
```

Entonces, inicie el servicio de Kibana:

```bash
sudo systemctl start kibana
```

Y habilite el servicio de Kibana para que inicie automáticamente al arranque de la máquina:

```bash
sudo systemctl enable kibana
```

A continuación, instale y configure Nginx.

#### Instalando y Configurando Nginx

Instale el paquete Nginx:

```bash
yum install nginx -y
```

A continuación, cree un archivo que contendrá las credenciales de autenticación para Kibana. Para ello, ejecute el siguiente comando e ingrese la contraseña deseada cuando se le solicite:

```bash
echo "kibanaadmin:`openssl passwd -apr1`" | tee -a /etc/nginx/htpasswd.users
```

Luego, cree un nuevo archivo de configuración para Nginx:

{% hint style="info" %}
Asegúrese de sustituir `<hostname>` por el nombre de host del servidor.
{% endhint %}

```bash
vim /etc/nginx/conf.d/<hostname>_kibana.conf
                      ^^^^^^^^^^
```

Agregue el siguiente contenido al archivo, realizando los cambios apropiados en `server_name` y `proxy_pass`:

{% hint style="info" %}
Asegúrese de sustituir `<host-ip>` por la dirección IP del servidor y `<kibana-host-ip>` por la dirección IP del servidor en el que está instalado Kibana.
{% endhint %}

{% hint style="warning" %}
A continuación, las líneas que contienen **"^^^^^^^^^"** están presentes solo para resaltar los cambios que deben realizarse. Elimínelas antes de guardar el archivo.
{% endhint %}

```properties
server {
	listen 80;

	server_name <host-ip>;
	            ^^^^^^^^^

	auth_basic "Restricted Access";
	auth_basic_user_file /etc/nginx/htpasswd.users;

	location / {
		proxy_pass http://<kibana-host-ip>:5601;
		                  ^^^^^^^^^^^^^^^^
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection 'upgrade';
		proxy_set_header Host $host;
		proxy_cache_bypass $http_upgrad;
	}
}
```

Pruebe el archivo de configuración de Nginx:

```bash
nginx -t
```

Luego, reinicie el servicio de Nginx:

```bash
systemctl restart nginx
```

Si es necesario, configure la conexión en SE:

```bash
setsebool httpd_can_network_connect 1 -P
```

Finalmente, verifique que el servicio de Kibana esté en ejecución, accediendo a la siguiente URL en un navegador:

{% hint style="info" %}
Asegúrese de sustituir `<host-ip>` por la dirección IP del servidor.
{% endhint %}

```bash
http://<host-ip>/status
       ^^^^^^^^^
```

{% hint style="success" %}
El nombre de usuario es **kibanaadmin** y la contraseña es la creada anteriormente.
{% endhint %}

### Instalando y Configurando Logstash

Instale el paquete Logstash:

```bash
yum install logstash -y
```

A continuación, instale el paquete MySQL Connector/J:

```bash
yum install mysql-connector-java -y
```

{% hint style="info" %}
Si no se encuentra, descárguelo en: <https://dev.mysql.com/downloads/connector/j/>
{% endhint %}

Luego, cree el archivo de configuración de Logstash:

```bash
vim /etc/logstash/conf.d/smartsense.conf
```

Agregue el siguiente contenido al archivo, realizando los cambios apropiados en `jdbc_connection_string`, `jdbc_user`, `jdbc_password` y `hosts`:

{% hint style="info" %}
Asegúrese de sustituir `<database-ip>`, `<database-username>`, `<database-password>` y `<elasticsearch-host-ip>` por los valores apropiados. Mantenga las comillas dobles.
{% endhint %}

{% hint style="warning" %}
A continuación, las líneas que contienen **"^^^^^^^^^"** están presentes solo para resaltar los cambios que deben realizarse. Elimínelas antes de guardar el archivo.
{% endhint %}

```properties
input {
	jdbc {
		jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar"
		jdbc_driver_class => "com.mysql.jdbc.Driver"
		jdbc_connection_string => "jdbc:mysql://<database-ip>:3306/"
		                                        ^^^^^^^^^^^^^
		jdbc_user => "<database-username>"
		              ^^^^^^^^^^^^^^^^^^^
		jdbc_password => "<database-password>"
		                  ^^^^^^^^^^^^^^^^^^^
		jdbc_validate_connection => true
		tracking_column => "id"
		use_column_value => true
		statement => "SELECT * FROM smartsense.load_balancing_count where id > :sql_last_value;"
		schedule => "*/2 * * * *"
		clean_run => false
	}
}
output {
	elasticsearch {
		hosts => ["<elasticsearch-host-ip>:9200"]
		           ^^^^^^^^^^^^^^^^^^^^^^^
		index => "smart_sense_index_pattern"
		document_id => "%{[id]}"
	}
	stdout {
		codec => rubydebug
	}
}
```

A continuación, el archivo systemd de Logstash necesita ser modificado para garantizar que se inicie usando el archivo de configuración creado anteriormente. Para ello, abra el archivo:

```bash
vim /etc/systemd/system/logstash.service
```

{% hint style="info" %}
Es posible que el archivo esté ubicado en `/usr/lib/systemd/system/logstash.service`.
{% endhint %}

Busque la línea que comienza con `ExecStart=`. Cambie su valor de:

```properties
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash"
```

A:

```properties
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash" "-f" "/etc/logstash/conf.d/smartsense.conf"
```

Luego, aplique los cambios recargando la configuración de systemd:

```bash
systemctl daemon-reload
```

{% hint style="warning" %}
Si está instalando en un servidor nuevo que posee una base de datos vacía, inserte un valor ficticio en la tabla `smartsense.load_balancing_count` para evitar errores. Para ello, ejecute el siguiente comando e ingrese la contraseña de la base de datos:

Asegúrese de sustituir `<database-username>` y `<mysql-database-ip>` por los valores apropiados.

```bash
#        vvvvvvvvvvvvvvvvvvv       vvvvvvvvvvvvvvvvvvv
mysql -u <database-username> -p -h <mysql-database-ip> \
      -e "USE smartsense; INSERT INTO load_balancing_count
         (id, hostname, load_time, api_id, transaction_type,
         latent, ul, load_count, extraction_time_avg, extraction_quality_avg,
         match_avg, total_avg, extraction_time_min, extraction_quality_min, match_min,
         total_min, extraction_time_max, extraction_quality_max, match_max, total_max)
         VALUES
         (1, 'hostname', '2023-08-31 21:25:40', '8829E30D-4994-4D09-99AF-B6F818473928',
         'IDENTIFY', 'false', 'false', 1, '541.0', '0.0', '48.0', '599.0',
         '541', '0', '48', '599', '541', '0', '48', '599');"
```

{% endhint %}

A continuación, habilite el servicio de Logstash para que inicie automáticamente al arranque de la máquina:

```bash
sudo systemctl enable logstash
```

Luego, inicie el servicio de Logstash:

```bash
sudo systemctl start logstash
```

Y supervise el registro:

```bash
tail -f /var/log/logstash/logstash-plain.log
```

{% hint style="danger" %}
Si ocurre un error indicando que Logstash no puede escribir en el directorio `/var/lib/logstash/{folder}`, ejecute el siguiente comando para cambiar su *owner*:

```bash
chown -R logstash:logstash /var/lib/logstash
```

{% endhint %}

Finalmente, para verificar si Logstash creó el índice en Elasticsearch, ejecute el siguiente comando:

{% hint style="info" %}
Asegúrese de sustituir `<elasticsearch-host-ip>` por la dirección IP del servidor en el que está instalado Elasticsearch.
{% endhint %}

```bash
curl -X GET "<elasticsearch-host-ip>:9200/_cat/indices?v"
             ^^^^^^^^^^^^^^^^^^^^^^^
```

La salida debe ser similar a:

```
health status index                     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   smart_sense_index_pattern 6Ux_yM25SvG2zWGdGR0HQw   5   1          1            0      6.7kb          6.7kb
green  open   .kibana_1                 BBO89yLnTUC3F7nhqKwf9w   1   0          4            0       18kb           18kb
green  open   .kibana_task_manager      sIMoATiBRsS8bXiVBCscrA   1   0          2            0     12.5kb         12.5kb
```

## Configurando ELK con SmartSense

### Configurando Kibana

#### Creando la *Data View*

{% hint style="info" %}
Asegúrese de sustituir `<kibana-host-ip>` por la dirección IP del servidor en el que está instalado Kibana.
{% endhint %}

En un navegador, acceda a: `http://<kibana-host-ip>:5601`. Luego, abra la barra lateral de opciones haciendo clic en este ícono, ubicado en la esquina superior izquierda de la pantalla:

![](/files/03f1d9f60a01f00e0e6980fe99a31ecca7e30eb7)

Haga clic en Management (última sección). Luego, en las opciones del lado izquierdo, en la sección *Fecha*, haga clic en Index Management.

O acceda a la siguiente URL directamente:

```html
http://<kibana-host-ip>:5601/app/management/data/index_management/indices
       ^^^^^^^^^^^^^^^^
```

Asegúrese de que el índice `smart_sense_index_pattern` aparezca en la lista.

Luego, en la sección *Kibana* de las opciones del lado izquierdo, haga clic en Data Views.

Haga clic en el botón azul Create data view y rellene los campos con la siguiente información:

* Name: `SS Pattern`
* Index pattern: `smart_sense_index_pattern`
* Timestamp field: `load_time`

Confirme la creación de la *Data View* haciendo clic en Save data view to Kibana.

#### Creando los *Dashboards*

Abra nuevamente la barra lateral de opciones haciendo clic en el ícono en la esquina superior izquierda de la pantalla. En la sección Analytics, haga clic en Dashboards.

O acceda a la siguiente URL directamente:

```html
http://<kibana-host-ip>:5601/app/dashboards
       ^^^^^^^^^^^^^^^^
```

Haga clic en el botón azul Create dashboard. Luego, haga clic en Create visualization. En el lado derecho, configure la *visualization* con la siguiente información:

* Visualization type: `Bar vertical stacked`
* Data view: `SS Pattern`
* Horizontal Axis:
  * Functions: `Date histogram`
  * Field: `load_time`
* Vertical Axis:
  * Functions: `Sum`
  * Field: `load_count`

Luego, haga clic en el símbolo +, ubicado en la esquina superior izquierda de la pantalla, para crear un nuevo filtro. Configure el filtro con la siguiente información: `transaction_type` `is` `ENROLL`. Confirme haciendo clic en Add filter.

Finalmente, guarde el *dashboard* haciendo clic en Save to library, ubicado en la esquina superior derecha de la pantalla, e introduciendo la siguiente información:

* Title: `SS Enroll Dashboard`
* Tags: `smartsense-enroll`

Haga clic en Save and return.

Repita las operaciones anteriores para crear los siguientes *dashboards*:

{% hint style="info" %}
Ajuste los nombres y tags según sea necesario.
{% endhint %}

* Para **VERIFY** añada el filtro: `transaction_type` `is` `VERIFY`
* Para **UPDATE** añada el filtro: `transaction_type` `is` `UPDATE`
* Para **IDENTIFY** añada el filtro: `transaction_type` `is` `IDENTIFY` `and` `latent` `is` `false`
* Para **LATENT** añada el filtro: `transaction_type` `is` `IDENTIFY` `and` `latent` `is` `true`

Con los cinco dashboards creados, entre en cada uno de ellos y configure el intervalo de tiempo a mostrar, haciendo clic en el ícono de calendario, ubicado en la esquina superior derecha de la pantalla.

Luego, haga clic en Share y en Copy link. Guarde el enlace, ya que se usará posteriormente.

Repita la operación para los cinco dashboards.

Al final de cada enlace, añada la siguiente información:

```default
&hide-filter-bar=true&show-time-filter=true&embed=true
```

Por ejemplo, el enlace:

```default
http://172.16.0.185:5601/app/lens#/edit/a0a936d5-4e92-4015-b3e7-37810c2a114a?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))
```

Quedará:

```default
http://172.16.0.185:5601/app/lens#/edit/a0a936d5-4e92-4015-b3e7-37810c2a114a?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true
```

Repita la operación para los cinco enlaces obtenidos.

Guarde los enlaces, ya que se usarán en el paso siguiente.

### Configurando los Dashboards en SmartSense

Abra el archivo de configuración de SmartSense, `config.properties`, ubicado en la carpeta `/var/lib/tomcats/smart-sense/conf`:

```bash
vim /var/lib/tomcats/smart-sense/conf/config.properties
```

Encuentre la sección **# SMARTSENSE - ELK CONFIGURATION**.

Para cada propiedad (`linkEnroll`, `linkIdentify`, `linkIdentifyLatent`, `linkUpdate`, `linkVerify`), inserte el enlace del dashboard correspondiente obtenido anteriormente. Por ejemplo:

```properties
linkEnroll=http://172.16.0.185:5601/app/lens#/edit/a0a936d5-4e92-4015-b3e7-37810c2a114a?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true

linkUpdate=http://172.16.0.185:5601/app/lens#/edit/25d53ee8-7adc-4b06-b05d-f38bfda39c66?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true

linkVerify=http://172.16.0.185:5601/app/lens#/edit/8bfa1546-7990-4ed3-baae-86e421a60aef?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true

linkIdentify=http://172.16.0.185:5601/app/lens#/edit/0d5edf08-ca78-40fc-ac5f-59ca91d07412?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true

linkIdentifyLatent=http://172.16.0.185:5601/app/lens#/edit/e3f84cc5-68dd-4c76-a84e-d209da2e777a?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true
```

Guarde y cierre el archivo.

Después de completar todos los pasos del procedimiento de instalación del Elastic Stack, vuelva al [manual de Configuración del SmartSense Server](/gbs/es/componentes-web/smartsenseconfig.md) para completar la configuración.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.griaule.com/gbs/es/herramientas-auxiliares/elk.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
