python-opentsdbclient/opentsdbclient/rest/client.py

114 lines
4.4 KiB
Python

# Copyright 2014: Mirantis Inc.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import json
import requests
import opentsdbclient
from opentsdbclient import base
from opentsdbclient.rest import utils
class RESTOpenTSDBClient(base.BaseOpenTSDBClient):
def get_statistics(self):
"""Get info about what metrics are registered and with what stats."""
req = requests.get(utils.STATS_TEMPL % {'host': self.hosts[0][0],
'port': self.hosts[0][1]})
return req
def put_meter(self, meters):
"""Post new meter(s) to the database.
Meter dictionary *should* contain the following four required fields:
- metric: the name of the metric you are storing
- timestamp: a Unix epoch style timestamp in seconds or milliseconds.
The timestamp must not contain non-numeric characters.
- value: the value to record for this data point. It may be quoted or
not quoted and must conform to the OpenTSDB value rules.
- tags: a map of tag name/tag value pairs. At least one pair must be
supplied.
"""
res = []
meters = self._check_meters(meters)
for meter_dict in meters:
req = requests.post(utils.PUT_TEMPL %
{'host': self.hosts[0][0],
'port': self.hosts[0][1]},
data=json.dumps(meter_dict))
res.append(req)
return res
def define_retention(self, tsuid, retention_days):
"""Set retention days for the defined by ID timeseries.
##########################################################
NOTE: currently not working directly through the REST API.
that should be done directly on the HBase level.
##########################################################
:param tsuid: hexadecimal representation of the timeseries UID
:param retention_days: number of days of data points to retain for the
given timeseries. When set to 0, the default,
data is retained indefinitely.
"""
meta_data = {'tsuid': tsuid, 'retention': retention_days}
req = requests.post(utils.META_TEMPL % {'host': self.hosts[0][0],
'port': self.hosts[0][1],
'tsuid': tsuid},
data=json.dumps(meta_data))
return req
def get_aggregators(self):
"""Used to get the list of default aggregation functions."""
req = requests.get(utils.AGGR_TEMPL % {'host': self.hosts[0][0],
'port': self.hosts[0][1]})
return req
def get_version(self):
"""Used to check OpenTSDB version.
That might be needed in case of unknown bugs - this code is written
only for the 2.x REST API version, so some of the failures might refer
to the wrong OpenTSDB version installed.
"""
req = requests.get(utils.VERSION_TEMPL % {'host': self.hosts[0][0],
'port': self.hosts[0][1]})
return req
def _make_query(self, query, verb):
meth = getattr(requests, verb.lower(), None)
if meth is None:
pass
req = meth(utils.QUERY_TEMPL % {'host': self.hosts[0][0],
'port': self.hosts[0][1],
'query': query})
return req
def get_query(self, query):
return self._make_query(query, 'get')
def process_response(self, resp):
try:
res = json.loads(resp.text)
except Exception:
raise opentsdbclient.OpenTSDBError(resp.text)
if 'errors' in res:
raise opentsdbclient.OpenTSDBError(res['error'])
return res