summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfumingwei <[email protected]>2023-11-22 18:56:34 +0800
committer付明卫 <[email protected]>2023-11-22 11:22:33 +0000
commitd1f72eda03ba7d0139c8f51b2d8efbabe9beb1b5 (patch)
tree732ef5191fac137886c8d8f5de43d62f3d58eddb
parent30437a0f2756671ba658311c0f179769f2b4e5ea (diff)
bugfix:TSG-17794:support print_table print speed values.
-rw-r--r--readme_fieldstat_easy.md2
-rw-r--r--src/exporter/fieldstat_exporter.py76
-rw-r--r--test/test_fieldstat_exporter.py17
3 files changed, 66 insertions, 29 deletions
diff --git a/readme_fieldstat_easy.md b/readme_fieldstat_easy.md
index 96c88e7..13bf0e3 100644
--- a/readme_fieldstat_easy.md
+++ b/readme_fieldstat_easy.md
@@ -140,7 +140,7 @@ Export the metrics of type counter in the form of a determinant.
We can use the template argument to exporter table format. The template argument include the follow functions:
functions|description|jinja2 example
---|---|---
-print_tables(groupby, columns)|Groupby specifies the tag key as the row of the table. Column specifies the field key as the column of the table.| '{{ print_tables("send_log", ["T_success_log"]) }}{{"\n"}}{{ print_tables("groupby", ["T_fail_log"]) }}'
+print_tables(groupby, columns)|Groupby specifies the tag key as the row of the table. Column specifies the field key as the column of the table. Default print speed value.| '{{ print_tables("send_log", ["T_success_log"]) }}{{"\n"}}{{ print_tables("groupby", ["T_fail_log"], False) }}'
print_counters(field_keys)| Export counter metrics specified by the field keys.|'{{ print_counters(["T_success_log"]) }}'
print_histograms(field_keys)| Export histogram metrics specified by the field keys.|'{{ print_histograms(["list_num"]) }}'
print_hlls(field_keys)| Export hyperloglog metrics specified by the field keys.| '{{ print_hlls(["external_ip"]) }}'
diff --git a/src/exporter/fieldstat_exporter.py b/src/exporter/fieldstat_exporter.py
index cdb7f1d..a40481d 100644
--- a/src/exporter/fieldstat_exporter.py
+++ b/src/exporter/fieldstat_exporter.py
@@ -178,7 +178,11 @@ class PrometheusExporter:
with open(self.json_path) as file:
fcntl.flock(file, fcntl.LOCK_EX)
- json_data = json.load(file)
+ json_data = []
+ try:
+ json_data = json.load(file)
+ except json.JSONDecodeError as e:
+ print("Invalid JSON:", e)
fcntl.flock(file, fcntl.LOCK_UN)
for item in json_data:
payload += self.__build_metrics(item)
@@ -285,18 +289,31 @@ class CounterTable:
self.build_columns_tables()
for item in self.tables:
print(item)
+ if len(self.tables) > 0:
+ print("=" * self.terminal_size)
+
class TableFormatTable:
def __init__(self):
+ self.terminal_size, _ = shutil.get_terminal_size((128, 64))
self.tables = []
self.rows = []
- def create_table(self, fields):
+ def create_table(self, fields, enable_speed):
field_names = []
- sorted_keys = sorted(fields.keys())
field_names.append("")
- field_names.extend(sorted_keys)
+
+ sorted_keys = sorted(fields.keys())
+ if enable_speed:
+ keys = []
+ for key in sorted_keys:
+ keys.append(key)
+ speed_fields = str(key) + "/s"
+ keys.append(speed_fields)
+ field_names.extend(keys)
+ else:
+ field_names.extend(sorted_keys)
table = PrettyTable()
table.vrules = NONE
@@ -312,7 +329,7 @@ class TableFormatTable:
return table
- def add_table_row(self, table, tags, fields):
+ def add_table_row(self, table, tags, fields, fields_delta, interval_ms, enable_speed):
row = []
if table is None:
@@ -324,8 +341,17 @@ class TableFormatTable:
#exporter table row value.
sorted_keys = sorted(fields.keys())
- for key in sorted_keys:
- row.append(fields[key])
+ if enable_speed:
+ for key in sorted_keys:
+ row.append(fields[key])
+ if (interval_ms > 0) and (key in fields_delta):
+ speed_s = fields_delta[key] * 1000 / interval_ms
+ row.append("{:.2f}".format(speed_s))
+ else:
+ row.append("-")
+ else:
+ for key in sorted_keys:
+ row.append(fields[key])
table.add_row(row)
@@ -333,13 +359,15 @@ class TableFormatTable:
def print_tables(self):
for item in self.tables:
print(item)
-
+ if len(self.tables) > 0:
+ print("=" * self.terminal_size)
class HistogramTable:
def __init__(self):
self.format = FieldstatExporterVars.hist_format
self.bins = FieldstatExporterVars.hist_bins
self.tables = []
+ self.terminal_size, _ = shutil.get_terminal_size((128, 64))
def __get_row_shared_values(self, c_hist):
shared_values = []
@@ -418,7 +446,8 @@ class HistogramTable:
def print_tables(self):
for item in self.tables:
print(item)
-
+ if len(self.tables) > 0:
+ print("=" * self.terminal_size)
class LocalExporter:
def __init__(self):
@@ -447,7 +476,7 @@ class LocalExporter:
def __build_counter_type_exporter(self, tags, key, value, value_delta, timestamp_ms_delta):
speed_s = 0.0
- if value_delta is not None:
+ if (value_delta is not None) and (timestamp_ms_delta > 0):
speed_s = value_delta * 1000 / timestamp_ms_delta
self.ctable.add_table_column(tags, key, value, speed_s)
@@ -491,7 +520,10 @@ class LocalExporter:
return objects
with open(self.json_path) as fd:
fcntl.flock(fd, fcntl.LOCK_EX)
- objects = json.load(fd)
+ try:
+ objects = json.load(fd)
+ except json.JSONDecodeError as e:
+ print("Invalid JSON:", e)
fcntl.flock(fd, fcntl.LOCK_UN)
return objects
@@ -572,14 +604,17 @@ class LocalExporter:
self.__build_histogram_type_exporter(tags_new, key, value, value_delta, timestamp_ms_delta)
- def build_table_format_exporter(self, json_objects):
+ def build_table_format_exporter(self, json_objects, enable_speed):
table = None
for item in json_objects:
tags = item["tags"]
fields = item["fields"]
+ fields_delta = item["fields_delta"]
+ interval_ms = item["timestamp_ms_delta"]
if table == None:
- table = self.tftable.create_table(fields)
- self.tftable.add_table_row(table, tags, fields)
+ table = self.tftable.create_table(fields, enable_speed)
+
+ self.tftable.add_table_row(table, tags, fields, fields_delta, interval_ms, enable_speed)
return table
@@ -602,7 +637,7 @@ class LocalExporter:
self.build_not_table_format_exporter(self.objects_matched)
- def print_table_format(self, groupby, columns):
+ def print_table_format(self, groupby, columns, enable_speed=True):
table_fields=[]
for item in self.objects_matched:
is_print_table = True
@@ -631,8 +666,11 @@ class LocalExporter:
if groupby != key:
new_fields["tags"].pop(key)
+ # if enable_speed == False:
+ # new_fields["fields_delta"] = {}
+
table_fields.append(new_fields)
- return self.build_table_format_exporter(table_fields)
+ return self.build_table_format_exporter(table_fields, enable_speed)
# def print_counter(self, [tags], [fields])
def print_counter_type(self, field_keys):
@@ -702,17 +740,15 @@ class LocalExporter:
else:
if self.display_counter:
self.ctable.print_tables()
- print("=" * self.terminal_size)
self.tftable.print_tables()
- print("=" * self.terminal_size)
if self.display_hist:
self.htable.print_tables()
- print("=" * self.terminal_size)
+ #print("=" * self.terminal_size)
if self.display_hll:
self.hlltable.print_tables()
- print("=" * self.terminal_size)
+ #print("=" * self.terminal_size)
#The bottom edge
print('-' * self.terminal_size)
diff --git a/test/test_fieldstat_exporter.py b/test/test_fieldstat_exporter.py
index 84909b7..f9f8cd7 100644
--- a/test/test_fieldstat_exporter.py
+++ b/test/test_fieldstat_exporter.py
@@ -351,7 +351,7 @@ class TestCounterTable(unittest.TestCase):
self.assertEqual(len(self.c_table.tables), math.ceil(100/table_size))
self.assertEqual(self.c_table.read_tables_num(), math.ceil(100/table_size))
- self.assertEqual(len(output_str.split('\n')), math.ceil(100/table_size) * 4 + 1)
+ self.assertEqual(len(output_str.split('\n')), math.ceil(100/table_size) * 4 + 2)
@@ -362,26 +362,27 @@ class TestTableFormatTable(unittest.TestCase):
def test_create_table(self):
fields_names_0 = {"column0": 0, "column1": 1}
- table = self.c_table.create_table(fields_names_0)
- self.assertEqual(table.field_names, ["", "column0", "column1"])
+ table = self.c_table.create_table(fields_names_0, True)
+ self.assertEqual(table.field_names, ["", "column0", "column0/s", "column1", "column1/s"])
fields_names_1 = {"column2": 2, "column3": 3}
- table = self.c_table.create_table(fields_names_1)
+ table = self.c_table.create_table(fields_names_1, False)
self.assertEqual(table.field_names, ["", "column2", "column3"])
def test_add_table_row(self):
self.c_table.field_names = []
- table = self.c_table.create_table({"column0": 0, "column1": 1})
+ table = self.c_table.create_table({"column0": 0, "column1": 1}, False)
tags = {"row": "0"}
field = {"column0": 0, "column1":1}
- self.c_table.add_table_row(None, tags, field)
+ field_delta = {}
+ self.c_table.add_table_row(None, tags, field, field_delta, 0, False)
table_str = table.get_string()
row_count = len(table_str.split("\n")) - 1
self.assertEqual(row_count, 0)
- self.c_table.add_table_row(table, tags, field)
+ self.c_table.add_table_row(table, tags, field, field_delta, 0, False)
row_count = len(table_str.split("\n")) - 1
self.assertEqual(row_count, 0)
@@ -486,7 +487,7 @@ class TestHistogramTable(unittest.TestCase):
sys.stdout = sys.__stdout__
self.assertEqual(len(self.h_table.tables), n_operate)
- self.assertEqual(len(output_str.split('\n')), n_operate * 6 + 1)
+ self.assertEqual(len(output_str.split('\n')), n_operate * 6 + 2)
def tearDown(self):