Skip to content

Commit 43a2012

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 2f51273 commit 43a2012

File tree

2 files changed

+73
-14
lines changed

2 files changed

+73
-14
lines changed

llama_stack/log.py

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

41+
# Telemetry category - only added when explicitly enabled
42+
_telemetry_enabled = False
43+
_telemetry_level = None
44+
4145

4246
def config_to_category_levels(category: str, level: str):
4347
"""
@@ -99,6 +103,8 @@ def parse_environment_config(env_config: str) -> dict[str, int]:
99103
Returns:
100104
Dict[str, int]: A dictionary mapping categories to their log levels.
101105
"""
106+
global _telemetry_enabled, _telemetry_level, CATEGORIES
107+
102108
category_levels = {}
103109
delimiter = ","
104110
for pair in env_config.split(delimiter):
@@ -109,7 +115,19 @@ def parse_environment_config(env_config: str) -> dict[str, int]:
109115
category, level = pair.split("=", 1)
110116
category = category.strip().lower()
111117
level = level.strip().upper() # Convert to uppercase for logging._nameToLevel
112-
category_levels.update(config_to_category_levels(category=category, level=level))
118+
119+
if category == "telemetry":
120+
# Add telemetry to CATEGORIES and enable it
121+
level_value = logging._nameToLevel.get(level)
122+
if level_value is not None:
123+
_telemetry_enabled = True
124+
_telemetry_level = level_value
125+
logging.info(f"Telemetry logging enabled at level '{level}'.")
126+
else:
127+
logging.warning(f"Unknown telemetry log level '{level}'. Telemetry logging will remain disabled.")
128+
else:
129+
# Handle regular categories
130+
category_levels.update(config_to_category_levels(category=category, level=level))
113131

114132
except ValueError:
115133
logging.warning(f"Invalid logging configuration: '{pair}'. Expected format: 'category=level'.")
@@ -171,6 +189,23 @@ def filter(self, record):
171189
record.category = "uncategorized" # Default to 'uncategorized' if no category found
172190
return True
173191

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

@@ -182,7 +217,7 @@ def filter(self, record):
182217
"show_time": False,
183218
"show_path": False,
184219
"markup": True,
185-
"filters": ["category_filter"],
220+
"filters": ["category_filter", "telemetry_block_filter"],
186221
}
187222
}
188223

@@ -193,8 +228,27 @@ def filter(self, record):
193228
"filename": log_file,
194229
"mode": "a",
195230
"encoding": "utf-8",
231+
"filters": ["category_filter", "telemetry_block_filter"],
196232
}
197233

234+
# Build loggers configuration step by step
235+
loggers_config = {}
236+
for category in CATEGORIES:
237+
if category == "telemetry" and not _telemetry_enabled:
238+
# When telemetry is disabled, configure it to be silent
239+
loggers_config[category] = {
240+
"level": logging.CRITICAL,
241+
"propagate": False,
242+
"handlers": [], # No handlers = no output
243+
}
244+
else:
245+
# Regular categories get standard handlers
246+
loggers_config[category] = {
247+
"handlers": list(handlers.keys()), # Apply all handlers
248+
"level": category_levels.get(category, DEFAULT_LOG_LEVEL),
249+
"propagate": False, # Disable propagation to root logger
250+
}
251+
198252
logging_config = {
199253
"version": 1,
200254
"disable_existing_loggers": False,
@@ -208,35 +262,43 @@ def filter(self, record):
208262
"filters": {
209263
"category_filter": {
210264
"()": 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
265+
},
266+
"telemetry_block_filter": {
267+
"()": TelemetryBlockFilter,
268+
"telemetry_enabled": _telemetry_enabled,
269+
},
220270
},
271+
"loggers": loggers_config,
221272
"root": {
222273
"handlers": list(handlers.keys()),
223274
"level": root_level, # Set root logger's level dynamically
224275
},
225276
}
277+
226278
dictConfig(logging_config)
227279

228280
# Ensure third-party libraries follow the root log level
229281
for _, logger in logging.root.manager.loggerDict.items():
230282
if isinstance(logger, logging.Logger):
231283
logger.setLevel(root_level)
232284

285+
# Explicitly silence telemetry loggers when telemetry is not enabled
286+
if not _telemetry_enabled:
287+
telemetry_logger = logging.getLogger("telemetry")
288+
telemetry_logger.setLevel(logging.CRITICAL) # Silence all telemetry logs
289+
# Also silence any child telemetry loggers
290+
for name, logger in logging.root.manager.loggerDict.items():
291+
if isinstance(logger, logging.Logger) and name.startswith("telemetry"):
292+
logger.setLevel(logging.CRITICAL)
293+
233294

234295
def get_logger(
235296
name: str, category: str = "uncategorized", config: LoggingConfig | None | None = None
236297
) -> logging.LoggerAdapter:
237298
"""
238299
Returns a logger with the specified name and category.
239300
If no category is provided, defaults to 'uncategorized'.
301+
Note: telemetry category is only available when explicitly enabled via LLAMA_STACK_LOGGING=telemetry=LEVEL
240302
241303
Parameters:
242304
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)