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
|
||||
'''
|
||||
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_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
|
||||
'''
|
||||
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_metric_list = self._build_serie_metric_list_from_v0_11_0
|
||||
|
||||
|
@ -130,6 +128,32 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
|||
|
||||
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,
|
||||
region, start_timestamp, end_timestamp,
|
||||
offset, group_by, limit):
|
||||
|
@ -284,7 +308,7 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
|||
raise exceptions.RepositoryException(ex)
|
||||
|
||||
def _build_serie_dimension_values_to_v0_11_0(self, series_names, dimension_name):
|
||||
dim_values = []
|
||||
dim_value_set = set()
|
||||
json_dim_value_list = []
|
||||
|
||||
if not series_names:
|
||||
|
@ -294,27 +318,22 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
|||
if not dimension_name:
|
||||
return json_dim_value_list
|
||||
|
||||
if 'series' in series_names.raw:
|
||||
for series in series_names.raw['series']:
|
||||
for tag_values in series[u'values']:
|
||||
for series in series_names.raw['series']:
|
||||
if 'columns' not in series:
|
||||
continue
|
||||
if u'values' not in series:
|
||||
continue
|
||||
for value in series[u'values']:
|
||||
dim_value_set.add(value[0])
|
||||
|
||||
dims = {
|
||||
name: 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]})
|
||||
for value in dim_value_set:
|
||||
json_dim_value_list.append({u'dimension_value': value})
|
||||
|
||||
json_dim_value_list = sorted(json_dim_value_list)
|
||||
return json_dim_value_list
|
||||
|
||||
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
|
||||
'''
|
||||
dim_value_set = set()
|
||||
|
@ -333,23 +352,13 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
|||
columns = series['columns']
|
||||
if 'key' not in columns:
|
||||
continue
|
||||
key_index = columns.index('key')
|
||||
if u'values' not in series:
|
||||
continue
|
||||
for value in series[u'values']:
|
||||
split_value = value[key_index].split(',')
|
||||
if len(split_value) < 2:
|
||||
if len(value) < 2:
|
||||
continue
|
||||
for tag in split_value[1:]:
|
||||
tag_key_value = tag.split('=')
|
||||
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 tag in value[1:]:
|
||||
dim_value_set.add(tag)
|
||||
|
||||
for value in dim_value_set:
|
||||
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)
|
||||
return json_dim_value_list
|
||||
|
||||
def _build_serie_dimension_names_to_v0_11_0(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
|
||||
'''
|
||||
def _build_serie_dimension_names(self, series_names):
|
||||
dim_name_set = set()
|
||||
json_dim_name_list = []
|
||||
|
||||
|
@ -389,24 +378,13 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
|||
for series in series_names.raw['series']:
|
||||
if 'columns' not in series:
|
||||
continue
|
||||
columns = series['columns']
|
||||
if 'key' not in columns:
|
||||
continue
|
||||
key_index = columns.index('key')
|
||||
if u'values' not in series:
|
||||
continue
|
||||
for value in series[u'values']:
|
||||
split_value = value[key_index].split(',')
|
||||
if len(split_value) < 2:
|
||||
tag_key = value[0]
|
||||
if tag_key.startswith(u'_'):
|
||||
continue
|
||||
for tag in split_value[1:]:
|
||||
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)
|
||||
dim_name_set.add(tag_key)
|
||||
|
||||
for name in dim_name_set:
|
||||
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,
|
||||
dimension_name):
|
||||
try:
|
||||
query = self._build_show_series_query(None, metric_name,
|
||||
tenant_id, region)
|
||||
query = self._build_show_tag_values_query(metric_name,
|
||||
dimension_name,
|
||||
tenant_id, region)
|
||||
result = self.influxdb_client.query(query)
|
||||
json_dim_name_list = self._build_serie_dimension_values(
|
||||
result, dimension_name)
|
||||
|
@ -909,8 +888,8 @@ class MetricsRepository(metrics_repository.AbstractMetricsRepository):
|
|||
|
||||
def list_dimension_names(self, tenant_id, region, metric_name):
|
||||
try:
|
||||
query = self._build_show_series_query(None, metric_name,
|
||||
tenant_id, region)
|
||||
query = self._build_show_tag_keys_query(metric_name,
|
||||
tenant_id, region)
|
||||
result = self.influxdb_client.query(query)
|
||||
json_dim_name_list = self._build_serie_dimension_names(result)
|
||||
return json_dim_name_list
|
||||
|
|
|
@ -134,18 +134,12 @@ class TestRepoMetricsInfluxDB(unittest.TestCase):
|
|||
def test_list_dimension_values(self, influxdb_client_mock):
|
||||
mock_client = influxdb_client_mock.return_value
|
||||
mock_client.query.return_value.raw = {
|
||||
u'series': [{
|
||||
u'values': [[
|
||||
u'custom_metric,_region=useast,_tenant_id=38dc2a2549f94d2e9a4fa1cc45a4970c,'
|
||||
u'hostname=custom_host,service=custom_service',
|
||||
u'useast',
|
||||
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']
|
||||
}]
|
||||
u'series': [
|
||||
{
|
||||
u'values': [[u'custom_host']],
|
||||
u'name': u'custom_metric',
|
||||
u'columns': [u'hostname']
|
||||
}]
|
||||
}
|
||||
|
||||
repo = influxdb_repo.MetricsRepository()
|
||||
|
@ -163,16 +157,10 @@ class TestRepoMetricsInfluxDB(unittest.TestCase):
|
|||
mock_client = influxdb_client_mock.return_value
|
||||
mock_client.query.return_value.raw = {
|
||||
u'series': [{
|
||||
u'values': [[
|
||||
u'custom_metric,_region=useast,_tenant_id=38dc2a2549f94d2e9a4fa1cc45a4970c,'
|
||||
u'hostname=custom_host,service=custom_service',
|
||||
u'useast',
|
||||
u'38dc2a2549f94d2e9a4fa1cc45a4970c',
|
||||
u'custom_host',
|
||||
u'custom_service'
|
||||
]],
|
||||
u'values': [[u'_region'], [u'_tenant_id'], [u'hostname'],
|
||||
[u'service']],
|
||||
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