batchPoints com influxdb-java sendo sobrescritos a menos que forçado o tempo exclusivo
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
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.
@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. ~