48 Monitoring

Ein effektives Monitoring ist entscheidend für die Aufrechterhaltung eines gesunden OpenSearch-Clusters. Ähnlich wie ein Arzt die Vitalzeichen überwacht, müssen wir wichtige Metriken verfolgen, die den Gesundheitszustand und die Performance unseres Systems anzeigen. In diesem Kapitel erfahren Sie, wie Sie ein umfassendes Monitoring implementieren, das Ihnen hilft, das Verhalten Ihres Clusters zu verstehen, potenzielle Probleme vorherzusagen und auf Probleme zu reagieren, bevor sie Ihre Benutzer beeinträchtigen.

48.1 Monitoring-Grundlagen verstehen

Das Monitoring in OpenSearch arbeitet auf mehreren Ebenen, die jeweils unterschiedliche Einblicke in den Gesundheitszustand und die Performance Ihres Clusters bieten. Lassen Sie uns diese Ebenen erkunden und verstehen, wie wir das Monitoring für jede implementieren können.

48.1.1 Cluster Health Monitoring

Die Grundlage des OpenSearch-Monitorings beginnt mit der Cluster-Gesundheit. Betrachten Sie die Cluster-Gesundheit als den Puls Ihres Systems - sie bietet unmittelbare Einblicke, ob Ihr Cluster korrekt funktioniert.

Implementieren wir ein grundlegendes Cluster Health Monitoring:

GET /_cluster/health

Für eine kontinuierliche Überwachung benötigen wir jedoch etwas Ausgereifteres:

PUT _plugins/_alerting/monitors/cluster_health_monitor
{
  "type": "monitor",
  "name": "Cluster Health Monitor",
  "enabled": true,
  "schedule": {
    "period": {
      "interval": 1,
      "unit": "MINUTES"
    }
  },
  "inputs": [
    {
      "search": {
        "indices": [".monitoring-opensearch-*"],
        "query": {
          "bool": {
            "must": [
              {
                "range": {
                  "timestamp": {
                    "gte": "now-5m"
                  }
                }
              },
              {
                "term": {
                  "type": "cluster_stats"
                }
              }
            ]
          }
        }
      }
    }
  ],
  "triggers": [
    {
      "name": "Cluster-Status-Alert",
      "severity": "High",
      "condition": {
        "script": {
          "source": "ctx.results[0].hits.hits.any(hit -> hit._source.status != 'green')"
        }
      },
      "actions": [
        {
          "name": "Operations benachrichtigen",
          "destination_id": "ops_slack",
          "message_template": {
            "source": "Cluster-Gesundheit hat sich verschlechtert. Aktueller Status: {{ctx.results.0.hits.hits.0._source.status}}"
          }
        }
      ]
    }
  ]
}

Dieser Monitor prüft die Cluster-Gesundheit jede Minute und alarmiert, wenn der Status nicht mehr “green” ist. Das Skript wertet den Cluster-Status aus und löst Benachrichtigungen aus, wenn Probleme erkannt werden.

48.1.2 Node Monitoring

Einzelne Nodes benötigen ein detailliertes Monitoring, um sicherzustellen, dass sie optimal arbeiten. Implementieren wir ein umfassendes Node-Monitoring:

PUT _plugins/_alerting/monitors/node_monitor
{
  "type": "monitor",
  "name": "Node Performance Monitor",
  "enabled": true,
  "schedule": {
    "period": {
      "interval": 1,
      "unit": "MINUTES"
    }
  },
  "inputs": [
    {
      "search": {
        "indices": [".monitoring-opensearch-*"],
        "query": {
          "bool": {
            "must": [
              {
                "term": {
                  "type": "node_stats"
                }
              }
            ]
          }
        }
      }
    }
  ],
  "triggers": [
    {
      "name": "Hohe CPU-Auslastung",
      "severity": "High",
      "condition": {
        "script": {
          "source": """
            def maxCpuPercent = 80.0;
            return ctx.results[0].hits.hits.any(hit -> {
              def stats = hit._source;
              return stats.process.cpu.percent > maxCpuPercent;
            });
          """
        }
      }
    },
    {
      "name": "Hohe Heap-Nutzung",
      "severity": "High",
      "condition": {
        "script": {
          "source": """
            def maxHeapPercent = 85.0;
            return ctx.results[0].hits.hits.any(hit -> {
              def stats = hit._source;
              return (stats.jvm.mem.heap_used_percent > maxHeapPercent);
            });
          """
        }
      }
    }
  ]
}

48.1.3 Index Monitoring

Indizes sind der Ort, an dem Ihre Daten leben, und sie benötigen sorgfältiges Monitoring. Erstellen wir ein umfassendes Index-Monitoring-System:

PUT _plugins/_alerting/monitors/index_monitor
{
  "type": "monitor",
  "name": "Index Health Monitor",
  "enabled": true,
  "schedule": {
    "period": {
      "interval": 5,
      "unit": "MINUTES"
    }
  },
  "inputs": [
    {
      "search": {
        "indices": [".monitoring-opensearch-*"],
        "query": {
          "bool": {
            "must": [
              {
                "term": {
                  "type": "index_stats"
                }
              }
            ]
          }
        }
      }
    }
  ],
  "triggers": [
    {
      "name": "Index-Wachstums-Alert",
      "severity": "Medium",
      "condition": {
        "script": {
          "source": """
            def indexGrowthThreshold = 50.0;  // 50% Wachstum
            return ctx.results[0].hits.hits.any(hit -> {
              def stats = hit._source;
              def currentSize = stats.primaries.store.size_in_bytes;
              def previousSize = stats.primaries.store.previous_size_in_bytes;
              return (currentSize > previousSize * (1 + indexGrowthThreshold/100));
            });
          """
        }
      }
    }
  ]
}

48.2 Performance Monitoring

Performance Monitoring geht über grundlegende Gesundheitsprüfungen hinaus, um zu verstehen, wie gut Ihr Cluster arbeitet. Implementieren wir ein umfassendes Performance Monitoring.

48.2.1 Query Performance Monitoring

Zuerst richten wir ein Monitoring für langsame Queries ein:

PUT /my-index/_settings
{
  "index.search.slowlog.threshold.query.warn": "10s",
  "index.search.slowlog.threshold.query.info": "5s",
  "index.search.slowlog.threshold.query.debug": "2s",
  "index.search.slowlog.threshold.fetch.warn": "1s",
  "index.search.slowlog.threshold.fetch.info": "800ms",
  "index.search.slowlog.threshold.fetch.debug": "500ms",
  "index.indexing.slowlog.threshold.index.warn": "10s",
  "index.indexing.slowlog.threshold.index.info": "5s",
  "index.indexing.slowlog.threshold.index.debug": "2s"
}

Erstellen wir nun einen Monitor für die Analyse langsamer Queries:

PUT _plugins/_alerting/monitors/query_performance_monitor
{
  "type": "monitor",
  "name": "Query Performance Monitor",
  "enabled": true,
  "schedule": {
    "period": {
      "interval": 5,
      "unit": "MINUTES"
    }
  },
  "inputs": [
    {
      "search": {
        "indices": ["*slowlog*"],
        "query": {
          "bool": {
            "must": [
              {
                "range": {
                  "took": {
                    "gte": 5000
                  }
                }
              }
            ]
          }
        }
      }
    }
  ],
  "triggers": [
    {
      "name": "Langsame-Query-Alert",
      "severity": "Medium",
      "condition": {
        "script": {
          "source": "ctx.results[0].hits.total.value > 5"
        }
      },
      "actions": [
        {
          "name": "Entwicklungsteam benachrichtigen",
          "destination_id": "dev_slack",
          "message_template": {
            "source": "Mehrere langsame Queries erkannt. Bitte Query-Muster untersuchen."
          }
        }
      ]
    }
  ]
}

48.2.2 Ressourcennutzungs-Monitoring

Ressourcen-Monitoring hilft, Ressourcenerschöpfung zu verhindern. Implementieren wir ein umfassendes Ressourcen-Monitoring:

PUT _plugins/_alerting/monitors/resource_monitor
{
  "type": "monitor",
  "name": "Ressourcennutzungs-Monitor",
  "enabled": true,
  "schedule": {
    "period": {
      "interval": 1,
      "unit": "MINUTES"
    }
  },
  "inputs": [
    {
      "search": {
        "indices": [".monitoring-opensearch-*"],
        "query": {
          "bool": {
            "must": [
              {
                "term": {
                  "type": "node_stats"
                }
              }
            ]
          }
        }
      }
    }
  ],
  "triggers": [
    {
      "name": "Speicherplatz-Alert",
      "severity": "High",
      "condition": {
        "script": {
          "source": """
            def diskThreshold = 85.0;  // 85% Festplattennutzung
            return ctx.results[0].hits.hits.any(hit -> {
              def stats = hit._source;
              return stats.fs.total.available_in_bytes < 
                     (stats.fs.total.total_in_bytes * (1 - diskThreshold/100));
            });
          """
        }
      }
    },
    {
      "name": "Speicherdruck-Alert",
      "severity": "High",
      "condition": {
        "script": {
          "source": """
            def memoryThreshold = 85.0;  // 85% Speichernutzung
            return ctx.results[0].hits.hits.any(hit -> {
              def stats = hit._source;
              return stats.jvm.mem.heap_used_percent > memoryThreshold;
            });
          """
        }
      }
    }
  ]
}

48.3 Monitoring Dashboard erstellen

Ein Monitoring-Dashboard bietet einen visuellen Überblick über die Gesundheit und Performance Ihres Clusters. Erstellen wir ein umfassendes Dashboard:

PUT _plugins/_dashboards/api/saved_objects/dashboard/cluster_overview
{
  "attributes": {
    "title": "Cluster-Übersicht",
    "panels": [
      {
        "type": "visualization",
        "name": "Cluster-Gesundheit",
        "params": {
          "type": "metric",
          "source": {
            "index": ".monitoring-opensearch-*",
            "aggs": {
              "cluster_status": {
                "terms": {
                  "field": "cluster_status",
                  "size": 1
                }
              }
            }
          }
        }
      },
      {
        "type": "visualization",
        "name": "Node-Status",
        "params": {
          "type": "gauge",
          "source": {
            "index": ".monitoring-opensearch-*",
            "aggs": {
              "avg_cpu": {
                "avg": {
                  "field": "process.cpu.percent"
                }
              }
            }
          }
        }
      }
    ]
  }
}

48.4 Alerting und Benachrichtigungssystem

Ein robustes Alerting-System stellt sicher, dass Sie über wichtige Ereignisse informiert werden. Implementieren wir ein umfassendes Alerting-System:

PUT _plugins/_alerting/destinations/ops_team
{
  "name": "Operations-Team-Alerts",
  "type": "slack",
  "slack": {
    "url": "https://hooks.slack.com/services/your-webhook-url"
  }
}

PUT _plugins/_alerting/destinations/emergency
{
  "name": "Notfall-Alerts",
  "type": "email",
  "email": {
    "to": ["ops-emergency@example.com"],
    "subject_template": "{{ctx.monitor.name}}: {{ctx.trigger.name}}",
    "message_template": {
      "source": "Alert-Details:\n{{ctx.results.0.hits.hits.0._source}}"
    }
  }
}

48.5 Best Practices und Richtlinien

Bei der Implementierung von Monitoring in OpenSearch sollten Sie diese wichtigen Prinzipien beachten:

Datenaufbewahrung:

Alert-Konfiguration:

Performance-Auswirkungen: