From b7cb1045b0e445a50c7562a9237b01e6a45f4423 Mon Sep 17 00:00:00 2001 From: "wujiaming.ai" Date: Thu, 5 Mar 2026 20:23:25 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3meter=20uploader?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=97=AE=E9=A2=98=EF=BC=8C=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=96=B0=E5=A2=9Etraceid=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I1072e6b3add3ef6ca69efa378c81216df3136f46 --- veadk/agent.py | 4 ++++ veadk/tracing/telemetry/opentelemetry_tracer.py | 4 ++++ veadk/tracing/telemetry/telemetry.py | 16 +++++++++++++++- veadk/utils/logger.py | 15 ++++++++++++++- 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/veadk/agent.py b/veadk/agent.py index 07e089e0..6a5d004e 100644 --- a/veadk/agent.py +++ b/veadk/agent.py @@ -587,6 +587,10 @@ 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..e1a9c2e6 100644 --- a/veadk/tracing/telemetry/opentelemetry_tracer.py +++ b/veadk/tracing/telemetry/opentelemetry_tracer.py @@ -214,6 +214,10 @@ 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..c6d71e3f 100644 --- a/veadk/tracing/telemetry/telemetry.py +++ b/veadk/tracing/telemetry/telemetry.py @@ -37,6 +37,20 @@ 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 +104,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..55bbd974 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,21 @@ 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"), ) From 284980d009b5268ee31888b80362b2d88acedb56 Mon Sep 17 00:00:00 2001 From: "wujiaming.ai" Date: Thu, 5 Mar 2026 20:26:49 +0800 Subject: [PATCH 2/3] upgrade version Change-Id: Iec24209e4e0828fd787866b3ee08a1825bc179e6 --- pyproject.toml | 2 +- veadk/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/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" From 8fe2b8df04d860342aee7e91a9297dbfcec631d7 Mon Sep 17 00:00:00 2001 From: "wujiaming.ai" Date: Thu, 5 Mar 2026 20:45:56 +0800 Subject: [PATCH 3/3] ruff format Change-Id: Ifde37f3f153b2d254dd02a099e1323c5032cbfd6 --- veadk/agent.py | 5 ++++- veadk/tracing/telemetry/opentelemetry_tracer.py | 5 ++++- veadk/tracing/telemetry/telemetry.py | 5 ++++- veadk/utils/logger.py | 12 +++++++----- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/veadk/agent.py b/veadk/agent.py index 6a5d004e..abfc668c 100644 --- a/veadk/agent.py +++ b/veadk/agent.py @@ -588,7 +588,10 @@ def _prepare_tracers(self): ) # Initialize global meter_uploader from exporters - from veadk.tracing.telemetry.telemetry import init_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 diff --git a/veadk/tracing/telemetry/opentelemetry_tracer.py b/veadk/tracing/telemetry/opentelemetry_tracer.py index e1a9c2e6..591d3772 100644 --- a/veadk/tracing/telemetry/opentelemetry_tracer.py +++ b/veadk/tracing/telemetry/opentelemetry_tracer.py @@ -215,7 +215,10 @@ def _init_global_tracer_provider(self) -> None: ) # Initialize global meter_uploader from exporters - from veadk.tracing.telemetry.telemetry import init_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 diff --git a/veadk/tracing/telemetry/telemetry.py b/veadk/tracing/telemetry/telemetry.py index c6d71e3f..3f46f538 100644 --- a/veadk/tracing/telemetry/telemetry.py +++ b/veadk/tracing/telemetry/telemetry.py @@ -47,7 +47,10 @@ def init_global_meter_uploader_from_exporters(exporters): 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__) + logger.debug( + "Global meter_uploader initialized from exporter: {}", + exporter.__class__.__name__, + ) break diff --git a/veadk/utils/logger.py b/veadk/utils/logger.py index 55bbd974..35770cd9 100644 --- a/veadk/utils/logger.py +++ b/veadk/utils/logger.py @@ -43,18 +43,20 @@ 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')}" - + 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=format_with_traceid,