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

  • Alarmierung über Skripte

    16.09.2019

    Nachdem ich mich in letzter Zeit wieder verstärkt mit den Themen Monitoring und Alarmierung auseinandersetze, habe ich überlegt, ob ich die dabei gewonnenen Erkenntnisse nicht auch dazu nutzen könnte, die bestehende Lösung flexibler zu machen

    Weiterlesen...

Neueste Artikel

  • Meine Umsetzung des Konzepts CircuitBreaker

    Das Konzept eines CircuitBreaker ist schon lange bekannt. Ich habe mir zu Studienzwecken einen selber gebaut - eigentlich zwei: Einer ist dafür da, das Logging von gleichartigen Exceptions zu drosseln, der andere für das Entzerren von Versuchen, Ressourcen von URLs nachzuladen. Diese spezielle Variante benötigte ich für EBMap4D: Falls einer der Tile-Server ausfällt, wird ansonsten ständig versucht, die Kacheln neu herunterzuladen. Das frisst nicht nur Rechenzeit, sondern ist auch unnütz.

    Weiterlesen...
  • Mein erster Origami-Kranich

    Nachdem ich mich nun schon so lange mit Origami beschäftige habe ich endlich einmal das älteste dokumentierte Ornament versucht - aus gutem Grund...

    Weiterlesen...
  • Will it go round in circles - Nashville Jam

    Eine neue Musikreihe/Show auf Youtube gefunden...

    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.