From 6de860b0e3560614de1ed13c5a470e55ed8a641c Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Mon, 10 Nov 2025 14:41:14 +0100 Subject: [PATCH] first attempt --- plugins/callback/opentelemetry.py | 35 +++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/plugins/callback/opentelemetry.py b/plugins/callback/opentelemetry.py index 2e318de136..4cb3530ad9 100644 --- a/plugins/callback/opentelemetry.py +++ b/plugins/callback/opentelemetry.py @@ -256,6 +256,37 @@ class OpenTelemetrySource: task.dump = dump task.add_host(HostData(host_uuid, host_name, status, result)) + def create_import_span(self, result, imported_file, disable_logs, disable_attributes_in_logs): + """Create a span for imported playbook as a child of the current trace""" + + # No tracer provider available yet + if not hasattr(trace.get_tracer_provider(), 'get_tracer'): + return + + tracer = trace.get_tracer(__name__) + host_name = result._host.name if hasattr(result, "_host") and result._host else "localhost" + + # Create a span for the imported playbook + with tracer.start_as_current_span( + f"import_playbook: {basename(imported_file)}", + kind=SpanKind.CLIENT + ) as span: + attributes = { + "ansible.import.type": "playbook", + "ansible.import.file": imported_file, + "ansible.import.host": host_name, + "ansible.import.status": "imported" + } + + if span: + span.set_attributes(attributes) + span.set_status(Status(status_code=StatusCode.OK)) + + # Add log event if not disabled + if not disable_logs: + event_attributes = {} if disable_attributes_in_logs else attributes + span.add_event(f"Imported playbook: {imported_file}", attributes=event_attributes) + def generate_distributed_traces( self, otel_service_name, @@ -595,6 +626,10 @@ class CallbackModule(CallbackBase): def v2_playbook_on_include(self, included_file): self.opentelemetry.finish_task(self.tasks_data, "included", included_file, "") + def v2_playbook_on_import_for_host(self, result, imported_file): + """Handle import_playbook to create child spans for imported playbooks""" + self.opentelemetry.create_import_span(result, imported_file, self.disable_logs, self.disable_attributes_in_logs) + def v2_playbook_on_stats(self, stats): if self.errors == 0: status = Status(status_code=StatusCode.OK)