Skip to content

Commit 7e49dfd

Browse files
committed
feat: omit telemetry logs
this does a few things: 1. fixes `on_start` so that all span [START] and [END] is printed. not just [END] 2. change `log.py` to omit the telemetry category by default, but it can be enabled like any other logger `LLAMA_STACK_LOGGING=telemetry=INFO` This allows us to keep the metric logging and the verbosity of seeing the span [START] and [END] but by default hides it from normal users. This conforms to our logging system since a user just need to enable the category to see the logs Signed-off-by: Charlie Doern <[email protected]>
1 parent 5b312a8 commit 7e49dfd

File tree

2 files changed

+50
-13
lines changed

2 files changed

+50
-13
lines changed

llama_stack/log.py

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
# Initialize category levels with default level
3939
_category_levels: dict[str, int] = dict.fromkeys(CATEGORIES, DEFAULT_LOG_LEVEL)
4040

41+
# telemetry is enabled only when explicitly added to the env list
42+
_telemetry_enabled = False
43+
4144

4245
def config_to_category_levels(category: str, level: str):
4346
"""
@@ -99,6 +102,8 @@ def parse_environment_config(env_config: str) -> dict[str, int]:
99102
Returns:
100103
Dict[str, int]: A dictionary mapping categories to their log levels.
101104
"""
105+
global _telemetry_enabled
106+
102107
category_levels = {}
103108
delimiter = ","
104109
for pair in env_config.split(delimiter):
@@ -109,6 +114,15 @@ def parse_environment_config(env_config: str) -> dict[str, int]:
109114
category, level = pair.split("=", 1)
110115
category = category.strip().lower()
111116
level = level.strip().upper() # Convert to uppercase for logging._nameToLevel
117+
118+
if category == "telemetry":
119+
# check if telemetry was passed in, if so we should disable the filter below
120+
level_value = logging._nameToLevel.get(level)
121+
if level_value is not None:
122+
_telemetry_enabled = True
123+
logging.info(f"Telemetry logging enabled at level '{level}'.")
124+
else:
125+
logging.warning(f"Unknown telemetry log level '{level}'. Telemetry logging will remain disabled.")
112126
category_levels.update(config_to_category_levels(category=category, level=level))
113127

114128
except ValueError:
@@ -171,6 +185,23 @@ def filter(self, record):
171185
record.category = "uncategorized" # Default to 'uncategorized' if no category found
172186
return True
173187

188+
class TelemetryBlockFilter(logging.Filter):
189+
"""Block all telemetry logs when telemetry is not enabled."""
190+
191+
def __init__(self, telemetry_enabled=False):
192+
super().__init__()
193+
self.telemetry_enabled = telemetry_enabled
194+
195+
def filter(self, record):
196+
# If telemetry is not enabled, block all telemetry logs
197+
if not self.telemetry_enabled:
198+
# Check if this is a telemetry log by logger name or category
199+
if (hasattr(record, "name") and record.name.startswith("telemetry")) or (
200+
hasattr(record, "category") and record.category == "telemetry"
201+
):
202+
return False # Block this log
203+
return True # Allow all other logs
204+
174205
# Determine the root logger's level (default to WARNING if not specified)
175206
root_level = category_levels.get("root", logging.WARNING)
176207

@@ -182,7 +213,7 @@ def filter(self, record):
182213
"show_time": False,
183214
"show_path": False,
184215
"markup": True,
185-
"filters": ["category_filter"],
216+
"filters": ["category_filter", "telemetry_block_filter"],
186217
}
187218
}
188219

@@ -193,6 +224,16 @@ def filter(self, record):
193224
"filename": log_file,
194225
"mode": "a",
195226
"encoding": "utf-8",
227+
"filters": ["category_filter", "telemetry_block_filter"],
228+
}
229+
230+
# Build loggers configuration step by step
231+
loggers_config = {}
232+
for category in CATEGORIES:
233+
loggers_config[category] = {
234+
"handlers": list(handlers.keys()), # Apply all handlers
235+
"level": category_levels.get(category, DEFAULT_LOG_LEVEL),
236+
"propagate": False, # Disable propagation to root logger
196237
}
197238

198239
logging_config = {
@@ -208,21 +249,19 @@ def filter(self, record):
208249
"filters": {
209250
"category_filter": {
210251
"()": CategoryFilter,
211-
}
212-
},
213-
"loggers": {
214-
category: {
215-
"handlers": list(handlers.keys()), # Apply all handlers
216-
"level": category_levels.get(category, DEFAULT_LOG_LEVEL),
217-
"propagate": False, # Disable propagation to root logger
218-
}
219-
for category in CATEGORIES
252+
},
253+
"telemetry_block_filter": {
254+
"()": TelemetryBlockFilter,
255+
"telemetry_enabled": _telemetry_enabled,
256+
},
220257
},
258+
"loggers": loggers_config,
221259
"root": {
222260
"handlers": list(handlers.keys()),
223261
"level": root_level, # Set root logger's level dynamically
224262
},
225263
}
264+
226265
dictConfig(logging_config)
227266

228267
# Ensure third-party libraries follow the root log level
@@ -237,6 +276,7 @@ def get_logger(
237276
"""
238277
Returns a logger with the specified name and category.
239278
If no category is provided, defaults to 'uncategorized'.
279+
Note: telemetry category is only available when explicitly enabled via LLAMA_STACK_LOGGING=telemetry=LEVEL
240280
241281
Parameters:
242282
name (str): The name of the logger (e.g., module or filename).

llama_stack/providers/inline/telemetry/meta_reference/console_span_processor.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ def __init__(self, print_attributes: bool = False):
2121
self.print_attributes = print_attributes
2222

2323
def on_start(self, span: ReadableSpan, parent_context=None) -> None:
24-
if span.attributes and span.attributes.get("__autotraced__"):
25-
return
26-
2724
timestamp = datetime.fromtimestamp(span.start_time / 1e9, tz=UTC).strftime("%H:%M:%S.%f")[:-3]
2825
logger.info(f"[dim]{timestamp}[/dim] [bold magenta][START][/bold magenta] [dim]{span.name}[/dim]")
2926

0 commit comments

Comments
 (0)