1313from . import exceptions
1414
1515_LOGGER = logging .getLogger (__name__ )
16- _RESOURCE = 'http://{host}:{port}/api/v{api}/data?chart={resource}&{realtime}'
17- _REALTIME = 'before=0&after=-1&options=seconds'
16+ _INSTANCE = 'http://{host}:{port}/api/v{api}/'
17+ _DATA_ENDPOINT = 'data?chart={resource}&before=0&after=-1&options=seconds'
18+ _ALARMS_ENDPOINT = 'alarms?all&format=json'
19+ _ALL_METRIC_ENDPOINT = ('allmetrics?format=json&help=no&types=no&'
20+ 'timestamps=yes&names=yes&data=average' )
1821
1922API_VERSION = 1
2023
2124
2225class Netdata (object ):
2326 """A class for handling connections with a Netdata instance."""
2427
25- def __init__ (self , host , resource , loop , session , port = 19999 ):
28+ def __init__ (self , host , loop , session , port = 19999 , data = None ):
2629 """Initialize the connection to the Netdata instance."""
2730 self ._loop = loop
2831 self ._session = session
2932 self .host = host
3033 self .port = port
31- self .resource = resource
32- self .values = None
34+ self .values = self .alarms = self .metrics = None
35+ self .base_url = _INSTANCE .format (host = host , port = port , api = API_VERSION )
36+ if data is None :
37+ self .endpoint = _ALL_METRIC_ENDPOINT
38+ if data == 'alarms' :
39+ self .endpoint = _ALARMS_ENDPOINT
40+ if data == 'data' :
41+ self .endpoint = _DATA_ENDPOINT
3342
34- async def async_get_data (self ):
35- url = _RESOURCE . format (
36- host = self . host , port = self . port , api = API_VERSION ,
37- resource = self .resource , realtime = _REALTIME )
43+ async def get_data (self , resource ):
44+ """Get detail for a resource from the data endpoint."""
45+ url = '{}{}' . format (
46+ self .base_url , self . endpoint . format ( resource = resource ) )
3847
3948 try :
4049 with async_timeout .timeout (5 , loop = self ._loop ):
4150 response = await self ._session .get (url )
4251
43- _LOGGER .debug (
52+ _LOGGER .info (
4453 "Response from Netdata: %s" , response .status )
4554 data = await response .json ()
4655 _LOGGER .debug (data )
@@ -50,3 +59,39 @@ async def async_get_data(self):
5059 except (asyncio .TimeoutError , aiohttp .ClientError , socket .gaierror ):
5160 _LOGGER .error ("Can not load data from Netdata" )
5261 raise exceptions .NetdataConnectionError ()
62+
63+ async def get_alarms (self ):
64+ """Get alarms for a Netdata instance."""
65+ url = '{}{}' .format (self .base_url , self .endpoint )
66+
67+ try :
68+ with async_timeout .timeout (5 , loop = self ._loop ):
69+ response = await self ._session .get (url )
70+
71+ _LOGGER .debug (
72+ "Response from Netdata: %s" , response .status )
73+ data = await response .text ()
74+ _LOGGER .debug (data )
75+ self .alarms = data
76+
77+ except (asyncio .TimeoutError , aiohttp .ClientError , socket .gaierror ):
78+ _LOGGER .error ("Can not load data from Netdata" )
79+ raise exceptions .NetdataConnectionError ()
80+
81+ async def get_allmetrics (self ):
82+ """Get all available metrics from a Netdata instance."""
83+ url = '{}{}' .format (self .base_url , self .endpoint )
84+
85+ try :
86+ with async_timeout .timeout (5 , loop = self ._loop ):
87+ response = await self ._session .get (url )
88+
89+ _LOGGER .debug (
90+ "Response from Netdata: %s" , response .status )
91+ data = await response .json ()
92+ _LOGGER .debug (data )
93+ self .metrics = data
94+
95+ except (asyncio .TimeoutError , aiohttp .ClientError , socket .gaierror ):
96+ _LOGGER .error ("Can not load data from Netdata" )
97+ raise exceptions .NetdataConnectionError ()
0 commit comments