La grafite mostra "Nessuno" per tutti i punti dati anche se gli invio dati


8

Ho installato Graphite tramite Puppet ( https://forge.puppetlabs.com/dwerder/graphite ) con nginx e PostgresSQL. Quando invio i dati manualmente, crea la metrica ma tutti i suoi punti dati sono "Nessuno" (aka null). Questo succede anche se eseguo example-client.py fornito 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

E:

$ 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

Questo è, secondo ngrep, i dati che arrivano alla porta [da un tentativo successivo] (linea 3):

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

Questa è la parte rilevante di /opt/graphite/conf/storage-schemas.conf:

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

Qualche idea su cosa sia sbagliato? Le metriche e i dati di Carbon sono visualizzati nell'interfaccia utente. Grazie!

Ambiente: Ubuntu 13.10 Saucy, grafite 0.9.12 (tramite pip).

PS: Ho scritto dei miei tentativi di risoluzione dei problemi qui - La grafite mostra metriche ma nessun dato - Risoluzione dei problemi

AGGIORNAMENTO :

  1. I punti dati nei file di sussurro vengono registrati solo ogni 1 m min anche se i criteri di conservazione specificano una precisione più elevata come "1s" o "10s".
  2. Soluzione alternativa per i dati ignorati: utilizzare uno schema di aggregazione con xFilesFactor = 0.1(anziché 0,5) o impostare la precisione più bassa su 1 m anziché <numero tra 1-49> s. - vedere i commenti sotto la risposta accettata o la domanda di risposta in grafite. Secondo i documenti : " xFilesFactordovrebbe essere un numero in virgola mobile compreso tra 0 e 1 e specifica quale frazione degli slot del livello di conservazione precedente deve avere valori non nulli per aggregare a un valore non nullo. Il valore predefinito è 0,5 " . Quindi, a prescindere dall'aver specificato la precisione di 1s, i dati vengono aggregati a 1 minuto e finiscono per essere Nessuno perché meno del 50% dei valori nel periodo dei minuti sono diversi da Nessuno.

SOLUZIONE

Quindi @jlawrie mi ha portato alla soluzione. Si scopre che i dati sono effettivamente lì ma sono aggregati a nulla, il motivo è doppio:

  1. Sia l'interfaccia utente che il whisper-fetch mostrano i dati aggregati con la massima precisione che copre l'intero periodo di query, il cui valore predefinito è 24 ore. Vale a dire qualsiasi cosa con conservazione <1d non verrà mai mostrata nell'interfaccia utente o nel recupero a meno che non selezioni un periodo più breve. Poiché il mio periodo di conservazione per 1 secondo era di 30 minuti, avrei bisogno di selezionare un periodo di <= ultimi 30 minuti per vedere effettivamente i dati grezzi con la massima precisione raccolti.
  2. Quando si aggregano i dati (da 1s a 1min nel mio caso), Graphite richiede per impostazione predefinita che il 50% (xFilesFactor = 0,5) dei punti dati nel periodo abbia valore. In caso contrario, ignorerà i valori esistenti e li aggregherà a Nessuno. Quindi, nel mio caso, dovrei inviare i dati almeno 30 volte in un minuto (30 è il 50% di 60s = 1min) affinché vengano visualizzati nel valore aggregato di 1 minuto. Ma la mia app invia dati ogni 10 secondi, quindi ho solo 6 dei 60 valori possibili.

=> soluzione è cambiare la prima precisione da 1s a 10s e ricordare di selezionare un periodo più breve quando voglio vedere i dati grezzi (o estendere la sua conservazione a 24 ore per mostrarlo per impostazione predefinita).


La domanda di risposte alla grafite Set di dati riempito con valori null? è interessante in questo contesto (menziona l'aggiunta predefinita di null ogni 60s, solo le ultime 24h) e b / c la sua raccomandazione di ngrep per la risoluzione dei problemi.
Jakub Holý,

Ho chiesto aiuto anche a Graphite Answers - answer.launchpad.net/graphite/+question/248242
Jakub Holý

Hai controllato i registri? Se c'è un problema con la metrica ricevuta (no \ n oppure usa \ r \ n) dovresti vedere qualcosa in console.log o create.log. Questi registri sono archiviati in / opt / graphite / storage / log / carbon-cache / carbon-cache-a / se è stato utilizzato il percorso di installazione predefinito.
mattsn0w,

Sì, ho controllato i registri. Non c'era nulla di interessante. Il registro della console aveva essenzialmente "[..] ServerFactory a partire dal 7002 [..] Avvio dell'istanza <twisted.internet.protocol.ServerFactory a 0x1bc4248>" e aveva record di creazione delle metriche previste ma nessuna menzione dei dati - f. ex. (per un'altra metrica senza dati) "[..] creazione del file di database /opt/graphite/storage/whisper/ring/handling-time/POST/15MinuteRate.wsp (archive = [(1, 1800), (60, 1440 ), (300, 210240)] xff = 0,5 agg = media) "
Jakub Holý

@ JakubHolý Potresti aggiornare la risposta di jlawrie o pubblicare un'altra risposta poiché la domanda contiene una risposta ora
030

Risposte:


8

Ho riscontrato lo stesso problema utilizzando lo stesso modulo fantoccio. Non sono esattamente sicuro del perché, ma la modifica del criterio di conservazione predefinito sembra risolverlo, ad es

class { 'graphite':
  gr_storage_schemas => [
    {
      name       => 'carbon',
      pattern    => '^carbon\.',
      retentions => '1m:90d'
    },
    {
      name       => 'default',
      pattern    => '.*',
      retentions => '1m:14d'
    }
  ],
}

Molte grazie! Questo misterioso cambiamento ha davvero aiutato. È interessante notare che la modifica della conservazione da "1s: 30m, 1m: 1d, 5m: 2y" a "1m: 14d" lo "corregge". Proverò a giocarci di più. Potrebbe esserci qualche problema con la granularità 1s?
Jakub Holý,

Sembra davvero essere un problema con il periodo s - mentre '1m:1d,5m:2yfunziona (dati registrati), 10s:30m,1m:1d,5m:2yno. In realtà, dal file .wsp sembra che la granularità <1m sia ignorata poiché i timestamp per gli anni 10: ... le configurazioni sono ancora a intervalli di 1 minuto - "08:17:00, 08:18:00, ecc."
Jakub Holý,

OK, quindi il problema è legato alla politica di aggregazione e xFilesFactor, il (valore predefinito) che si applica qui è nella media e xFilesFactor=0.5(vedi /opt/graphite/conf/storage-aggregation.conf). Quando cambio a sume 0.1cambiando il nome, i dati vengono archiviati (anche se i punti sono ancora a 1 m di frequenza):echo -e "jakub.test.10s30m+1m1d+5m2y.count 42 $(date +%s)" | nc 0.0.0.0 2003
Jakub Holý

Ho giocato con diff. AGGREG. schemi, i dati vengono registrati (a intervalli di 1m) quando imposto xFilesFactor = 0.1, l'agg. il metodo non ha importanza (almeno tutto il lavoro medio, ultimo, somma).
Jakub Holý,

In base a ciò , gli schemi di aggregazione entrano in gioco solo con più politiche di conservazione. Se ho solo una politica di conservazione, anche con una risoluzione di 10 secondi (che è la frequenza con cui invio i dati), sta raccogliendo ogni singolo punto dati. Con più criteri di conservazione, sceglie quello in base all'intervallo di tempo della query, che con whisper-fetch.py ​​viene impostato per impostazione predefinita all'ultimo giorno, motivo per cui penso che vengano visualizzati solo punti dati ogni 1 minuto. Non so ancora perché mostrerebbero Nessuno, invece del valore aggregato.
jlawrie

1

Ci sono molti modi in cui la grafite perderà i dati, motivo per cui cerco davvero di evitare di usarli. Vorrei iniziare con una semplice: provare a connettere l'applicazione, attendere un secondo (letteralmente un secondo) e quindi generare i dati con data e ora. Ho trovato in molte circostanze che risolverà quel problema esatto. Un'altra cosa che dovresti provare è l'invio di dati a una frequenza che è molto più alta della frequenza con cui la grafite registra i dati. Ne parlerò un po 'di più. Un altro errore frequente è l'utilizzo dell'utilità whisper-resize.py, che in realtà non ha funzionato per me. Se i tuoi dati non sono ancora importanti, elimina i file sussurro e lascia che vengano creati con le nuove impostazioni di conservazione.

I file di archiviazione di Graphite, i file di sussurro, invece di archiviare i dati come un punto con un valore e un tempo (come hai fornito il programma) li memorizzano come aventi una serie di slot in cui viene archiviato il valore. Il programma quindi cerca di capire quale slot corrisponde a un periodo di tempo utilizzando il file di dati di conservazione. Se ottiene un dato che non rientra esattamente in uno slot, pensociò che accade è che utilizza una media, min o max a seconda di un altro file nella stessa directory del file di conservazione. Ho scoperto che il modo migliore per evitare che si rovinasse tutto era inviare i dati con una frequenza molto più alta della frequenza con cui la grafite stava memorizzando i dati. Onestamente diventa super complicato - non solo ci sono periodi di ritenzione per la grafite e algoritmi di calcolo della media che riempiono i punti (penso), ma questi valori vengono anche applicati ai file di sussurro. Accadranno cose molto strane quando queste non coincidono, quindi fino a quando la tua configurazione non funziona ti suggerirei di eliminare ripetutamente i tuoi file di sussurri e di lasciarli ricreare dalla grafite.

Questo programma mi ha davvero impressionato, quindi se incontri qualcosa del genere non dare per scontato che sia colpa tua.


Grazie, immagino che dovrei imparare di più su come funzionano il recupero e l'aggregazione dei dati, forse è davvero la causa del problema. Tuttavia, penso che " inviare i dati a una frequenza molto più elevata della frequenza con cui la grafite stava memorizzando i dati " è una soluzione non ottimale in quanto viene registrato solo l'ultimo punto dati ricevuto in ciascun periodo di grafite, altri ignorati - ecco perché f.ex . statsD flush period must = Periodo della grafite .
Jakub Holý,

1
A proposito, i dati di "perdita" di grafite / carbonio potrebbero essere correlati a impostazioni di carbonio come MAX_UPDATES_PER_SECOND = 500, MAX_CREATES_PER_MINUTE = 50 (immagino che i punti / le metriche di dati oltre il limite siano stati eliminati).
Jakub Holý,

Sembra che mi sbagliassi, la documentazione - se la interpreto correttamente - dice che le impostazioni sopra limitano l'accesso al disco ma i dati / le metriche sono ancora conservati in memoria (anche se vorrei verificarlo prima).
Jakub Holý,

Alcuni di questi potrebbero sicuramente spiegare alcuni dei problemi che ho avuto con quell'applicazione.
Alcuni nerd Linux il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.