{"record":{"id":"b1e43785a5d094fa","repo":"redis/redis-py","slug":"opentelemetry-is-not-installed-install-it-with","errorCode":null,"errorMessage":"OpenTelemetry is not installed. Install it with:\n  pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp-proto-http","messagePattern":"OpenTelemetry is not installed\\. Install it with:\n  pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp-proto-http","errorType":"exception","errorClass":"ImportError","httpStatus":null,"severity":"error","filePath":"redis/observability/providers.py","lineNumber":79,"sourceCode":"        \"\"\"\n        Get the global MeterProvider set by the application.\n\n        Returns:\n            MeterProvider instance or None if metrics are disabled\n\n        Raises:\n            ImportError: If OpenTelemetry is not installed\n            RuntimeError: If metrics are enabled but no global MeterProvider is set\n        \"\"\"\n        if not self.config.is_enabled():\n            return None\n\n        # Lazy import - only import OTel when metrics are enabled\n        try:\n            from opentelemetry import metrics\n            from opentelemetry.metrics import NoOpMeterProvider\n        except ImportError:\n            raise ImportError(\n                \"OpenTelemetry is not installed. Install it with:\\n\"\n                \"  pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp-proto-http\"\n            )\n\n        # Get the global MeterProvider\n        if self._meter_provider is None:\n            self._meter_provider = metrics.get_meter_provider()\n\n            # Check if it's a real provider (not NoOp)\n            if isinstance(self._meter_provider, NoOpMeterProvider):\n                raise RuntimeError(\n                    \"Metrics are enabled but no global MeterProvider is configured.\\n\"\n                    \"\\n\"\n                    \"Set up OpenTelemetry before initializing redis-py observability:\\n\"\n                    \"\\n\"\n                    \"  from opentelemetry import metrics\\n\"\n                    \"  from opentelemetry.sdk.metrics import MeterProvider\\n\"\n                    \"  from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader\\n\"","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/redis/redis-py/blob/6a6b581b48225afa0b76912d1028c6035baee932/redis/observability/providers.py#L61-L97","documentation":"Raised as ImportError by OTelProviderManager.get_meter_provider() (redis/observability/providers.py:79) when config.is_enabled() is True but the lazy import `from opentelemetry import metrics` fails. Unlike error 461 (which needs only opentelemetry-api for the collector), this path requires the SDK packages so the manager can obtain a real MeterProvider. The message lists the full set: opentelemetry-api, opentelemetry-sdk, and the OTLP HTTP exporter.","triggerScenarios":"Calling otel.init(OTelConfig(enable_metrics=True)) (or any default OTelConfig, since DEFAULT_TELEMETRY is METRICS) and then issuing a Redis command that triggers get_meter_provider(). Only opentelemetry-api is installed but not opentelemetry-sdk; or neither is installed and the module happened to construct the manager before hitting the collector check.","commonSituations":"Developer installed just `opentelemetry-api` (the light API package) thinking it was enough; requirements list `opentelemetry-sdk` but a version conflict removed it; the OTLP exporter package needed to actually export metrics was never added; dev environment works but production slim image omits the SDK wheels.","solutions":["Install the full SDK set exactly as the message instructs: `pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp-proto-http` (or `pip install redis[otel]` plus the exporter if you export over OTLP HTTP).","Confirm both `from opentelemetry import metrics` and `from opentelemetry.sdk.metrics import MeterProvider` import cleanly in the target interpreter.","If you do not want metrics, pass an OTelConfig with enabled_telemetry cleared so get_meter_provider() returns early before the import.","Pin opentelemetry-sdk and the exporter to compatible versions in your lockfile to prevent a resolver from dropping them."],"exampleFix":"# before - only the api package present\npip install opentelemetry-api\notel.init(OTelConfig(enable_metrics=True))  # providers.py:79 ImportError\n\n# after\npip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp-proto-http","handlingStrategy":"validation","validationCode":"def otel_sdk_available():\n    try:\n        from opentelemetry import metrics  # noqa: F401\n        from opentelemetry.sdk.metrics import MeterProvider  # noqa: F401\n        return True\n    except ImportError:\n        return False\n\n# only enable metrics if the full SDK is present\nconfig = OTelConfig(enable_metrics=True) if otel_sdk_available() else OTelConfig(enabled_telemetry=[])","typeGuard":null,"tryCatchPattern":"try:\n    otel.init(OTelConfig(enable_metrics=True))\nexcept ImportError as e:\n    if 'OpenTelemetry' in str(e):\n        logging.warning('OpenTelemetry SDK not installed; observability disabled')\n    else:\n        raise","preventionTips":["Install opentelemetry-api, opentelemetry-sdk, and opentelemetry-exporter-otlp-proto-http together (or use the otel extra plus the exporter).","Guard the init call with an import probe so a missing SDK disables metrics instead of raising.","Run a startup self-check importing the SDK packages in the production interpreter.","Pin all three OpenTelemetry packages to mutually compatible versions in requirements."],"tags":["observability","opentelemetry","provider","import","dependency","configuration"],"backgroundTag":null,"analyzedSha":"6a6b581b48225afa0b76912d1028c6035baee932","analyzedAt":"2026-08-10T12:52:44.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}