i try to run an script to monitor elastic but when i add sensor i get the error :
| XML: Structural error in xml file, 1 open items. -- JSON: The returned JSON does not match the expected structure (Invalid JSON.). (code: PE231) |
my script is :
import requests
import json
import sys
from paepy.ChannelDefinition import CustomSensorResult
if __name__ == '__main__':
#load the prtg parameters into a dictionary and make call to ES host
data = json.loads(sys.argv[1])
url = 'http://{elastic server IP}:9200/_cluster/health'.format(data['host'])
req = requests.get(url)
#load the json response into a dictionary
output = json.loads(req.text)
#Turn status color into a number so that it can be viewed in prtg
if output['status'] == 'green':
status = 0
elif output['status'] == 'yellow':
status = 1
elif output['status'] == 'red':
status = 2
#turn timed out into a number so that it can be viewed in prtg
if output['timed_out'] == False:
timedOut = 0
else:
timedOut = 1
#create a prtg sensor and add the channel data. Each key/value in the json response from ES gets channelized
sensor = CustomSensorResult(output['status'])
sensor.add_channel(channel_name='Status',unit='Count',value=status,is_limit_mode=True,limit_max_error=1.5,limit_max_warning=0.5)
sensor.add_channel(channel_name='Number Of Data Nodes',unit='Count',value=output['number_of_data_nodes'])
sensor.add_channel(channel_name='Number of Nodes',unit='Count',value=output['number_of_nodes'])
sensor.add_channel(channel_name='Percent of Shards Active',unit='Percent',value=output['active_shards_percent_as_number'])
sensor.add_channel(channel_name='Delayed Unassigned Shards',unit='Count',value=output['delayed_unassigned_shards'])
sensor.add_channel(channel_name='In Flight Fetches',unit='Count',value=output['number_of_in_flight_fetch'])
sensor.add_channel(channel_name='Relocating Shards',unit='Count',value=output['relocating_shards'])
sensor.add_channel(channel_name='Pending Tasks',unit='Count',value=output['number_of_pending_tasks'])
sensor.add_channel(channel_name='Initializing Shards',unit='Count',value=output['initializing_shards'])
sensor.add_channel(channel_name='Unassigned Shards',unit='Count',value=output['unassigned_shards'])
sensor.add_channel(channel_name='Task Queue Time (max)',unit='Milliseconds',value=output['task_max_waiting_in_queue_millis'])
sensor.add_channel(channel_name='Timed Out',unit='Count',value=timedOut,is_limit_mode=True,limit_max_error=0.5,limit_error_msg='Timed Out = True')
#send the sensor data back to the prtg process in json format
print(sensor.get_json_result())
Please Help...
Article Comments
XML: Structural error in xml file, 1 open items. -- JSON: The returned JSON does not match the expected structure (Invalid JSON.). (code: PE231)
Jul, 2018 - Permalink
When you execute the script using python, what's that output saying? Something like this:
C:\Program Files (x86)\PRTG Network Monitor\Python34\python.exe <path-to-python-script>
Jul, 2018 - Permalink
Traceback (most recent call last): File "c:\elasticprtg.py", line 10, in <module> data = json.loads(sys.argv[1]) IndexError: list index out of range
Jul, 2018 - Permalink
Hold on, is the script really saying {elastic server IP} in the URL? You probably want to modify that. Additionally, you might need to pass the host to the script:
C:\Program Files (x86)\PRTG Network Monitor\Python34\python.exe <path-to-python-script> <host>
edit sorry for the late reply, this somehow got posted into another thread instead of this one.
Kind regards,
Stephan Linke, Tech Support Team
Jul, 2018 - Permalink
From the PRTG version 20.3.61.1649 and above, PRTG use the new Python 3.7 distribution because the end-of-life Python 3.4. For more information please read this page: https://helpdesk.paessler.com/en/support/solutions/articles/76000063532-after-updating-to-prtg-20-1-55-my-python-script-advanced-sensors-are-down You need to update the script with new library
import requests
import json
import sys
from prtg.sensor.result import CustomSensorResult
from prtg.sensor.units import ValueUnit
if __name__ == '__main__':
#load the prtg parameters into a dictionary and make call to ES host
data = json.loads(sys.argv[1])
url = 'http://{elastic server IP}:9200/_cluster/health'
req = requests.get(url)
#load the json response into a dictionary
output = json.loads(req.text)
#Turn status color into a number so that it can be viewed in prtg
if output['status'] == 'green':
status = 0
elif output['status'] == 'yellow':
status = 1
elif output['status'] == 'red':
status = 2
#turn timed out into a number so that it can be viewed in prtg
if output['timed_out'] == False:
timedOut = 0
else:
timedOut = 1
#create a prtg sensor and add the channel data. Each key/value in the json response from ES gets channelized
sensor = CustomSensorResult(output['status'])
sensor.add_channel(name='Status',unit='Count',value=status,is_limit_mode=True,limit_max_error=1.5,limit_max_warning=0.5)
sensor.add_channel(name='Number Of Data Nodes',unit='Count',value=output['number_of_data_nodes'])
sensor.add_channel(name='Number of Nodes',unit='Count',value=output['number_of_nodes'])
sensor.add_channel(name='Percent of Shards Active',unit='Percent',value=output['active_shards_percent_as_number'])
sensor.add_channel(name='Delayed Unassigned Shards',unit='Count',value=output['delayed_unassigned_shards'])
sensor.add_channel(name='In Flight Fetches',unit='Count',value=output['number_of_in_flight_fetch'])
sensor.add_channel(name='Relocating Shards',unit='Count',value=output['relocating_shards'])
sensor.add_channel(name='Pending Tasks',unit='Count',value=output['number_of_pending_tasks'])
sensor.add_channel(name='Initializing Shards',unit='Count',value=output['initializing_shards'])
sensor.add_channel(name='Unassigned Shards',unit='Count',value=output['unassigned_shards'])
sensor.add_channel(name='Task Queue Time (max)',unit='Milliseconds',value=output['task_max_waiting_in_queue_millis'])
sensor.add_channel(name='Timed Out',unit='Count',value=timedOut,is_limit_mode=True,limit_max_error=0.5,limit_error_msg='Timed Out = True')
#send the sensor data back to the prtg process in json format
print(sensor.json_result)
Oct, 2020 - Permalink
What does the actual output look like?
Kind regards,
Stephan Linke, Tech Support Team
Jul, 2018 - Permalink