From bf2ae7211da60a071846d619e91e4442beb07855 Mon Sep 17 00:00:00 2001 From: Mohamed Asaker Date: Mon, 3 Mar 2025 10:53:50 -0800 Subject: [PATCH 1/7] Lambda Microservice changes --- .../distro/_aws_span_processing_util.py | 3 +- .../distro/aws_lambda_span_processor.py | 44 +++++++++++++++++++ .../distro/aws_opentelemetry_configurator.py | 2 + 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/_aws_span_processing_util.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/_aws_span_processing_util.py index 24aaa68dc..21e19afa9 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/_aws_span_processing_util.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/_aws_span_processing_util.py @@ -57,7 +57,8 @@ def get_ingress_operation(__, span: ReadableSpan) -> str: with the first API path parameter" if the default span name is None, UnknownOperation or http.method value. """ operation: str = span.name - if _AWS_LAMBDA_FUNCTION_NAME in os.environ: + scope = getattr(span, "instrumentation_scope", None) + if _AWS_LAMBDA_FUNCTION_NAME in os.environ and scope.name != "opentelemetry.instrumentation.flask": operation = os.environ.get(_AWS_LAMBDA_FUNCTION_NAME) + "/FunctionHandler" elif should_use_internal_operation(span): operation = INTERNAL_OPERATION diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py new file mode 100644 index 000000000..0f030d162 --- /dev/null +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py @@ -0,0 +1,44 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +from typing import Optional + +from typing_extensions import override + +from opentelemetry.context import Context +from opentelemetry.sdk.trace import ReadableSpan, Span, SpanProcessor +from opentelemetry.trace import SpanKind +from amazon.opentelemetry.distro._aws_attribute_keys import AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER + +class AwsLambdaSpanProcessor(SpanProcessor): + def __init__(self, instrumentation_names=None): + """ + :param instrumentation_names: A set or list of instrumentation scope names + for which we want to mark as SERVER spans if they are INTERNAL. + """ + self.instrumentation_names = set(instrumentation_names or ["opentelemetry.instrumentation.flask"]) + self.parent_lambda_span = None + + @override + def on_start(self, span: Span, parent_context: Optional[Context] = None) -> None: + scope = getattr(span, "instrumentation_scope", None) + if span.kind == SpanKind.SERVER and scope.name == "opentelemetry.instrumentation.aws_lambda": + self.parent_lambda_span = span + + if span.kind == SpanKind.INTERNAL and scope.name in self.instrumentation_names: + span._kind = SpanKind.SERVER + self.parent_lambda_span.set_attribute(AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER, True) + return + + @override + def on_end(self, span: ReadableSpan) -> None: + return + + @override + def force_flush(self, timeout_millis: int = 30000) -> bool: + """Flush any buffered data.""" + return True + + @override + def shutdown(self) -> None: + """Clean up.""" + self.force_flush() diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py index d5cea0989..285ec3090 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py @@ -24,6 +24,7 @@ from amazon.opentelemetry.distro.otlp_udp_exporter import OTLPUdpSpanExporter from amazon.opentelemetry.distro.sampler.aws_xray_remote_sampler import AwsXRayRemoteSampler from amazon.opentelemetry.distro.scope_based_exporter import ScopeBasedPeriodicExportingMetricReader +from amazon.opentelemetry.distro.aws_lambda_span_processor import AwsLambdaSpanProcessor from amazon.opentelemetry.distro.scope_based_filtering_view import ScopeBasedRetainingView from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter as OTLPHttpOTLPMetricExporter from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter @@ -343,6 +344,7 @@ def _customize_span_processors(provider: TracerProvider, resource: Resource) -> # Export 100% spans and not export Application-Signals metrics if on Lambda. if _is_lambda_environment(): _export_unsampled_span_for_lambda(provider, resource) + provider.add_span_processor(AwsLambdaSpanProcessor()) return # Construct meterProvider From 10967b12aa8004249aa7ac3400d137ffcc44bee1 Mon Sep 17 00:00:00 2001 From: Mohamed Asaker Date: Tue, 4 Mar 2025 15:00:48 -0800 Subject: [PATCH 2/7] added unit tests --- .../distro/_aws_attribute_keys.py | 1 + .../distro/aws_lambda_span_processor.py | 28 +++---- .../distro/aws_opentelemetry_configurator.py | 2 +- .../distro/test_aws_lambda_span_processor.py | 82 +++++++++++++++++++ .../test_aws_opentelementry_configurator.py | 2 +- 5 files changed, 99 insertions(+), 16 deletions(-) create mode 100644 aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/_aws_attribute_keys.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/_aws_attribute_keys.py index 879f86653..23ba661af 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/_aws_attribute_keys.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/_aws_attribute_keys.py @@ -13,6 +13,7 @@ AWS_SDK_DESCENDANT: str = "aws.sdk.descendant" AWS_CONSUMER_PARENT_SPAN_KIND: str = "aws.consumer.parent.span.kind" AWS_TRACE_FLAG_SAMPLED: str = "aws.trace.flag.sampled" +AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER: str = "aws.trace.lambda.multiple-server" AWS_CLOUDFORMATION_PRIMARY_IDENTIFIER: str = "aws.remote.resource.cfn.primary.identifier" # AWS_#_NAME attributes are not supported in python as they are not part of the Semantic Conventions. diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py index 0f030d162..3da62acfa 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py @@ -4,17 +4,14 @@ from typing_extensions import override +from amazon.opentelemetry.distro._aws_attribute_keys import AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER from opentelemetry.context import Context from opentelemetry.sdk.trace import ReadableSpan, Span, SpanProcessor from opentelemetry.trace import SpanKind -from amazon.opentelemetry.distro._aws_attribute_keys import AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER + class AwsLambdaSpanProcessor(SpanProcessor): def __init__(self, instrumentation_names=None): - """ - :param instrumentation_names: A set or list of instrumentation scope names - for which we want to mark as SERVER spans if they are INTERNAL. - """ self.instrumentation_names = set(instrumentation_names or ["opentelemetry.instrumentation.flask"]) self.parent_lambda_span = None @@ -23,9 +20,13 @@ def on_start(self, span: Span, parent_context: Optional[Context] = None) -> None scope = getattr(span, "instrumentation_scope", None) if span.kind == SpanKind.SERVER and scope.name == "opentelemetry.instrumentation.aws_lambda": self.parent_lambda_span = span - - if span.kind == SpanKind.INTERNAL and scope.name in self.instrumentation_names: - span._kind = SpanKind.SERVER + + if ( + scope.name in self.instrumentation_names + and self.parent_lambda_span.get_span_context().span_id == span.parent.span_id + ): + if span.kind == SpanKind.INTERNAL: + span._kind = SpanKind.SERVER self.parent_lambda_span.set_attribute(AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER, True) return @@ -33,12 +34,11 @@ def on_start(self, span: Span, parent_context: Optional[Context] = None) -> None def on_end(self, span: ReadableSpan) -> None: return - @override - def force_flush(self, timeout_millis: int = 30000) -> bool: - """Flush any buffered data.""" - return True - @override def shutdown(self) -> None: - """Clean up.""" self.force_flush() + + # pylint: disable=no-self-use + @override + def force_flush(self, timeout_millis: int = None) -> bool: + return True diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py index 285ec3090..f3a897128 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py @@ -16,6 +16,7 @@ AttributePropagatingSpanProcessorBuilder, ) from amazon.opentelemetry.distro.aws_batch_unsampled_span_processor import BatchUnsampledSpanProcessor +from amazon.opentelemetry.distro.aws_lambda_span_processor import AwsLambdaSpanProcessor from amazon.opentelemetry.distro.aws_metric_attributes_span_exporter_builder import ( AwsMetricAttributesSpanExporterBuilder, ) @@ -24,7 +25,6 @@ from amazon.opentelemetry.distro.otlp_udp_exporter import OTLPUdpSpanExporter from amazon.opentelemetry.distro.sampler.aws_xray_remote_sampler import AwsXRayRemoteSampler from amazon.opentelemetry.distro.scope_based_exporter import ScopeBasedPeriodicExportingMetricReader -from amazon.opentelemetry.distro.aws_lambda_span_processor import AwsLambdaSpanProcessor from amazon.opentelemetry.distro.scope_based_filtering_view import ScopeBasedRetainingView from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter as OTLPHttpOTLPMetricExporter from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py new file mode 100644 index 000000000..10049aebd --- /dev/null +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py @@ -0,0 +1,82 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +from unittest import TestCase +from unittest.mock import MagicMock, patch + +from amazon.opentelemetry.distro._aws_attribute_keys import AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER +from amazon.opentelemetry.distro.aws_lambda_span_processor import AwsLambdaSpanProcessor +from opentelemetry.trace import Span, SpanContext, SpanKind, TraceFlags + + +class TestAwsLambdaSpanProcessor(TestCase): + + def setUp(self): + self.processor = AwsLambdaSpanProcessor() + self.lambda_span: Span = MagicMock() + self.lambda_span.instrumentation_scope.name = "opentelemetry.instrumentation.aws_lambda" + self.lambda_span.kind = SpanKind.SERVER + + self.lambda_span_context: SpanContext = MagicMock() + self.lambda_span_context.trace_id = "ABC" + self.lambda_span_context.span_id = "lambda_id" + + self.lambda_span.get_span_context.return_value = self.lambda_span_context + self.processor.on_start(self.lambda_span) + + def tearDown(self): + self.processor.on_end(self.lambda_span) + self.processor.shutdown() + + @patch("opentelemetry.sdk.trace.Span") + def test_lambda_span_multiple_server_flag_internal_api(self, mock_span_class): + + flask_span = mock_span_class.return_value + flask_span.instrumentation_scope.name = "opentelemetry.instrumentation.flask" + flask_span.kind = SpanKind.INTERNAL + flask_span.parent = self.lambda_span_context + + self.processor.on_start(flask_span) + + self.assertEqual(flask_span._kind, SpanKind.SERVER) + self.assertIn(AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER, self.lambda_span.set_attribute.call_args_list[0][0][0]) + + self.processor.on_end(flask_span) + self.processor.on_end(self.lambda_span) + + self.processor.shutdown() + + @patch("opentelemetry.sdk.trace.Span") + def test_lambda_span_multiple_server_flag_server_api(self, mock_span_class): + + flask_span = mock_span_class.return_value + flask_span.instrumentation_scope.name = "opentelemetry.instrumentation.flask" + flask_span.kind = SpanKind.SERVER + flask_span.parent = self.lambda_span_context + + self.processor.on_start(flask_span) + + self.assertEqual(flask_span.kind, SpanKind.SERVER) + self.assertIn(AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER, self.lambda_span.set_attribute.call_args_list[0][0][0]) + + self.processor.on_end(flask_span) + self.processor.on_end(self.lambda_span) + + self.processor.shutdown() + + @patch("opentelemetry.sdk.trace.Span") + def test_lambda_span_single_server_span(self, mock_span_class): + + flask_span = mock_span_class.return_value + flask_span.instrumentation_scope.name = "opentelemetry.instrumentation.http" + flask_span.kind = SpanKind.CLIENT + flask_span.parent = self.lambda_span_context + + self.processor.on_start(flask_span, self.lambda_span_context) + + self.assertEqual(flask_span.kind, SpanKind.CLIENT) + flask_span.set_attribute.assert_not_called() + + self.processor.on_end(flask_span) + self.processor.on_end(self.lambda_span) + + self.processor.shutdown() diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelementry_configurator.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelementry_configurator.py index cb29d0533..d2963c4ec 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelementry_configurator.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelementry_configurator.py @@ -318,7 +318,7 @@ def test_customize_span_processors_lambda(self): os.environ.setdefault("OTEL_AWS_APPLICATION_SIGNALS_ENABLED", "True") os.environ.setdefault("AWS_LAMBDA_FUNCTION_NAME", "myLambdaFunc") _customize_span_processors(mock_tracer_provider, Resource.get_empty()) - self.assertEqual(mock_tracer_provider.add_span_processor.call_count, 2) + self.assertEqual(mock_tracer_provider.add_span_processor.call_count, 3) first_processor: SpanProcessor = mock_tracer_provider.add_span_processor.call_args_list[0].args[0] self.assertIsInstance(first_processor, AttributePropagatingSpanProcessor) second_processor: SpanProcessor = mock_tracer_provider.add_span_processor.call_args_list[1].args[0] From 4267957b62b6e609a3a9aa9c9217486f819d7782 Mon Sep 17 00:00:00 2001 From: Mohamed Asaker Date: Tue, 4 Mar 2025 15:05:29 -0800 Subject: [PATCH 3/7] fixed lint error --- .../opentelemetry/distro/test_aws_lambda_span_processor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py index 10049aebd..eead319d4 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py @@ -5,7 +5,7 @@ from amazon.opentelemetry.distro._aws_attribute_keys import AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER from amazon.opentelemetry.distro.aws_lambda_span_processor import AwsLambdaSpanProcessor -from opentelemetry.trace import Span, SpanContext, SpanKind, TraceFlags +from opentelemetry.trace import Span, SpanContext, SpanKind class TestAwsLambdaSpanProcessor(TestCase): From bca91644fe8f06fcff66e18d692b6fc313f661cc Mon Sep 17 00:00:00 2001 From: Mohamed Asaker Date: Thu, 6 Mar 2025 17:14:57 -0800 Subject: [PATCH 4/7] Updated PR --- .../distro/aws_lambda_span_processor.py | 24 ++++++++++--------- .../distro/test_aws_lambda_span_processor.py | 10 +++++--- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py index 3da62acfa..31703e12a 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py @@ -5,29 +5,31 @@ from typing_extensions import override from amazon.opentelemetry.distro._aws_attribute_keys import AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER -from opentelemetry.context import Context +from opentelemetry.context import Context, get_value from opentelemetry.sdk.trace import ReadableSpan, Span, SpanProcessor from opentelemetry.trace import SpanKind +from opentelemetry.trace.propagation import _SPAN_KEY class AwsLambdaSpanProcessor(SpanProcessor): def __init__(self, instrumentation_names=None): self.instrumentation_names = set(instrumentation_names or ["opentelemetry.instrumentation.flask"]) - self.parent_lambda_span = None @override def on_start(self, span: Span, parent_context: Optional[Context] = None) -> None: + scope = getattr(span, "instrumentation_scope", None) - if span.kind == SpanKind.SERVER and scope.name == "opentelemetry.instrumentation.aws_lambda": - self.parent_lambda_span = span - - if ( - scope.name in self.instrumentation_names - and self.parent_lambda_span.get_span_context().span_id == span.parent.span_id - ): - if span.kind == SpanKind.INTERNAL: + if scope.name in self.instrumentation_names: + parent_span = get_value(_SPAN_KEY, context=parent_context) + + if parent_span is None: + return + + parent_scope = getattr(parent_span, "instrumentation_scope", None) + if parent_span.kind == SpanKind.SERVER and parent_scope.name == "opentelemetry.instrumentation.aws_lambda": span._kind = SpanKind.SERVER - self.parent_lambda_span.set_attribute(AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER, True) + parent_span.set_attribute(AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER, True) + return @override diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py index eead319d4..85100385a 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py @@ -5,7 +5,9 @@ from amazon.opentelemetry.distro._aws_attribute_keys import AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER from amazon.opentelemetry.distro.aws_lambda_span_processor import AwsLambdaSpanProcessor +from opentelemetry.context import Context, get_value, set_value from opentelemetry.trace import Span, SpanContext, SpanKind +from opentelemetry.trace.propagation import _SPAN_KEY class TestAwsLambdaSpanProcessor(TestCase): @@ -20,6 +22,8 @@ def setUp(self): self.lambda_span_context.trace_id = "ABC" self.lambda_span_context.span_id = "lambda_id" + self.lambda_context: Context = set_value(_SPAN_KEY, self.lambda_span) + self.lambda_span.get_span_context.return_value = self.lambda_span_context self.processor.on_start(self.lambda_span) @@ -35,7 +39,7 @@ def test_lambda_span_multiple_server_flag_internal_api(self, mock_span_class): flask_span.kind = SpanKind.INTERNAL flask_span.parent = self.lambda_span_context - self.processor.on_start(flask_span) + self.processor.on_start(flask_span, self.lambda_context) self.assertEqual(flask_span._kind, SpanKind.SERVER) self.assertIn(AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER, self.lambda_span.set_attribute.call_args_list[0][0][0]) @@ -53,7 +57,7 @@ def test_lambda_span_multiple_server_flag_server_api(self, mock_span_class): flask_span.kind = SpanKind.SERVER flask_span.parent = self.lambda_span_context - self.processor.on_start(flask_span) + self.processor.on_start(flask_span, self.lambda_context) self.assertEqual(flask_span.kind, SpanKind.SERVER) self.assertIn(AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER, self.lambda_span.set_attribute.call_args_list[0][0][0]) @@ -71,7 +75,7 @@ def test_lambda_span_single_server_span(self, mock_span_class): flask_span.kind = SpanKind.CLIENT flask_span.parent = self.lambda_span_context - self.processor.on_start(flask_span, self.lambda_span_context) + self.processor.on_start(flask_span, self.lambda_context) self.assertEqual(flask_span.kind, SpanKind.CLIENT) flask_span.set_attribute.assert_not_called() From befc6e53286254c5e5dbe53ed83b17aaeaa1d5e4 Mon Sep 17 00:00:00 2001 From: Mohamed Asaker Date: Fri, 7 Mar 2025 10:05:30 -0800 Subject: [PATCH 5/7] fixed lint issue --- .../opentelemetry/distro/test_aws_lambda_span_processor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py index 85100385a..202e2364b 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_lambda_span_processor.py @@ -5,7 +5,7 @@ from amazon.opentelemetry.distro._aws_attribute_keys import AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER from amazon.opentelemetry.distro.aws_lambda_span_processor import AwsLambdaSpanProcessor -from opentelemetry.context import Context, get_value, set_value +from opentelemetry.context import Context, set_value from opentelemetry.trace import Span, SpanContext, SpanKind from opentelemetry.trace.propagation import _SPAN_KEY From 1c10f78517b2d165b19b04debff3fc33d4904aa6 Mon Sep 17 00:00:00 2001 From: Mohamed Asaker Date: Fri, 7 Mar 2025 10:08:11 -0800 Subject: [PATCH 6/7] fixed lint --- .../src/amazon/opentelemetry/distro/aws_lambda_span_processor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py index 31703e12a..843854e6a 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py @@ -32,6 +32,7 @@ def on_start(self, span: Span, parent_context: Optional[Context] = None) -> None return + # pylint: disable=no-self-use @override def on_end(self, span: ReadableSpan) -> None: return From e4b8bd3dd59808c3d6c1bae1752d5e003ce0339c Mon Sep 17 00:00:00 2001 From: Mohamed Asaker Date: Mon, 10 Mar 2025 03:16:18 -0700 Subject: [PATCH 7/7] applied comments --- .../amazon/opentelemetry/distro/aws_lambda_span_processor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py index 843854e6a..d29b7bbbb 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_lambda_span_processor.py @@ -26,7 +26,7 @@ def on_start(self, span: Span, parent_context: Optional[Context] = None) -> None return parent_scope = getattr(parent_span, "instrumentation_scope", None) - if parent_span.kind == SpanKind.SERVER and parent_scope.name == "opentelemetry.instrumentation.aws_lambda": + if parent_scope.name == "opentelemetry.instrumentation.aws_lambda": span._kind = SpanKind.SERVER parent_span.set_attribute(AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER, True)