Skip to content

Commit fa2f04e

Browse files
committed
User collector cardinality, #288
1 parent ed33b8b commit fa2f04e

2 files changed

Lines changed: 24 additions & 11 deletions

File tree

mktxp/collector/user_collector.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1212
## GNU General Public License for more details.
1313

14-
14+
from datetime import datetime
1515
from mktxp.collector.base_collector import BaseCollector
1616
from mktxp.datasource.user_ds import UserMetricsDataSource
1717

@@ -24,7 +24,19 @@ def collect(router_entry):
2424

2525
user_labels = ['name', 'when', 'address', 'via', 'group']
2626
user_records = UserMetricsDataSource.metric_records(router_entry, metric_labels=user_labels)
27+
2728
if user_records:
28-
# Auto de-duplicate the records from the scrapes via API silently
29-
user_metrics = BaseCollector.info_collector('active_users', 'Active Users', user_records, user_labels, verbose_reporting = False)
29+
for record in user_records:
30+
if 'when' in record:
31+
try:
32+
dt = datetime.strptime(record['when'], "%Y-%m-%d %H:%M:%S")
33+
record['when'] = int(dt.timestamp())
34+
except ValueError:
35+
# Use current timestamp as fallback if parsing fails
36+
record['when'] = int(datetime.now().timestamp())
37+
38+
user_labels.remove('when')
39+
40+
# Auto de-duplicate the records from the scrapes via API silently
41+
user_metrics = BaseCollector.gauge_collector('active_users_info', 'Active Users', user_records, 'when', user_labels, verbose_reporting = False)
3042
yield user_metrics

tests/collector/test_user_collector.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,26 @@
1515
from unittest.mock import Mock, patch
1616
from mktxp.collector.user_collector import UserCollector
1717

18+
# MikroTik when format: YYYY-MM-DD HH:MM:SS
1819
# Case 1: Records with duplicates
1920
records_with_duplicates = [
20-
{'name': 'user1', 'when': 't1', 'address': 'a1', 'via': 'v1', 'group': 'g1'},
21-
{'name': 'user2', 'when': 't2', 'address': 'a2', 'via': 'v2', 'group': 'g2'},
22-
{'name': 'user1', 'when': 't1', 'address': 'a1', 'via': 'v1', 'group': 'g1'}, # Duplicate
21+
{'name': 'user1', 'when': '2024-12-18 10:54:02', 'address': 'a1', 'via': 'v1', 'group': 'g1'},
22+
{'name': 'user2', 'when': '2024-12-18 10:55:02', 'address': 'a2', 'via': 'v2', 'group': 'g2'},
23+
{'name': 'user1', 'when': '2024-12-18 10:54:02', 'address': 'a1', 'via': 'v1', 'group': 'g1'}, # Duplicate
2324
]
2425
expected_names_1 = {'user1', 'user2'}
2526

2627
# Case 2: No duplicates
2728
records_without_duplicates = [
28-
{'name': 'user1', 'when': 't1', 'address': 'a1', 'via': 'v1', 'group': 'g1'},
29-
{'name': 'user2', 'when': 't2', 'address': 'a2', 'via': 'v2', 'group': 'g2'},
29+
{'name': 'user1', 'when': '2024-12-18 10:54:02', 'address': 'a1', 'via': 'v1', 'group': 'g1'},
30+
{'name': 'user2', 'when': '2024-12-18 10:55:02', 'address': 'a2', 'via': 'v2', 'group': 'g2'},
3031
]
3132
expected_names_2 = {'user1', 'user2'}
3233

3334
# Case 3: All duplicates
3435
records_all_duplicates = [
35-
{'name': 'user1', 'when': 't1', 'address': 'a1', 'via': 'v1', 'group': 'g1'},
36-
{'name': 'user1', 'when': 't1', 'address': 'a1', 'via': 'v1', 'group': 'g1'},
36+
{'name': 'user1', 'when': '2024-12-18 10:54:02', 'address': 'a1', 'via': 'v1', 'group': 'g1'},
37+
{'name': 'user1', 'when': '2024-12-18 10:54:02', 'address': 'a1', 'via': 'v1', 'group': 'g1'},
3738
]
3839
expected_names_3 = {'user1'}
3940

@@ -61,7 +62,7 @@ def test_user_collector_deduplicates_records(mock_metric_records, input_records,
6162
assert len(metrics) == 1
6263

6364
user_metric = metrics[0]
64-
assert user_metric.name == 'mktxp_active_users'
65+
assert user_metric.name == 'mktxp_active_users_info'
6566
assert len(user_metric.samples) == expected_sample_count
6667

6768
# Check that the correct samples are present

0 commit comments

Comments
 (0)