diff --git a/pyproject.toml b/pyproject.toml index b90c5dc3..161ef605 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "veadk-python" -version = "0.5.26" +version = "0.5.27" description = "Volcengine agent development kit, integrations with Volcengine cloud services." readme = "README.md" requires-python = ">=3.10" diff --git a/veadk/agent.py b/veadk/agent.py index 07e089e0..abfc668c 100644 --- a/veadk/agent.py +++ b/veadk/agent.py @@ -587,6 +587,13 @@ def _prepare_tracers(self): f"Opentelemetry Tracer init {len(self.tracers[0].exporters)} exporters" # type: ignore ) + # Initialize global meter_uploader from exporters + from veadk.tracing.telemetry.telemetry import ( + init_global_meter_uploader_from_exporters, + ) + + init_global_meter_uploader_from_exporters(self.tracers[0].exporters) # type: ignore + @property def _llm_flow(self) -> BaseLlmFlow: from google.adk.flows.llm_flows.auto_flow import AutoFlow diff --git a/veadk/tracing/telemetry/opentelemetry_tracer.py b/veadk/tracing/telemetry/opentelemetry_tracer.py index 52b5d35d..591d3772 100644 --- a/veadk/tracing/telemetry/opentelemetry_tracer.py +++ b/veadk/tracing/telemetry/opentelemetry_tracer.py @@ -214,6 +214,13 @@ def _init_global_tracer_provider(self) -> None: f"Init OpentelemetryTracer with {len(self._processors)} exporter(s)." ) + # Initialize global meter_uploader from exporters + from veadk.tracing.telemetry.telemetry import ( + init_global_meter_uploader_from_exporters, + ) + + init_global_meter_uploader_from_exporters(self.exporters) + @property def trace_file_path(self) -> str: """Get the file path of the most recent trace dump. diff --git a/veadk/tracing/telemetry/telemetry.py b/veadk/tracing/telemetry/telemetry.py index 3582a81d..3f46f538 100644 --- a/veadk/tracing/telemetry/telemetry.py +++ b/veadk/tracing/telemetry/telemetry.py @@ -37,6 +37,23 @@ meter_uploader = None +def init_global_meter_uploader_from_exporters(exporters): + """Initialize global meter_uploader from a list of exporters. + + Args: + exporters: List of exporter instances to search for meter_uploader + """ + global meter_uploader + for exporter in exporters: + if hasattr(exporter, "meter_uploader") and exporter.meter_uploader: + meter_uploader = exporter.meter_uploader + logger.debug( + "Global meter_uploader initialized from exporter: {}", + exporter.__class__.__name__, + ) + break + + def _upload_call_llm_metrics( invocation_context: InvocationContext, event_id: str, @@ -90,7 +107,7 @@ def _upload_tool_call_metrics( if meter_uploader: meter_uploader.record_tool_call(tool, args, function_response_event) else: - logger.warning( + logger.debug( "Meter uploader is not initialized yet. Skip recording tool call metrics." ) diff --git a/veadk/utils/logger.py b/veadk/utils/logger.py index d8350d5b..35770cd9 100644 --- a/veadk/utils/logger.py +++ b/veadk/utils/logger.py @@ -15,6 +15,7 @@ import sys from loguru import logger +from opentelemetry import trace from veadk.utils.misc import getenv @@ -42,9 +43,23 @@ def filter_log(): def setup_logger(): logger.remove() + + def format_with_traceid(record): + span = trace.get_current_span() + trace_id_part = "" + if span.is_recording(): + trace_id_part = ( + f" | trace_id={format(span.get_span_context().trace_id, '016x')}" + ) + + base_format = "{time:YYYY-MM-DD HH:mm:ss} | {level} | {file}:{line}" + message_part = " - {message}\n{exception}" + + return base_format + trace_id_part + message_part + logger.add( sys.stdout, - format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {file}:{line} - {message}", + format=format_with_traceid, colorize=True, level=getenv("LOGGING_LEVEL", "DEBUG"), ) diff --git a/veadk/version.py b/veadk/version.py index 08828898..b43347c0 100644 --- a/veadk/version.py +++ b/veadk/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -VERSION = "0.5.26" +VERSION = "0.5.27"