Skip to content

Commit 1cf47e1

Browse files
committed
feat: add eventbridge integration (#4)
1 parent 69f8f92 commit 1cf47e1

File tree

2 files changed

+63
-2
lines changed
  • instrumentation
    • opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda
    • opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore

2 files changed

+63
-2
lines changed

instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py

+43
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,31 @@ def _instrumented_lambda_handler_call( # noqa pylint: disable=too-many-branches
512512
except Exception as ex:
513513
pass
514514

515+
eventBridgeTriggerSpan = None
516+
try:
517+
if type(lambda_event) is dict and lambda_event.get("source") is not None and type(lambda_event.get("source")) is str:
518+
span_name = 'EventBridge event'
519+
if lambda_event.get("detail-type") is not None:
520+
span_name = lambda_event.get("detail-type")
521+
522+
links = []
523+
if lambda_event.get("detail") is not None and lambda_event["detail"].get("_context") is not None:
524+
ctx = get_global_textmap().extract(carrier=lambda_event["detail"].get("_context"))
525+
links.append(Link(get_current_span(ctx).get_span_context()))
526+
527+
eventBridgeTriggerSpan = tracer.start_span(span_name, context=parent_context, kind=SpanKind.CONSUMER, links=links)
528+
eventBridgeTriggerSpan.set_attribute(SpanAttributes.FAAS_TRIGGER, "pubsub")
529+
eventBridgeTriggerSpan.set_attribute("faas.trigger.type", "EventBridge")
530+
eventBridgeTriggerSpan.set_attribute("aws.event.bridge.trigger.source", lambda_event.get("source"))
531+
parent_context = set_span_in_context(eventBridgeTriggerSpan)
532+
533+
eventBridgeTriggerSpan.set_attribute(
534+
"rpc.request.body",
535+
json.dumps(lambda_event),
536+
)
537+
except Exception as ex:
538+
pass
539+
515540
try:
516541
with tracer.start_as_current_span(
517542
name=orig_handler_name,
@@ -685,6 +710,22 @@ def _instrumented_lambda_handler_call( # noqa pylint: disable=too-many-branches
685710
except Exception:
686711
pass
687712
cognitoTriggerSpan.end()
713+
714+
if lambda_event and eventBridgeTriggerSpan is not None:
715+
try:
716+
if isinstance(result, dict) and result.get("statusCode"):
717+
eventBridgeTriggerSpan.set_attribute(
718+
SpanAttributes.HTTP_STATUS_CODE,
719+
result.get("statusCode"),
720+
)
721+
if isinstance(result, dict) and result.get("body"):
722+
eventBridgeTriggerSpan.set_attribute(
723+
"rpc.response.body",
724+
result.get("body"),
725+
)
726+
except Exception:
727+
pass
728+
eventBridgeTriggerSpan.end()
688729

689730
now = time.time()
690731
_tracer_provider = tracer_provider or get_tracer_provider()
@@ -712,6 +753,8 @@ def _instrumented_lambda_handler_call( # noqa pylint: disable=too-many-branches
712753
dynamoTriggerSpan.end()
713754
if cognitoTriggerSpan is not None:
714755
cognitoTriggerSpan.end()
756+
if eventBridgeTriggerSpan is not None:
757+
eventBridgeTriggerSpan.end()
715758

716759
now = time.time()
717760
_tracer_provider = tracer_provider or get_tracer_provider()

instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py

+20-2
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def response_hook(span, service_name, operation_name, result):
105105
from opentelemetry.propagate import inject
106106
from opentelemetry.propagators import textmap
107107
from opentelemetry.semconv.trace import SpanAttributes
108-
from opentelemetry.trace import get_tracer
108+
from opentelemetry.trace import get_tracer, SpanKind
109109
from opentelemetry.trace.span import Span
110110
import base64
111111
import typing
@@ -232,6 +232,8 @@ def _patched_api_call(self, original_func, instance, args, kwargs):
232232
body = call_context.params.get("Message")
233233
if body is not None:
234234
attributes["rpc.request.payload"] = limit_string_size(self.payload_size_limit,json.dumps(body, default=str))
235+
elif call_context.service == "events" and call_context.operation == "PutEvents":
236+
call_context.span_kind = SpanKind.PRODUCER
235237
else:
236238
attributes["rpc.request.payload"] = limit_string_size(self.payload_size_limit, json.dumps(call_context.params, default=str))
237239
except Exception as ex:
@@ -288,7 +290,23 @@ def _patched_api_call(self, original_func, instance, args, kwargs):
288290
inject(carrier = entry.get("MessageAttributes"), setter=SQSSetter())
289291

290292
except Exception as ex:
291-
pass
293+
pass
294+
295+
try:
296+
if call_context.service == "events" and call_context.operation == "PutEvents":
297+
if args[1].get("Entries") is not None:
298+
for entry in args[1].get("Entries"):
299+
if entry.get("Detail") is not None:
300+
detailJson = json.loads(entry.get("Detail"))
301+
detailJson['_context'] = {}
302+
inject(carrier = detailJson['_context'])
303+
entry['Detail'] = json.dumps(detailJson)
304+
else:
305+
detailJson = {'_context': {}}
306+
inject(carrier = detailJson['_context'])
307+
entry['Detail'] = json.dumps(detailJson)
308+
except Exception as ex:
309+
pass
292310

293311
result = None
294312
try:

0 commit comments

Comments
 (0)