es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo evitar el error “Límite total de campos superados” en metricbeat en conjunción con el módulo de Prometheus?

Estoy ejecutando metricbeat en Kubernetes utilizando el gráfico de Helm de helm.elastic.co. Esto resulta en que metricbeat carga una enorme plantilla de índice con 3776 campos en el índice Elasticsearch. Pero solo se utilizan 633 y se envían valores al índice.

El problema es que recibo el siguiente error cuando la instancia metricbeat-metricbeat-metrics intenta enviar eventos a Elasticsearch: “No se puede indexar el evento…” La razón es que se ha superado el límite total de campos [5000]. Este error ocurre en una instancia metricbeat donde se utiliza el módulo prometheus con un “collector” metricset. No estoy seguro si la plantilla cargada es la razón o si los eventos enviados por prometheus contienen realmente más de 5000 campos cada uno.

De todas maneras, ¿es común la práctica de tener plantillas tan grandes cargadas en Elasticsearch? Y si no lo es, ¿cuál es la manera de limitar la plantilla solo a los campos utilizados?

La investigación adicional llevó a la conclusión de que el tamaño de la plantilla Elasticsearch no está causando este error. El error de indexación ocurre solo cuando el módulo prometheus en metricbeat está activo. El tamaño de la plantilla sigue siendo el mismo en este caso.

El prometheus debería rastrear las métricas de los pods en ejecución. Originalmente, el número de métricas era de 61274 en total ({name! = “”}) y 956 nombres de métricas diferentes (group by(name) ({name! = “”}) ). Cambié la configuración de rastreo de prometheus, lo que resultó en 118 métricas en total ({name! = “”}) y 55 nombres de métricas diferentes (group by(name) ({name! = “”})). El módulo prometheus de metricbeat está configurado como:

- module: prometheus
  period: 30s
  metricsets: ["collector"]
  hosts: ["prometheus-server"]
  metrics_path: '/federate'
  query:
    'match[]': '{job="kubernetes-pods"}'
  processors:
  - add_cloud_metadata: ~

Donde esa consulta {job = “kubernetes-pods”} resulta exactamente en esas 118 series.

Pero aún así, el error “No se puede indexar el evento…” sigue apareciendo. La línea de registro de error completa es:

“`
2021-12-03T07:15:07.227Z WARN [elasticsearch] elasticsearch/client.go:408 Cannot index event publisher.Event{Content:beat.Event{Timestamp:time.Time{wall:0xc0628ede3b502221, ext:907213012182, loc:(*time.Location)(0x5862e80)}, Meta:null, Fields:{“agent”:{“ephemeralid”:”e7ef097d-95c8-4f60-a63f-0de436c45195″,”hostname”:”metricbeat-metricbeat-metrics-59c8d8b865-b2gqc”,”id”:”2c17c983-631e-4f70-ab36-a56bc1b5b254″,”name”:”metricbeat-metricbeat-metrics-59c8d8b865-b2gqc”,”type”:”metricbeat”,”version”:”7.10.0″},”cloud”:{“account”:{“id”:”xxxx”},”availabilityzone”:”eu-central-1b”,”image”:{“id”:”ami-xxxx”},”instance”:{“id”:”i-xxxx”},”machine”:{“type”:”t3a.xlarge”},”provider”:”aws”,”region”:”eu-central-1″},”ecs”:{“version”:”1.6.0″},”event”:{“dataset”:”prometheus.collector”,”duration”:5888251,”module”:”prometheus”},”host”:{“name”:”metricbeat-metricbeat-metrics-59c8d8b865-b2gqc”},”metricset”:{“name”:”collector”,”period”:30000},”prometheus”:{“labels”:{“appkubernetesioinstance”:”…”,”appkubernetesioname”:”my-pod-name”,”instance”:”10.124.2.235:8080″,”job”:”kubernetes-pods”,”kubernetesnamespace”:”mynamespace”,”kubernetespodname”:”my-pod-85746d8c4f-wb4kq”,”name”:”rabbit”,”podtemplatehash”:”85746d8c4f”},”metrics”:{“rabbitmqacknowledgedpublishedtotal”:0.000000,”rabbitmqacknowledgedtotal”:9.000000,”rabbitmqchannels”:2.000000,”rabbitmqconnections”:1.000000,”rabbitmqconsumedtotal”:9.000000,”rabbitmqfailedtopublishtotal”:0.000000,”rabbitmqnotacknowledgedpublishedtotal”:0.000000,”rabbitmqpublishedtotal”:0.000000,”rabbitmqrejectedtotal”:0.000000,”rabbitmqunroutedpublishedtotal”:0.000000}},”service”:{“address”:”http://prometheus-server/federate?match%5B%5D=%7Bjob%3D%22kubernetes-pods%22%7D”,”type”:”prometheus”}}, Private:interface {}(nil), TimeSeries:true}, Flags:0x0, Cache:publisher.EventCache{m:common.MapStr(nil)}} (status=400): {“type”:”illegalargument_exception”,”reason”:”Limit of total fields [5000] has been exceeded” }

Usar la API de consulta en lugar de la federación también causa el mismo error. Solo cuando especifico un patrón de inclusión que coincidirá con algunas de las métricas, como “jvm.*”, el error desaparece. Pero definitivamente no quiero incluir explícitamente todas mis métricas dentro de la configuración de metricbeat.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución al error de indexación de Elasticsearch en metricbeat con el módulo de prometheus

    El error “No se puede indexar el evento…”razón”:”Se ha excedido el límite de campos totales [5000]”}” se produce en una situación en la que se utiliza un módulo de prometheus con un conjunto de métricas “collector” en metricbeat. Este error no es causado por el tamaño de la plantilla de Elasticsearch.

    El módulo de prometheus raspa las métricas de los pods en ejecución. En este caso, el número de métricas originalmente fue de 61274 métricas en total ({name!=””}) y 956 nombres de métricas diferentes ( group by(name) ({name!=””}))

    No obstante, al cambiar la configuración de raspado de prometheus, sólo quedaron 118 métricas en total ({name!=””}) y 55 nombres de métricas diferentes ( group by(name) ({name!=””}))

    El módulo de prometheus en metricbeat está configurado para escanear las métricas de los pods utilizando la consulta {job=”kubernetes-pods”}, lo que resulta en exactamente esas 118 series.

    Se identificó que el error persistió incluso después de reducir el número de métricas raspadas. Sólo cuando se especificó un patrón de inclusión, como “jvm.*”, que coincide con algunas de las métricas, desapareció el error. Sin embargo, la inclusión explícita de todas las métricas en la configuración del beat de métricas es poco práctica.

    Recomendamos:

    1. Filtrar las métricas innecesarias antes de rasparlas utilizando prometheus. Esto reduce el número de campos que se envían a Elasticsearch.
    2. Utilizar la API de gestión de índices para limitar la plantilla sólo a los campos que se están usando.

    Siguiendo estos pasos, el número total de campos se puede reducir por debajo del límite de 5000 campos, y se resolverá el error.

Comments are closed.