From bc7008acdf511a9fe22282961d5718b218c4c693 Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Thu, 31 Jul 2025 08:30:00 -0300 Subject: [PATCH 01/17] SIENTIAPDE-1174 Update requirements and environment configurations - Changed the sientia-dataops-library dependency to a relative path in requirements.txt. - Updated image tag to 0.3.0 in values.yaml. - Renamed HTTP_SERVER_PORT to HTTP_METRICS_PORT in app.py and updated its default value to 9090. - Added TAG_WRITTEN_COUNT metric in metrics.py to track writing processes. - Incremented TAG_WRITTEN_COUNT in DataManager upon successful data insertion. --- ingestor/app.py | 2 +- ingestor/managers/data_manager.py | 6 ++++++ ingestor/metrics.py | 9 +++++++++ requirements.txt | 3 ++- values.yaml | 4 ++-- 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/ingestor/app.py b/ingestor/app.py index e2657f7..8fc3672 100644 --- a/ingestor/app.py +++ b/ingestor/app.py @@ -66,7 +66,7 @@ def signal_handler(_signum, _frame): def start_prometheus_server(): try: - port = int(os.getenv("HTTP_SERVER_PORT", 4840)) + port = int(os.getenv("HTTP_METRICS_PORT", 9090)) start_http_server(port) print(f"Prometheus server started on port {port}.") metrics.APP_UP.labels(pod_id=POD_ID).set(1) # Mark app as UP diff --git a/ingestor/managers/data_manager.py b/ingestor/managers/data_manager.py index 68dbe06..903daf0 100644 --- a/ingestor/managers/data_manager.py +++ b/ingestor/managers/data_manager.py @@ -189,6 +189,12 @@ class DataManager(BaseActivity): self.logger.debug( f"Message inserted into MongoDB collection {topic}: {data}") + metrics.TAG_WRITTEN_COUNT.labels( + pod_id=self.pod_id, + tag_name=data["name"], + collection_name=topic + ).inc() + except Exception as e: trace = traceback.format_exc() self.send_notification( diff --git a/ingestor/metrics.py b/ingestor/metrics.py index b2ddc42..8cb2110 100644 --- a/ingestor/metrics.py +++ b/ingestor/metrics.py @@ -6,6 +6,15 @@ KAFKA_LABELS = ["pod_id", "topic"] REDIS_LABELS = ["pod_id", "operation"] NOTIFICATION_LABELS = ["pod_id", "level", "block"] +MAIN_LABELS = ["pod_id"] + +# --- Reliability Metrics --- +TAG_WRITTEN_COUNT = Counter( + "ingestor_tag_written_count", + "Number of writing process to the collection", + [*MAIN_LABELS, "tag_name", "collection_name"], +) + # --- General Application Metrics --- APP_LOOP_COUNT = Counter( diff --git a/requirements.txt b/requirements.txt index a7bba96..efdfaf2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ asyncua==1.1.5 redis -git+ssh://git@github.com/Aignosi/sientia-dataops-library.git@1.3.5 +# git+ssh://git@github.com/Aignosi/sientia-dataops-library.git@1.3.5 +../sientia-dataops-library prometheus_client pymongo \ No newline at end of file diff --git a/values.yaml b/values.yaml index 9f3d9ed..1ae0638 100644 --- a/values.yaml +++ b/values.yaml @@ -11,7 +11,7 @@ image: # This sets the pull policy for images. pullPolicy: Always # Overrides the image tag whose default is the chart appVersion. - tag: "0.2.7" + tag: "0.3.0" # This is for the secrets for pulling an image from a private repository more information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ imagePullSecrets: @@ -190,7 +190,7 @@ env: value: "10" - name: LOG_LEVEL value: "DEBUG" - - name: HTTP_SERVER_PORT + - name: HTTP_METRICS_PORT value: "9090" From 5ed6523c513d7c3e98178b14ed9779cb4b9d2fc6 Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Thu, 31 Jul 2025 08:47:52 -0300 Subject: [PATCH 02/17] SIENTIAPDE-1174 Update values.yaml to modify replica count and GITHUB_BRANCH environment variable - Increased replicaCount from 1 to 3 for improved scalability. - Updated GITHUB_BRANCH environment variable to SIENTIAPDE-1174-mapear-e-implementar-metricas-a-serem-criadas. --- values.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/values.yaml b/values.yaml index 1ae0638..b048bd6 100644 --- a/values.yaml +++ b/values.yaml @@ -3,7 +3,7 @@ # Declare variables to be passed into your templates. # This will set the replicaset count more information can be found here: https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/ -replicaCount: 1 +replicaCount: 3 # This sets the container image more information can be found here: https://kubernetes.io/docs/concepts/containers/images/ image: @@ -158,7 +158,7 @@ env: - name: GITHUB_REPO_URL value: "git@github.com:Aignosi/sientia-dataops-opc-ingestor.git" - name: GITHUB_BRANCH - value: "SIENTIAPDE-1172-criar-pipeline-de-alertas-orquestrador" + value: "SIENTIAPDE-1174-mapear-e-implementar-metricas-a-serem-criadas" - name: PYTHON_APP value: "ingestor.app" From 17d958c666df4998ee9d0d0c5cb911de41417240 Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Thu, 31 Jul 2025 09:12:18 -0300 Subject: [PATCH 03/17] SIENTIAPDE-1174 SIENTIAPDE-1174 Add pod_id to Ingestor metadata for improved tracking - Included 'pod_id' in the metadata dictionary of the Ingestor class to enhance tracking capabilities. --- ingestor/ingestor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ingestor/ingestor.py b/ingestor/ingestor.py index 9614302..ec5a684 100644 --- a/ingestor/ingestor.py +++ b/ingestor/ingestor.py @@ -74,6 +74,7 @@ class Ingestor: 'model_name': '-', 'workflow_name': 'OPC_INGESTOR', 'schema_name': 'OPC_INGESTOR', + 'pod_id': self.pod_id, } self.ingestor_manager = None From cc01a358a946bf62cf92647c01c07f5fe2689a91 Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Thu, 31 Jul 2025 12:03:27 -0300 Subject: [PATCH 04/17] SIENTIAPDE-1174 Refactor unit tests to improve readability and maintainability - Updated test assertions and mock setups in test_app.py for clarity. - Added 'pod_id' to the metadata in test_ingestor.py for consistency. - Introduced a new test for TAG_WRITTEN_COUNT in test_metrics.py to verify its definition. - Enhanced test data structure in test_data_manager.py to include additional fields. --- tests/unit/managers/test_data_manager.py | 6 +++- tests/unit/test_app.py | 28 +++++++++++------ tests/unit/test_ingestor.py | 1 + tests/unit/test_metrics.py | 39 ++++++++++++++++++------ 4 files changed, 53 insertions(+), 21 deletions(-) diff --git a/tests/unit/managers/test_data_manager.py b/tests/unit/managers/test_data_manager.py index ed157cc..344b203 100644 --- a/tests/unit/managers/test_data_manager.py +++ b/tests/unit/managers/test_data_manager.py @@ -10,6 +10,7 @@ metadata = { "model_name": "test_model", "workflow_name": "test_workflow", "schema_name": "test_schedule", + "pod_id": "localhost", }, } @@ -258,7 +259,10 @@ def test_publish_no_kafka(data_manager): @patch("ingestor.managers.data_manager.traceback") def test_publish_error(traceback, data_manager): topic = "test_topic" - data = {"key": "value"} + data = { + "key": "value", + "name": "test_tag" + } # Mock the send method of the Kafka producer to raise an exception send_mock = MagicMock(side_effect=Exception("Test error")) diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index c4af7bb..421c2df 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -44,13 +44,15 @@ def mock_app_env(monkeypatch): monkeypatch.setattr( app.metrics.APP_UP, "labels", - MagicMock(return_value=MagicMock(set=mocks["metrics_APP_UP_labels_set"])), + MagicMock(return_value=MagicMock( + set=mocks["metrics_APP_UP_labels_set"])), ) monkeypatch.setattr( app.metrics.APP_LOOP_COUNT, "labels", MagicMock( - return_value=MagicMock(inc=mocks["metrics_APP_LOOP_COUNT_labels_inc"]) + return_value=MagicMock( + inc=mocks["metrics_APP_LOOP_COUNT_labels_inc"]) ), ) monkeypatch.setattr( @@ -66,7 +68,8 @@ def mock_app_env(monkeypatch): app.metrics.APP_ERRORS_TOTAL, "labels", MagicMock( - return_value=MagicMock(inc=mocks["metrics_APP_ERRORS_TOTAL_labels_inc"]) + return_value=MagicMock( + inc=mocks["metrics_APP_ERRORS_TOTAL_labels_inc"]) ), ) @@ -74,7 +77,8 @@ def mock_app_env(monkeypatch): monkeypatch.setattr(app, "time", mocks["time_time"]) monkeypatch.setattr(app, "sleep", mocks["time_sleep"]) monkeypatch.setattr(app.signal, "signal", mocks["signal_signal"]) - monkeypatch.setattr(app.traceback, "print_exc", mocks["traceback_print_exc"]) + monkeypatch.setattr(app.traceback, "print_exc", + mocks["traceback_print_exc"]) monkeypatch.setattr(app, "exit_signal", mocks["mock_exit_signal"]) monkeypatch.setattr(app, "POD_ID", "test_pod") @@ -98,7 +102,7 @@ def test_main_successful_run_one_loop(mock_app_env, capsys): app.main() assert excinfo.value.code == 0 - mock_app_env["start_http_server"].assert_called_once_with(4840) + mock_app_env["start_http_server"].assert_called_once_with(9090) app.metrics.APP_UP.labels.assert_any_call(pod_id="test_pod") set_calls = mock_app_env["metrics_APP_UP_labels_set"].call_args_list assert call(1) in set_calls @@ -115,7 +119,8 @@ def test_main_successful_run_one_loop(mock_app_env, capsys): app.metrics.APP_LOOP_COUNT.labels.assert_called_with(pod_id="test_pod") mock_app_env["metrics_APP_LOOP_COUNT_labels_inc"].assert_called_once() - mock_exit_signal.wait.assert_called_once_with(mock_ingestor_instance.poll_interval) + mock_exit_signal.wait.assert_called_once_with( + mock_ingestor_instance.poll_interval) app.metrics.APP_LOOP_DURATION.labels.assert_called_with(pod_id="test_pod") mock_app_env["metrics_APP_LOOP_DURATION_labels_observe"].assert_called_once_with( @@ -125,15 +130,17 @@ def test_main_successful_run_one_loop(mock_app_env, capsys): mock_ingestor_instance.shutdown.assert_called_once() mock_app_env["time_sleep"].assert_called_once_with(5) # CORREÇÃO APLICADA ABAIXO: - mock_ingestor_instance.logger.info.assert_any_call("Main loop exit_signaled.") + mock_ingestor_instance.logger.info.assert_any_call( + "Main loop exit_signaled.") captured = capsys.readouterr() - assert "Prometheus server started on port 4840." in captured.out + assert "Prometheus server started on port 9090." in captured.out def test_main_prometheus_server_fails_to_start(mock_app_env, capsys): """Test the scenario where starting the Prometheus server fails.""" - mock_app_env["start_http_server"].side_effect = OSError("Port already in use") + mock_app_env["start_http_server"].side_effect = OSError( + "Port already in use") with pytest.raises(OsExitCalled) as excinfo: app.main() @@ -229,7 +236,8 @@ def test_main_multiple_loop_iterations(mock_app_env): mock_exit_signal = mock_app_env["mock_exit_signal"] mock_exit_signal.is_set.side_effect = [False, False, False, True] - mock_app_env["time_time"].side_effect = [10.0, 10.1, 10.2, 10.3, 10.4, 10.5] + mock_app_env["time_time"].side_effect = [ + 10.0, 10.1, 10.2, 10.3, 10.4, 10.5] with pytest.raises(OsExitCalled) as excinfo: app.main() diff --git a/tests/unit/test_ingestor.py b/tests/unit/test_ingestor.py index 2f0a42f..60a5b89 100644 --- a/tests/unit/test_ingestor.py +++ b/tests/unit/test_ingestor.py @@ -51,6 +51,7 @@ def test___init__(notification_handler, getenv): "model_name": "-", "workflow_name": "OPC_INGESTOR", "schema_name": "OPC_INGESTOR", + "pod_id": "localhost1" } notification_handler.assert_called_once_with( diff --git a/tests/unit/test_metrics.py b/tests/unit/test_metrics.py index 8750d42..d5e5be0 100644 --- a/tests/unit/test_metrics.py +++ b/tests/unit/test_metrics.py @@ -7,6 +7,15 @@ import ingestor.metrics as metrics # --- Test Functions for Each Metric (Corrected for v0.22.0 _name behavior) --- +def test_ingestor_tag_written_count(): + """Verify the definition of INGESTOR_TAG_WRITTEN_COUNT.""" + assert metrics.TAG_WRITTEN_COUNT is not None + assert isinstance(metrics.TAG_WRITTEN_COUNT, Counter) + assert metrics.TAG_WRITTEN_COUNT._name == "ingestor_tag_written_count" + assert set(metrics.TAG_WRITTEN_COUNT._labelnames) == { + "pod_id", "tag_name", "collection_name"} + + def test_app_loop_count(): """Verify the definition of APP_LOOP_COUNT.""" assert metrics.APP_LOOP_COUNT is not None @@ -118,7 +127,8 @@ def test_opc_connections_total(): assert ( metrics.OPC_CONNECTIONS_TOTAL._name == "opc_connections_initiated" ) # REMOVED _total - assert set(metrics.OPC_CONNECTIONS_TOTAL._labelnames) == {"pod_id", "server_name"} + assert set(metrics.OPC_CONNECTIONS_TOTAL._labelnames) == { + "pod_id", "server_name"} def test_opc_connections_failed(): @@ -128,7 +138,8 @@ def test_opc_connections_failed(): assert ( metrics.OPC_CONNECTIONS_FAILED._name == "opc_connections_failed" ) # REMOVED _total - assert set(metrics.OPC_CONNECTIONS_FAILED._labelnames) == {"pod_id", "server_name"} + assert set(metrics.OPC_CONNECTIONS_FAILED._labelnames) == { + "pod_id", "server_name"} def test_opc_connection_status(): @@ -162,7 +173,8 @@ def test_opc_tags_subscribed(): assert metrics.OPC_TAGS_SUBSCRIBED is not None assert isinstance(metrics.OPC_TAGS_SUBSCRIBED, Gauge) assert metrics.OPC_TAGS_SUBSCRIBED._name == "opc_tags_subscribed_current" - assert set(metrics.OPC_TAGS_SUBSCRIBED._labelnames) == {"pod_id", "server_name"} + assert set(metrics.OPC_TAGS_SUBSCRIBED._labelnames) == { + "pod_id", "server_name"} def test_opc_cycles_without_data(): @@ -170,7 +182,8 @@ def test_opc_cycles_without_data(): assert metrics.OPC_CYCLES_WITHOUT_DATA is not None assert isinstance(metrics.OPC_CYCLES_WITHOUT_DATA, Gauge) assert metrics.OPC_CYCLES_WITHOUT_DATA._name == "opc_cycles_without_data" - assert set(metrics.OPC_CYCLES_WITHOUT_DATA._labelnames) == {"pod_id", "server_name"} + assert set(metrics.OPC_CYCLES_WITHOUT_DATA._labelnames) == { + "pod_id", "server_name"} def test_opc_reconnections_total(): @@ -180,7 +193,8 @@ def test_opc_reconnections_total(): assert ( metrics.OPC_RECONNECTIONS_TOTAL._name == "opc_reconnections_tried" ) # REMOVED _total - assert set(metrics.OPC_RECONNECTIONS_TOTAL._labelnames) == {"pod_id", "server_name"} + assert set(metrics.OPC_RECONNECTIONS_TOTAL._labelnames) == { + "pod_id", "server_name"} def test_kafka_messages_sent(): @@ -198,7 +212,8 @@ def test_kafka_messages_errors(): assert ( metrics.KAFKA_MESSAGES_ERRORS._name == "kafka_messages_errors" ) # REMOVED _total - assert set(metrics.KAFKA_MESSAGES_ERRORS._labelnames) == {"pod_id", "topic"} + assert set(metrics.KAFKA_MESSAGES_ERRORS._labelnames) == { + "pod_id", "topic"} def test_kafka_connection_status(): @@ -214,7 +229,8 @@ def test_redis_operations_total(): assert metrics.REDIS_OPERATIONS_TOTAL is not None assert isinstance(metrics.REDIS_OPERATIONS_TOTAL, Counter) assert metrics.REDIS_OPERATIONS_TOTAL._name == "redis_operations" # REMOVED _total - assert set(metrics.REDIS_OPERATIONS_TOTAL._labelnames) == {"pod_id", "operation"} + assert set(metrics.REDIS_OPERATIONS_TOTAL._labelnames) == { + "pod_id", "operation"} def test_redis_operations_errors(): @@ -224,7 +240,8 @@ def test_redis_operations_errors(): assert ( metrics.REDIS_OPERATIONS_ERRORS._name == "redis_operations_errors" ) # REMOVED _total - assert set(metrics.REDIS_OPERATIONS_ERRORS._labelnames) == {"pod_id", "operation"} + assert set(metrics.REDIS_OPERATIONS_ERRORS._labelnames) == { + "pod_id", "operation"} def test_redis_operations_duration(): @@ -234,7 +251,8 @@ def test_redis_operations_duration(): assert ( metrics.REDIS_OPERATIONS_DURATION._name == "redis_operations_duration_seconds" ) - assert set(metrics.REDIS_OPERATIONS_DURATION._labelnames) == {"pod_id", "operation"} + assert set(metrics.REDIS_OPERATIONS_DURATION._labelnames) == { + "pod_id", "operation"} def test_redis_connection_status(): @@ -250,4 +268,5 @@ def test_notifications_sent(): assert metrics.NOTIFICATIONS_SENT is not None assert isinstance(metrics.NOTIFICATIONS_SENT, Counter) assert metrics.NOTIFICATIONS_SENT._name == "notifications_sent" # REMOVED _total - assert set(metrics.NOTIFICATIONS_SENT._labelnames) == {"pod_id", "level", "block"} + assert set(metrics.NOTIFICATIONS_SENT._labelnames) == { + "pod_id", "level", "block"} From 8c248f478355bc1f94a6c807ae5240c629d84e36 Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Mon, 4 Aug 2025 10:01:24 -0300 Subject: [PATCH 05/17] SIENTIAPDE-1174 Update image tag in values.yaml to 0.3.1 and adjust helm upgrade command version --- values.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/values.yaml b/values.yaml index b048bd6..1b309a2 100644 --- a/values.yaml +++ b/values.yaml @@ -11,7 +11,7 @@ image: # This sets the pull policy for images. pullPolicy: Always # Overrides the image tag whose default is the chart appVersion. - tag: "0.3.0" + tag: "0.3.1" # This is for the secrets for pulling an image from a private repository more information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ imagePullSecrets: @@ -212,7 +212,7 @@ ssh: # kubectl create secret docker-registry docker-hub-secret --namespace sientia --docker-server=http://aignosi.azurecr.io --docker-username=aignosi --docker-password=5I5zpQ6sRaHqX1hD3dr+2mo647yO3FRc359/wu6gsP+ACRDRz5mp -# helm upgrade --install sientia-opc-ingestor sientia/sientia-module -n sientia --create-namespace -f ./values.yaml --version 0.4.0-uat +# helm upgrade --install sientia-opc-ingestor sientia/sientia-module -n sientia --create-namespace -f ./values.yaml --version 0.4.0 # kubectl create secret generic git-ssh-key-sientia-opc-ingestor \ # --namespace sientia \ From 9fb2862d3c5320e6a23122b12e19a3417f2f6ee8 Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Mon, 4 Aug 2025 15:02:55 -0300 Subject: [PATCH 06/17] SIENTIAPDE-1174 Update BaseActivity initialization in manager classes to disable error counter metric - Modified the initialization of DataManager, IngestorManager, OpcManager, and ResourceManager to include 'set_error_counter_metric=False' for improved error handling. --- ingestor/managers/data_manager.py | 3 ++- ingestor/managers/ingestor_manager.py | 3 ++- ingestor/managers/opc_manager.py | 3 ++- ingestor/managers/resource_manager.py | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ingestor/managers/data_manager.py b/ingestor/managers/data_manager.py index 903daf0..4984682 100644 --- a/ingestor/managers/data_manager.py +++ b/ingestor/managers/data_manager.py @@ -96,7 +96,8 @@ class DataManager(BaseActivity): ) BaseActivity.__init__(self, logger=logger, - notification_handler=notification_handler) + notification_handler=notification_handler, + set_error_counter_metric=False) def shutdown(self): """Closes the Kafka producer connection.""" diff --git a/ingestor/managers/ingestor_manager.py b/ingestor/managers/ingestor_manager.py index 47499fd..879531c 100644 --- a/ingestor/managers/ingestor_manager.py +++ b/ingestor/managers/ingestor_manager.py @@ -56,7 +56,8 @@ class IngestorManager(BaseActivity): self.metadata = metadata BaseActivity.__init__(self, logger=logger, - notification_handler=notification_handler) + notification_handler=notification_handler, + set_error_counter_metric=False) def initialize_opc_from_config(self, server_config: dict) -> OpcManager | None: """ diff --git a/ingestor/managers/opc_manager.py b/ingestor/managers/opc_manager.py index cdf37b6..3e32e2e 100644 --- a/ingestor/managers/opc_manager.py +++ b/ingestor/managers/opc_manager.py @@ -35,7 +35,8 @@ class OpcManager(BaseActivity): pod_id=self.pod_id, server_name=self.name).set(0) BaseActivity.__init__(self, logger=logger, - notification_handler=notification_handler) + notification_handler=notification_handler, + set_error_counter_metric=False) def __str__(self): return f"OpcManager(name={self.name}, url={self.url}, server_uri={self.server_uri})\n" \ diff --git a/ingestor/managers/resource_manager.py b/ingestor/managers/resource_manager.py index 9dc3ddc..bee722d 100644 --- a/ingestor/managers/resource_manager.py +++ b/ingestor/managers/resource_manager.py @@ -44,7 +44,8 @@ class ResourceManager(BaseActivity): self.metadata = metadata BaseActivity.__init__(self, logger=logger, - notification_handler=notification_handler) + notification_handler=notification_handler, + set_error_counter_metric=False) def _execute_redis_op(self, operation_name: str, func, *args, **kwargs): """Wrapper to execute Redis operations and record metrics.""" From e8f85b64e9f07a543718bf345206c944cd987562 Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Mon, 4 Aug 2025 15:10:28 -0300 Subject: [PATCH 07/17] SIENTIAPDE-1174 Update image tag in values.yaml to 0.3.2 for version consistency --- values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/values.yaml b/values.yaml index 1b309a2..1372684 100644 --- a/values.yaml +++ b/values.yaml @@ -11,7 +11,7 @@ image: # This sets the pull policy for images. pullPolicy: Always # Overrides the image tag whose default is the chart appVersion. - tag: "0.3.1" + tag: "0.3.2" # This is for the secrets for pulling an image from a private repository more information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ imagePullSecrets: From bb40e723bacc49b85868ad2fd861cac42b906127 Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Mon, 4 Aug 2025 15:32:49 -0300 Subject: [PATCH 08/17] SIENTIAPDE-1174 Update BaseActivity initialization in manager classes to enable error counter metric - Modified the initialization of DataManager, IngestorManager, OpcManager, and ResourceManager to include 'set_error_counter=True' for enhanced error tracking. --- ingestor/managers/data_manager.py | 2 +- ingestor/managers/ingestor_manager.py | 2 +- ingestor/managers/opc_manager.py | 2 +- ingestor/managers/resource_manager.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ingestor/managers/data_manager.py b/ingestor/managers/data_manager.py index 4984682..5d58c51 100644 --- a/ingestor/managers/data_manager.py +++ b/ingestor/managers/data_manager.py @@ -97,7 +97,7 @@ class DataManager(BaseActivity): BaseActivity.__init__(self, logger=logger, notification_handler=notification_handler, - set_error_counter_metric=False) + set_error_counter=True) def shutdown(self): """Closes the Kafka producer connection.""" diff --git a/ingestor/managers/ingestor_manager.py b/ingestor/managers/ingestor_manager.py index 879531c..a9303da 100644 --- a/ingestor/managers/ingestor_manager.py +++ b/ingestor/managers/ingestor_manager.py @@ -57,7 +57,7 @@ class IngestorManager(BaseActivity): BaseActivity.__init__(self, logger=logger, notification_handler=notification_handler, - set_error_counter_metric=False) + set_error_counter=True) def initialize_opc_from_config(self, server_config: dict) -> OpcManager | None: """ diff --git a/ingestor/managers/opc_manager.py b/ingestor/managers/opc_manager.py index 3e32e2e..332a2ca 100644 --- a/ingestor/managers/opc_manager.py +++ b/ingestor/managers/opc_manager.py @@ -36,7 +36,7 @@ class OpcManager(BaseActivity): BaseActivity.__init__(self, logger=logger, notification_handler=notification_handler, - set_error_counter_metric=False) + set_error_counter=True) def __str__(self): return f"OpcManager(name={self.name}, url={self.url}, server_uri={self.server_uri})\n" \ diff --git a/ingestor/managers/resource_manager.py b/ingestor/managers/resource_manager.py index bee722d..de2d3b2 100644 --- a/ingestor/managers/resource_manager.py +++ b/ingestor/managers/resource_manager.py @@ -45,7 +45,7 @@ class ResourceManager(BaseActivity): BaseActivity.__init__(self, logger=logger, notification_handler=notification_handler, - set_error_counter_metric=False) + set_error_counter=True) def _execute_redis_op(self, operation_name: str, func, *args, **kwargs): """Wrapper to execute Redis operations and record metrics.""" From 47e61360ffbc0c8f42100243a10e59718573f0be Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Tue, 5 Aug 2025 10:59:29 -0300 Subject: [PATCH 09/17] SIENTIAPDE-1174 Update requirements and refactor manager classes to remove pod_id - Updated the sientia-dataops-library dependency version to 1.3.8 in requirements.txt. - Refactored IngestorManager, OpcManager, and ResourceManager classes to remove pod_id from their initialization and internal handling, enhancing code clarity and consistency. - Adjusted unit tests to reflect the removal of pod_id, ensuring they remain functional and accurate. --- ingestor/managers/ingestor_manager.py | 5 +---- ingestor/managers/opc_manager.py | 13 ++++++------- ingestor/managers/resource_manager.py | 11 ++++------- requirements.txt | 3 +-- tests/unit/managers/test_ingestor_manager.py | 4 ---- tests/unit/managers/test_opc_manager.py | 14 ++++++-------- tests/unit/managers/test_resource_manager.py | 19 ++++++++----------- 7 files changed, 26 insertions(+), 43 deletions(-) diff --git a/ingestor/managers/ingestor_manager.py b/ingestor/managers/ingestor_manager.py index a9303da..eec7116 100644 --- a/ingestor/managers/ingestor_manager.py +++ b/ingestor/managers/ingestor_manager.py @@ -14,7 +14,7 @@ import ingestor.metrics as metrics class IngestorManager(BaseActivity): def __init__(self, kafka_servers: str, redis_data: dict, - lease_ttl: int, heartbeat_ttl: int, pod_id: str, + lease_ttl: int, heartbeat_ttl: int, poll_interval: int, mongo_connection_string: str, mongo_database: str, metadata: dict, logger: Logger, notification_handler: NotificationHandler, @@ -40,7 +40,6 @@ class IngestorManager(BaseActivity): port=redis_port, lease_ttl=lease_ttl, heartbeat_ttl=heartbeat_ttl, - pod_id=pod_id, metadata=metadata, logger=logger, notification_handler=notification_handler, @@ -52,7 +51,6 @@ class IngestorManager(BaseActivity): self.managed_tags = {} self.opc_servers = {} - self.pod_id = pod_id self.metadata = metadata BaseActivity.__init__(self, logger=logger, @@ -88,7 +86,6 @@ class IngestorManager(BaseActivity): logger=self.logger, server_uri=server_config['server_uri'], notification_handler=self.notification_handler, - pod_id=self.pod_id, metadata=self.metadata, cert_path=server_config.get('cert_path'), private_key_path=server_config.get('private_key_path'), diff --git a/ingestor/managers/opc_manager.py b/ingestor/managers/opc_manager.py index 332a2ca..b5fa903 100644 --- a/ingestor/managers/opc_manager.py +++ b/ingestor/managers/opc_manager.py @@ -11,8 +11,8 @@ import ingestor.metrics as metrics class OpcManager(BaseActivity): - def __init__(self, name: str, url: str, data_manager: DataManager, - logger: Logger, server_uri: str, notification_handler: NotificationHandler, pod_id: str, metadata: dict, + def __init__(self, name: str, url: str, data_manager: DataManager, logger: Logger, + server_uri: str, notification_handler: NotificationHandler, metadata: dict, cert_path: str = None, private_key_path: str = None, server_cert_path: str = None): self.url = url self.name = name @@ -26,18 +26,17 @@ class OpcManager(BaseActivity): self.nodes = {} self.subscriptions = {} self.data_manager = data_manager - self.pod_id = pod_id self.metadata = metadata + BaseActivity.__init__(self, logger=logger, + notification_handler=notification_handler, + set_error_counter=True) + metrics.OPC_CONNECTION_STATUS.labels( pod_id=self.pod_id, server_name=self.name, server_url=self.url).set(0) metrics.OPC_TAGS_SUBSCRIBED.labels( pod_id=self.pod_id, server_name=self.name).set(0) - BaseActivity.__init__(self, logger=logger, - notification_handler=notification_handler, - set_error_counter=True) - def __str__(self): return f"OpcManager(name={self.name}, url={self.url}, server_uri={self.server_uri})\n" \ f"nodes={self.nodes}, subscriptions={self.subscriptions}" diff --git a/ingestor/managers/resource_manager.py b/ingestor/managers/resource_manager.py index de2d3b2..d2db351 100644 --- a/ingestor/managers/resource_manager.py +++ b/ingestor/managers/resource_manager.py @@ -16,14 +16,15 @@ class ResourceManager(BaseActivity): port: int, lease_ttl: int, heartbeat_ttl: int, - pod_id: str, metadata: dict, logger: Logger, notification_handler: NotificationHandler, username: str | None = None, password: str | None = None, ) -> None: - self.pod_id = pod_id + BaseActivity.__init__(self, logger=logger, + notification_handler=notification_handler, + set_error_counter=True) try: self.redis = Redis( host=host, @@ -35,7 +36,7 @@ class ResourceManager(BaseActivity): self.redis.ping() metrics.REDIS_CONNECTION_STATUS.labels(pod_id=self.pod_id).set(1) except Exception as e: - logger.error(f"Failed to connect to Redis: {e}") + self.logger.error(f"Failed to connect to Redis: {e}") metrics.REDIS_CONNECTION_STATUS.labels(pod_id=self.pod_id).set(0) raise @@ -43,10 +44,6 @@ class ResourceManager(BaseActivity): self.heartbeat_ttl = heartbeat_ttl self.metadata = metadata - BaseActivity.__init__(self, logger=logger, - notification_handler=notification_handler, - set_error_counter=True) - def _execute_redis_op(self, operation_name: str, func, *args, **kwargs): """Wrapper to execute Redis operations and record metrics.""" start_time = time() diff --git a/requirements.txt b/requirements.txt index efdfaf2..5687b65 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ asyncua==1.1.5 redis -# git+ssh://git@github.com/Aignosi/sientia-dataops-library.git@1.3.5 -../sientia-dataops-library +git+ssh://git@github.com/Aignosi/sientia-dataops-library.git@1.3.8 prometheus_client pymongo \ No newline at end of file diff --git a/tests/unit/managers/test_ingestor_manager.py b/tests/unit/managers/test_ingestor_manager.py index f6ace9f..df994b7 100644 --- a/tests/unit/managers/test_ingestor_manager.py +++ b/tests/unit/managers/test_ingestor_manager.py @@ -25,7 +25,6 @@ def ingestor_manager(data_manager_mock, resource_manager_mock): }, lease_ttl=60, heartbeat_ttl=60, - pod_id="test_pod", poll_interval=5, mongo_connection_string="mongodb://localhost:27017", mongo_database="sientia", @@ -54,7 +53,6 @@ def test___init__(notification_handler_mock, resource_manager_mock, data_manager }, lease_ttl=60, heartbeat_ttl=60, - pod_id="test_pod", poll_interval=5, mongo_connection_string="mongodb://localhost:27017", mongo_database="sientia", @@ -79,7 +77,6 @@ def test___init__(notification_handler_mock, resource_manager_mock, data_manager port=6379, lease_ttl=60, heartbeat_ttl=60, - pod_id="test_pod", metadata=metadata["metadata"], logger=ingestor.logger, notification_handler=ingestor.notification_handler, @@ -117,7 +114,6 @@ def test_initialize_opc_from_config(opc_manager, ingestor_manager): logger=ingestor_manager.logger, server_uri=server_config['server_uri'], notification_handler=ingestor_manager.notification_handler, - pod_id=server_config['pod_id'], cert_path=server_config['cert_path'], private_key_path=server_config['private_key_path'], server_cert_path=server_config['server_cert_path'], diff --git a/tests/unit/managers/test_opc_manager.py b/tests/unit/managers/test_opc_manager.py index 386f2ae..7cdfb80 100644 --- a/tests/unit/managers/test_opc_manager.py +++ b/tests/unit/managers/test_opc_manager.py @@ -46,13 +46,12 @@ metadata = { @fixture def raw_opc_manager(): return OpcManager( - "TestConnector", - "opc.tcp://localhost:4840", - MagicMock(), - MagicMock(), - "opc.tcp://localhost:4840", - MagicMock(), - "localhost", + name="TestConnector", + url="opc.tcp://localhost:4840", + data_manager=MagicMock(), + logger=MagicMock(), + server_uri="opc.tcp://localhost:4840", + notification_handler=MagicMock(), metadata=metadata["metadata"], ) @@ -552,7 +551,6 @@ def test_init_metrics_calls_correct_metric_methods(mock_metrics): logger=MagicMock(), server_uri="opc.tcp://init.test:4840/uri", notification_handler=MagicMock(), - pod_id="init_pod_localhost", metadata=metadata["metadata"], ) diff --git a/tests/unit/managers/test_resource_manager.py b/tests/unit/managers/test_resource_manager.py index 0e528a2..00238ea 100644 --- a/tests/unit/managers/test_resource_manager.py +++ b/tests/unit/managers/test_resource_manager.py @@ -22,7 +22,6 @@ def resource_manager(redis): port=6379, lease_ttl=10, heartbeat_ttl=10, - pod_id="pod_id", metadata=metadata["metadata"], logger=MagicMock(), notification_handler=MagicMock(), @@ -58,7 +57,7 @@ def test_ingestor_heartbeat(resource_manager): resource_manager.redis.set.return_value = True resource_manager.ingestor_heartbeat() resource_manager.redis.set.assert_called_once_with( - "heartbeat:ingestor:pod_id", 1, ex=10 + "heartbeat:ingestor:localhost", 1, ex=10 ) @@ -67,12 +66,12 @@ def test_lease_tag(resource_manager): output = resource_manager.lease_tag("tag_id") assert output is True resource_manager.redis.set.assert_called_once_with( - "lease:opc_tags:tag_id", "pod_id", nx=True, ex=10 + "lease:opc_tags:tag_id", "localhost", nx=True, ex=10 ) def test_renew_tag_lease_success(resource_manager): - resource_manager.redis.get.return_value = "pod_id" + resource_manager.redis.get.return_value = "localhost" resource_manager.redis.expire.return_value = True result = resource_manager.renew_tag_lease("tag_id") assert result is True @@ -136,13 +135,12 @@ def test_init_connection_failure(monkeypatch): port=6379, lease_ttl=10, heartbeat_ttl=10, - pod_id="pod_id", metadata=metadata["metadata"], logger=MagicMock(), notification_handler=MagicMock(), ) - mock_metrics.labels.assert_called_once_with(pod_id="pod_id") + mock_metrics.labels.assert_called_once_with(pod_id="localhost") mock_status.set.assert_called_once_with(0) @@ -166,13 +164,12 @@ def test_init_ping_failure(monkeypatch): port=6379, lease_ttl=10, heartbeat_ttl=10, - pod_id="pod_id", metadata=metadata["metadata"], logger=MagicMock(), notification_handler=MagicMock(), ) - mock_metrics.labels.assert_called_once_with(pod_id="pod_id") + mock_metrics.labels.assert_called_once_with(pod_id="localhost") mock_status.set.assert_called_once_with(0) @@ -198,12 +195,12 @@ def test_execute_redis_op_success(resource_manager): mock_func.assert_called_once_with("arg1", kwarg1="value1") mock_total.labels.assert_called_once_with( - pod_id="pod_id", operation="test_op" + pod_id="localhost", operation="test_op" ) mock_total_labels.inc.assert_called_once() mock_duration.labels.assert_called_once_with( - pod_id="pod_id", operation="test_op" + pod_id="localhost", operation="test_op" ) mock_duration_labels.observe.assert_called_once_with( 0.5 @@ -226,7 +223,7 @@ def test_execute_redis_op_exception(resource_manager): # Verify metrics and error handling mock_errors.labels.assert_called_once_with( - pod_id="pod_id", operation="test_op" + pod_id="localhost", operation="test_op" ) mock_errors_labels.inc.assert_called_once() resource_manager.send_notification.assert_called_once_with( From c1184f8ccd58a43f952e5e0233af3a43aaeea5b1 Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Tue, 5 Aug 2025 12:13:12 -0300 Subject: [PATCH 10/17] SIENTIAPDE-1174 Fix test assertion for OPC_CONNECTION_STATUS in test_opc_manager.py to ensure correct label calls. --- tests/unit/managers/test_opc_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/managers/test_opc_manager.py b/tests/unit/managers/test_opc_manager.py index 7cdfb80..5774544 100644 --- a/tests/unit/managers/test_opc_manager.py +++ b/tests/unit/managers/test_opc_manager.py @@ -554,7 +554,7 @@ def test_init_metrics_calls_correct_metric_methods(mock_metrics): metadata=metadata["metadata"], ) - mock_metrics.OPC_CONNECTION_STATUS.labels.assert_called_once_with( + mock_metrics.OPC_CONNECTION_STATUS.labels.assert_called_with( pod_id=opc_manager.pod_id, server_name=opc_manager.name, server_url=opc_manager.url, From 2de4c4917ff177ecb3ea102aedceb3220a7ffc7e Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Tue, 5 Aug 2025 14:01:51 -0300 Subject: [PATCH 11/17] SIENTIAPDE-1174 Refactor test assertions in test_opc_manager.py for improved readability - Updated the assertion syntax for notification calls in the test_check_opc_listenning_error_notification_and_retry function to use dictionary literals for clarity. --- tests/unit/managers/test_opc_manager.py | 28 ++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/unit/managers/test_opc_manager.py b/tests/unit/managers/test_opc_manager.py index 5774544..f82d065 100644 --- a/tests/unit/managers/test_opc_manager.py +++ b/tests/unit/managers/test_opc_manager.py @@ -511,21 +511,21 @@ def test_check_opc_listenning_error_notification_and_retry(metrics, opc_manager) assert opc_manager.send_notification.call_count == 2 calls = opc_manager.send_notification.call_args_list # First call: 5 cycles warning - assert calls[0].kwargs == dict( - notification_id=f"OPC_LISTENNING_STOPPED__{opc_manager.name}", - message=f"15 cycles without receive from OPC {opc_manager.name}. Tags: {json.dumps(opc_manager.nodes)}", - block="opc_manager", - level=NotificationLevel.ERROR, - metadata=metadata["metadata"], - ) + assert calls[0].kwargs == { + "notification_id": f"OPC_LISTENNING_STOPPED__{opc_manager.name}", + "message": f"15 cycles without receive from OPC {opc_manager.name}. Tags: {json.dumps(opc_manager.nodes)}", + "block": "opc_manager", + "level": NotificationLevel.ERROR, + "metadata": metadata["metadata"], + } # Second call: 15 cycles retry - assert calls[1].kwargs == dict( - notification_id=f"OPC_CONNECTION_RETRY__{opc_manager.name}", - message=f"Retrying to connect to server {opc_manager.name}", - block="opc_manager", - level=NotificationLevel.ERROR, - metadata=metadata["metadata"], - ) + assert calls[1].kwargs == { + "notification_id": f"OPC_CONNECTION_RETRY__{opc_manager.name}", + "message": f"Retrying to connect to server {opc_manager.name}", + "block": "opc_manager", + "level": NotificationLevel.ERROR, + "metadata": metadata["metadata"], + } assert result is True metrics.OPC_CYCLES_WITHOUT_DATA.labels.assert_called_once_with( From c10432eae8b6a9758e20dceab6e739f1fac1ff18 Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Tue, 12 Aug 2025 08:53:06 -0300 Subject: [PATCH 12/17] SIENTIAPDE-1174 SIENTIAPDE-1174 Remove pod_id from Ingestor class initialization to streamline code structure --- ingestor/ingestor.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ingestor/ingestor.py b/ingestor/ingestor.py index ec5a684..f39746b 100644 --- a/ingestor/ingestor.py +++ b/ingestor/ingestor.py @@ -137,7 +137,6 @@ class Ingestor: }, lease_ttl=self.lease_ttl, heartbeat_ttl=self.heartbeat_ttl, - pod_id=self.pod_id, poll_interval=self.poll_interval, mongo_connection_string=self.mongo_connection_string, mongo_database=self.mongo_database, From 2cf836c35bd8657306771ecc1f8dd70508138747 Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Wed, 13 Aug 2025 15:39:53 -0300 Subject: [PATCH 13/17] SIENTIAPDE-1174 SIENTIAPDE-1174 Remove pod_id from test_prepare_ingestor to align with Ingestor class changes --- tests/unit/test_ingestor.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/test_ingestor.py b/tests/unit/test_ingestor.py index 60a5b89..215e0fc 100644 --- a/tests/unit/test_ingestor.py +++ b/tests/unit/test_ingestor.py @@ -113,7 +113,6 @@ def test_prepare_ingestor(ingestor_manager_mock, ingestor): }, lease_ttl=ingestor.lease_ttl, heartbeat_ttl=ingestor.heartbeat_ttl, - pod_id=ingestor.pod_id, poll_interval=ingestor.poll_interval, mongo_connection_string=ingestor.mongo_connection_string, mongo_database=ingestor.mongo_database, From 75bbcf5a289308568976fee7cce8d654e22aa95d Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Wed, 13 Aug 2025 15:47:09 -0300 Subject: [PATCH 14/17] SIENTIAPDE-1174 Reset mock metrics in test_init_metrics_calls_correct_metric_methods for improved test isolation in test_opc_manager.py. --- tests/unit/managers/test_opc_manager.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/unit/managers/test_opc_manager.py b/tests/unit/managers/test_opc_manager.py index f82d065..dae11f1 100644 --- a/tests/unit/managers/test_opc_manager.py +++ b/tests/unit/managers/test_opc_manager.py @@ -544,6 +544,9 @@ def test_check_opc_listenning_error_notification_and_retry(metrics, opc_manager) @patch("ingestor.managers.opc_manager.metrics") def test_init_metrics_calls_correct_metric_methods(mock_metrics): + mock_metrics.OPC_CONNECTION_STATUS.reset_mock() + mock_metrics.OPC_TAGS_SUBSCRIBED.reset_mock() + opc_manager = OpcManager( name="TestInitConnector", url="opc.tcp://init.test:4840", From 753acf464b5d4f00ae313206c602bf6f7a2572ee Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Wed, 13 Aug 2025 15:49:31 -0300 Subject: [PATCH 15/17] SIENTIAPDE-1174 Rename OpcManager instance in test_init_metrics_calls_correct_metric_methods for clarity in test_opc_manager.py. --- tests/unit/managers/test_opc_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/managers/test_opc_manager.py b/tests/unit/managers/test_opc_manager.py index dae11f1..da66b24 100644 --- a/tests/unit/managers/test_opc_manager.py +++ b/tests/unit/managers/test_opc_manager.py @@ -548,7 +548,7 @@ def test_init_metrics_calls_correct_metric_methods(mock_metrics): mock_metrics.OPC_TAGS_SUBSCRIBED.reset_mock() opc_manager = OpcManager( - name="TestInitConnector", + name="TestConnector", url="opc.tcp://init.test:4840", data_manager=MagicMock(), logger=MagicMock(), From 59f518b7858326ed668040913abd3ecfe795f266 Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Wed, 13 Aug 2025 15:53:10 -0300 Subject: [PATCH 16/17] SIENTIAPDE-1174 Refactor test_init_metrics_calls_correct_metric_methods to use metrics directly instead of mock_metrics for improved clarity in test_opc_manager.py. --- tests/unit/managers/test_opc_manager.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/tests/unit/managers/test_opc_manager.py b/tests/unit/managers/test_opc_manager.py index da66b24..4162c28 100644 --- a/tests/unit/managers/test_opc_manager.py +++ b/tests/unit/managers/test_opc_manager.py @@ -543,12 +543,10 @@ def test_check_opc_listenning_error_notification_and_retry(metrics, opc_manager) @patch("ingestor.managers.opc_manager.metrics") -def test_init_metrics_calls_correct_metric_methods(mock_metrics): - mock_metrics.OPC_CONNECTION_STATUS.reset_mock() - mock_metrics.OPC_TAGS_SUBSCRIBED.reset_mock() +def test_init_metrics_calls_correct_metric_methods(metrics): opc_manager = OpcManager( - name="TestConnector", + name="TestInitConnector", url="opc.tcp://init.test:4840", data_manager=MagicMock(), logger=MagicMock(), @@ -557,19 +555,19 @@ def test_init_metrics_calls_correct_metric_methods(mock_metrics): metadata=metadata["metadata"], ) - mock_metrics.OPC_CONNECTION_STATUS.labels.assert_called_with( + metrics.OPC_CONNECTION_STATUS.labels.assert_called_with( pod_id=opc_manager.pod_id, server_name=opc_manager.name, server_url=opc_manager.url, ) - mock_metrics.OPC_CONNECTION_STATUS.labels.return_value.set.assert_called_once_with( + metrics.OPC_CONNECTION_STATUS.labels.return_value.set.assert_called_once_with( 0) - mock_metrics.OPC_TAGS_SUBSCRIBED.labels.assert_called_once_with( + metrics.OPC_TAGS_SUBSCRIBED.labels.assert_called_once_with( pod_id=opc_manager.pod_id, server_name=opc_manager.name ) - mock_metrics.OPC_TAGS_SUBSCRIBED.labels.return_value.set.assert_called_once_with( + metrics.OPC_TAGS_SUBSCRIBED.labels.return_value.set.assert_called_once_with( 0) From ee69815f97676103e1c2a97157c95cd8fe7e910f Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Wed, 13 Aug 2025 15:57:58 -0300 Subject: [PATCH 17/17] SIENTIAPDE-1174 Add metrics patch decorator to raw_opc_manager fixture for improved test isolation in test_opc_manager.py --- tests/unit/managers/test_opc_manager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/managers/test_opc_manager.py b/tests/unit/managers/test_opc_manager.py index 4162c28..7f022b7 100644 --- a/tests/unit/managers/test_opc_manager.py +++ b/tests/unit/managers/test_opc_manager.py @@ -44,7 +44,8 @@ metadata = { @fixture -def raw_opc_manager(): +@patch("ingestor.managers.opc_manager.metrics") +def raw_opc_manager(mock_metrics): return OpcManager( name="TestConnector", url="opc.tcp://localhost:4840",