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.
30.12.2023
Dieses Jahr ist auch wieder rum. Zeit, nach vorne und Zurück zu blicken...
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...Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Gui Hardware Java Jupyter Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
In eigener Sache...
Weiterlesen...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...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.