diff --git a/middleware/lib/_meter.py b/middleware/lib/_meter.py index d659344..b88627c 100644 --- a/middleware/lib/_meter.py +++ b/middleware/lib/_meter.py @@ -1,4 +1,11 @@ -import psutil +try: + import psutil + PSUTIL_AVAILABLE = True +except ImportError: + PSUTIL_AVAILABLE = False + # todo: report this information to Middleware servers + print("Warning: psutil is not installed. Metrics features will be disabled.") + import os import threading import gc @@ -26,25 +33,26 @@ class DiskUsageData(NamedTuple): def collect_metrics() -> None: - exporter = OTLPMetricExporter( - timeout=5, - compression=grpc.Compression.Gzip, - ) - readers = [PeriodicExportingMetricReader(exporter)] - if config.console_exporter: - output= sys.stdout - if config.debug_log_file: - output=open("mw-metrics.log", "w") - console_reader = PeriodicExportingMetricReader( - ConsoleMetricExporter(out=output) + if PSUTIL_AVAILABLE: + exporter = OTLPMetricExporter( + timeout=5, + compression=grpc.Compression.Gzip, ) - readers.append(console_reader) - provider = MeterProvider(metric_readers=readers) - if metrics.get_meter_provider() is None: - metrics.set_meter_provider(provider) - # metrics.set_meter_provider(provider) - meter = provider.get_meter("sdk_meter_provider") - _generate_metrics(meter) + readers = [PeriodicExportingMetricReader(exporter)] + if config.console_exporter: + output= sys.stdout + if config.debug_log_file: + output=open("mw-metrics.log", "w") + console_reader = PeriodicExportingMetricReader( + ConsoleMetricExporter(out=output) + ) + readers.append(console_reader) + provider = MeterProvider(metric_readers=readers) + if metrics.get_meter_provider() is None: + metrics.set_meter_provider(provider) + # metrics.set_meter_provider(provider) + meter = provider.get_meter("sdk_meter_provider") + _generate_metrics(meter) def _generate_metrics(meter): diff --git a/middleware/lib/_profiler.py b/middleware/lib/_profiler.py index 68871b7..dd5bc5d 100644 --- a/middleware/lib/_profiler.py +++ b/middleware/lib/_profiler.py @@ -1,6 +1,12 @@ import os import requests, json -import pyroscope +try: + import pyroscope + PYROSCOPE_AVAILABLE = True +except ImportError: + PYROSCOPE_AVAILABLE = False + # todo: report this information to Middleware servers + print("Warning: Pyroscope is not installed. Profiling features will be disabled.") from middleware.config import config green_color = "\033[92m" @@ -8,7 +14,7 @@ reset_color = "\033[0m" def collect_profiling() -> None: - if config.access_token != "": + if PYROSCOPE_AVAILABLE and config.access_token != "": # Setting Middleware Account Authentication URL auth_url = os.getenv('MW_AUTH_URL', 'https://app.middleware.io/api/v1/auth') diff --git a/middleware/lib/mw_tracker.py b/middleware/lib/mw_tracker.py index f164754..a9e855a 100644 --- a/middleware/lib/mw_tracker.py +++ b/middleware/lib/mw_tracker.py @@ -1,5 +1,9 @@ import os -import psutil +try: + import psutil + PSUTIL_AVAILABLE = True +except ImportError: + PSUTIL_AVAILABLE = False import logging import requests from middleware.version import SDK_VERSION @@ -24,8 +28,9 @@ def __init__(self): self.collect_traces() if config.collect_logs: self.collect_logs() - if config.collect_profiling and not psutil.WINDOWS: - self.collect_profiling() + if PSUTIL_AVAILABLE: + if config.collect_profiling and not psutil.WINDOWS: + self.collect_profiling() self._get_instrument_info() def collect_metrics(self): diff --git a/pyproject.toml b/pyproject.toml index 329bd60..e0eb5e4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "middleware-apm" -version = "1.2.1" +version = "1.2.4rc4" description = "Middleware's APM tool enables Python developers to effortlessly monitor their applications, gathering distributed tracing, metrics, logs, and profiling data for valuable insights and performance optimization." readme = "README.md" requires-python = ">=3.8" @@ -27,9 +27,6 @@ dependencies = [ "opentelemetry-util-http==0.48b0", "PyYAML==6.0.2", "requests==2.32.3", - "thrift==0.20.0", - "pyroscope-io==0.8.5; sys_platform != 'win32'", - "psutil==6.0.0", "tomli==2.0.1", "opentelemetry-propagator-b3==1.27.0", "opentelemetry-propagator-jaeger==1.27.0", @@ -38,6 +35,13 @@ dependencies = [ "opentelemetry-propagator-gcp==1.7.0" ] +[project.optional-dependencies] +test = [ + "pyroscope-io==0.8.5", + "psutil==6.0.0", + "thrift==0.20.0", +] + [project.urls] Source = "https://github.com/middleware-labs/agent-apm-python.git" Homepage = "https://docs.middleware.io/docs/apm-configuration/python" diff --git a/requirements.txt b/requirements.txt index 366bf66..558d3d6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,9 +17,6 @@ opentelemetry-semantic-conventions==0.48b0 opentelemetry-util-http==0.48b0 PyYAML==6.0.2 requests==2.32.3 -thrift==0.20.0 -pyroscope-io==0.8.5; sys_platform != 'win32' -psutil==6.0.0 tomli==2.0.1 # webencodings==0.5.1 # websocket-client==0.53.0