diff --git a/.pylintrc b/.pylintrc index d3a4723112..b59a8cc939 100644 --- a/.pylintrc +++ b/.pylintrc @@ -80,7 +80,8 @@ disable=missing-docstring, missing-module-docstring, # temp-pylint-upgrade import-error, # needed as a workaround as reported here: https://github.com/open-telemetry/opentelemetry-python-contrib/issues/290 cyclic-import, - not-context-manager + not-context-manager, + attribute-defined-outside-init # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option diff --git a/CHANGELOG.md b/CHANGELOG.md index 4300f1b627..18c09eed21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#4335](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4335)) - Expand `AGENTS.md` with instrumentation/GenAI guidance and add PR review instructions. ([#4457](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4457)) +- Remove redundant `pylint: disable=attribute-defined-outside-init` comments and add rule to global `.pylintrc` disable list + ([#3839](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3839)) - `opentelemetry-exporter-richconsole`: Add support for suppressing resource information ([#3898](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3898)) diff --git a/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/__init__.py b/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/__init__.py index e70e07e5e4..64e4fc39da 100644 --- a/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/__init__.py @@ -550,7 +550,7 @@ def __init__(self, *args, **kwargs): class AioHttpServerInstrumentor(BaseInstrumentor): - # pylint: disable=protected-access,attribute-defined-outside-init + # pylint: disable=protected-access """An instrumentor for aiohttp.web.Application See `BaseInstrumentor` diff --git a/instrumentation/opentelemetry-instrumentation-asyncio/src/opentelemetry/instrumentation/asyncio/__init__.py b/instrumentation/opentelemetry-instrumentation-asyncio/src/opentelemetry/instrumentation/asyncio/__init__.py index cb84ba479c..4acf422242 100644 --- a/instrumentation/opentelemetry-instrumentation-asyncio/src/opentelemetry/instrumentation/asyncio/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-asyncio/src/opentelemetry/instrumentation/asyncio/__init__.py @@ -120,7 +120,6 @@ def instrumentation_dependencies(self) -> Collection[str]: return _instruments def _instrument(self, **kwargs): - # pylint: disable=attribute-defined-outside-init self._tracer = get_tracer( __name__, __version__, kwargs.get("tracer_provider") ) diff --git a/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py b/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py index 32342dad95..554ad43995 100644 --- a/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py @@ -465,9 +465,10 @@ def _instrument(self, **kwargs): ) ) return - # pylint: disable=attribute-defined-outside-init + # Convert slash-delimited paths to dot-delimited for valid Python imports lambda_handler = lambda_handler.replace("/", ".") + ( self._wrapped_module_name, self._wrapped_function_name, diff --git a/instrumentation/opentelemetry-instrumentation-boto3sqs/src/opentelemetry/instrumentation/boto3sqs/__init__.py b/instrumentation/opentelemetry-instrumentation-boto3sqs/src/opentelemetry/instrumentation/boto3sqs/__init__.py index 7c74188242..7d0306955b 100644 --- a/instrumentation/opentelemetry-instrumentation-boto3sqs/src/opentelemetry/instrumentation/boto3sqs/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-boto3sqs/src/opentelemetry/instrumentation/boto3sqs/__init__.py @@ -82,7 +82,6 @@ def set(self, carrier: CarrierT, key: str, value: str) -> None: boto3sqs_setter = Boto3SQSSetter() -# pylint: disable=attribute-defined-outside-init class Boto3SQSInstrumentor(BaseInstrumentor): received_messages_spans: Dict[str, Span] = {} current_span_related_to_token: Span = None @@ -177,7 +176,7 @@ def _safe_end_processing_span(receipt_handle: str) -> None: @staticmethod def _extract_queue_name_from_url(queue_url: str) -> str: # A Queue name cannot have the `/` char, therefore we can return the part after the last / - return queue_url.split("/")[-1] + return queue_url.rsplit("/", maxsplit=1)[-1] def _create_processing_span( self, diff --git a/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py b/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py index 76c882ae1f..0ff08628b7 100644 --- a/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py @@ -140,6 +140,7 @@ def response_hook(span, service_name, operation_name, result): suppress_http_instrumentation, unwrap, ) +from opentelemetry.metrics import Instrument from opentelemetry.propagators.aws.aws_xray_propagator import ( TRACE_HEADER_KEY, AwsXRayPropagator, @@ -181,7 +182,15 @@ def instrumentation_dependencies(self) -> Collection[str]: return _instruments_botocore def _instrument(self, **kwargs): - # pylint: disable=attribute-defined-outside-init + # tracers are lazy initialized per-extension in _get_tracer + self._tracers = {} + # loggers are lazy initialized per-extension in _get_logger + self._loggers = {} + # meters are lazy initialized per-extension in _get_meter + self._meters = {} + # metrics are lazy initialized per-extension in _get_metrics + self._metrics: Dict[str, Dict[str, Instrument]] = {} + self.request_hook = kwargs.get("request_hook") self.response_hook = kwargs.get("response_hook") diff --git a/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/extensions/bedrock.py b/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/extensions/bedrock.py index 148e92ea86..dc3fe839c0 100644 --- a/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/extensions/bedrock.py +++ b/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/extensions/bedrock.py @@ -460,7 +460,6 @@ def before_service_call( span.update_name(f"{operation_name} {request_model}") # this is used to calculate the operation duration metric, duration may be skewed by request_hook - # pylint: disable=attribute-defined-outside-init self._operation_start = default_timer() # pylint: disable=no-self-use,too-many-locals diff --git a/instrumentation/opentelemetry-instrumentation-celery/src/opentelemetry/instrumentation/celery/__init__.py b/instrumentation/opentelemetry-instrumentation-celery/src/opentelemetry/instrumentation/celery/__init__.py index a70be46923..48ef739592 100644 --- a/instrumentation/opentelemetry-instrumentation-celery/src/opentelemetry/instrumentation/celery/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-celery/src/opentelemetry/instrumentation/celery/__init__.py @@ -124,7 +124,6 @@ def instrumentation_dependencies(self) -> Collection[str]: def _instrument(self, **kwargs): tracer_provider = kwargs.get("tracer_provider") - # pylint: disable=attribute-defined-outside-init self._tracer = trace.get_tracer( __name__, __version__, diff --git a/instrumentation/opentelemetry-instrumentation-confluent-kafka/src/opentelemetry/instrumentation/confluent_kafka/__init__.py b/instrumentation/opentelemetry-instrumentation-confluent-kafka/src/opentelemetry/instrumentation/confluent_kafka/__init__.py index 45c0e8b196..c879458ea4 100644 --- a/instrumentation/opentelemetry-instrumentation-confluent-kafka/src/opentelemetry/instrumentation/confluent_kafka/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-confluent-kafka/src/opentelemetry/instrumentation/confluent_kafka/__init__.py @@ -219,7 +219,6 @@ class ConfluentKafkaInstrumentor(BaseInstrumentor): See `BaseInstrumentor` """ - # pylint: disable=attribute-defined-outside-init @staticmethod def instrument_producer( producer: Producer, tracer_provider=None diff --git a/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/__init__.py b/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/__init__.py index 68c5f6586c..f99c16029b 100644 --- a/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/__init__.py @@ -538,7 +538,7 @@ def process_response(self, req, resp, resource, req_succeeded=None): # pylint:d class FalconInstrumentor(BaseInstrumentor): - # pylint: disable=protected-access,attribute-defined-outside-init + # pylint: disable=protected-access """An instrumentor for falcon.API See `BaseInstrumentor` diff --git a/instrumentation/opentelemetry-instrumentation-fastapi/tests/test_fastapi_instrumentation.py b/instrumentation/opentelemetry-instrumentation-fastapi/tests/test_fastapi_instrumentation.py index 7c6f41a48f..d8e895d20e 100644 --- a/instrumentation/opentelemetry-instrumentation-fastapi/tests/test_fastapi_instrumentation.py +++ b/instrumentation/opentelemetry-instrumentation-fastapi/tests/test_fastapi_instrumentation.py @@ -2052,7 +2052,6 @@ async def _(*_): ) -# pylint: disable=attribute-defined-outside-init class TestFastAPIFallback(TestBaseFastAPI): @pytest.fixture(autouse=True) def inject_fixtures(self, caplog): diff --git a/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/__init__.py b/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/__init__.py index 67eee996a9..67dee24e40 100644 --- a/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/__init__.py @@ -726,7 +726,7 @@ def __init__(self, *args, **kwargs): class FlaskInstrumentor(BaseInstrumentor): - # pylint: disable=protected-access,attribute-defined-outside-init + # pylint: disable=protected-access """An instrumentor for flask.Flask See `BaseInstrumentor` diff --git a/instrumentation/opentelemetry-instrumentation-flask/tests/base_test.py b/instrumentation/opentelemetry-instrumentation-flask/tests/base_test.py index d69a096079..e5745ce273 100644 --- a/instrumentation/opentelemetry-instrumentation-flask/tests/base_test.py +++ b/instrumentation/opentelemetry-instrumentation-flask/tests/base_test.py @@ -110,5 +110,4 @@ def excluded2_endpoint(): self._repeat_custom_response_headers ) - # pylint: disable=attribute-defined-outside-init self.client = Client(self.app, Response) diff --git a/instrumentation/opentelemetry-instrumentation-flask/tests/test_automatic.py b/instrumentation/opentelemetry-instrumentation-flask/tests/test_automatic.py index f396ee8276..451c7415d8 100644 --- a/instrumentation/opentelemetry-instrumentation-flask/tests/test_automatic.py +++ b/instrumentation/opentelemetry-instrumentation-flask/tests/test_automatic.py @@ -40,7 +40,6 @@ def test_uninstrument(self): self.app = flask.Flask(__name__) self.app.route("/hello/")(self._hello_endpoint) - # pylint: disable=attribute-defined-outside-init self.client = Client(self.app, Response) resp = self.client.get("/hello/123") @@ -77,7 +76,6 @@ def test_no_op_tracer_provider(self): self.app = flask.Flask(__name__) self.app.route("/hello/")(self._hello_endpoint) - # pylint: disable=attribute-defined-outside-init self.client = Client(self.app, Response) self.client.get("/hello/123") diff --git a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/__init__.py b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/__init__.py index d5ad928ad4..3b0ef08703 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/__init__.py @@ -309,7 +309,7 @@ class GrpcInstrumentorServer(BaseInstrumentor): """ - # pylint:disable=attribute-defined-outside-init, redefined-outer-name + # pylint:disable=redefined-outer-name def __init__(self, filter_=None): excluded_service_filter = _excluded_service_filter() @@ -363,7 +363,7 @@ class GrpcAioInstrumentorServer(BaseInstrumentor): """ - # pylint:disable=attribute-defined-outside-init, redefined-outer-name + # pylint:disable=redefined-outer-name def __init__(self, filter_=None): excluded_service_filter = _excluded_service_filter() @@ -495,7 +495,7 @@ class GrpcAioInstrumentorClient(BaseInstrumentor): """ - # pylint:disable=attribute-defined-outside-init, redefined-outer-name + # pylint:disable=redefined-outer-name def __init__(self, filter_=None): excluded_service_filter = _excluded_service_filter() diff --git a/instrumentation/opentelemetry-instrumentation-grpc/tests/test_aio_server_interceptor.py b/instrumentation/opentelemetry-instrumentation-grpc/tests/test_aio_server_interceptor.py index 33570c5ff4..c05c79f92e 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/tests/test_aio_server_interceptor.py +++ b/instrumentation/opentelemetry-instrumentation-grpc/tests/test_aio_server_interceptor.py @@ -347,7 +347,6 @@ async def test_span_lifetime(self): class SpanLifetimeServicer(GRPCTestServerServicer): # pylint:disable=C0103 async def SimpleMethod(self, request, context): - # pylint:disable=attribute-defined-outside-init self.span = trace.get_current_span() return Response( diff --git a/instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/__init__.py b/instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/__init__.py index ee985a174f..1ac10ff1ec 100644 --- a/instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/__init__.py @@ -1082,7 +1082,7 @@ async def aclose(self) -> None: class HTTPXClientInstrumentor(BaseInstrumentor): - # pylint: disable=protected-access,attribute-defined-outside-init + # pylint: disable=protected-access """An instrumentor for httpx Client and AsyncClient See `BaseInstrumentor` diff --git a/instrumentation/opentelemetry-instrumentation-logging/tests/test_logging.py b/instrumentation/opentelemetry-instrumentation-logging/tests/test_logging.py index 26809c3908..f32dce4db4 100644 --- a/instrumentation/opentelemetry-instrumentation-logging/tests/test_logging.py +++ b/instrumentation/opentelemetry-instrumentation-logging/tests/test_logging.py @@ -35,7 +35,7 @@ def get_tracer( # pylint: disable=no-self-use class TestLoggingInstrumentorProxyTracerProvider(TestBase): @pytest.fixture(autouse=True) def inject_fixtures(self, caplog): - self.caplog = caplog # pylint: disable=attribute-defined-outside-init + self.caplog = caplog def setUp(self): super().setUp() @@ -66,7 +66,7 @@ def log_hook(span, record): class TestLoggingInstrumentor(TestBase): @pytest.fixture(autouse=True) def inject_fixtures(self, caplog): - self.caplog = caplog # pylint: disable=attribute-defined-outside-init + self.caplog = caplog def setUp(self): super().setUp() diff --git a/instrumentation/opentelemetry-instrumentation-pika/src/opentelemetry/instrumentation/pika/pika_instrumentor.py b/instrumentation/opentelemetry-instrumentation-pika/src/opentelemetry/instrumentation/pika/pika_instrumentor.py index e15456675d..a83696a46d 100644 --- a/instrumentation/opentelemetry-instrumentation-pika/src/opentelemetry/instrumentation/pika/pika_instrumentor.py +++ b/instrumentation/opentelemetry-instrumentation-pika/src/opentelemetry/instrumentation/pika/pika_instrumentor.py @@ -42,7 +42,6 @@ def _consumer_callback_attribute_name() -> str: class PikaInstrumentor(BaseInstrumentor): # type: ignore CONSUMER_CALLBACK_ATTR = _consumer_callback_attribute_name() - # pylint: disable=attribute-defined-outside-init @staticmethod def _instrument_channel_consumers( channel: Union[BlockingChannel, Channel], diff --git a/instrumentation/opentelemetry-instrumentation-pymemcache/tests/test_pymemcache.py b/instrumentation/opentelemetry-instrumentation-pymemcache/tests/test_pymemcache.py index 4ffcd9505b..92fd117d6b 100644 --- a/instrumentation/opentelemetry-instrumentation-pymemcache/tests/test_pymemcache.py +++ b/instrumentation/opentelemetry-instrumentation-pymemcache/tests/test_pymemcache.py @@ -64,7 +64,6 @@ def tearDown(self): PymemcacheInstrumentor().uninstrument() def make_client(self, mock_socket_values, **kwargs): - # pylint: disable=attribute-defined-outside-init self.client = pymemcache.client.base.Client( (TEST_HOST, TEST_PORT), **kwargs ) @@ -539,7 +538,6 @@ def make_client(self, *mock_socket_values, **kwargs): # pylint: disable=import-outside-toplevel from pymemcache.client.hash import HashClient # noqa: PLC0415 - # pylint: disable=attribute-defined-outside-init self.client = HashClient([], **kwargs) ip = TEST_HOST diff --git a/instrumentation/opentelemetry-instrumentation-pyramid/tests/pyramid_base_test.py b/instrumentation/opentelemetry-instrumentation-pyramid/tests/pyramid_base_test.py index 2fbed3ff38..9206add865 100644 --- a/instrumentation/opentelemetry-instrumentation-pyramid/tests/pyramid_base_test.py +++ b/instrumentation/opentelemetry-instrumentation-pyramid/tests/pyramid_base_test.py @@ -60,5 +60,4 @@ def excluded2_endpoint(request): route_name="custom_response_headers", ) - # pylint: disable=attribute-defined-outside-init self.client = Client(config.make_wsgi_app(), TestResponse) diff --git a/instrumentation/opentelemetry-instrumentation-remoulade/src/opentelemetry/instrumentation/remoulade/__init__.py b/instrumentation/opentelemetry-instrumentation-remoulade/src/opentelemetry/instrumentation/remoulade/__init__.py index 54c6439388..ab96132a62 100644 --- a/instrumentation/opentelemetry-instrumentation-remoulade/src/opentelemetry/instrumentation/remoulade/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-remoulade/src/opentelemetry/instrumentation/remoulade/__init__.py @@ -166,7 +166,6 @@ def instrumentation_dependencies(self) -> Collection[str]: def _instrument(self, **kwargs): tracer_provider = kwargs.get("tracer_provider") - # pylint: disable=attribute-defined-outside-init self._tracer = trace.get_tracer( __name__, __version__, diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py index 18585df106..929b717a49 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py @@ -47,7 +47,7 @@ class TestSqlalchemyInstrumentation(TestBase): @pytest.fixture(autouse=True) def inject_fixtures(self, caplog): - self.caplog = caplog # pylint: disable=attribute-defined-outside-init + self.caplog = caplog def setUp(self): super().setUp() diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlcommenter.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlcommenter.py index 83fd534f6e..308a9527ae 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlcommenter.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlcommenter.py @@ -28,7 +28,7 @@ class TestSqlalchemyInstrumentationWithSQLCommenter(TestBase): @pytest.fixture(autouse=True) def inject_fixtures(self, caplog): - self.caplog = caplog # pylint: disable=attribute-defined-outside-init + self.caplog = caplog def setUp(self): super().setUp() diff --git a/instrumentation/opentelemetry-instrumentation-tortoiseorm/src/opentelemetry/instrumentation/tortoiseorm/__init__.py b/instrumentation/opentelemetry-instrumentation-tortoiseorm/src/opentelemetry/instrumentation/tortoiseorm/__init__.py index 84eb1c508c..4740b2da1b 100644 --- a/instrumentation/opentelemetry-instrumentation-tortoiseorm/src/opentelemetry/instrumentation/tortoiseorm/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-tortoiseorm/src/opentelemetry/instrumentation/tortoiseorm/__init__.py @@ -97,7 +97,6 @@ def _instrument(self, **kwargs): None """ tracer_provider = kwargs.get("tracer_provider") - # pylint: disable=attribute-defined-outside-init self._tracer = trace.get_tracer( __name__, __version__,