batchPoints avec influxdb-java étant écrasés à moins que l'heure unique ne soit forcée?

Oct 15 2020

Mon projet utilise actuellement influxdb-java pour se connecter à Influx 1.8.2. Actuellement, mon code ressemble à ceci:

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();

Actuellement, Line Adoit être présent, sinon il semble que mes points se remplacent d'eux-mêmes et qu'un seul point sera effectivement écrit someTable. Donc, Line Ac'est une solution hacky mais c'est la seule façon dont je peux écrire tous les points. L'inspiration pour l'utilisation de batchPoints comme celle-ci est venue des propres exemples de tests de performance d'influx où ils ne spécifient même pas une heure. Alors, qu'est-ce que je fais de mal qui provoque l'écrasement des points sinon pour Line A? Peut-être changer d' influxdb-client-java à la place, juste pour le contexte, au cas où cela pourrait atténuer ce problème.

Réponses

1 robert Oct 17 2020 at 04:43

Dans InfluxDB, tous les points ayant les mêmes valeurs de balise et horodatage, même lorsqu'ils ont des valeurs de champ différentes, sont considérés comme dupliqués. Ainsi, ces points de données sont écrasés en silence. Ceci est conforme à la conception d' InfluxDB .

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

Oui, c'est par conception.

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

Oui, il est écrasé en silence.

Ceci est documenté mais pas bien. J'ai ouvert influxdata / influxdb.com # 324 pour résoudre ce problème.

1 Phil Oct 16 2020 at 18:08

@Isaac -

Si vous utilisez InfluxDB 1.8+, j'envisagerais de passer au influxdb-client-javacar il semble plus fréquemment maintenu.

Pour votre exemple de code utilisant influxdb-java, le générateur BatchPoints n'est pas utilisé de manière idiomatique. Je dirais que testWritePerformancedans l'exemple, les tests sont également étranges et que le test est désactivé.

J'élide une grande partie de votre code.

// setup ...

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

// start for loops ...

batchPointsBuilder.point(p);

// finish loops ...

connection.write(batchPointsBuilder.build());


// setdown

MAIS en regardant le code java et le vôtre, je ne pense pas que ce soit le problème comme l' point(Point p)ajout de Points à un fichier List. Il ne devrait donc pas être écrasé ici.

Si vous omettez l'horodatage, tous les points recevront le même horodatage car le lot arrive en même temps (c'est ainsi qu'un horodatage laissé de côté est déterminé dans InfluxDB - lorsque le point arrive). Je ne peux pas voir vos données et vos balises, mais si tous les points sont identiques avec les clés de champs, les clés de balises, les valeurs de balises et l'horodatage, ils s'écraseront / se remplaceront. Je soupçonne que vos données / balises / champs sont censés être différents; vérifiez-le.

Enfin, je vous demanderais de vérifier (et de partager si vous voulez) comment vous savez que tous les points se remplacent eux-mêmes? Quelle est la requête que vous utilisez?

~ Il y a une faute de frappe dans votre exemple de code à for (int i=someInt; i < data.length; i++){- devrait être data1. ~