El grafito muestra "Ninguno" para todos los puntos de datos aunque lo envíe

8

He instalado Graphite a través de Puppet ( https://forge.puppetlabs.com/dwerder/graphite ) con nginx y PostgresSQL. Cuando le envío datos manualmente, crea la métrica pero todos sus puntos de datos son "Ninguno" (también conocido como nulo). Esto sucede también si ejecuto el ejemplo-client.py enviado con Graphite.

echo "jakub.test 42 $(date +%s)" | nc 0.0.0.0 2003 # Carbon listens at 2003
# A minute or so later:
$ whisper-fetch.py --pretty /opt/graphite/storage/whisper/jakub/test.wsp | head -n1
Sun May  4 12:19:00 2014    None
$ whisper-fetch.py --pretty /opt/graphite/storage/whisper/jakub/test.wsp | tail -n1
Mon May  5 12:09:00 2014    None
$ whisper-fetch.py --pretty /opt/graphite/storage/whisper/jakub/test.wsp | grep -v None | wc -l
0

Y:

$ python /opt/graphite/examples/example-client.py 
# Wait until it sends two batches of data ...
$ whisper-fetch.py /opt/graphite/storage/whisper/system/loadavg_15min.wsp | grep -v None | wc -l
0

Estos son, según ngrep, los datos que llegan al puerto [desde un intento posterior] (línea 3):

####
T 127.0.0.1:34696 -> 127.0.0.1:2003 [AP]
  jakub.test  45 1399362193. 
####^Cexit
23 received, 0 dropped

Esta es la parte relevante de /opt/graphite/conf/storage-schemas.conf:

[default]
pattern = .*
retentions = 1s:30m,1m:1d,5m:2y

¿Alguna idea de lo que está mal? Las propias métricas y datos de Carbon se muestran en la interfaz de usuario. ¡Gracias!

Entorno: Ubuntu 13.10 Saucy, grafito 0.9.12 (a través de pip).

PD: He escrito sobre mis intentos de solución de problemas aquí: Graphite muestra métricas pero no hay datos - Solución de problemas

ACTUALIZACIÓN :

  1. Los puntos de datos en los archivos de susurro solo se recuperan cada 1m min incluso si la política de retención especifica una precisión más alta como "1s" o "10s".
  2. Solución alternativa para los datos que se ignoran: utilice un esquema de agregación con xFilesFactor = 0.1(en lugar de 0.5) o establezca la precisión más baja en 1 m en lugar de <número entre 1-49> s. - vea los comentarios debajo de la respuesta aceptada o la pregunta de Respuestas de grafito. Según los documentos : " xFilesFactordebe ser un número de coma flotante entre 0 y 1, y especifica qué fracción de las ranuras del nivel de retención anterior debe tener valores no nulos para agregar a un valor no nulo. El valor predeterminado es 0.5 " . Por lo tanto, parece que sin tener en cuenta la precisión especificada de 1s, los datos se agregan a 1 minuto y terminan siendo Ninguno porque menos del 50% de los valores en el período de minutos no son Ninguno.

SOLUCIÓN

Entonces @jlawrie me llevó a la solución. Resulta que los datos están realmente allí, pero están agregados a nada, la razón es doble:

  1. Tanto la interfaz de usuario como la búsqueda de susurro muestran datos agregados con la máxima precisión que abarca todo el período de consulta, que por defecto es de 24 h. Es decir, cualquier cosa con retención <1d nunca se mostrará en la interfaz de usuario o buscará a menos que seleccione un período más corto. Dado que mi período de retención de 1s fue de 30 minutos, tendría que seleccionar un período de <= últimos 30 minutos para ver realmente los datos sin procesar con la mayor precisión que se recopila.
  2. Al agregar datos (de 1s a 1min en mi caso), Graphite requiere por defecto que el 50% (xFilesFactor = 0.5) de los puntos de datos en el período tengan valor. Si no, ignorará los valores existentes y los agregará a Ninguno. Entonces, en mi caso, necesitaría enviar datos al menos 30 veces en un minuto (30 es el 50% de 60s = 1 minuto) para que se muestren en el valor agregado de 1 minuto. Pero mi aplicación solo envía datos cada 10 segundos, por lo que solo tengo 6 de los 60 valores posibles.

=> la solución es cambiar la primera precisión de 1s a 10s y recordar seleccionar un período más corto cuando quiera ver los datos sin procesar (o extender su retención a 24h para mostrarlos por defecto).

Jakub Holý
fuente
La pregunta de respuestas de grafito ¿ Conjunto de datos lleno de nulos? es interesante en este contexto (menciona la adición predeterminada de nulo cada 60 s, solo las últimas 24 h) y b / c su recomendación de ngrep para la resolución de problemas.
Jakub Holý
También he pedido ayuda en Graphite Answers - answers.launchpad.net/graphite/+question/248242
Jakub Holý
¿Has revisado los registros? Si hay un problema con la métrica recibida (no \ n o use \ r \ n en su lugar), debería ver algo en console.log o created.log. Estos registros se almacenan en / opt / graphite / storage / log / carbon-cache / carbon-cache-a / si utilizó la ruta de instalación predeterminada.
mattsn0w
Sí, he revisado los registros. No había nada de interés. El registro de la consola tenía esencialmente "[..] ServerFactory comenzando en 7002 [..] Iniciando la fábrica <instancia twisted.internet.protocol.ServerFactory en 0x1bc4248>" y tenía registros de la creación de las métricas esperadas pero ninguna mención de los datos - f. ex. (para otra métrica sin datos) "[..] creando el archivo de base de datos /opt/graphite/storage/whisper/ring/handling-time/POST/15MinuteRate.wsp (archive = [(1, 1800), (60, 1440 ), (300, 210240)] xff = 0.5 agg = promedio) "
Jakub Holý
@ JakubHolý ¿Podría actualizar la respuesta de jlawrie o publicar otra respuesta ya que la pregunta contiene una respuesta ahora?
030

Respuestas:

8

Encontré el mismo problema al usar ese mismo módulo de marionetas. No estoy exactamente seguro de por qué, pero cambiar la política de retención predeterminada parece solucionarlo, por ejemplo

class { 'graphite':
  gr_storage_schemas => [
    {
      name       => 'carbon',
      pattern    => '^carbon\.',
      retentions => '1m:90d'
    },
    {
      name       => 'default',
      pattern    => '.*',
      retentions => '1m:14d'
    }
  ],
}
jlawrie
fuente
¡Muchas gracias! Este misterioso cambio realmente ha ayudado. Es interesante que cambiar la retención de "1s: 30m, 1m: 1d, 5m: 2y" a "1m: 14d" lo "arregle". Intentaré jugar más con él. ¿Puede haber algún problema con la granularidad 1s?
Jakub Holý
De hecho, parece ser un problema con el período s, mientras que '1m:1d,5m:2yfunciona (datos recuperados), 10s:30m,1m:1d,5m:2yno. En realidad, desde el archivo .wsp parece que se ignora la granularidad <1m ya que las marcas de tiempo para los 10s: ... config todavía están en intervalos de 1 min - "08:17:00, 08:18:00, etc."
Jakub Holý
OK, entonces el problema está relacionado con la política de agregación y xFilesFactor, el (valor predeterminado) que se aplica aquí es promedio y xFilesFactor=0.5(ver /opt/graphite/conf/storage-aggregation.conf). Cuando cambio a sumy 0.1al cambiar el nombre, los datos se almacenan (aunque los puntos todavía están a 1m de frecuencia):echo -e "jakub.test.10s30m+1m1d+5m2y.count 42 $(date +%s)" | nc 0.0.0.0 2003
Jakub Holý
He jugado con diff. agregación esquemas, los datos se registran (a intervalos de 1 m) cuando configuro xFilesFactor = 0.1, el agg. el método no importa (al menos todo el promedio, último, suma de trabajo).
Jakub Holý
De acuerdo con esto , los esquemas de agregación solo entran en juego con múltiples políticas de retención. Si solo tengo una política de retención, incluso con una resolución de 10 segundos (que es la frecuencia con la que envío datos), está recopilando cada punto de datos individual. Con múltiples políticas de retención, elige la que se basa en el rango de tiempo de la consulta, que con whisper-fetch.py ​​se predetermina al último día, por lo que creo que solo estás viendo puntos de datos cada 1 minuto. Sin embargo, todavía no estoy seguro de por qué mostrarían Ninguno, en lugar de valor agregado.
jlawrie
1

Graphite perderá datos de muchas maneras, por eso realmente trato de evitar usarlo. Permítanme comenzar con uno simple: intente que su aplicación se conecte, espere un segundo (literalmente un segundo) y luego envíe los datos con marca de tiempo. He encontrado en muchas circunstancias que esto solucionará ese problema exacto. Otra cosa que debe intentar es enviar datos a una frecuencia mucho mayor que la frecuencia con la que el grafito registra datos. Entraré en eso un poco más. Otro error frecuente es usar la utilidad whisper-resize.py, que realmente no funcionó para mí. Si sus datos aún no son importantes, simplemente elimine los archivos de susurro y deje que se creen con la nueva configuración de retención.

Los archivos de almacenamiento de grafito, los archivos de susurro, en lugar de almacenar los datos como un punto con un valor y un tiempo (como proporcionó el programa) en realidad lo almacenan como una serie de ranuras en las que se almacena el valor. El programa luego intenta averiguar qué ranura corresponde a un período de tiempo utilizando el archivo de datos de retención. Si obtiene datos que no encajan exactamente en una ranura, creolo que sucede es que usa un promedio, mínimo o máximo dependiendo de otro archivo en el mismo directorio que el archivo de retención. Encontré que la mejor manera de evitar que eso arruinara todo era enviar datos a una frecuencia mucho mayor que la frecuencia con la que el grafito almacenaba datos. Honestamente, se vuelve súper complicado: no solo hay períodos de retención para el grafito y algoritmos de promedio que llenan los puntos (creo), sino que estos valores también se aplican a los archivos de susurro. Sucederán cosas muy extrañas cuando no coincidan, por lo que hasta que su configuración esté funcionando, sugeriría eliminar sus archivos de susurro repetidamente y dejar que el grafito los vuelva a crear.

Este programa realmente me pareció que actuaba con errores, así que si encuentras algo como esto, no asumas que es tu culpa.

Un poco de nerd de Linux
fuente
Gracias, creo que debería saber más sobre cómo funciona la recuperación y agregación de datos, tal vez sea la causa del problema. Sin embargo, creo que " enviar datos a una frecuencia que era mucho más alta que la frecuencia con la que el grafito almacenaba datos " es una solución subóptima ya que solo se registra el último punto de datos recibido en cada período de grafito, otros ignorados, es por eso que f.ex . statsD flush period must = Graphite period .
Jakub Holý
1
Por cierto, los datos "perdidos" de grafito / carbono podrían estar relacionados con configuraciones de carbono como MAX_UPDATES_PER_SECOND = 500, MAX_CREATES_PER_MINUTE = 50 (supongo que los puntos / métricas de datos por encima del límite simplemente se eliminan).
Jakub Holý
Parece que estaba equivocado, la documentación, si la interpreto correctamente, dice que la configuración anterior limita el acceso al disco, pero los datos / métricas aún se mantienen en la memoria (aunque me gustaría verificar esto primero).
Jakub Holý
Algunos de ellos definitivamente podrían explicar algunos de los problemas que he tenido con esa aplicación.
Algunos Linux Nerd