Supermarktpreisentwicklung in InfluxDB

vorhergehende Artikel in: Java Komponenten TeleGrafana
27.09.2023

Durch diesen Mastodon-Thread aufmerksam geworden habe ich neulich zunächst erst einmal andere Preise in eine Influx-Zeitreihendatenbank importiert. Nun wollte ich es wissen und versuchte mich ander ursprünglichen Idee der Supermarktpreise...

Zunächst zur Vorgeschichte und zum Weg zur aktuell in einem OpenSource-Projekt vorliegenden Implementierung:

Ich wollte die Implementierung mittels Java realisieren und das Ziel war, die Daten in eine InfluxDB Version 1.x zu importieren - dann könnte man sie mittels Grafana oder ähnlichen Werkzeugen auswerten.

Zwei wichtige Dinge, die ich unterwegs gelernt habe: Die API von Rewe Digital sitzt hinter Cloudflare - das ist der Grund, warum ich nicht direkt von Java (oder Python...) aus daraus zugreife, sondern den seltsamen Umweg über den Aufruf von curl als externem Betriebssystemprozess gehe.

Und zweitens: Die defaultinstallation einer InfluxDB Version 1.8 beschränkt die Anzahl von Werten pro Tag auf 10000 - da ich aber die Namen der Produkte als Tag name abgebildet habe und bereits ein einzelner Rewe Store mehr als 10000 unterschiedliche Produkte anbietet scheiterte der Import zunächst mit einem Fehler 400. Die Dokumentation der Schnittstelle sagt dazu lediglich, dass ein solcher Request nicht wieder gesendet werden sollte.

Nach endlosen frustrierenden Versuchen fand ich schließlich die Tatsache dieser Beschränkung heraus. Ich war zwischendurch bereits so verzweifelt, dass ich Tests machte, ob es vielleicht an dem von mir eingesetzten Docker-Image liegen könnte und verglich das Verhalten mit einer bare-metal-Installation. Letztlich stellte sich heraus, dass man darauf achten muss, die Parameter INFLUXDB_DATA_MAX_VALUES_PER_TAG und INFLUXDB_DATA_MAX_SERIES_PER_DATABASE auf 0 zu setzen.

Die Anwendung selbst ist als Kommandozeilenwerkzeug realisiert, da sich so regelmäßige Updates der aktuellen Preise zum Beispiel per Cron einfach automatisieren lassen.

Die Anwendung verfügt derzeit über zwei Subcommands Import und Update - die Kommandozeilenschalter und -parameter sind im folgenden dargestellt. Diese Übersicht ist auch direkt auf der Kommandozeile abrufbar - tatsächlich stammen die folgenden Zeilen exakt von dort:

Import

Usage: HeissePreiseInfluxdbInterface Import [-hV] [-a=<measurementName>]
       -d=<influxDbDatabasename> [-H=<influxDbHost>] [-l=<logLevel>]
       [-p=<influxDbPassword>] [-P=<influxDbPort>] [-S=<influxDbScheme>]
       [-u=<influxDbUsername>] <jsonFile>
Importiert historische Preisdaten von Supermärkten.
      <jsonFile>   Diese Datei enthält die historischen Daten der Supermärkte.
                     Verfügbar zum Beispiel hier: https://heisse-preise.
                     io/data/latest-canonical.json *(Achtung: über 100 MB!).*
                     Das Ursprungsprojekt ist https://github.
                     com/badlogic/heissepreise .
  -a, -measurementName-=<measurementName>
                   measurementName (default: Product). Das ist der Name des
                     Measurement, unter dem die Daten importiert werden.
  -d, --influxDbDatabasename=<influxDbDatabasename>
                   influxDbDatabasename. Der Name der Influx 1.x Datenbank, in
                     die die Daten geschrieben werden sollen.
  -h, --help       Show this help message and exit.
  -H, --influxDbHost=<influxDbHost>
                   influxDbHost (default: localhost). Der Name oder die
                     IP-Adresse zur Verbindung mit der Influx 1.x Datenbank.
  -l, --logLevel=<logLevel>
                   logLevel (default: WARN). Der Loglevel bestimmt die
                     Ausführlichkeit der Ausgaben während der Bearbeitung.
                     Erleubte Werte sind TRACE, DEBUG, INFO, WARN und ERROR.
  -p, --influxDbPassword=<influxDbPassword>
                   influxDbPassword (default: null). Das PAsswort für die
                     Authentifizierung an der Influx 1.x Datenbank - falls
                     benötigt.
  -P, --influxDbPort=<influxDbPort>
                   influxDbPort (default: 8086). Der Port zur Verbindung mit
                     der Influx 1.x Datenbank
  -S, --influxDbScheme=<influxDbScheme>
                   influxDbScheme (default: HTTP). Erlaubte Werte sind HTTP für
                     Verbindungen zur Influx1.x Datenbank ohne TLS und HTTPS
                     für TLS-verschlüsselte Verbindungen.
  -u, --influxDbUsername=<influxDbUsername>
                   influxDbUsername (default: null). Der Nutzername für die
                     Authentifizierung an der Influx 1.x Datenbank - falls
                     benötigt.
  -V, --version    Print version information and exit.

Update

Usage: HeissePreiseInfluxdbInterface Update [-hV] [-a=<measurementName>]
       -d=<influxDbDatabasename> [-H=<influxDbHost>] [-l=<logLevel>]
       [-p=<influxDbPassword>] [-P=<influxDbPort>] [-s=<storeNumber>]
       [-S=<influxDbScheme>] [-u=<influxDbUsername>]
Aktualisiert Preisdaten von Rewe Supermärkten. Derzeit wird nur Rewe (DE)
unterstützt. Weiterewerden folgen. Das Update erfolgt so, dass er mit dem
Import historischer Daten (subcommand Update) zusammen funktioniert. Alle
Informationen werden in ein Measurement importiert und die Informationen zu
einzelnen Produkten können anhang des Tags "name" differenziert werden.
  -a, -measurementName-=<measurementName>
                  measurementName (default: Product). Das ist der Name des
                    Measurement, unter dem die Daten importiert werden.
  -d, --influxDbDatabasename=<influxDbDatabasename>
                  influxDbDatabasename. Der Name der Influx 1.x Datenbank, in
                    die die Daten geschrieben werden sollen.
  -h, --help      Show this help message and exit.
  -H, --influxDbHost=<influxDbHost>
                  influxDbHost (default: localhost). Der Name oder die
                    IP-Adresse zur Verbindung mit der Influx 1.x Datenbank.
  -l, --logLevel=<logLevel>
                  logLevel (default: WARN). Der Loglevel bestimmt die
                    Ausführlichkeit der Ausgaben während der Bearbeitung.
                    Erleubte Werte sind TRACE, DEBUG, INFO, WARN und ERROR.
  -p, --influxDbPassword=<influxDbPassword>
                  influxDbPassword (default: null). Das PAsswort für die
                    Authentifizierung an der Influx 1.x Datenbank - falls
                    benötigt.
  -P, --influxDbPort=<influxDbPort>
                  influxDbPort (default: 8086). Der Port zur Verbindung mit der
                    Influx 1.x Datenbank
  -s, --storeNumber=<storeNumber>
                  storeNumber (default: 440405). Das ist die Nummer, die für
                    die Abfrage dere Preisdaten aus der ReweDigital-API
                    benötigt wird. Die Preise der Produkte können nur
                    Store-spezifisch abgefragt werden, da das Angebot sich
                    zwischen den einzelnen Stores unterscheidet. Möchte man
                    einen anderen als den als default hinterlegten Store
                    abfragen, kann man die benötigte Nummer über einen anderen
                    Endpunkt der API herausfinden (https://github.
                    com/foo-git/rewe-discounts/blob/master/rewe_discounts/rewe_d
                    iscounts.py).
  -S, --influxDbScheme=<influxDbScheme>
                  influxDbScheme (default: HTTP). Erlaubte Werte sind HTTP für
                    Verbindungen zur Influx1.x Datenbank ohne TLS und HTTPS für
                    TLS-verschlüsselte Verbindungen.
  -u, --influxDbUsername=<influxDbUsername>
                  influxDbUsername (default: null). Der Nutzername für die
                    Authentifizierung an der Influx 1.x Datenbank - falls
                    benötigt.
  -V, --version   Print version information and exit.

Artikel, die hierher verlinken

In eigener Sache mit Blick auf 2024

30.12.2023

Dieses Jahr ist auch wieder rum. Zeit, nach vorne und Zurück zu blicken...

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Alte Rechner zukunftsfähig (?)

    01.05.2019

    Ich mache immer wieder gerne Experimente mit Terminalsessions - meistens wegen der zentral möglichen Administration. Nunhabe ich das Thema von neuem angepackt: wegen einem alten(sehr alten) Laptop, der bei mir schon so lange im Schrank lag, dass sogar die BIOS-Batterie inzwischen leer war...

    Weiterlesen...

Neueste Artikel

  • Graphics2D Implementierung für Java mit verlegtem Koordinatenursprung

    Es gibt seit vielen Jahren immer mal wieder Leute, die im Internet fragen, ob man in Javas diversen Methoden zum Zeichnen von Graphiken das Koordinatensystem so ändern könnte, dass sich der Koordinatenursprung links unten befindet und die positive y-Achse nach oben weist. Meist sind die Antworten dann, dass eine Affine Transformation eingeschaltet werden solle, die das Bild spiegelt.

    Weiterlesen...
  • Unerwartete Probleme bei der Software Raid5 Erweiterung

    Ich bin an die Grenzen meiner Storagelösung gestoßen - es musste mehr Platz her...

    Weiterlesen...
  • Die sQLshell ist nun cloudnative!

    Die sQLshell hat eine weitere Integration erfahren - obwohl ich eigentlich selber nicht viel dazu tun musste: Es existiert ein Projekt/Produkt namens steampipe, dessen Slogan ist select * from cloud; - Im Prinzip eine Wrapperschicht um diverse (laut Eigenwerbung mehr als 140) (cloud) data sources.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.