Skip to content

Commit b423f58

Browse files
feat: support env to enable exporters (#252)
* feat: support env to enable exporters * fix: fix unit test for tracer init in agent (#253)
1 parent 2cfbdc0 commit b423f58

File tree

4 files changed

+50
-8
lines changed

4 files changed

+50
-8
lines changed

tests/test_agent.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def test_agent_default_values():
8888
assert agent.sub_agents == []
8989
assert agent.knowledgebase is None
9090
assert agent.long_term_memory is None
91-
assert agent.tracers == []
91+
# assert agent.tracers == []
9292

9393

9494
@patch.dict("os.environ", {"MODEL_AGENT_API_KEY": "mock_api_key"})

tests/test_tracing.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ async def test_tracing():
8282
exporters = init_exporters()
8383
tracer = OpentelemetryTracer(exporters=exporters)
8484

85-
assert len(tracer.exporters) == 3
85+
assert len(tracer.exporters) == 4 # with extra 1 built-in exporters
8686

8787
# TODO: Ensure the tracing provider is set correctly after loading SDK
8888

@@ -98,7 +98,7 @@ async def test_tracing_with_global_provider():
9898
#
9999
tracer = OpentelemetryTracer(exporters=exporters)
100100

101-
assert len(tracer.exporters) == 3 # with extra 1 built-in exporters
101+
assert len(tracer.exporters) == 4 # with extra 1 built-in exporters
102102

103103

104104
@pytest.mark.asyncio
@@ -112,5 +112,5 @@ async def test_tracing_with_apmplus_global_provider():
112112
# init OpentelemetryTracer
113113
tracer = OpentelemetryTracer(exporters=exporters)
114114

115-
# apmplus exporter won't init again
116-
assert len(tracer.exporters) == 2 # with extra 1 built-in exporters
115+
# apmplus exporter won't init again, so there are cozeloop, tls, in_memory exporter
116+
assert len(tracer.exporters) == 3 # with extra 1 built-in exporters

veadk/agent.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
from __future__ import annotations
1616

17+
import os
1718
from typing import Optional, Union
1819

1920
from google.adk.agents import LlmAgent, RunConfig
@@ -132,6 +133,8 @@ def model_post_init(self, __context: Any) -> None:
132133
"You are trying to use your own LiteLLM client, some default request headers may be missing."
133134
)
134135

136+
self._prepare_tracers()
137+
135138
if self.knowledgebase:
136139
from veadk.tools.builtin_tools.load_knowledgebase import (
137140
LoadKnowledgebaseTool,
@@ -194,6 +197,42 @@ async def event_generator():
194197

195198
return final_output
196199

200+
def _prepare_tracers(self):
201+
enable_apmplus_tracer = os.getenv("ENABLE_APMPLUS", "false").lower() == "true"
202+
enable_cozeloop_tracer = os.getenv("ENABLE_COZELOOP", "false").lower() == "true"
203+
enable_tls_tracer = os.getenv("ENABLE_TLS", "false").lower() == "true"
204+
205+
if not self.tracers:
206+
from veadk.tracing.telemetry.opentelemetry_tracer import OpentelemetryTracer
207+
208+
self.tracers.append(OpentelemetryTracer())
209+
210+
exporters = self.tracers[0].exporters # type: ignore
211+
212+
from veadk.tracing.telemetry.exporters.apmplus_exporter import APMPlusExporter
213+
from veadk.tracing.telemetry.exporters.cozeloop_exporter import CozeloopExporter
214+
from veadk.tracing.telemetry.exporters.tls_exporter import TLSExporter
215+
216+
if enable_apmplus_tracer and not any(
217+
isinstance(e, APMPlusExporter) for e in exporters
218+
):
219+
self.tracers[0].exporters.append(APMPlusExporter()) # type: ignore
220+
logger.info("Enable APMPlus exporter by env.")
221+
222+
if enable_cozeloop_tracer and not any(
223+
isinstance(e, CozeloopExporter) for e in exporters
224+
):
225+
self.tracers[0].exporters.append(CozeloopExporter()) # type: ignore
226+
logger.info("Enable CozeLoop exporter by env.")
227+
228+
if enable_tls_tracer and not any(isinstance(e, TLSExporter) for e in exporters):
229+
self.tracers[0].exporters.append(TLSExporter()) # type: ignore
230+
logger.info("Enable TLS exporter by env.")
231+
232+
logger.debug(
233+
f"Opentelemetry Tracer init {len(self.tracers[0].exporters)} exporters" # type: ignore
234+
)
235+
197236
async def run(
198237
self,
199238
prompt: str | list[str],

veadk/tracing/telemetry/opentelemetry_tracer.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from opentelemetry import trace as trace_api
2222
from opentelemetry.sdk import trace as trace_sdk
2323
from opentelemetry.sdk.resources import Resource
24-
from opentelemetry.sdk.trace import TracerProvider, SpanLimits
24+
from opentelemetry.sdk.trace import SpanLimits, TracerProvider
2525
from opentelemetry.sdk.trace.export import BatchSpanProcessor, SimpleSpanProcessor
2626
from pydantic import BaseModel, ConfigDict, Field, field_validator
2727
from typing_extensions import override
@@ -31,8 +31,8 @@
3131
from veadk.tracing.telemetry.exporters.base_exporter import BaseExporter
3232
from veadk.tracing.telemetry.exporters.inmemory_exporter import InMemoryExporter
3333
from veadk.utils.logger import get_logger
34-
from veadk.utils.patches import patch_google_adk_telemetry
3534
from veadk.utils.misc import get_temp_dir
35+
from veadk.utils.patches import patch_google_adk_telemetry
3636

3737
logger = get_logger(__name__)
3838

@@ -131,12 +131,15 @@ def _init_global_tracer_provider(self) -> None:
131131
) + global_tracer_provider._active_span_processor._span_processors
132132

133133
self._processors.append(self._inmemory_exporter.processor)
134+
self.exporters.append(self._inmemory_exporter)
134135
else:
135136
logger.warning(
136137
"InMemoryExporter processor is not initialized, cannot add to OpentelemetryTracer."
137138
)
138139

139-
logger.info(f"Init OpentelemetryTracer with {len(self._processors)} exporters.")
140+
logger.info(
141+
f"Init OpentelemetryTracer with {len(self._processors)} exporter(s)."
142+
)
140143

141144
@property
142145
def trace_file_path(self) -> str:

0 commit comments

Comments
 (0)