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"