Skip to content

Commit bf2ae72

Browse files
committed
Lambda Microservice changes
1 parent 1fae89f commit bf2ae72

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

aws-opentelemetry-distro/src/amazon/opentelemetry/distro/_aws_span_processing_util.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ def get_ingress_operation(__, span: ReadableSpan) -> str:
5757
with the first API path parameter" if the default span name is None, UnknownOperation or http.method value.
5858
"""
5959
operation: str = span.name
60-
if _AWS_LAMBDA_FUNCTION_NAME in os.environ:
60+
scope = getattr(span, "instrumentation_scope", None)
61+
if _AWS_LAMBDA_FUNCTION_NAME in os.environ and scope.name != "opentelemetry.instrumentation.flask":
6162
operation = os.environ.get(_AWS_LAMBDA_FUNCTION_NAME) + "/FunctionHandler"
6263
elif should_use_internal_operation(span):
6364
operation = INTERNAL_OPERATION
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
from typing import Optional
4+
5+
from typing_extensions import override
6+
7+
from opentelemetry.context import Context
8+
from opentelemetry.sdk.trace import ReadableSpan, Span, SpanProcessor
9+
from opentelemetry.trace import SpanKind
10+
from amazon.opentelemetry.distro._aws_attribute_keys import AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER
11+
12+
class AwsLambdaSpanProcessor(SpanProcessor):
13+
def __init__(self, instrumentation_names=None):
14+
"""
15+
:param instrumentation_names: A set or list of instrumentation scope names
16+
for which we want to mark as SERVER spans if they are INTERNAL.
17+
"""
18+
self.instrumentation_names = set(instrumentation_names or ["opentelemetry.instrumentation.flask"])
19+
self.parent_lambda_span = None
20+
21+
@override
22+
def on_start(self, span: Span, parent_context: Optional[Context] = None) -> None:
23+
scope = getattr(span, "instrumentation_scope", None)
24+
if span.kind == SpanKind.SERVER and scope.name == "opentelemetry.instrumentation.aws_lambda":
25+
self.parent_lambda_span = span
26+
27+
if span.kind == SpanKind.INTERNAL and scope.name in self.instrumentation_names:
28+
span._kind = SpanKind.SERVER
29+
self.parent_lambda_span.set_attribute(AWS_TRACE_LAMBDA_FLAG_MULTIPLE_SERVER, True)
30+
return
31+
32+
@override
33+
def on_end(self, span: ReadableSpan) -> None:
34+
return
35+
36+
@override
37+
def force_flush(self, timeout_millis: int = 30000) -> bool:
38+
"""Flush any buffered data."""
39+
return True
40+
41+
@override
42+
def shutdown(self) -> None:
43+
"""Clean up."""
44+
self.force_flush()

aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from amazon.opentelemetry.distro.otlp_udp_exporter import OTLPUdpSpanExporter
2525
from amazon.opentelemetry.distro.sampler.aws_xray_remote_sampler import AwsXRayRemoteSampler
2626
from amazon.opentelemetry.distro.scope_based_exporter import ScopeBasedPeriodicExportingMetricReader
27+
from amazon.opentelemetry.distro.aws_lambda_span_processor import AwsLambdaSpanProcessor
2728
from amazon.opentelemetry.distro.scope_based_filtering_view import ScopeBasedRetainingView
2829
from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter as OTLPHttpOTLPMetricExporter
2930
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
@@ -343,6 +344,7 @@ def _customize_span_processors(provider: TracerProvider, resource: Resource) ->
343344
# Export 100% spans and not export Application-Signals metrics if on Lambda.
344345
if _is_lambda_environment():
345346
_export_unsampled_span_for_lambda(provider, resource)
347+
provider.add_span_processor(AwsLambdaSpanProcessor())
346348
return
347349

348350
# Construct meterProvider

0 commit comments

Comments
 (0)