# Azure Load Balancer

# Introducción

<div id="bkmrk-este-plugin-de-disco"><div>Este plugin de discovery de Azure Load Balancer para Pandora FMS está diseñado para automatizar la monitorización de los recursos **Azure Load Balancer** de una suscripción de Azure. El plugin descubre de forma dinámica los Load Balancers disponibles, obtiene sus métricas principales mediante Azure Monitor y genera agentes y módulos en Pandora FMS.</div>  
<div>El plugin permite trabajar de dos formas: creando un agente por cada Load Balancer descubierto, o enviando todos los módulos a un único agente configurado por el usuario. También permite filtrar por grupo de recursos, aplicar prefijos personalizados, controlar la caché de entidades descubiertas y seleccionar grupos de módulos según el tipo de métrica que se quiera monitorizar.</div>  
<div>Las métricas implementadas se basan en las métricas utilizadas para Azure Load Balancer, incluyendo disponibilidad, estado de health probes, tráfico, SYN packets, consumo de puertos SNAT y conteo de hosts en backend pools.</div></div>

# Prerrequisitos

- El plugin se distribuye como un binario compilado que ya contiene todas las dependencias necesarias para su uso, por lo que no requiere instalar Python ni librerías adicionales en el servidor donde se ejecute.
- Es necesario disponer de una suscripción de Azure con recursos **Azure Load Balancer** que puedan ser consultados por el plugin.
- Es necesario disponer de credenciales de Azure mediante un **Service Principal** con permisos de lectura sobre la suscripción o sobre el grupo de recursos que se quiera monitorizar.
- El Service Principal debe poder listar recursos de red y consultar métricas de Azure Monitor.
- En entornos de prueba se puede utilizar el campo **Mock Azure API URL** para apuntar a un contenedor mock que simule respuestas de Azure Load Balancer.

# Parámetros

**Modo avanzado**

<table border="1" id="bkmrk-azure-load-balancer-advanced-params"><tbody><tr><td>--conf</td><td>ruta del archivo de configuración generado por la tarea de Discovery.</td></tr></tbody></table>

**Archivo de configuración (--conf)**

```ini
agents_group_id = id del grupo de agentes de Pandora FMS donde se crearán los agentes.
interval = intervalo de monitorización de la tarea en segundos.
subscription_id = identificador de la suscripción de Azure.
tenant_id = identificador del tenant de Azure Active Directory.
client_id = identificador de aplicación del Service Principal.
client_secret = secreto del Service Principal.
resource_group = grupo de recursos de Azure que se quiere monitorizar, opcional. Si se deja vacío, se descubren Load Balancers de toda la suscripción.
threads = número máximo de hilos de ejecución.
target_agent = agente destino cuando no se crea un agente por cada Load Balancer.
modules_prefix = prefijo opcional para los nombres de los módulos.
scan_load_balancers = activa el descubrimiento automático de Load Balancers.
agent_per_load_balancer = crea un agente por cada Load Balancer descubierto.
lb_agent_prefix = prefijo opcional para el nombre de los agentes creados por Load Balancer.
entities_list = ruta del fichero temporal donde se almacenan las entidades descubiertas.
enable_entities_interval = activa el refresco periódico del fichero de entidades.
entities_interval = intervalo de refresco del fichero de entidades.
time_window = ventana de tiempo usada para consultar métricas de Azure Monitor.
check_availability_modules = activa módulos de disponibilidad.
check_traffic_modules = activa módulos de tráfico.
check_snat_modules = activa módulos SNAT.
check_backend_pool_host_count = activa el módulo de conteo de hosts en backend pools.
check_load_balancer_count = activa el módulo de conteo de Load Balancers.
metric_interval = granularidad de métrica de Azure Monitor en formato ISO-8601, por ejemplo PT1M.
metric_timeout = timeout en segundos para llamadas a la API de Azure. Si se configura 0 o un valor negativo, el plugin usará 30 segundos.
max_retries = número máximo de reintentos para errores temporales de API, incluyendo rate limit HTTP 429.
mock_api_url = URL opcional del mock de Azure para pruebas locales. En producción debe dejarse vacío.

```

**Ejemplo**

```ini
[CONF]
agents_group_id = 10
interval = 300
subscription_id = 00000000-0000-0000-0000-000000000000
tenant_id = 11111111-1111-1111-1111-111111111111
client_id = 22222222-2222-2222-2222-222222222222
client_secret = my_client_secret
resource_group = rg-production
threads = 1
target_agent = Azure Load Balancer
modules_prefix =
scan_load_balancers = 1
agent_per_load_balancer = 1
lb_agent_prefix = Azure LB 
entities_list = /tmp/tmp_discovery.azure_load_balancer.entities
enable_entities_interval = 0
entities_interval = 86400
time_window = 300
check_availability_modules = 1
check_traffic_modules = 1
check_snat_modules = 1
check_backend_pool_host_count = 1
check_load_balancer_count = 1
metric_interval = PT1M
metric_timeout = 30
max_retries = 3
mock_api_url =

```

**Ejemplo usando mock local**

```ini
[CONF]
agents_group_id = 10
interval = 300
subscription_id = test-subscription
tenant_id = test-tenant
client_id = test-client
client_secret = test-secret
resource_group =
threads = 1
target_agent = Azure Load Balancer
modules_prefix =
scan_load_balancers = 1
agent_per_load_balancer = 1
lb_agent_prefix = Azure LB 
entities_list = /tmp/azure_lb_mock.entities
enable_entities_interval = 0
entities_interval = 86400
time_window = 300
check_availability_modules = 1
check_traffic_modules = 1
check_snat_modules = 1
check_backend_pool_host_count = 1
check_load_balancer_count = 1
metric_interval = PT1M
metric_timeout = 30
max_retries = 3
mock_api_url = http://azure-load-balancer-mock:8080

```

# Crear Service Principal

Desde Azure CLI se puede crear un Service Principal con rol `Reader` sobre una suscripción:

```bash
az ad sp create-for-rbac \
  --name pandora-azure-lb-discovery \
  --role Reader \
  --scopes /subscriptions/<SUBSCRIPTION_ID>

```

La salida devolverá valores similares a estos:

```json
{
  "appId": "<CLIENT_ID>",
  "displayName": "pandora-azure-lb-discovery",
  "password": "<CLIENT_SECRET>",
  "tenant": "<TENANT_ID>"
}

```

La correspondencia con los campos del plugin es:

```text
tenant       -> Azure Tenant ID
appId        -> Azure Client ID
password     -> Azure Client Secret
subscription -> Azure Subscription ID

```

# Requisitos

<div id="bkmrk-para-que-el-plugin-p"><div>Para que el plugin pueda descubrir Load Balancers y consultar sus métricas, se recomienda utilizar un Service Principal con permisos de lectura.</div></div><div id="bkmrk-"></div>El plugin necesita permisos de lectura para:

- Listar recursos **Microsoft.Network/loadBalancers**.
- Leer la configuración de backend pools.
- Consultar métricas de Azure Monitor asociadas al recurso.

En la mayoría de entornos el rol `Reader` sobre la suscripción o sobre el grupo de recursos será suficiente. Si se limita el permiso a un único resource group, se recomienda configurar también el campo **Resource group** en la tarea de Discovery.

# Ejecución manual

El formato de ejecución del plugin es el siguiente:

```bash
./pandora_azure_load_balancer --conf <ruta al fichero de configuración>

```

Ejemplo:

```bash
./pandora_azure_load_balancer --conf /etc/pandora/azure_load_balancer.conf

```

En modo Discovery, Pandora FMS genera automáticamente el fichero de configuración temporal y ejecuta el binario con el parámetro `--conf`.

La ejecución devuelve una salida JSON con información de resumen y datos de monitorización en el campo `monitoring_data`, para que puedan ser consumidos por el servidor de Discovery.

# Discovery

Este plugin puede integrarse con el *Discovery* de Pandora FMS.

Para ello se debe cargar el paquete `.disco` correspondiente desde la librería de Pandora FMS o desde el sistema de plugins de la consola.

Una vez cargado, se podrán monitorizar recursos Azure Load Balancer creando tareas de *Discovery* desde la sección correspondiente de Cloud/Application Discovery.

Para cada tarea se solicitarán los siguientes datos en el paso **Azure Base**:

- **Azure Subscription ID:** identificador de la suscripción de Azure donde se descubrirán los Load Balancers.
- **Azure Tenant ID:** identificador del tenant de Azure Active Directory usado por el Service Principal.
- **Azure Client ID:** identificador de aplicación del Service Principal.
- **Azure Client Secret:** secreto del Service Principal.
- **Resource group:** filtro opcional para limitar el descubrimiento a un grupo de recursos. Si se deja vacío, se descubren Load Balancers de toda la suscripción.

En el paso **Azure Load Balancer Detailed** se podrán configurar opciones adicionales:

- **Max threads:** número máximo de hilos usados para procesar los Load Balancers descubiertos.
- **Target agent:** agente destino donde se almacenarán todos los módulos cuando no se active la creación de agente por Load Balancer.
- **Custom module prefix:** prefijo opcional para todos los nombres de módulos generados.
- **Scan Load Balancers:** activa el descubrimiento automático de Load Balancers.
- **Create agent per Load Balancer:** si está activo, cada Load Balancer genera su propio agente. Si está desactivado, todos los módulos se envían al agente indicado en **Target agent**.
- **Custom Load Balancer agent prefix:** prefijo opcional para los agentes creados por Load Balancer. Por ejemplo, `Azure LB ` creará agentes como `Azure LB my-load-balancer`.
- **Enable entities file re-scan interval:** activa el refresco periódico del fichero temporal de entidades descubiertas.
- **Re-scan entities file interval:** intervalo usado para reconstruir la caché de entidades cuando el re-scan está activado.
- **Metric time window:** ventana temporal usada para consultar métricas de Azure Monitor. Normalmente debe coincidir o ser ligeramente superior al intervalo de la tarea.
- **Availability metrics:** crea módulos de disponibilidad: `data path availability` y `health probe status`.
- **Traffic metrics:** crea módulos de tráfico: `byte count`, `packet count` y `SYN count`.
- **SNAT metrics:** crea módulos SNAT: `allocated SNAT ports`, `used SNAT ports` y `SNAT connection count`.
- **Backend pool host count:** crea el módulo de conteo de hosts configurados en backend pools.
- **Load Balancer count:** crea el módulo de conteo de recursos Load Balancer descubiertos.
- **Azure Monitor metric interval:** granularidad de Azure Monitor en formato ISO-8601. Por defecto `PT1M`.
- **Azure API timeout:** timeout en segundos para cada llamada a Azure. Si se configura `0` o un valor negativo, el plugin usará `30` segundos.
- **Azure API max retries:** número máximo de reintentos para errores temporales de API, incluyendo rate limiting HTTP 429.

Las tareas completadas con éxito tendrán un resumen de ejecución con información similar a:

- **Total agents:** número total de agentes generados por la tarea.
- **Targets up:** número de Load Balancers disponibles o descubiertos correctamente.
- **Targets down:** número de Load Balancers almacenados previamente que ya no aparecen en el descubrimiento actual.
- **Load Balancers discovered:** número de Load Balancers descubiertos en la ejecución actual.

# Agentes y módulos generados por el plugin

El plugin crea un módulo `connection` para cada Load Balancer monitorizado. Este módulo se crea siempre, con valor `1` cuando el recurso está disponible y `0` cuando el recurso almacenado en la caché de entidades ya no aparece en Azure.

Si **Create agent per Load Balancer** está activado, se crea un agente por cada Load Balancer descubierto. El nombre del agente se forma usando el prefijo configurado en **Custom Load Balancer agent prefix** más el nombre del Load Balancer.

Ejemplo:

```text
Custom Load Balancer agent prefix: Azure LB 
Load Balancer name: lb-production-frontend
Agent name: Azure LB lb-production-frontend

```

Si **Create agent per Load Balancer** está desactivado, todos los módulos se envían al agente indicado en **Target agent**. En este modo, el nombre del Load Balancer se añade como prefijo al nombre de cada módulo para evitar colisiones.

Los módulos disponibles son:

```bash
connection: Estado del recurso Azure Load Balancer (1=UP, 0=DOWN). Siempre se monitoriza (generic_proc).
allocated SNAT ports: Número de puertos SNAT asignados en el periodo seleccionado (generic_data).
backend pool host count: Número de hosts configurados en los backend pools del Load Balancer (generic_data).
byte count: Bytes transmitidos en el periodo seleccionado (generic_data_inc).
health probe status: Estado medio de los health probes del Load Balancer (generic_data).
packet count: Paquetes transmitidos en el periodo seleccionado (generic_data_inc).
SNAT connection count: Nuevas conexiones SNAT creadas en el periodo seleccionado (generic_data_inc).
load balancer count: Conteo de recurso Load Balancer descubierto (generic_data).
SYN count: Paquetes SYN transmitidos en el periodo seleccionado (generic_data_inc).
used SNAT ports: Número de puertos SNAT utilizados en el periodo seleccionado (generic_data).
data path availability: Disponibilidad media de la ruta de datos del Load Balancer (generic_data).

```

> Los módulos `byte count`, `packet count`, `SNAT connection count` y `SYN count` son de tipo `generic_data_inc`. Al ser contadores incrementales, Pandora FMS puede necesitarlos en dos ejecuciones antes de mostrar el dato calculado correctamente.

**Mapeo de tipos de módulo**

<table id="bkmrk-azure-load-balancer-module-types"><thead><tr><th>Métrica</th><th>Tipo de módulo Pandora FMS</th><th>Unidad</th><th>Descripción</th></tr></thead><tbody><tr><td>connection</td><td>`generic\_proc`</td><td></td><td>Estado del recurso Azure Load Balancer. Valor 1 si está disponible y 0 si no se descubre en la ejecución actual.</td></tr><tr><td>allocated SNAT ports</td><td>`generic\_data`</td><td>ports</td><td>Número de puertos SNAT asignados durante la ventana seleccionada.</td></tr><tr><td>backend pool host count</td><td>`generic\_data`</td><td>hosts</td><td>Número de hosts configurados en los backend pools. Se calcula desde la configuración del Load Balancer.</td></tr><tr><td>byte count</td><td>`generic\_data\_inc`</td><td>bytes</td><td>Bytes transmitidos. Pandora FMS calcula la tasa a partir del contador incremental.</td></tr><tr><td>health probe status</td><td>`generic\_data`</td><td>%</td><td>Estado medio de las comprobaciones de health probe.</td></tr><tr><td>packet count</td><td>`generic\_data\_inc`</td><td>packets</td><td>Paquetes transmitidos. Pandora FMS calcula la tasa a partir del contador incremental.</td></tr><tr><td>SNAT connection count</td><td>`generic\_data\_inc`</td><td>connections</td><td>Nuevas conexiones SNAT creadas en la ventana seleccionada.</td></tr><tr><td>load balancer count</td><td>`generic\_data`</td><td>count</td><td>Conteo del recurso Load Balancer descubierto. El plugin informa 1 por cada Load Balancer.</td></tr><tr><td>SYN count</td><td>`generic\_data\_inc`</td><td>packets</td><td>Paquetes SYN transmitidos. Pandora FMS calcula la tasa a partir del contador incremental.</td></tr><tr><td>used SNAT ports</td><td>`generic\_data`</td><td>ports</td><td>Número de puertos SNAT utilizados durante la ventana seleccionada.</td></tr><tr><td>data path availability</td><td>`generic\_data`</td><td>%</td><td>Disponibilidad media de la ruta de datos del Load Balancer.</td></tr></tbody></table>

El plugin puede asignar identificadores estables en los agentes y módulos para facilitar su identificación posterior desde la consola, dashboards, extensiones o consultas SQL. El identificador externo recomendado para estos datos es el `resource_id` de Azure o el nombre del Load Balancer.

Formato recomendado:

- **Agente:** `azure_load_balancer:target:<resource_id_saneado>` — identifica el Load Balancer monitorizado.
- **Módulo connection:** `azure_load_balancer:metric_connection:<resource_id_saneado>`.
- **Módulos de métricas:** `azure_load_balancer:metric_<metric_name>:<resource_id_saneado>`.

Estos marcadores deben ser estables y no depender únicamente del nombre visible del agente o del módulo, ya que esos campos pueden cambiar por configuración de prefijos.

**Caché de entidades descubiertas**

El plugin utiliza un fichero temporal `entities_list` para almacenar los Load Balancers descubiertos. Esta lógica permite detectar recursos que existían en ejecuciones anteriores y que después han desaparecido de Azure.

Cuando un Load Balancer está almacenado en el fichero de entidades pero ya no aparece en el descubrimiento actual, el plugin mantiene su agente y genera el módulo `connection` con valor `0`. De esta forma Pandora FMS puede alertar de la desaparición del recurso en lugar de eliminarlo silenciosamente de la monitorización.

Si se activa **Enable entities file re-scan interval**, el fichero de entidades se limpia y reconstruye cuando se supera el intervalo configurado en **Re-scan entities file interval**. Si se deja desactivado, se conserva la lista de entidades descubiertas para poder detectar desapariciones.