diff --git a/plugin/manifest.json b/plugin/manifest.json index e2546d4..4f882b3 100644 --- a/plugin/manifest.json +++ b/plugin/manifest.json @@ -1,7 +1,7 @@ { "id": "pigway-agent", "name": "PIGWay Raspberry Pi Agent", - "version": "1.2.2", + "version": "1.3.0", "protocol_version": 1, "entrypoint": "worker.py", "runtime": "python3", @@ -38,5 +38,8 @@ "contract": "console-ui-v1", "entrypoint": "ui/index.js" }, - "legacy_connection_fields": true + "legacy_connection_fields": true, + "collection": { + "interval_seconds": 1 + } } diff --git a/plugin/worker.py b/plugin/worker.py index dd6a788..5738bf5 100644 --- a/plugin/worker.py +++ b/plugin/worker.py @@ -80,9 +80,15 @@ def collect(device): rate = value.get('network', {}).get(field) if isinstance(rate, (int, float)) and not isinstance(rate, bool) and math.isfinite(rate) and rate >= 0: metrics.append({'resource_id': 'host', 'key': key, 'value': rate, 'unit': 'bytes_per_second'}) + for metric in metrics: + source = value.get('network', {}) if metric['key'].startswith('network_') else value.get('system', {}) + at = source.get('observed_at') if metric['key'] != 'uptime_seconds' else value.get('timestamp') + if isinstance(at, (int, float)) and not isinstance(at, bool) and math.isfinite(at) and at > 0: + metric['observed_at'] = at return {'schema_version': 1, 'observed_at': value.get('timestamp'), 'identity': {'reported_name': value['machine'].get('name'), 'category': 'host', 'details': value.get('device', {})}, + 'collection': value.get('collection', MANIFEST['collection']), 'capabilities': MANIFEST['capabilities'], 'metrics': metrics, 'resources': [{'id': 'host', 'type': 'host'}], 'alerts': value.get('display', {}).get('alerts', []), diff --git a/tests/test_metrics.py b/tests/test_metrics.py index 7347544..bba7ff8 100644 --- a/tests/test_metrics.py +++ b/tests/test_metrics.py @@ -11,7 +11,7 @@ class MetricsTests(unittest.TestCase): value = {'timestamp': 123, 'machine': {'name':'Pi'}, 'system': { 'cpu_percent': 10, 'memory_total_bytes': 8000, 'memory_used_bytes': 4000, 'disk_total_bytes': 16000, 'disk_used_bytes': 5000}, - 'uptime_seconds': 1000, 'network': {'link_speed_mbps':1000,'rx_bytes_per_second':0,'tx_bytes_per_second':1234}, + 'uptime_seconds': 1000, 'network': {'observed_at':120,'link_speed_mbps':1000,'rx_bytes_per_second':0,'tx_bytes_per_second':1234}, 'display': {'alerts': []}} with patch.object(worker,'request',return_value=value): result=worker.collect({}) values = {m['key']:m['value'] for m in result['metrics']} @@ -20,6 +20,8 @@ class MetricsTests(unittest.TestCase): self.assertEqual(values['network_link_speed_mbps'],1000) self.assertEqual(values['network_rx_bytes_per_second'],0) self.assertEqual(values['network_tx_bytes_per_second'],1234) + self.assertEqual(next(m['observed_at'] for m in result['metrics'] if m['key']=='network_tx_bytes_per_second'),120) + self.assertEqual(result['collection']['interval_seconds'],1) self.assertTrue(result['alerts_complete']) def test_absent_or_boolean_fields_not_invented(self):