Merge "Use "SHOW TAG KEYS/VALUES" for list dim names and values"
This commit is contained in:
commit
2cccdcb778
|
@ -66,7 +66,6 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
||||||
'''Initialize function for InfluxDB serie builders < v0.11.0
|
'''Initialize function for InfluxDB serie builders < v0.11.0
|
||||||
'''
|
'''
|
||||||
LOG.info('Initialize InfluxDB serie builders < v0.11.0')
|
LOG.info('Initialize InfluxDB serie builders < v0.11.0')
|
||||||
self._build_serie_dimension_names = self._build_serie_dimension_names_to_v0_11_0
|
|
||||||
self._build_serie_dimension_values = self._build_serie_dimension_values_to_v0_11_0
|
self._build_serie_dimension_values = self._build_serie_dimension_values_to_v0_11_0
|
||||||
self._build_serie_metric_list = self._build_serie_metric_list_to_v0_11_0
|
self._build_serie_metric_list = self._build_serie_metric_list_to_v0_11_0
|
||||||
|
|
||||||
|
@ -76,7 +75,6 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
||||||
https://github.com/influxdata/influxdb/blob/master/CHANGELOG.md#v0110-2016-03-22
|
https://github.com/influxdata/influxdb/blob/master/CHANGELOG.md#v0110-2016-03-22
|
||||||
'''
|
'''
|
||||||
LOG.info('Initialize InfluxDB serie builders >= v0.11.0')
|
LOG.info('Initialize InfluxDB serie builders >= v0.11.0')
|
||||||
self._build_serie_dimension_names = self._build_serie_dimension_names_from_v0_11_0
|
|
||||||
self._build_serie_dimension_values = self._build_serie_dimension_values_from_v0_11_0
|
self._build_serie_dimension_values = self._build_serie_dimension_values_from_v0_11_0
|
||||||
self._build_serie_metric_list = self._build_serie_metric_list_from_v0_11_0
|
self._build_serie_metric_list = self._build_serie_metric_list_from_v0_11_0
|
||||||
|
|
||||||
|
@ -130,6 +128,32 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
||||||
|
|
||||||
return query
|
return query
|
||||||
|
|
||||||
|
def _build_show_tag_values_query(self, metric_name, dimension_name,
|
||||||
|
tenant_id, region):
|
||||||
|
from_with_clause = ''
|
||||||
|
if metric_name:
|
||||||
|
from_with_clause += ' from "{}"'.format(metric_name)
|
||||||
|
|
||||||
|
if dimension_name:
|
||||||
|
from_with_clause += ' with key = {}'.format(dimension_name)
|
||||||
|
|
||||||
|
where_clause = self._build_where_clause(None, None, tenant_id, region)
|
||||||
|
|
||||||
|
query = 'show tag values' + from_with_clause + where_clause
|
||||||
|
|
||||||
|
return query
|
||||||
|
|
||||||
|
def _build_show_tag_keys_query(self, metric_name, tenant_id, region):
|
||||||
|
from_with_clause = ''
|
||||||
|
if metric_name:
|
||||||
|
from_with_clause += ' from "{}"'.format(metric_name)
|
||||||
|
|
||||||
|
where_clause = self._build_where_clause(None, None, tenant_id, region)
|
||||||
|
|
||||||
|
query = 'show tag keys' + from_with_clause + where_clause
|
||||||
|
|
||||||
|
return query
|
||||||
|
|
||||||
def _build_select_measurement_query(self, dimensions, name, tenant_id,
|
def _build_select_measurement_query(self, dimensions, name, tenant_id,
|
||||||
region, start_timestamp, end_timestamp,
|
region, start_timestamp, end_timestamp,
|
||||||
offset, group_by, limit):
|
offset, group_by, limit):
|
||||||
|
@ -284,7 +308,7 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
||||||
raise exceptions.RepositoryException(ex)
|
raise exceptions.RepositoryException(ex)
|
||||||
|
|
||||||
def _build_serie_dimension_values_to_v0_11_0(self, series_names, dimension_name):
|
def _build_serie_dimension_values_to_v0_11_0(self, series_names, dimension_name):
|
||||||
dim_values = []
|
dim_value_set = set()
|
||||||
json_dim_value_list = []
|
json_dim_value_list = []
|
||||||
|
|
||||||
if not series_names:
|
if not series_names:
|
||||||
|
@ -294,27 +318,22 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
||||||
if not dimension_name:
|
if not dimension_name:
|
||||||
return json_dim_value_list
|
return json_dim_value_list
|
||||||
|
|
||||||
if 'series' in series_names.raw:
|
for series in series_names.raw['series']:
|
||||||
for series in series_names.raw['series']:
|
if 'columns' not in series:
|
||||||
for tag_values in series[u'values']:
|
continue
|
||||||
|
if u'values' not in series:
|
||||||
|
continue
|
||||||
|
for value in series[u'values']:
|
||||||
|
dim_value_set.add(value[0])
|
||||||
|
|
||||||
dims = {
|
for value in dim_value_set:
|
||||||
name: value
|
json_dim_value_list.append({u'dimension_value': value})
|
||||||
for name, value in zip(series[u'columns'], tag_values)
|
|
||||||
if value and not name.startswith(u'_')
|
|
||||||
}
|
|
||||||
|
|
||||||
if dimension_name in dims and dims[dimension_name] not in\
|
|
||||||
dim_values:
|
|
||||||
dim_values.append(dims[dimension_name])
|
|
||||||
json_dim_value_list.append({u'dimension_value':
|
|
||||||
dims[dimension_name]})
|
|
||||||
|
|
||||||
json_dim_value_list = sorted(json_dim_value_list)
|
json_dim_value_list = sorted(json_dim_value_list)
|
||||||
return json_dim_value_list
|
return json_dim_value_list
|
||||||
|
|
||||||
def _build_serie_dimension_values_from_v0_11_0(self, series_names, dimension_name):
|
def _build_serie_dimension_values_from_v0_11_0(self, series_names, dimension_name):
|
||||||
'''In InfluxDB v0.11.0 the SHOW SERIES output changed.
|
'''In InfluxDB v0.11.0 the SHOW TAG VALUES output changed.
|
||||||
See, https://github.com/influxdata/influxdb/blob/master/CHANGELOG.md#v0110-2016-03-22
|
See, https://github.com/influxdata/influxdb/blob/master/CHANGELOG.md#v0110-2016-03-22
|
||||||
'''
|
'''
|
||||||
dim_value_set = set()
|
dim_value_set = set()
|
||||||
|
@ -333,23 +352,13 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
||||||
columns = series['columns']
|
columns = series['columns']
|
||||||
if 'key' not in columns:
|
if 'key' not in columns:
|
||||||
continue
|
continue
|
||||||
key_index = columns.index('key')
|
|
||||||
if u'values' not in series:
|
if u'values' not in series:
|
||||||
continue
|
continue
|
||||||
for value in series[u'values']:
|
for value in series[u'values']:
|
||||||
split_value = value[key_index].split(',')
|
if len(value) < 2:
|
||||||
if len(split_value) < 2:
|
|
||||||
continue
|
continue
|
||||||
for tag in split_value[1:]:
|
for tag in value[1:]:
|
||||||
tag_key_value = tag.split('=')
|
dim_value_set.add(tag)
|
||||||
if len(tag_key_value) != 2:
|
|
||||||
continue
|
|
||||||
tag_key = tag_key_value[0]
|
|
||||||
tag_value = tag_key_value[1]
|
|
||||||
if tag_key.startswith(u'_'):
|
|
||||||
continue
|
|
||||||
if tag_key == dimension_name:
|
|
||||||
dim_value_set.add(tag_value)
|
|
||||||
|
|
||||||
for value in dim_value_set:
|
for value in dim_value_set:
|
||||||
json_dim_value_list.append({u'dimension_value': value})
|
json_dim_value_list.append({u'dimension_value': value})
|
||||||
|
@ -357,27 +366,7 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
||||||
json_dim_value_list = sorted(json_dim_value_list)
|
json_dim_value_list = sorted(json_dim_value_list)
|
||||||
return json_dim_value_list
|
return json_dim_value_list
|
||||||
|
|
||||||
def _build_serie_dimension_names_to_v0_11_0(self, series_names):
|
def _build_serie_dimension_names(self, series_names):
|
||||||
dim_names = []
|
|
||||||
json_dim_name_list = []
|
|
||||||
if not series_names:
|
|
||||||
return json_dim_name_list
|
|
||||||
if 'series' not in series_names.raw:
|
|
||||||
return json_dim_name_list
|
|
||||||
|
|
||||||
for series in series_names.raw['series']:
|
|
||||||
for name in series[u'columns']:
|
|
||||||
if name not in dim_names and not name.startswith(u'_'):
|
|
||||||
dim_names.append(name)
|
|
||||||
json_dim_name_list.append({u'dimension_name': name})
|
|
||||||
|
|
||||||
json_dim_name_list = sorted(json_dim_name_list)
|
|
||||||
return json_dim_name_list
|
|
||||||
|
|
||||||
def _build_serie_dimension_names_from_v0_11_0(self, series_names):
|
|
||||||
'''In InfluxDB v0.11.0 the SHOW SERIES output changed.
|
|
||||||
See, https://github.com/influxdata/influxdb/blob/master/CHANGELOG.md#v0110-2016-03-22
|
|
||||||
'''
|
|
||||||
dim_name_set = set()
|
dim_name_set = set()
|
||||||
json_dim_name_list = []
|
json_dim_name_list = []
|
||||||
|
|
||||||
|
@ -389,24 +378,13 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
||||||
for series in series_names.raw['series']:
|
for series in series_names.raw['series']:
|
||||||
if 'columns' not in series:
|
if 'columns' not in series:
|
||||||
continue
|
continue
|
||||||
columns = series['columns']
|
|
||||||
if 'key' not in columns:
|
|
||||||
continue
|
|
||||||
key_index = columns.index('key')
|
|
||||||
if u'values' not in series:
|
if u'values' not in series:
|
||||||
continue
|
continue
|
||||||
for value in series[u'values']:
|
for value in series[u'values']:
|
||||||
split_value = value[key_index].split(',')
|
tag_key = value[0]
|
||||||
if len(split_value) < 2:
|
if tag_key.startswith(u'_'):
|
||||||
continue
|
continue
|
||||||
for tag in split_value[1:]:
|
dim_name_set.add(tag_key)
|
||||||
tag_key_value = tag.split('=')
|
|
||||||
if len(tag_key_value) < 2:
|
|
||||||
continue
|
|
||||||
tag_key = tag_key_value[0]
|
|
||||||
if tag_key.startswith(u'_'):
|
|
||||||
continue
|
|
||||||
dim_name_set.add(tag_key)
|
|
||||||
|
|
||||||
for name in dim_name_set:
|
for name in dim_name_set:
|
||||||
json_dim_name_list.append({u'dimension_name': name})
|
json_dim_name_list.append({u'dimension_name': name})
|
||||||
|
@ -897,8 +875,9 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
||||||
def list_dimension_values(self, tenant_id, region, metric_name,
|
def list_dimension_values(self, tenant_id, region, metric_name,
|
||||||
dimension_name):
|
dimension_name):
|
||||||
try:
|
try:
|
||||||
query = self._build_show_series_query(None, metric_name,
|
query = self._build_show_tag_values_query(metric_name,
|
||||||
tenant_id, region)
|
dimension_name,
|
||||||
|
tenant_id, region)
|
||||||
result = self.influxdb_client.query(query)
|
result = self.influxdb_client.query(query)
|
||||||
json_dim_name_list = self._build_serie_dimension_values(
|
json_dim_name_list = self._build_serie_dimension_values(
|
||||||
result, dimension_name)
|
result, dimension_name)
|
||||||
|
@ -909,8 +888,8 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
||||||
|
|
||||||
def list_dimension_names(self, tenant_id, region, metric_name):
|
def list_dimension_names(self, tenant_id, region, metric_name):
|
||||||
try:
|
try:
|
||||||
query = self._build_show_series_query(None, metric_name,
|
query = self._build_show_tag_keys_query(metric_name,
|
||||||
tenant_id, region)
|
tenant_id, region)
|
||||||
result = self.influxdb_client.query(query)
|
result = self.influxdb_client.query(query)
|
||||||
json_dim_name_list = self._build_serie_dimension_names(result)
|
json_dim_name_list = self._build_serie_dimension_names(result)
|
||||||
return json_dim_name_list
|
return json_dim_name_list
|
||||||
|
|
|
@ -134,18 +134,12 @@ class TestRepoMetricsInfluxDB(unittest.TestCase):
|
||||||
def test_list_dimension_values(self, influxdb_client_mock):
|
def test_list_dimension_values(self, influxdb_client_mock):
|
||||||
mock_client = influxdb_client_mock.return_value
|
mock_client = influxdb_client_mock.return_value
|
||||||
mock_client.query.return_value.raw = {
|
mock_client.query.return_value.raw = {
|
||||||
u'series': [{
|
u'series': [
|
||||||
u'values': [[
|
{
|
||||||
u'custom_metric,_region=useast,_tenant_id=38dc2a2549f94d2e9a4fa1cc45a4970c,'
|
u'values': [[u'custom_host']],
|
||||||
u'hostname=custom_host,service=custom_service',
|
u'name': u'custom_metric',
|
||||||
u'useast',
|
u'columns': [u'hostname']
|
||||||
u'38dc2a2549f94d2e9a4fa1cc45a4970c',
|
}]
|
||||||
u'custom_host',
|
|
||||||
u'custom_service'
|
|
||||||
]],
|
|
||||||
u'name': u'custom_metric',
|
|
||||||
u'columns': [u'_key', u'_region', u'_tenant_id', u'hostname', u'service']
|
|
||||||
}]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
repo = influxdb_repo.MetricsRepository()
|
repo = influxdb_repo.MetricsRepository()
|
||||||
|
@ -163,16 +157,10 @@ class TestRepoMetricsInfluxDB(unittest.TestCase):
|
||||||
mock_client = influxdb_client_mock.return_value
|
mock_client = influxdb_client_mock.return_value
|
||||||
mock_client.query.return_value.raw = {
|
mock_client.query.return_value.raw = {
|
||||||
u'series': [{
|
u'series': [{
|
||||||
u'values': [[
|
u'values': [[u'_region'], [u'_tenant_id'], [u'hostname'],
|
||||||
u'custom_metric,_region=useast,_tenant_id=38dc2a2549f94d2e9a4fa1cc45a4970c,'
|
[u'service']],
|
||||||
u'hostname=custom_host,service=custom_service',
|
|
||||||
u'useast',
|
|
||||||
u'38dc2a2549f94d2e9a4fa1cc45a4970c',
|
|
||||||
u'custom_host',
|
|
||||||
u'custom_service'
|
|
||||||
]],
|
|
||||||
u'name': u'custom_metric',
|
u'name': u'custom_metric',
|
||||||
u'columns': [u'_key', u'_region', u'_tenant_id', u'hostname', u'service']
|
u'columns': [u'tagKey']
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue