:::: MENU ::::

¿Cómo monitorizar el uso de memoria y los índices de OpenSearch?

Comandos útiles para OpenSearch

Estado de OpenSearch

www-data@c2-30-gra11:~/current$ curl -X GET "localhost:9200/_cluster/health?pretty"
{
  "cluster_name" : "opensearch",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "discovered_master" : true,
  "discovered_cluster_manager" : true,
  "active_primary_shards" : 15,
  "active_shards" : 15,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 14,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 51.724137931034484
}

Estado JVM

www-data@c2-30-gra11:~/current$ curl -s -X GET localhost:9200/_nodes/stats/jvm?pretty
{
  "_nodes" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "cluster_name" : "opensearch",
  "nodes" : {
    "uaRudfgxRzy0mbDXdIHxQg" : {
      "timestamp" : 1775630178380,
      "name" : "c2-30-gra11",
      "transport_address" : "57.128.44.241:9300",
      "host" : "57.128.44.241",
      "ip" : "57.128.44.241:9300",
      "roles" : [
        "cluster_manager",
        "data",
        "ingest",
        "remote_cluster_client"
      ],
      "attributes" : {
        "shard_indexing_pressure_enabled" : "true"
      },
      "jvm" : {
        "timestamp" : 1775630178380,
        "uptime_in_millis" : 34608507,
        "mem" : {
          "heap_used_in_bytes" : 4788728368,
          "heap_used_percent" : 74,
          "heap_committed_in_bytes" : 6442450944,
          "heap_max_in_bytes" : 6442450944,
          "non_heap_used_in_bytes" : 201097608,
          "non_heap_committed_in_bytes" : 231669760,
          "pools" : {
            "young" : {
              "used_in_bytes" : 3435134976,
              "max_in_bytes" : 0,
              "peak_used_in_bytes" : 3858759680,
              "peak_max_in_bytes" : 0,
              "last_gc_stats" : {
                "used_in_bytes" : 0,
                "max_in_bytes" : 0,
                "usage_percent" : -1
              }
            },
            "old" : {
              "used_in_bytes" : 1310720000,
              "max_in_bytes" : 6442450944,
              "peak_used_in_bytes" : 5377866352,
              "peak_max_in_bytes" : 6442450944,
              "last_gc_stats" : {
                "used_in_bytes" : 1310720000,
                "max_in_bytes" : 6442450944,
                "usage_percent" : 20
              }
            },
            "survivor" : {
              "used_in_bytes" : 42873392,
              "max_in_bytes" : 0,
              "peak_used_in_bytes" : 255852544,
              "peak_max_in_bytes" : 0,
              "last_gc_stats" : {
                "used_in_bytes" : 42873392,
                "max_in_bytes" : 0,
                "usage_percent" : -1
              }
            }
          }
        },
        "threads" : {
          "count" : 87,
          "peak_count" : 92
        },
        "gc" : {
          "collectors" : {
            "young" : {
              "collection_count" : 154,
              "collection_time_in_millis" : 12574
            },
            "G1 Concurrent GC" : {
              "collection_count" : 82,
              "collection_time_in_millis" : 1233
            },
            "old" : {
              "collection_count" : 0,
              "collection_time_in_millis" : 0
            }
          }
        },
        "buffer_pools" : {
          "mapped" : {
            "count" : 251,
            "used_in_bytes" : 55396681,
            "total_capacity_in_bytes" : 55396681
          },
          "direct" : {
            "count" : 56,
            "used_in_bytes" : 9421385,
            "total_capacity_in_bytes" : 9421384
          },
          "mapped - 'non-volatile memory'" : {
            "count" : 0,
            "used_in_bytes" : 0,
            "total_capacity_in_bytes" : 0
          }
        },
        "classes" : {
          "current_loaded_count" : 25973,
          "total_loaded_count" : 27209,
          "total_unloaded_count" : 1236
        }
      }
    }
  }
}

Estado de los índices

debian@c2-30-gra11:~$ curl -X GET "localhost:9200/_cat/indices?v"
health status index                  uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   read_me                KMZWXbRMTjqY7ADQHkO7FA   1   1          1            0      4.8kb          4.8kb
yellow open   magento2_product_38_v3 MzKa_cS5SFy1Fdtx8y-Rtg   1   1       2368            0        8mb            8mb
yellow open   magento2_product_39_v3 MSBVphQoQS6F1TX5854cbw   1   1       2362            0      7.9mb          7.9mb
yellow open   magento2_product_8_v3  2b5LD9wLSvudlhZ8D7fVSQ   1   1       2367            0        8mb            8mb
yellow open   magento2_product_14_v3 pc6oSPZSQt29yiuQ2Z_Jfg   1   1       2362            0      7.9mb          7.9mb
yellow open   magento2_product_4_v3  txbaneuYTTCe8Kfc-zGYVA   1   1       2368            0      7.9mb          7.9mb
yellow open   magento2_product_48_v3 Aot8vVRBQTGkCuthYoK4Wg   1   1          0            0       208b           208b
yellow open   magento2_product_47_v3 JNRoHqG7QVCpBPoygPd7wA   1   1       2368            0      7.9mb          7.9mb
yellow open   magento2_product_46_v3 DgyuVeUlTCauKn7EO1phYg   1   1       2368            0      7.9mb          7.9mb
yellow open   magento2_product_25_v3 vryuO1OFSCqsVWuimhES_Q   1   1       2368            0        8mb            8mb
yellow open   magento2_product_45_v3 rSwiGYxUSAGsQtXS2LsU4g   1   1       2367            0      7.9mb          7.9mb
yellow open   magento2_product_48_v2 uo45CBqUS-COg98LFsJJRA   1   1       2362            0      7.7mb          7.7mb
yellow open   magento2_product_44_v3 HhrfhhZXTdOql4ONFWuw5w   1   1       2368            0        8mb            8mb
yellow open   magento2_product_43_v3 6WVlBrYzSOuoMfs1Y2ANkg   1   1       2362            0      7.9mb          7.9mb
yellow open   magento2_product_40_v3 AO12rl14Txy-D1ySt9dzwg   1   1       2362            0      7.9mb          7.9mb

Monitorización de OpenSearch

Con este script se puede extraer la información del uso de memoria y el estado de los índices de OpenSearch.

#!/bin/bash

# ==============================================================================
# Script de Monitoreo de OpenSearch
# Registra: Uso de Heap JVM y Estado de Índices Magento (Docs > 2000)
# ==============================================================================

# Configuración de rutas y endpoints
LOG_FILE="/var/www/current/var/log/opensearch.log"
JVM_ENDPOINT="localhost:9200/_nodes/stats/jvm"
INDICES_ENDPOINT="localhost:9200/_cat/indices?h=index,docs.count"

# Asegurar que el directorio del log existe
mkdir -p "$(dirname "$LOG_FILE")"

# 1. Obtener el porcentaje de uso de Heap
# Extraemos el valor de heap_used_percent del JSON de estadísticas
HEAP_USED=$(curl -s -X GET "$JVM_ENDPOINT" | grep -oP '"heap_used_percent":\s*\K[0-9]+' | head -n 1)
[ -z "$HEAP_USED" ] && HEAP_USED="N/A"

# 2. Obtener la información de todos los índices una sola vez para procesarla
# El formato de salida es: "nombre_indice numero_documentos"
INDICES_DATA=$(curl -s -X GET "$INDICES_ENDPOINT")

# 3. Definición de los índices a comprobar y sus etiquetas
# Formato: "etiqueta:prefijo_indice"
CHECK_LIST=("ES:magento2_product_4" "IT:magento2_product_8" "EN:magento2_product_14" "FR:magento2_product_25" "DE:magento2_product_38")

# Variable para almacenar los resultados de los índices
INDEX_STATUS_RESULTS=""

for ITEM in "${CHECK_LIST[@]}"; do
    LABEL="${ITEM%%:*}"
    PREFIX="${ITEM#*:}"

    # Buscamos el valor máximo de documentos entre todas las versiones encontradas.
    # La regex asegura que coincida el nombre exacto o seguido de un sufijo de versión (_v1, _2, etc.)
    # Esto evita que al buscar "product_4" se mezclen datos de "product_40".
    MAX_DOCS=$(echo "$INDICES_DATA" | grep -E "^${PREFIX}((_v|_)?[0-9]+)?\s" | awk '{print $2}' | sort -nr | head -n 1)

    # Validamos si el índice existe y si tiene al menos 2000 documentos
    if [[ -n "$MAX_DOCS" && "$MAX_DOCS" -ge 2000 ]]; then
        STATUS="OK"
    else
        STATUS="FAIL"
    fi

    # Concatenamos el resultado
    if [ -z "$INDEX_STATUS_RESULTS" ]; then
        INDEX_STATUS_RESULTS="${LABEL}: ${STATUS}"
    else
        INDEX_STATUS_RESULTS="${INDEX_STATUS_RESULTS}, ${LABEL}: ${STATUS}"
    fi
done

# 4. Obtener la fecha y hora actual
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")

# 5. Guardar en el archivo de log
# Formato: [Fecha] Heap Used: X%, ES: OK, IT: FAIL...
echo "[$TIMESTAMP] Heap Used: ${HEAP_USED}%, ${INDEX_STATUS_RESULTS}" >> "$LOG_FILE"

Generará un log como el siguiente:

[2026-04-08 06:18:01] Heap Used: 10%, ES: OK, IT: OK, EN: OK, FR: OK, DE: OK




Hey! Qué opinas sobre el artículo?