i am using pyhasystack in python and trying to read histories of all zone sensors in a single data frame (calling skyspark via python). this used to work before, but since a month or so, when trying to run command as per documentation, i get the java null pointer exception.
Can you provide more information about what your request looks like and also you should have a full stack trace in the response grid meta errTrace tag
Vipul VaidyaTue 27 Oct 2020
Request:
op = session.his_read_frame(znt, rng='today')
op.wait()
b = op.result
b
Error Trace:
---------------------------------------------------------------------------
HaystackError Traceback (most recent call last)
<ipython-input-11-368d15e6746f> in <module>()
1 op = session.his_read_frame(znt, rng='today')
2 op.wait()
----> 3 b = op.result
4 b
7 frames
/usr/local/lib/python3.6/dist-packages/pyhaystack/util/state.py in result(self)
98
99 if self.is_failed:
--> 100 self._result.reraise()
101
102 if not self._result_copy:
/usr/local/lib/python3.6/dist-packages/pyhaystack/util/asyncexc.py in reraise(self)
27
28 def reraise(self):
---> 29 reraise(*self._exc_info)
/usr/local/lib/python3.6/dist-packages/six.py in reraise(tp, value, tb)
701 if value.__traceback__ is not tb:
702 raise value.with_traceback(tb)
--> 703 raise value
704 finally:
705 value = None
/usr/local/lib/python3.6/dist-packages/pyhaystack/client/ops/his.py in _on_single_read(self, operation, col, **kwargs)
330 self._log.debug("Response back for column %s", col)
331 try:
--> 332 grid = operation.result
333
334 if self._tz is None:
/usr/local/lib/python3.6/dist-packages/pyhaystack/util/state.py in result(self)
98
99 if self.is_failed:
--> 100 self._result.reraise()
101
102 if not self._result_copy:
/usr/local/lib/python3.6/dist-packages/pyhaystack/util/asyncexc.py in reraise(self)
27
28 def reraise(self):
---> 29 reraise(*self._exc_info)
/usr/local/lib/python3.6/dist-packages/six.py in reraise(tp, value, tb)
701 if value.__traceback__ is not tb:
702 raise value.with_traceback(tb)
--> 703 raise value
704 finally:
705 value = None
/usr/local/lib/python3.6/dist-packages/pyhaystack/client/ops/grid.py in _check_err(grid)
335 raise HaystackError(
336 grid.metadata.get("dis", "Unknown Error"),
--> 337 grid.metadata.get("traceback", None),
338 )
339 return grid
HaystackError: sys::NullErr: java.lang.NullPointerException
Vipul VaidyaTue 27 Oct 2020
also, just a side note-this query used to work perfectly fine a few months back and was not giving any error. Only recently i have begin to get this error. Have tried different skyspark projects, changed time interval in the query; but everytime i am not able to resolve this error.
Brian FrankWed 28 Oct 2020
That is the local trace, not the remote trace. The remote trace will be in the response grid meta errTrace tag
Vipul VaidyaThu 29 Oct 2020
Hi Brian, Sorry for my ignorance, but i am not really sure how do i get the response grid meta errTrace Tag..do i extract this by querying using python? can you please guide me?
Chris BreederveldThu 29 Oct 2020
Hi Vipul, I'm not familiar with the python library, but in Axon you would use grid.meta()->errTrace, perhaps that helps you get in the right direction.
Vipul VaidyaThu 29 Oct 2020
HI,
I hope below is the response grid for meta error, with the error description (HaystackError: sys::NullErr: java.lang.NullPointerException)
/usr/local/lib/python3.6/dist-packages/pyhaystack/client/ops/grid.py in _check_err(grid)
Is there any other error trace we are looking for?
Vipul.
Chris BreederveldThu 29 Oct 2020
Hi Vipul, I'm missing the errTrace tag in your above code snippets, but let's try this a different way:
Are you trying to handle/log the exception in your code, are are you trying to debug the exception? If you are (currently) only interested in debugging the exception, perhaps you could try to run the query directly in SkySpark and see what the results are then?
If the SkySpark result is indeed a grid with the errTrace metadata, you can post that exact content here. Also perhaps debugging/logging the full result might give you some insight where the error is hiding in your response object.
Vipul VaidyaFri 30 Oct 2020
Yes, i am trying to debug the error in my python code. When i run the same/equivalent query in skyspark (read the history value of all zone temp sensors for today); i do not get any error message, the code runs successfully
It's worth noting that his_read_frame is a high-level abstraction that translates the native Grid format used by Haystack into a form more easily used in computations Python-side, notably for numpy integration.
Furthermore, there's also state machine logic that will either execute a multi-point hisRead operation (on servers that support it) or will issue multiple single-point hisRead operations for each point, and stitch the result sets together to form a "frame".
Stripping of the server-side stack trace is actually a design decision here. Emitting server-side stack traces to the client is somewhat frowned upon as it's "leaking" implementation details.
Leaking a NullPointerException immediately makes me think unhappy paths have not received good test coverage: not a good look.
Anyway, I digress…
You'll note that when generating the exception, that it passes that traceback object as an argument to the HaystackException:
from pyhaystack.exception import HaystackException
try:
op = session.his_read_frame(znt, rng='today')
op.wait()
b = op.result
except HaystackException as e:
print (e.traceback)
That might get you what you're after.
The other thing you might want to look at is enabling logging in the client:
Vipul Vaidya Tue 27 Oct 2020
Hi,
i am using pyhasystack in python and trying to read histories of all zone sensors in a single data frame (calling skyspark via python). this used to work before, but since a month or so, when trying to run command as per documentation, i get the java null pointer exception.
Error message- HaystackError: sys::NullErr: java.lang.NullPointerException
Can you please help?
Vipul.
Brian Frank Tue 27 Oct 2020
Can you provide more information about what your request looks like and also you should have a full stack trace in the response grid meta errTrace tag
Vipul Vaidya Tue 27 Oct 2020
Vipul Vaidya Tue 27 Oct 2020
also, just a side note-this query used to work perfectly fine a few months back and was not giving any error. Only recently i have begin to get this error. Have tried different skyspark projects, changed time interval in the query; but everytime i am not able to resolve this error.
Brian Frank Wed 28 Oct 2020
That is the local trace, not the remote trace. The remote trace will be in the response grid meta errTrace tag
Vipul Vaidya Thu 29 Oct 2020
Hi Brian, Sorry for my ignorance, but i am not really sure how do i get the response grid meta errTrace Tag..do i extract this by querying using python? can you please guide me?
Chris Breederveld Thu 29 Oct 2020
Hi Vipul, I'm not familiar with the python library, but in Axon you would use
grid.meta()->errTrace
, perhaps that helps you get in the right direction.Vipul Vaidya Thu 29 Oct 2020
HI,
I hope below is the response grid for meta error, with the error description (HaystackError: sys::NullErr: java.lang.NullPointerException)
/usr/local/lib/python3.6/dist-packages/pyhaystack/client/ops/grid.py in _check_err(grid)
--> 337 grid.metadata.get("traceback", None),
HaystackError: sys::NullErr: java.lang.NullPointerException
Is there any other error trace we are looking for?
Vipul.
Chris Breederveld Thu 29 Oct 2020
Hi Vipul, I'm missing the
errTrace
tag in your above code snippets, but let's try this a different way:Are you trying to handle/log the exception in your code, are are you trying to debug the exception? If you are (currently) only interested in debugging the exception, perhaps you could try to run the query directly in SkySpark and see what the results are then?
If the SkySpark result is indeed a grid with the errTrace metadata, you can post that exact content here. Also perhaps debugging/logging the full result might give you some insight where the error is hiding in your response object.
Vipul Vaidya Fri 30 Oct 2020
Yes, i am trying to debug the error in my python code. When i run the same/equivalent query in skyspark (read the history value of all zone temp sensors for today); i do not get any error message, the code runs successfully
Below Code executed successfully in SkySpark:
readAll(zone and temp and sensor).hisRead(today)
Chris Breederveld Mon 2 Nov 2020
Hi Vipul, I think it is clear then there is an issue with the library itself. Did you try contacting the maintainer via https://github.com/ChristianTremblay/pyhaystack/issues ?
Stuart Longland Mon 2 Nov 2020
Hi,
pyhaystack
contributor here,It's worth noting that
his_read_frame
is a high-level abstraction that translates the native Grid format used by Haystack into a form more easily used in computations Python-side, notably fornumpy
integration.Furthermore, there's also state machine logic that will either execute a multi-point
hisRead
operation (on servers that support it) or will issue multiple single-pointhisRead
operations for each point, and stitch the result sets together to form a "frame".If you're after a low-level
hisRead
, without the extra stuff, look no further than thehis_read
method. https://pyhaystack.readthedocs.io/en/latest/pyhaystack.client.html#pyhaystack.client.session.HaystackSession.his_readStripping of the server-side stack trace is actually a design decision here. Emitting server-side stack traces to the client is somewhat frowned upon as it's "leaking" implementation details.
Leaking a
NullPointerException
immediately makes me think unhappy paths have not received good test coverage: not a good look.Anyway, I digress…
You'll note that when generating the exception, that it passes that
traceback
object as an argument to theHaystackException
:https://github.com/ChristianTremblay/pyhaystack/blob/master/pyhaystack/client/ops/grid.py#L337
If you catch this exception, you'll find that trace-back is preserved as the
traceback
attribute on the exception:https://github.com/ChristianTremblay/pyhaystack/blob/3c3508212c0f5a4e5f254fed4d169da91f03242d/pyhaystack/exception.py#L8
That might get you what you're after.
The other thing you might want to look at is enabling logging in the client:
https://github.com/ChristianTremblay/pyhaystack/issues/89#issuecomment-657866097 has some example set-up code for doing that.