A grafite mostra "Nenhum" para todos os pontos de dados, mesmo que eu os envie

8

Instalei o Graphite via Puppet ( https://forge.puppetlabs.com/dwerder/graphite ) com o nginx e o PostgresSQL. Quando envio dados manualmente, ele cria a métrica, mas todos os seus pontos de dados são "Nenhum" (também conhecido como nulo). Isso acontece também se eu executar o example-client.py enviado com o 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

Estes são, de acordo com o ngrep, os dados que chegam à porta [de uma tentativa posterior] (linha 3):

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

Esta é a parte relevante de /opt/graphite/conf/storage-schemas.conf:

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

Alguma idéia do que está errado? As métricas e os dados do Carbon são exibidos na interface do usuário. Obrigado!

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

PS: Eu escrevi sobre minhas tentativas de solução de problemas aqui - Grafite mostra métricas, mas não há dados - Solução de problemas

ATUALIZAÇÃO :

  1. Os pontos de dados nos arquivos whisper são recuperados apenas a cada 1 minuto, mesmo que a política de retenção especifique uma precisão mais alta, como "1s" ou "10s".
  2. Solução alternativa para os dados que estão sendo ignorados: use um esquema de agregação com xFilesFactor = 0.1(em vez de 0,5) ou configure a menor precisão para 1m em vez de <número entre 1-49> s. - veja os comentários abaixo da resposta aceita ou a pergunta Respostas de grafite. De acordo com a documentação : " xFilesFactordeve ser um número de ponto flutuante entre 0 e 1 e especifica qual fração dos slots do nível de retenção anterior deve ter valores não nulos para agregar a um valor não nulo. O padrão é 0,5 " . Portanto, parece que, sem considerar a precisão especificada de 1s, os dados são agregados a 1 minuto e acabam sendo Nenhum, porque menos de 50% dos valores no período de minutos são diferentes de Nenhum.

SOLUÇÃO

Então, @jlawrie me levou à solução. Acontece que os dados estão realmente lá, mas são agregados a nada, o motivo é o dobro:

  1. A interface do usuário e a busca por sussurro mostram dados agregados com a maior precisão possível, que abrange todo o período da consulta, cujo padrão é 24h. Ou seja, qualquer coisa com retenção <1d nunca será exibida na interface do usuário ou será buscada, a menos que você selecione um período mais curto. Como meu período de retenção de 1s foi de 30 minutos, eu precisaria selecionar um período de <= últimos 30 minutos para realmente ver os dados brutos com a mais alta precisão sendo coletada.
  2. Ao agregar dados (de 1s a 1min no meu caso), o Graphite exige, por padrão, que 50% (xFilesFactor = 0,5) dos pontos de dados no período tenham valor. Caso contrário, ele ignorará os valores existentes e o agregará a Nenhum. Portanto, no meu caso, eu precisaria enviar dados pelo menos 30 vezes em um minuto (30 é 50% de 60s = 1min) para que eles apareçam no valor agregado de 1 minuto. Mas meu aplicativo envia apenas dados a cada 10s, então eu tenho apenas 6 dos 60 valores possíveis.

=> solução é alterar a primeira precisão de 1s para 10s e lembre-se de selecionar um período mais curto quando eu quiser ver os dados brutos (ou estender sua retenção para 24h para mostrá-lo por padrão).

Jakub Holý
fonte
O Grafite responde à pergunta Conjunto de dados preenchido com valores nulos? é interessante nesse contexto (menciona a adição padrão de null a cada 60s, apenas nas últimas 24h) e b / c sua recomendação de ngrep para solução de problemas.
Jakub Holý 5/05
Pedi ajuda também em respostas de grafite - answers.launchpad.net/graphite/+question/248242
Jakub Holý
Você verificou os logs? Se houver um problema com a métrica recebida (não \ n ou use \ r \ n), você verá algo no console.log ou no create.log. Esses logs são armazenados em / opt / graphite / storage / log / carbon-cache / carbon-cache-a / se você usou o caminho de instalação padrão.
Mattsn0w
Sim, verifiquei os logs. Não havia nada de interessante. O log do console tinha essencialmente apenas "[..] ServerFactory iniciando na instância 7002 [..] Iniciando factory <twisted.internet.protocol.ServerFactory em 0x1bc4248>" e tinha registros de criação das métricas esperadas, mas nenhuma menção aos dados - f. ex. (para outra métrica sem dados) "[..] criando arquivo de banco de dados /opt/graphite/storage/whisper/ring/handling-time/POST/15MinuteRate.wsp (archive = [(1, 1800), (60, 1440 ), (300, 210240)] xff = 0,5 agg = média) "
Jakub Holý
@ JakubHolý você foi possível atualizar a resposta de jlawrie ou postar outra resposta como a questão contém uma resposta agora
030

Respostas:

8

Encontrei o mesmo problema usando o mesmo módulo fantoche. Não sei exatamente por que, mas a alteração da política de retenção padrão parece corrigi-la, por exemplo,

class { 'graphite':
  gr_storage_schemas => [
    {
      name       => 'carbon',
      pattern    => '^carbon\.',
      retentions => '1m:90d'
    },
    {
      name       => 'default',
      pattern    => '.*',
      retentions => '1m:14d'
    }
  ],
}
jlawrie
fonte
Muito obrigado! Essa mudança misteriosa realmente ajudou. Interessante que alterar a retenção de "1s: 30m, 1m: 1d, 5m: 2y" para "1m: 14d" a "corrige". Vou tentar jogar mais com ele. Pode haver algum problema com a granularidade 1s?
Jakub Holý
De fato, parece haver um problema com o período s - enquanto '1m:1d,5m:2yfunciona (dados recuperados), 10s:30m,1m:1d,5m:2ynão. Na verdade, a partir do arquivo .wsp, parece que a granularidade <1m é ignorada desde os carimbos de data / hora para os 10s: ... a configuração ainda está em intervalos de 1 minuto - "08:17:00, 08:18:00 etc."
Jakub Holý
OK, então o problema está relacionado à política de agregação e xFilesFactor, o (padrão) que se aplica aqui é médio e xFilesFactor=0.5(consulte /opt/graphite/conf/storage-aggregation.conf). Quando mudo para sume 0.1alterando o nome, os dados são armazenados (embora os pontos ainda estejam com 1m de freq):echo -e "jakub.test.10s30m+1m1d+5m2y.count 42 $(date +%s)" | nc 0.0.0.0 2003
Jakub Holý
Eu brinquei com diff. agreg. esquemas, os dados são gravados (no intervalo de 1m) quando eu definir xFilesFactor = 0.1, o agg. O método não importa (pelo menos todo o trabalho médio, último, soma).
Jakub Holý
De acordo com isso , os esquemas de agregação só entram em jogo com várias políticas de retenção. Se eu tiver apenas uma política de retenção, mesmo com uma resolução de 10 segundos (que é a frequência com que estou enviando dados), ela estará coletando cada ponto de dados individual. Com várias políticas de retenção, ela escolhe aquela com base no intervalo de tempo da consulta, que com o whisper-fetch.py ​​é padronizado até o último dia, e é por isso que você vê apenas pontos de dados a cada 1 minuto. Ainda não sei por que eles mostrariam None, em vez de valor agregado.
Jlawrie
1

Há muitas maneiras pelas quais o Graphite perde dados, e é por isso que realmente tento evitar usá-los. Deixe-me começar com um simples - tente conectar seu aplicativo, aguarde um segundo (literalmente um segundo) e depois envie os dados com registro de data e hora. Descobri em muitas circunstâncias que isso resolverá o problema exato. Outra coisa que você deve tentar é enviar dados em uma frequência muito superior à frequência na qual a grafite registra dados. Vou falar um pouco mais sobre isso. Outro erro frequente é usar o utilitário whisper-resize.py, que realmente não funcionou para mim. Se seus dados ainda não forem importantes, basta excluir os arquivos de sussurro e permitir que sejam criados com as novas configurações de retenção.

Os arquivos de armazenamento do Graphite, os arquivos whisper, em vez de armazenar os dados como um ponto com um valor e uma hora (como você forneceu o programa), na verdade, os armazenam como tendo uma série de slots nos quais o valor é armazenado. O programa tenta descobrir qual slot corresponde a um período usando o arquivo de dados de retenção. Se obtiver dados que não se encaixam exatamente em um slot, achoo que acontece é que ele usa uma média, um mínimo ou um máximo, dependendo de outro arquivo no mesmo diretório que o arquivo de retenção. Descobri que a melhor maneira de impedir que isso estragasse tudo era enviar dados em uma frequência muito superior à frequência na qual a grafite estava armazenando dados. Honestamente, fica super complicado - não apenas existem períodos de retenção para grafite e algoritmos de média que preenchem pontos (acho), mas esses valores também são aplicados aos arquivos whisper. Coisas muito estranhas acontecerão quando elas não corresponderem; portanto, até que sua configuração esteja funcionando, sugiro que você exclua seus arquivos sussurros repetidamente e deixe que a grafite os recrie.

Esse programa realmente me pareceu um buggy, portanto, se você encontrar algo assim, não pense que a culpa é sua.

Algum Linux Nerd
fonte
Obrigado, acho que devo discutir mais sobre como a recuperação e agregação de dados funciona, talvez seja realmente a causa do problema. No entanto, acho que " enviar dados em uma frequência muito superior à frequência em que a grafite estava armazenando dados " é uma solução abaixo do ideal, pois apenas o último ponto de dados recebido em cada período da grafite é registrado, outros são ignorados - é por isso que f.ex . O período de descarga statsD deve = Período de grafite .
Jakub Holý
1
BTW, os dados de "perda" de grafite / carbono podem estar relacionados a configurações de carbono, como MAX_UPDATES_PER_SECOND = 500, MAX_CREATES_PER_MINUTE = 50 (acho que pontos / métricas de dados acima do limite são descartados).
Jakub Holý
Parece que eu estava errado, a documentação - se a interpretar corretamente - diz que as configurações acima limitam o acesso ao disco, mas os dados / métricas ainda estão na memória (embora eu realmente queira verificar isso primeiro).
Jakub Holý
Alguns deles poderiam definitivamente explicar alguns dos problemas que tive com esse aplicativo.
Algum Nerd do Linux