Init commit
Copied source: https://github.com/braedon/prometheus-es-exporter
with last commit: 05c52723859bfcc2fa2f9614743ac3f9380f4f64
Related-bug: PROD-27906 (PROD:27906)
Change-Id: I264c92d794c4554303873231a72284a24f2c55b1
(cherry picked from commit a16d07eaa4db83da68a1dcb1f301913fa94cb9f7)
diff --git a/prometheus_es_exporter/parser.py b/prometheus_es_exporter/parser.py
new file mode 100644
index 0000000..9ec59fe
--- /dev/null
+++ b/prometheus_es_exporter/parser.py
@@ -0,0 +1,90 @@
+from collections import OrderedDict
+
+
+def parse_buckets(agg_key, buckets, metric=None, labels=None):
+ if metric is None:
+ metric = []
+ if labels is None:
+ labels = OrderedDict()
+
+ result = []
+
+ for index, bucket in enumerate(buckets):
+ labels_next = labels.copy()
+
+ if 'key' in bucket.keys():
+ bucket_key = str(bucket['key'])
+ if agg_key in labels_next.keys():
+ labels_next[agg_key] = labels_next[agg_key] + [bucket_key]
+ else:
+ labels_next[agg_key] = [bucket_key]
+ del bucket['key']
+ else:
+ bucket_key = 'filter_' + str(index)
+ if agg_key in labels_next.keys():
+ labels_next[agg_key] = labels_next[agg_key] + [bucket_key]
+ else:
+ labels_next[agg_key] = [bucket_key]
+
+ result.extend(parse_agg(bucket_key, bucket, metric=metric, labels=labels_next))
+
+ return result
+
+
+def parse_buckets_fixed(agg_key, buckets, metric=None, labels=None):
+ if metric is None:
+ metric = []
+ if labels is None:
+ labels = OrderedDict()
+
+ result = []
+
+ for bucket_key, bucket in buckets.items():
+ labels_next = labels.copy()
+
+ if agg_key in labels_next.keys():
+ labels_next[agg_key] = labels_next[agg_key] + [bucket_key]
+ else:
+ labels_next[agg_key] = [bucket_key]
+
+ result.extend(parse_agg(bucket_key, bucket, metric=metric, labels=labels_next))
+
+ return result
+
+
+def parse_agg(agg_key, agg, metric=None, labels=None):
+ if metric is None:
+ metric = []
+ if labels is None:
+ labels = OrderedDict()
+
+ result = []
+
+ for key, value in agg.items():
+ if key == 'buckets' and isinstance(value, list):
+ result.extend(parse_buckets(agg_key, value, metric=metric, labels=labels))
+ elif key == 'buckets' and isinstance(value, dict):
+ result.extend(parse_buckets_fixed(agg_key, value, metric=metric, labels=labels))
+ elif isinstance(value, dict):
+ result.extend(parse_agg(key, value, metric=metric + [key], labels=labels))
+ else:
+ result.append((metric + [key], labels, value))
+
+ return result
+
+
+def parse_response(response, metric=None):
+ if metric is None:
+ metric = []
+
+ result = []
+
+ if not response['timed_out']:
+ result.append((metric + ['hits'], {}, response['hits']['total']))
+ result.append((metric + ['took', 'milliseconds'], {}, response['took']))
+
+ if 'aggregations' in response.keys():
+ for key, value in response['aggregations'].items():
+ result.extend(parse_agg(key, value, metric=metric + [key]))
+
+ return result