Skip to content

Commit

Permalink
Merge pull request #28 from odigos-io/avoid-logging
Browse files Browse the repository at this point in the history
fix: silent logging from odigos-otel-python
  • Loading branch information
tamirdavid1 authored Sep 17, 2024
2 parents 20c43c0 + 58d02ec commit 8bf8288
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 29 deletions.
14 changes: 11 additions & 3 deletions initializer/odigos_sampler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
39 changes: 26 additions & 13 deletions opamp/http_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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
Expand All @@ -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)

Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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
Expand All @@ -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 = [
Expand Down Expand Up @@ -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)
Expand All @@ -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

Expand All @@ -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:
Expand Down
8 changes: 4 additions & 4 deletions opamp/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}
12 changes: 4 additions & 8 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down

0 comments on commit 8bf8288

Please sign in to comment.