batchPoints com influxdb-java sendo sobrescritos a menos que forçado o tempo exclusivo

Oct 15 2020

Meu projeto está usando influxdb-java para se conectar ao Influx 1.8.2. Atualmente, meu código se parece com isto:

InfluxDB connection = InfluxDBFactory.connect(server, client);
connection.enableBatch(100,10,TimeUnit.MILLISECONDS);
connection.setDatabase(database);
BatchPoints batchPoints = BatchPoints.database(database).build();

long currTime = System.currentTimeMillis()*1000000;
double[] data1 = getInfluxData();
for (int i=someInt; i < data1.length; i++){
    if (i % someInt == 0){
        double[] data2 = processData(data1, i-someInt, i);
        for (int j=0; j < data2.length; j++){
            Point p = Point.measurement(someTable)
                .time(currTime+i+j, TimeUnit.NANOSECONDS)   //Line A (j < someInt)
                .tag("someTag", "someTagValue")
                .addField("someField", data2[j])
                .build();
            batchPoints.point(p)
        }
}
connection.write(batchPoints);
connection.disableBatch();
connection.close();

Atualmente, Line Aprecisa estar presente, caso contrário, parece que meus pontos se sobrescreverão e apenas 1 ponto será realmente escrito someTable. Portanto, Line Aé uma solução hacky, mas é a única maneira de escrever todos os pontos. A inspiração para o uso de batchPoints como esse veio dos próprios testes de desempenho de exemplo do influx, onde eles nem mesmo especificam um tempo. Então, o que estou fazendo de errado que está causando a sobregravação dos pontos, senão por isso Line A? Em vez disso, pode estar alternando influxdb-client-java , apenas para contexto, caso isso possa aliviar o problema.

Respostas

1 robert Oct 17 2020 at 04:43

No InfluxDB, todos os pontos com os mesmos valores de tag e carimbo de data / hora, mesmo quando têm valores de campo diferentes, são considerados duplicados. Portanto, esses pontos de dados são substituídos silenciosamente. Isso ocorre de acordo com o design do InfluxDB .

Is it a limitation of influx that only one point can exist with the same tags and timestamp?

Sim, isso ocorre por design.

If a collision does occur, does the old one get overwritten?

Sim, é substituído silenciosamente.

Isso está documentado, mas não bem. Abri influxdata / influxdb.com # 324 para resolver isso.

1 Phil Oct 16 2020 at 18:08

@Isaac -

Se você estiver usando o InfluxDB 1.8+, eu consideraria mudar para o influxdb-client-javacomo ele parece ser mantido com mais frequência.

Para o seu exemplo de código usando influxdb-java, o construtor BatchPoints não está sendo usado de forma idiomática. Eu diria que testWritePerformancenos testes de exemplo também é estranho e esse teste está desativado.

Estou omitindo grande parte do seu código.

// setup ...

BatchPoints.Builder batchPointsBuilder = BatchPoints.database(database);

// start for loops ...

batchPointsBuilder.point(p);

// finish loops ...

connection.write(batchPointsBuilder.build());


// setdown

MAS olhando para o código java e o seu, não acho que esse seja o problema, pois point(Point p)é anexar Points a a List. Portanto, não deve ser substituído aqui.

Se você omitir o timestamp, todos os pontos receberão o mesmo timestamp porque o lote chega todos de uma vez (é assim que um timestamp omitido é determinado no InfluxDB - quando o Ponto chega). Não consigo ver seus dados e tags, mas se todos os pontos forem idênticos às chaves de campos, chaves de tags, valores de tag e carimbo de data / hora, eles se sobrescreverão / substituirão. Suspeito que seus dados / tags / campos sejam diferentes; verifique novamente.

Por último, peço que você verifique (e compartilhe, se quiser) como sabe que todos os pontos estão se sobrescrevendo? Qual é a consulta que você está usando?

~ Há um erro de digitação em seu código de amostra em for (int i=someInt; i < data.length; i++){- deveria ser data1. ~