Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Command "node_is_alive" return python error #48

Closed
leeroyke opened this issue Sep 19, 2023 · 10 comments
Closed

Command "node_is_alive" return python error #48

leeroyke opened this issue Sep 19, 2023 · 10 comments
Labels
bug Something isn't working

Comments

@leeroyke
Copy link

Hello,

I use check_patroni on Debian 11 with python 3.9.2 and patroni 3.0.1, and i would like use the command "node_is_alive", but I return this python error, here is the command I use, in verbose mode :

# /usr/bin/check_patroni -vv -e http://127.0.0.1:8008 node_is_alive
NODEISALIVE UNKNOWN: AttributeError: module 'requests.exceptions' has no attribute 'JSONDecodeError'
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/check_patroni/types.py", line 73, in rest_api
    return r.json()
  File "/usr/lib/python3/dist-packages/requests/models.py", line 900, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/lib/python3.9/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.9/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.9/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/nagiosplugin/runtime.py", line 44, in wrapper
    return func(*args, **kwds)
  File "/usr/lib/python3/dist-packages/check_patroni/cli.py", line 747, in node_is_alive
    check.main(verbose=ctx.obj.verbose, timeout=ctx.obj.timeout)
  File "/usr/lib/python3/dist-packages/nagiosplugin/check.py", line 121, in main
    runtime.execute(self, verbose, timeout)
  File "/usr/lib/python3/dist-packages/nagiosplugin/runtime.py", line 129, in execute
    with_timeout(self.timeout, self.run, check)
  File "/usr/lib/python3/dist-packages/nagiosplugin/platform/posix.py", line 17, in with_timeout
    func(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/nagiosplugin/runtime.py", line 118, in run
    check()
  File "/usr/lib/python3/dist-packages/nagiosplugin/check.py", line 106, in __call__
    self._evaluate_resource(resource)
  File "/usr/lib/python3/dist-packages/nagiosplugin/check.py", line 73, in _evaluate_resource
    metrics = resource.probe()
  File "/usr/lib/python3/dist-packages/check_patroni/node.py", line 251, in probe
    self.rest_api("liveness")
  File "/usr/lib/python3/dist-packages/check_patroni/types.py", line 74, in rest_api
    except requests.exceptions.JSONDecodeError:
AttributeError: module 'requests.exceptions' has no attribute 'JSONDecodeError'

Can you help me for this issues ?
Thanks.

@blogh
Copy link
Collaborator

blogh commented Sep 19, 2023

Hi, which version are you using ?

@blogh blogh added the bug Something isn't working label Sep 19, 2023
@blogh
Copy link
Collaborator

blogh commented Sep 19, 2023

I spotted a similar problem in #31 and fixed it in v1.
Are you using an older version ?

@leeroyke
Copy link
Author

Hi,
I use v1, we have create a debian package from this release : https://github.com/dalibo/check_patroni/releases/tag/v1.0.0

The debian package : https://packages.debian.org/sid/check-patroni

@dlax
Copy link
Member

dlax commented Sep 19, 2023

Can you try to apply this patch?

diff --git a/check_patroni/types.py b/check_patroni/types.py
index 16789a7..dd64905 100644
--- a/check_patroni/types.py
+++ b/check_patroni/types.py
@@ -8,7 +8,7 @@ import requests
 from . import _log
 
 
-class APIError(requests.exceptions.RequestException):
+class APIError(requests.RequestException):
     """This exception is raised when the rest api couldn't
     be reached and we got a http status code different from 200.
     """
@@ -71,7 +71,7 @@ class PatroniResource(nagiosplugin.Resource):
 
             try:
                 return r.json()
-            except requests.exceptions.JSONDecodeError:
+            except requests.JSONDecodeError:
                 return None
         raise nagiosplugin.CheckError("Connection failed for all provided endpoints")
 

@blogh, there is probably no need to pull exception classes from the requests.exceptions module as they are exposed at package-level and documented.

@leeroyke
Copy link
Author

I apply this patch :

--- check_patroni_backup/types.py	2023-09-06 10:56:10.000000000 +0200
+++ /usr/lib/python3/dist-packages/check_patroni/types.py	2023-09-19 17:44:23.252305699 +0200
@@ -8,7 +8,7 @@
 from . import _log
 
 
-class APIError(requests.exceptions.RequestException):
+class APIError(requests.RequestException):
     """This exception is raised when the rest api couldn't
     be reached and we got a http status code different from 200.
     """
@@ -71,7 +71,7 @@
 
             try:
                 return r.json()
-            except requests.exceptions.JSONDecodeError:
+            except requests.JSONDecodeError:
                 return None
         raise nagiosplugin.CheckError("Connection failed for all provided endpoints")

But I have the same error like this :

~# /usr/bin/check_patroni -vvv node_is_alive
DEBUG - Trying to connect to http://127.0.0.1:8008/liveness with cert: None verify: None
DEBUG - Starting new HTTP connection (1): 127.0.0.1:8008
DEBUG - http://127.0.0.1:8008 "GET /liveness HTTP/1.1" 200 None
DEBUG - api call data: <Empty>
NODEISALIVE UNKNOWN: AttributeError: module 'requests' has no attribute 'JSONDecodeError'
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/check_patroni/types.py", line 73, in rest_api
    return r.json()
  File "/usr/lib/python3/dist-packages/requests/models.py", line 900, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/lib/python3.9/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.9/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.9/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/nagiosplugin/runtime.py", line 44, in wrapper
    return func(*args, **kwds)
  File "/usr/lib/python3/dist-packages/check_patroni/cli.py", line 747, in node_is_alive
    check.main(verbose=ctx.obj.verbose, timeout=ctx.obj.timeout)
  File "/usr/lib/python3/dist-packages/nagiosplugin/check.py", line 121, in main
    runtime.execute(self, verbose, timeout)
  File "/usr/lib/python3/dist-packages/nagiosplugin/runtime.py", line 129, in execute
    with_timeout(self.timeout, self.run, check)
  File "/usr/lib/python3/dist-packages/nagiosplugin/platform/posix.py", line 17, in with_timeout
    func(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/nagiosplugin/runtime.py", line 118, in run
    check()
  File "/usr/lib/python3/dist-packages/nagiosplugin/check.py", line 106, in __call__
    self._evaluate_resource(resource)
  File "/usr/lib/python3/dist-packages/nagiosplugin/check.py", line 73, in _evaluate_resource
    metrics = resource.probe()
  File "/usr/lib/python3/dist-packages/check_patroni/node.py", line 251, in probe
    self.rest_api("liveness")
  File "/usr/lib/python3/dist-packages/check_patroni/types.py", line 74, in rest_api
    except requests.JSONDecodeError:
AttributeError: module 'requests' has no attribute 'JSONDecodeError'

@dlax
Copy link
Member

dlax commented Sep 20, 2023

@leeroyke, I tried this on my side with the debian package on a sid system and got no problem.

Though the error you get seems to be related to the python3-requests package being non-functional. Can you run this?

# python3 -c 'import requests; print(requests.JSONDecodeError)'

@leeroyke
Copy link
Author

leeroyke commented Sep 20, 2023

Actually the problem comes from the debian package python3-requests 2.25, available in Debian 11.

If i run this command with package python3-requests 2.25, the class JSONDecodeError return a error :

# python3 -c 'import requests; print(requests.JSONDecodeError)'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: module 'requests' has no attribute 'JSONDecodeError'

This issues has been reported in python here :
python/typeshed#7072 and this fix here : python/typeshed#7171

In Debian 12 and package python3-requests 2.28.1 this issues has fixed.

Sorry for the inconvenience, I report this bug in Debian for the package python3-requests 2.25 here :
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1052328

@dlax
Copy link
Member

dlax commented Sep 21, 2023

In requests 2.25, the top-level requests namespace does not re-export the JSONDecodeError name, see https://github.com/psf/requests/blob/v2.25.1/requests/__init__.py. So the error you get there is normal. I would assume this would work with python3 -c 'import requests.exceptions; print(requests.exceptions.JSONDecodeError)' (which is the current way it's done in check_patroni).

This issues has been reported in python here :
python/typeshed#7072 and this fix here : python/typeshed#7171

These issues are about typing and should have no effect at runtime, so I think it's unrelated.

I'm also quite surprised you mention this old requests version as you earlier said you were packaging check_patroni for Debian/Sid?!

In any case, it does not seem we can do anything on our side, so the issue might be closed IMO.

@leeroyke
Copy link
Author

Thanks for your feedback.

We have packaged check_patroni for Debian, but since the package is new, we can only deploy it on Debian Sid at this time.
But I tested the package on a pre-production server in Debian 11, because for me the dependencies were resolved, without knowing that there was a bug in version 2.25 of python3-requests.

I close this issue.

@dlax
Copy link
Member

dlax commented Oct 6, 2023

#59 should resolve this issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants