From 58d02ec2f8cbf1769d002a6655de472a09a5206e Mon Sep 17 00:00:00 2001 From: Tamir David Date: Tue, 17 Sep 2024 15:16:07 +0300 Subject: [PATCH] fix: silent logging from odigos-otel-python --- initializer/odigos_sampler.py | 14 ++++++++++--- opamp/http_client.py | 39 +++++++++++++++++++++++------------ opamp/utils.py | 8 +++---- requirements.txt | 12 ++++------- setup.py | 1 - 5 files changed, 45 insertions(+), 29 deletions(-) diff --git a/initializer/odigos_sampler.py b/initializer/odigos_sampler.py index 6af8197..6b665db 100644 --- a/initializer/odigos_sampler.py +++ b/initializer/odigos_sampler.py @@ -5,11 +5,19 @@ # Setup the Sampler logger sampler_logger = logging.getLogger(__name__) -# sampler_logger.setLevel(logging.DEBUG) -# handler = logging.StreamHandler() -# sampler_logger.addHandler(handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) or handler) +sampler_logger.setLevel(logging.DEBUG) +sampler_logger.propagate = False # Prevent the log messages from being propagated to the root logger sampler_logger.disabled = True # Comment this line to enable the logger +# Safely remove all attached handlers from the logger. +# This ensures that any existing handlers, if present, are detached, +# preventing them from processing or outputting any log messages. +for handler in sampler_logger.handlers[:]: + try: + sampler_logger.removeHandler(handler) + except Exception: + pass + class OdigosSampler(Sampler): # Define the sampling operator functions used in the configuration. diff --git a/opamp/http_client.py b/opamp/http_client.py index d94007a..a6b79b8 100644 --- a/opamp/http_client.py +++ b/opamp/http_client.py @@ -20,8 +20,17 @@ # Setup the logger opamp_logger = logging.getLogger(__name__) opamp_logger.setLevel(logging.DEBUG) +opamp_logger.propagate = False # Prevent the log messages from being propagated to the root logger opamp_logger.disabled = True # Comment this line to enable the logger +# Safely remove all attached handlers from the logger. +# This ensures that any existing handlers, if present, are detached, +# preventing them from processing or outputting any log messages. +for handler in opamp_logger.handlers[:]: + try: + opamp_logger.removeHandler(handler) + except Exception: + pass class OpAMPHTTPClient: def __init__(self, event, condition: threading.Condition): @@ -44,7 +53,7 @@ def start(self, python_version_supported: bool = None): python_version = f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}' error_message = f"Opentelemetry SDK require Python in version 3.8 or higher [{python_version} is not supported]" - opamp_logger.warning(f"{error_message}, sending disconnect message to OpAMP server...") + # opamp_logger.warning(f"{error_message}, sending disconnect message to OpAMP server...") self.send_unsupported_version_disconnect_message(error_message=error_message) self.event.set() return @@ -64,7 +73,7 @@ def run(self): self.worker() except Exception as e: - opamp_logger.error(f"Error running OpAMP client: {e}") + # opamp_logger.error(f"Error running OpAMP client: {e}") failure_message = self.get_agent_failure_disconnect_message(error_message=str(e)) self.send_agent_to_server_message(failure_message) @@ -112,13 +121,14 @@ def send_first_message_with_retry(self) -> None: self.resource_attributes = utils.parse_first_message_to_resource_attributes(first_message_server_to_agent, opamp_logger) # Send healthy message to OpAMP server - opamp_logger.info("Reporting healthy to OpAMP server...") + # opamp_logger.info("Reporting healthy to OpAMP server...") agent_health = self.get_agent_health(component_health=True, status=AgentHealthStatus.HEALTHY.value) self.send_agent_to_server_message(opamp_pb2.AgentToServer(health=agent_health)) break except Exception as e: - opamp_logger.error(f"Error sending full state to OpAMP server: {e}") + # opamp_logger.error(f"Error sending full state to OpAMP server: {e}") + pass if attempt < max_retries: time.sleep(delay) @@ -129,11 +139,12 @@ def worker(self): try: server_to_agent = self.send_heartbeat() if self.update_remote_config_status(server_to_agent): - opamp_logger.info("Remote config updated, applying changes...") + # opamp_logger.info("Remote config updated, applying changes...") + pass # TODO: implement changes based on the remote config if server_to_agent.flags & opamp_pb2.ServerToAgentFlags_ReportFullState: - opamp_logger.info("Received request to report full state") + # opamp_logger.info("Received request to report full state") agent_description = self.get_agent_description() agent_health = self.get_agent_health(component_health=True, status=AgentHealthStatus.HEALTHY.value) @@ -144,7 +155,8 @@ def worker(self): self.update_remote_config_status(server_to_agent) except requests_odigos.RequestException as e: - opamp_logger.error(f"Error fetching data: {e}") + # opamp_logger.error(f"Error fetching data: {e}") + pass self.condition.wait(30) def send_heartbeat(self) -> opamp_pb2.ServerToAgent: # type: ignore @@ -153,7 +165,8 @@ def send_heartbeat(self) -> opamp_pb2.ServerToAgent: # type: ignore agent_to_server = opamp_pb2.AgentToServer(remote_config_status=self.remote_config_status) return self.send_agent_to_server_message(agent_to_server) except requests_odigos.RequestException as e: - opamp_logger.error(f"Error sending heartbeat to OpAMP server: {e}") + # opamp_logger.error(f"Error sending heartbeat to OpAMP server: {e}") + pass def get_agent_description(self) -> opamp_pb2.AgentDescription: # type: ignore identifying_attributes = [ @@ -212,10 +225,10 @@ def send_agent_to_server_message(self, message: opamp_pb2.AgentToServer) -> opam response = requests_odigos.post(self.server_url, data=message_bytes, headers=headers, timeout=5) response.raise_for_status() except requests_odigos.Timeout: - opamp_logger.error("Timeout sending message to OpAMP server") + # opamp_logger.error("Timeout sending message to OpAMP server") return opamp_pb2.ServerToAgent() except requests_odigos.ConnectionError as e: - opamp_logger.error(f"Error sending message to OpAMP server: {e}") + # opamp_logger.error(f"Error sending message to OpAMP server: {e}") return opamp_pb2.ServerToAgent() finally: detach(agent_message) @@ -224,7 +237,7 @@ def send_agent_to_server_message(self, message: opamp_pb2.AgentToServer) -> opam try: server_to_agent.ParseFromString(response.content) except NotImplementedError as e: - opamp_logger.error(f"Error parsing response from OpAMP server: {e}") + # opamp_logger.error(f"Error parsing response from OpAMP server: {e}") return opamp_pb2.ServerToAgent() return server_to_agent @@ -236,14 +249,14 @@ def mandatory_env_vars_set(self): for env_var, value in mandatory_env_vars.items(): if not value: - opamp_logger.error(f"{env_var} environment variable not set") + # opamp_logger.error(f"{env_var} environment variable not set") return False return True def shutdown(self, custom_failure_message: str = None): self.running = False - opamp_logger.info("Sending agent disconnect message to OpAMP server...") + # opamp_logger.info("Sending agent disconnect message to OpAMP server...") if custom_failure_message: disconnect_message = self.get_agent_failure_disconnect_message(error_message=custom_failure_message) else: diff --git a/opamp/utils.py b/opamp/utils.py index 01d4a54..a1af1c1 100644 --- a/opamp/utils.py +++ b/opamp/utils.py @@ -2,23 +2,23 @@ import logging from opamp import opamp_pb2 -def parse_first_message_to_resource_attributes(first_message_server_to_agent: opamp_pb2.ServerToAgent, logger: logging.Logger) -> dict: +def parse_first_message_to_resource_attributes(first_message_server_to_agent: opamp_pb2.ServerToAgent, logger: logging.Logger) -> dict: # type: ignore config_map = first_message_server_to_agent.remote_config.config.config_map if "SDK" not in config_map: - logger.error("SDK not found in config map, returning empty resource attributes") + # logger.error("SDK not found in config map, returning empty resource attributes") return {} try: sdk_config = json.loads(config_map["SDK"].body) except json.JSONDecodeError as e: - logger.error(f"Error decoding SDK config: {e}") + # logger.error(f"Error decoding SDK config: {e}") return {} remote_resource_attributes = sdk_config.get('remoteResourceAttributes', []) if not remote_resource_attributes: - logger.error('missing "remoteResourceAttributes" section in OpAMP server remote config on first server to agent message') + # logger.error('missing "remoteResourceAttributes" section in OpAMP server remote config on first server to agent message') return {} return {item['key']: item['value'] for item in remote_resource_attributes} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 83cef5b..84b066f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # # pip-compile setup.py @@ -76,7 +76,6 @@ opentelemetry-api==1.25.0 # opentelemetry-instrumentation-sqlalchemy # opentelemetry-instrumentation-sqlite3 # opentelemetry-instrumentation-starlette - # opentelemetry-instrumentation-system-metrics # opentelemetry-instrumentation-threading # opentelemetry-instrumentation-tornado # opentelemetry-instrumentation-tortoiseorm @@ -136,7 +135,6 @@ opentelemetry-instrumentation==0.46b0 # opentelemetry-instrumentation-sqlalchemy # opentelemetry-instrumentation-sqlite3 # opentelemetry-instrumentation-starlette - # opentelemetry-instrumentation-system-metrics # opentelemetry-instrumentation-threading # opentelemetry-instrumentation-tornado # opentelemetry-instrumentation-tortoiseorm @@ -232,8 +230,6 @@ opentelemetry-instrumentation-sqlite3==0.46b0 # via odigos-opentelemetry-python (setup.py) opentelemetry-instrumentation-starlette==0.46b0 # via odigos-opentelemetry-python (setup.py) -opentelemetry-instrumentation-system-metrics==0.46b0 - # via odigos-opentelemetry-python (setup.py) opentelemetry-instrumentation-threading==0.46b0 # via odigos-opentelemetry-python (setup.py) opentelemetry-instrumentation-tornado==0.46b0 @@ -325,12 +321,12 @@ protobuf==3.19.4 # googleapis-common-protos # odigos-opentelemetry-python (setup.py) # opentelemetry-proto -psutil==5.9.8 - # via opentelemetry-instrumentation-system-metrics requests==2.32.3 # via opentelemetry-exporter-otlp-proto-http typing-extensions==4.12.2 - # via opentelemetry-sdk + # via + # asgiref + # opentelemetry-sdk urllib3==2.2.2 # via requests urllib3-odigos==2.2.2 diff --git a/setup.py b/setup.py index 3a21325..017bbf8 100644 --- a/setup.py +++ b/setup.py @@ -54,7 +54,6 @@ 'opentelemetry-instrumentation-sqlalchemy==0.46b0', 'opentelemetry-instrumentation-sqlite3==0.46b0', 'opentelemetry-instrumentation-starlette==0.46b0', - 'opentelemetry-instrumentation-system-metrics==0.46b0', 'opentelemetry-instrumentation-tornado==0.46b0', 'opentelemetry-instrumentation-tortoiseorm==0.46b0', 'opentelemetry-instrumentation-threading==0.46b0',