Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: silent logging from odigos-otel-python #28

Merged
merged 1 commit into from
Sep 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading