NEWS
Python-Zugriff auf InfluxDB im Docker
-
Hallo,
ich habe mir eine InfluxDB im Docker auf meinem NAS eingerichtet um Werte zu speichern.
Der InfuxDB Adapter funktioniert einwandfrei und Grafana (ebenfalls auf dem NAS) funktioniert auch.
Nun wollte ich ein wenig Datenauswertung betreiben und von meinem PC aus mit Anaconda/JuyperNotebook die Daten abrufen.
Es scheint, als ob ich SSL-Probleme hätte.Kann da jemand helfen? Kann ich SSL im lokalen Netzwerk ausschalten?
Gruß,
Christian -
@christiansr sagte in Python-Zugriff auf InfluxDB im Docker:
Es scheint, als ob ich SSL-Probleme hätte.
Eine InfluxDB kommuniziert im Standard unverschlüsselt. Falls sie das nicht tut, hast du es bewusst eingeschaltet (was ich nicht glaube).
Was bringt dich zu dieser Aussage?
-
- Ich bekomme die Meldung (405) Not Allowed.
- gleiches Python-Skript kann problemlos auf eine Online-DB zugreifen (SSL-verschlüsselt).
- Grafana (auf dem gleichen NAS) kann mit gleichem Token auf meine DB zugreifen.
Ich habe also auf irgendwelche Netzwerk-Problee geschlossen
-
@christiansr sagte in Python-Zugriff auf InfluxDB im Docker:
Ich bekomme die Meldung (405) Not Allowed.
Keine Ahnung, vielleicht liegt es an einer unpassenden Python client library zur Influx Version, vielleicht fehlt die Authentifizierung / der Token.
Ich habe also auf irgendwelche Netzwerk-Problee geschlossen
Das denke ich nicht, denn du bekommst ja eine "Not Allowed" Meldung von der Datenbank. Damit wäre das Netzwerk als Ursache raus.
-
@marc-berg fehlender/falscher Token schließe ich aus, da der gleiche Token von Grafana aus funktioniert.
Die Python library schafft es immerhin auf eine (aktuelle) online Datenbank zuzugreifen. Daher denke ich nicht, dass sie aktuell ist.
Allerdings ist meine InfluxDB nicht die neuste Version. Wie gesagt schafft es Grafana darauf zuzugreifen. Woran kann es liegen, dass Python das nicht schafft? -
@christiansr sagte in Python-Zugriff auf InfluxDB im Docker:
Woran kann es liegen, dass Python das nicht schafft?
Bei den "reichlichen" Informationen, die du hier zur Verfügung stellst, wird dir das hier wohl niemand beantworten können.
Bei dieser Fehlermeldung gibt es aber (neben den oben genannten) nicht so viele Möglichkeiten, was da schief läuft.- Rechte des Tokens nicht ausreichend
- Organisation nicht/falsch benannt
- Bucket nicht/falsch benannt
- Programmierfehler
- Fehler in der Python-Library, die vor dir noch niemand bemerkt hat
-
@christiansr sagte in Python-Zugriff auf InfluxDB im Docker:
fehlender/falscher Token schließe ich aus, da der gleiche Token von Grafana aus funktioniert.
Moin,
zu viele unbekannte Variablen.
- Gib doch mal preis, um welche Versionen es sich handelt.
- wie sieht die Fehlermeldung genau aus, nicht sagen, zeigen
VG
BerndP.S.: alles was ich gerade auf die Schnelle mit
python
,jupyter
,error
und405
gefunden habe, deutet auf eine Methode nicht erlaubt hin! -
@marc-berg
Ich versuche mal alle Informationen zusammenzutragen:InfluxDB v.2.7.1
via Docker (influxdb:latest)
Python 3.9.17 via JupyterLab 3.3.2Python-Code:
@marc-berg said in Python-Zugriff auf InfluxDB im Docker:
- Rechte des Tokens nicht ausreichend
- Organisation nicht/falsch benannt
- Bucket nicht/falsch benannt
- Programmierfehler
- Fehler in der Python-Library, die vor dir noch niemand bemerkt hat
Organisation, Token, Bucket habe ich schon per copy/paste in Grafana probiert - funkioniert
Programmierfehler liegt nahe, da das Thema für mich komplett neu ist, allerdings ist das Skript schon wirklich reduziert...@dp20eic said in Python-Zugriff auf InfluxDB im Docker:
- wie sieht die Fehlermeldung genau aus, nicht sagen, zeigen
Fehlermeldung:
Vollständiger Fehlertext:
-
@christiansr said in Python-Zugriff auf InfluxDB im Docker:
ich bin jetzt dem python nur mäßig mächtig
genauso der influx abfragesprache.kannst du mal die query noch weiter vereinfachen?
einfach nur eine tabelle abfragen mit möglichst wenig parameter?wenn ich richtig vermute und das komplette fehlerlog richtig interpretiere, dann ist der fehler in Zeile 24 entstanden.
Also die Connection zur Datenbank mit token, bucket, etc hat schon mal funktioniert. also interpretiere ich, das irgendwas an der Formulierung der Abfrage nicht stimmt bzw eine unzulässige Angabe gemacht worden ist.
Leider lässt die API-Doku sich nicht über die möglichen Fehlercodes aus
https://influxdb-client.readthedocs.io/en/stable/api.html#queryapiIn diesem Beitrag (es geht allerdings um den C# Client, gab es auch ein problem mit einer Angabe. Dazwischen war aber auch ein Hinweis auf ein Token mit Permission_All
https://community.influxdata.com/t/influx-cloud-compatibility-with-c-client-library/25920In der javabibliothek bedeutet 405: Method not allowed, also könnte auch ein Hinweis auf einen Fehler in der Abfrage sein
https://influxdata.github.io/influxdb-client-java/influxdb-client-core/apidocs/com/influxdb/exceptions/class-use/InfluxException.htmldein fehlerlog ist vom client?
du könntest mal noch influxdb serverlog anschauen, ob da noch ein genauerer hinweis drin steht -
@christiansr sagte in Python-Zugriff auf InfluxDB im Docker:
D:\Programme\anaconda\lib\site-packages\influxdb_client_sync\api_client.py
Moin,
ich mache mich hier sicher lächerlich und oute mich, dass ich nicht Programmieren kann.
Die Python Skripte sind nicht vollständig, daher nicht schlagen, aber soweit ich das gestern überflogen habe, ist Fehler 405, eine fehlerhafte Methode, ist denn imapi_client.py
auchGET
das Du oben benutzt auch definiert/korrekt?Um mich damit aber mehr zu beschäftigen, fehlt mir die kommenden 4 Tage leider die Zeit.
VG
Bernd -
@christiansr sagte in Python-Zugriff auf InfluxDB im Docker:
HTTP response headers: HTTPHeaderDict({'Server': 'nginx', 'Date': 'Wed, 06 Sep 2023 19:08:36 GMT', 'Content-Type': 'text/html', 'Content-Length': '150', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=20'}) HTTP response body: b'<html>\r\n<head><title>405 Not Allowed</title></head>\r\n<body>\r\n<center><h1>405 Not Allowed</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n'
Sehe ich das richtig, und da sitzt ein NGINX als Reverse Proxy vor der Datenbank? Dann könnte die Fehlermeldung "Not Allowed" natürlich ein ganz andere Bedeutung haben und hätte nichts mit der Datenbank/Abfrage zu tun.
-
@oliverio said in Python-Zugriff auf InfluxDB im Docker:
kannst du mal die query noch weiter vereinfachen?
einfach nur eine tabelle abfragen mit möglichst wenig parameter?Habe die Abfrage nun auf ein Minimum reuziert. Bei der Gelegenheit ist mir an dieser Stelle ein Fehler aufgefallen. "my-bucket" gibt es nicht. Dennoch ist das Ergebnis unverändert.
In diesem Beitrag (es geht allerdings um den C# Client, gab es auch ein problem mit einer Angabe. Dazwischen war aber auch ein Hinweis auf ein Token mit Permission_All
https://community.influxdata.com/t/influx-cloud-compatibility-with-c-client-library/25920Der Token hat permission ALL.
In der javabibliothek bedeutet 405: Method not allowed, also könnte auch ein Hinweis auf einen Fehler in der Abfrage sein
https://influxdata.github.io/influxdb-client-java/influxdb-client-core/apidocs/com/influxdb/exceptions/class-use/InfluxException.htmlFühre ich die Abfrage im UI von InfluxDB aus bekomme ich ein Ergebnis...
dein fehlerlog ist vom client?
du könntest mal noch influxdb serverlog anschauen, ob da noch ein genauerer hinweis drin stehtwenn ich das richtig verstanden habe, dann werden die Logs in einer Datei im Docker abgelegt. Vom UI aus komme ich da vermutlich nicht hin.
@dp20eic said in Python-Zugriff auf InfluxDB im Docker:
ist denn im
api_client.py
auchGET
das Du oben benutzt auch definiert/korrekt?Den von mir geschriebenen Code habe ich vollständig hier rein kopiert. Alles andere steckt in fertigen Bibliotheken. Ich gehe momentan davon aus, dass dort nicht der Fehler liegt.
@marc-berg said in Python-Zugriff auf InfluxDB im Docker:
Sehe ich das richtig, und da sitzt ein NGINX als Reverse Proxy vor der Datenbank? Dann könnte die Fehlermeldung "Not Allowed" natürlich ein ganz andere Bedeutung haben und hätte nichts mit der Datenbank/Abfrage zu tun.
Habe nun erstmal die Vokabeln "NGINX" und "Reverse Proxy" gegoogelt. So richtig aussagefähig bin ich hier leider noch nicht.
Mein System ist ein Synology NAS mit installiertem Docker. InfluxDB läuft in dem Docker und wird über die IP des NAS angesprochen.
@OliverIO hat ja geschlussfolgert, dass die Verbindung bereits durch geht. Kann ich das irgendwie prüfen? -
@OliverIO bisher habe ich es noch nicht geschfft die Logs zu finden.
@marc-berg Wo der NGINX herkommt weiß ich nicht. Vermutlich gehört der zum NAS/ Docker.Ich habe mal probiert einen fehlerhaften Token zu nutzen. Die Fehlermeldung ist die gleiche. Ich glaube also nicht, dass ich schon auf der Datenbank angekommen bin.
-
https://docs.influxdata.com/influxdb/v2.7/admin/logs/
Wahrscheinlich musst du erst konfigurieren bevor da was rauskommt.Entweder du führst den Pfad per volume Parameter nach außen oder du verbindest dich auf die Shell im laufenden Container und schaust dann auf die Innere verzeichnisstruktur
https://kodekloud.com/blog/docker-exec/#Wenn du eine UI deines NAS verwendest müsste es da einen Knopf geben. So ist es zumindest im portainer
-
Habe jetzt auch erstmal keine Idee mehr dazu. Meine Vermutung ist, dass Grafana funktioniert, weil du es auch im Docker zu laufen hast und damit direkt auf die InfluxDB zugegriffen werden kann, ohne den NGINX der Synology zu benutzen.
Hast du die Möglichkeit, deinen Python-Code in einen Container zu packen, um diese Theorie auszuschließen/zu bestätigen?
Vielleicht ist es ja ein Konfigurationsproblem der Synology/des Containers. Kenne mich aber Null mit den NAS aus. -
@OliverIO In der Doku steht: "By default, InfluxDB outputs all logs to stdout."
Wenn ich das richtig sehe, dann habe ich diesen Stream in meinem UI vom Docker sichtbar:
Allerdings taucht da nix nenneswertes auf.
Da der Default Log-Level auf "Info" steht sollte hier nicht das Problem sein, sondern ich gehe davon aus, dass meine Queries gar nicht erst ankommen und daher nicht im Log auftauchen.@Marc-Berg Leider kenne ich mich auch nicht wirklich mit Docker aus. Ich habe es nur genutzt, um unkompliziert eine InfluxDB aufzusetzen. Ich habe auch schon darüber nachgedacht die Daten in die Cloud zu stecken, so richtig begeistert bin ich von dem Gedanken allerdings nicht.
Oder ich setze doch wieder auf MySQL. Das läuft auf meinem NAS als direkte Applikation ohne Docker und war von außen immer problemlos erreichbar.
Leider gibt es für InfluxDB keine Software, die unkompliziert Queries ausführen könnte (analog MySQL Workbench).
Ich hatte TimeSeriesAdmin ausprobiert, allerdings ohne Erfolg.
Ich wollte auch Power BI ausprobieren, allerdings hat das Probleme mit Anaconda, sodass ich hier erstmal Python ans Laufen bekommen muss. Power BI bietet noch andere Verbindungsmöglichkeiten, die ich jedoch alle ebenfalls nicht beherrsche. -
@OliverIO Das log wirft nur "info" aus, kein "debug".
Wenn ich in der Konsoleinfluxd --log-level=info
starte, dann kommen wesentlich mehr Meldungen. Dieser werden allerdings nicht gelogt.
Also habe ich die config-Datei gesucht. Im Verzeichnis/etc/influxdb2/
gibt es nur eine Datei:influxdb-configs
.
Folgender Inhalt:
Da habe ich nun als erste Zeile folgendes ergänzt:log-level="debug"
Auch nach Docker-Neustart wird noch immer ausschließlich "info" geloggt.In der Konsole das Kommando
influxd --log-level=info
eingegeben bekomme ich einen aktuellen log in der konsole:
Ich bin irritiert, was die letzte Zeile angeht. Sieht irgendwie nach Port-Problemen aus.Da es allerdings mit Grafana problemlos klappt komme ich immer darauf zurück und vermute, dass mit dem Python-Script etwas nicht stimmt.
-
@christiansr sagte in Python-Zugriff auf InfluxDB im Docker:
Ich bin irritiert, was die letzte Zeile angeht. Sieht irgendwie nach Port-Problemen aus.
Moin,
nein, wenn Du den Docker Container startest, dann wird auch
influxDB
gestartet, dann versuchst Du den Datenbankmanager nochmals zu starten, aber mit der gleichen Konfiguration, das geht nicht, da der Port 8086 schon in Benutzung ist.VG
Bernd -
@dp20eic den Datenbankmanager zweimal zu starten macht natürlich keinen Sinn. Eigentlich will ich nur den log-level erhöhen, was mir jedoch nicht gelungen ist. In der Doku klingt das so einfach :
log-level = "info"
ergänzen.
Ist es richtig die Zeile einfach an den Anfang der Config-Datei zu schreiben oder gehört das unter irgend einen[Abschnitt]
? -
@christiansr sagte in Python-Zugriff auf InfluxDB im Docker:
Ist es richtig die Zeile einfach an den Anfang der Config-Datei zu schreiben oder gehört das unter irgend einen [Abschnitt]?
Moin,
nope und ja
Ich schau’ mal, melde mich später noch einmal.
Edit
Also, da habe ich mich wohl getäuscht, ist anscheinend doch egal wo es steht, ich würde Änderungen, aber immer am Ende machen.Vielleicht ist nur die Schreibweise falsch.
Wenn Konfig eineyaml
Datei, dannlog-level: info
Wenn Konfig eine
toml
Datei, dannlog-level = "info"
Wenn Konfig eine
json
, dann{ "log-level": "info" }
Ich würde es mal so versuchen
[default] url = "http://localhost:8086" token = "5kPlL7izVhHLQXMJN81lRWjiC7iNGGHQtBIWvxmbxUGIXMV2GfMnZNGzYnqkJ5ktY_Ly5Fp-ddr0ODbHqvM2nA==" org = "hausautomation" active = true log-level = debug
VG
Bernd