115 lines
4.5 KiB
Python
115 lines
4.5 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')
|
|
|
|
@staticmethod
|
|
def process_response(resp):
|
|
try:
|
|
res = json.loads(resp.text)
|
|
except Exception:
|
|
raise opentsdbclient.OpenTSDBError(resp.text)
|
|
|
|
if 'error' in res:
|
|
raise opentsdbclient.OpenTSDBError(res['error'])
|
|
|
|
return res
|