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 Codeberg Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Multi-User-WebDAV, Docker, GitHub

    17.11.2019

    Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...

    Weiterlesen...

Neueste Artikel

  • Migration der Webseite und aller OpenSource Projekte

    In eigener Sache...

    Weiterlesen...
  • AutoHideToolbar für Java Swing

    Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.

    Weiterlesen...
  • Integration von EBMap4D in die sQLshell

    Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.

    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, muss 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 Codeberg-Repositories findet man hier.