What you will be able to do
- Explain what an event table is and why telemetry collection needs both an active event table and telemetry levels
- Choose between the default SNOWFLAKE.TELEMETRY.EVENTS table and a custom event table, and manage access to each
- Create a custom event table, associate it with an account or database, and predict which table receives an object's data
- Set LOG_LEVEL, LOG_EVENT_LEVEL, METRIC_LEVEL and TRACE_LEVEL at the right scope and predict the level in effect
Key concept
Active event table + telemetry level — Snowflake only records logs, traces, metrics and events when two things are true. An event table must be active for the object's scope, and a telemetry level must allow that kind of data. If either one is missing, nothing is captured.
1.What an event table is and where telemetry lands
Procedures, UDFs and other Snowflake objects emit telemetry: log messages, trace data, metrics and log events. Snowflake writes all of it to an event table. An event table is a special kind of database table with a predefined set of columns. Its structure follows the OpenTelemetry data model, and you read it with ordinary SQL queries. It holds data you emit by instrumenting handler code with logging and tracing APIs, and it also holds data that Snowflake generates itself.
Every account comes with the default event table SNOWFLAKE.TELEMETRY.EVENTS. If you never set an active event table yourself, Snowflake uses this one. The table alone is not enough, though. Collection also depends on telemetry levels, which the last section of this page covers. Collection is not free either: the documentation warns that collecting telemetry data incurs costs. So capture what you need and leave the rest switched off.
Snowflake also provides a predefined view, SNOWFLAKE.TELEMETRY.EVENTS_VIEW. Use it to share event data with a wider group of users more securely than granting access to the table itself. You can manage access to the view with a row access policy.
Checkpoint 1 of 6· Check yourself
Which statement about event tables is correct?
Event tables have fixed columns that follow OpenTelemetry. They hold both Snowflake-generated data and data your code emits, and collecting telemetry incurs costs.
“An event table is a special kind of database table with a predefined set of columns.”Source: docs.snowflake.com
Sources1
2.Default versus custom event tables, and how to manage each
The default table is easy to use but you have less control over it. It supports only some of the DDL commands available for an event table you create. You can query it, truncate it and delete from it, but you cannot drop it or undrop it. Neither kind of event table can be renamed. A custom event table also supports DROP, UNDROP and CREATE TABLE.
Event table data grows continuously, so you need a way to keep it in check. TRUNCATE TABLE removes all rows. DELETE removes selected rows, which lets you build retention rules. For example, you could keep one function's logs longer than another's. You can also create a stream on an event table to capture new rows as they are inserted.
| Operation | Default event table | User-created event table |
|---|---|---|
| SHOW EVENT TABLES / DESCRIBE EVENT TABLE / SELECT | Supported | Supported |
| TRUNCATE TABLE / DELETE | Supported | Supported |
| DROP TABLE / UNDROP TABLE / CREATE TABLE | Not supported | Supported |
| ALTER TABLE | Supported (rename is not supported) | Supported (rename is not supported) |
Access control also differs between the two. For the default table, Snowflake provides two application roles. ACCOUNTADMIN can grant them, and they must be granted to roles, not directly to users:
- EVENTS_VIEWER can SELECT from EVENTS_VIEW. - EVENTS_ADMIN has SELECT, TRUNCATE and DELETE on the default table and SELECT on EVENTS_VIEW. It can also run the procedures ADD_ROW_ACCESS_POLICY_ON_EVENTS_VIEW and DROP_ROW_ACCESS_POLICY_ON_EVENTS_VIEW. Row access policies on this view require Enterprise Edition.
For a custom table, you control access through privileges such as SELECT. You can also create views on the event table that each expose part of the data, and grant each view to a different role.
Checkpoint 2 of 6· Fill the gap
An analyst role needs to read the default event table's data through EVENTS_VIEW, and nothing more. Which application role completes the grant?
GRANT APPLICATION ROLE SNOWFLAKE. ? TO ROLE my_analysis_role;EVENTS_VIEWER gives SELECT on EVENTS_VIEW only. EVENTS_ADMIN would also allow TRUNCATE and DELETE on the default table, which is more than an analyst needs.
Source: docs.snowflake.com3.Configuring a custom event table and its scope
Setting up a custom event table takes two steps. First, with a role that has the CREATE EVENT TABLE privilege, create the table. You give it only a name, because the columns are predefined. Second, set the EVENT_TABLE parameter on an object to associate the table with it. That object becomes the scope whose telemetry goes into the table.
CREATE EVENT TABLE my_database.my_schema.my_events;You can associate an event table with the account or with a database.
- Account: gives the broadest scope. It requires the ACCOUNTADMIN role, OWNERSHIP on the account, and OWNERSHIP or INSERT on the event table. Use ALTER ACCOUNT SET EVENT_TABLE = ... with the fully qualified table name.
- Database: requires Enterprise Edition. Use ALTER DATABASE ... SET EVENT_TABLE.
To remove an association, use UNSET EVENT_TABLE. To check which table is set, use SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT, or IN DATABASE for a database.
When both levels have a table, the database's table wins. Objects in that database write to the database's table, and every other database falls back to the account's table. One more limit to keep in mind: event tables are not replicated. Event tables inside primary databases are skipped during replication.
Checkpoint 3 of 6· Fill the gap
Complete the statement that makes my_events the active event table for procedures and UDFs in my_database.
ALTER DATABASE my_database SET ? = my_database.my_schema.my_events;Setting the EVENT_TABLE parameter on the database makes it the scope for that event table. LOG_LEVEL and TRACE_LEVEL control how much data is captured, not where it goes.
Source: docs.snowflake.comCheckpoint 4 of 6· Check yourself
The account's EVENT_TABLE is set to ops.tel.acct_events, and database SALES has EVENT_TABLE set to sales.tel.sales_events. Where do telemetry rows from a UDF in SALES go?
The order of precedence is Account » Database, so an event table associated with a database overrides the account's table for objects in that database.
“In that precedence order, an event table associated with a database takes precedence over an event table associated with an account.”Source: docs.snowflake.com
Sources1
4.Setting levels for logs, log events, metrics and traces
The event table decides where telemetry goes. Levels decide how much of it is captured. Each kind of telemetry has its own parameter. You can set a parameter for the account, override it on an object, or set it for the current session. Objects you can set levels on include a database, a schema, a procedure, a UDF or UDTF, and an externally managed Iceberg table with automated refresh. You cannot set levels on Streamlit objects. Instead, set the level on the database or schema that contains them.
| Telemetry | Parameter | What the level means | Session privilege |
|---|---|---|---|
| Log messages | LOG_LEVEL | Captures the set level and all more severe levels | MODIFY SESSION LOG LEVEL |
| Log events (record type EVENT) | LOG_EVENT_LEVEL | Captures the set level and all more severe levels, e.g. events from Snowpipe, tasks or dynamic tables | MODIFY SESSION LOG EVENT LEVEL |
| Metrics | METRIC_LEVEL | All or nothing: every metric is captured, or none | MODIFY SESSION METRIC LEVEL |
| Traces | TRACE_LEVEL | How much trace event data is stored | MODIFY SESSION TRACE LEVEL |
| SQL text in traced statements | SQL_TRACE_QUERY_TEXT | Whether the SQL text of a traced statement is captured | Account only: SQL_TRACE_QUERY_TEXT on the account |
To set a level at the account scope, you need MODIFY LOG LEVEL (or MODIFY TRACE LEVEL, and so on) on the account. Setting it on an object also requires MODIFY on that object and USAGE on its database or schema.
To set account-level telemetry in Snowsight, go to Monitoring » Traces & logs and choose Set Event Level. The Snowsight toggles simplify the underlying parameters. Logs On sets LOG_LEVEL to INFO. Traces On sets TRACE_LEVEL to ALWAYS. Metrics On sets METRIC_LEVEL to ALL.
Levels follow two hierarchies. Object parameters run Account » Database » Schema » Object, and the setting closest to the object wins. Session parameters run Account » User » Session. If a level is set in both the session and the object hierarchy, Snowflake uses the most verbose of the two.
ALTER ACCOUNT SET LOG_LEVEL = FATAL;
ALTER FUNCTION MyJavaUDF SET LOG_LEVEL = INFO;
-- The INFO log level is used because the FUNCTION MYJAVAUDF
-- is lower than the ACCOUNT in the hierarchy.Checkpoint 5 of 6· Check yourself
Procedure P has LOG_LEVEL = ERROR. A developer runs ALTER SESSION SET LOG_LEVEL = DEBUG and then calls P. Which level is in effect?
This combines the session hierarchy with the object hierarchy, and in that case Snowflake picks the more verbose level. DEBUG is more verbose than ERROR.
“In cases where the level is set in both the session and object parameter hierarchies, the most verbose level is used.”Source: docs.snowflake.com
Checkpoint 6 of 6· Exam question
A platform team wants telemetry from all stored procedures kept for only 14 days, with a stream on the telemetry table feeding a downstream task and a clustering key on the timestamp. Which approach MOST appropriately meets these needs?
Correct answer: C — Create a custom event table with CREATE EVENT TABLE, then make it the account's active event table with ALTER ACCOUNT SET EVENT_TABLE.
- A. Incorrect. Only an object created with CREATE EVENT TABLE can be set as the account's event table; a regular table with matching columns is rejected.
- B. Incorrect. The default system event table is managed by Snowflake and cannot be altered, so streams, cluster keys and custom retention cannot be attached to it, even by ACCOUNTADMIN.
- C. Correct. A custom event table is a table you own, so you can add streams, clustering and your own purge task, and ALTER ACCOUNT SET EVENT_TABLE redirects collection to it.
- D. Incorrect. The default events view is a read-only window on the system table, and a materialized view cannot be built on it to enforce a 14-day retention or to feed a stream.
Sources3
Exam traps
Each one states something that sounds right. Open it to see what is actually true.
1.Setting LOG_LEVEL = WARN captures only WARN messages.Why is that wrong?
A log level is a threshold. Snowflake captures messages at that level and every more severe level, so WARN also captures ERROR and FATAL.
Covered in Setting levels for logs, log events, metrics and traces
2.An event table set on the account overrides any table set on a database, because the account is the broadest scope.Why is that wrong?
It works the other way round. The database's event table takes precedence, and the account's table only catches databases that have no table of their own.
3.The default event table works like any table you own, so you can drop it or rename it.Why is that wrong?
The default table supports only some event table operations. DROP and UNDROP are custom-table only, and rename is not supported for either kind.
Covered in Default versus custom event tables, and how to manage each
Sources
Every claim above is drawn from one of these pages, quoted as it was written on the date shown.
- 1.
“When collecting telemetry data, you incur costs.”
↩︎ What an event table is and where telemetry lands“You can manage access to the view with a row access policy.”
↩︎ What an event table is and where telemetry lands“You must grant these roles to other roles, rather than to a user.”
↩︎ Default versus custom event tables, and how to manage each“Using row access policies on the EVENT_VIEW view is an Enterprise Edition feature.”
↩︎ Default versus custom event tables, and how to manage each“When you create an event table, you do not specify the columns in the table.”
↩︎ Configuring a custom event table and its scope“Associating an event table with a database is an Enterprise Edition feature.”
↩︎ Configuring a custom event table and its scope“Replication of event tables is not currently supported.”
↩︎ Configuring a custom event table and its scope“To collect telemetry data, you must have an active event table and have set telemetry levels to allow data collection.”
↩︎ Key concept“In that precedence order, an event table associated with a database takes precedence over an event table associated with an account.”
↩︎ Exam trap 2“After installation, Snowflake includes a default event table called SNOWFLAKE.TELEMETRY.EVENTS. This event table is active and collects data until you deactivate it.”
↩︎ Prediction“An event table is a special kind of database table with a predefined set of columns.”
↩︎ Checkpoint“In that precedence order, an event table associated with a database takes precedence over an event table associated with an account.”
↩︎ Checkpoint - 2.
“Use DELETE to remove selected rows from the event table.”
↩︎ Default versus custom event tables, and how to manage each“you can create views on the event table, then grant access for each view to separate roles.”
↩︎ Default versus custom event tables, and how to manage each“You can perform only a subset of the operations listed here on the default event table, as noted in this topic.”
↩︎ Exam trap 3 - 3.
“You can currently have all metrics data captured or none.”
↩︎ Setting levels for logs, log events, metrics and traces“to set trace data collection to ALWAYS”
↩︎ Setting levels for logs, log events, metrics and traces“For session parameters, the hierarchy is Account » User » Session.”
↩︎ Setting levels for logs, log events, metrics and traces“setting the LOG_LEVEL parameter to WARN means that log messages at the WARN, ERROR, and FATAL levels are captured in the event table”
↩︎ Exam trap 1“In cases where the level is set in both the session and object parameter hierarchies, the most verbose level is used.”
↩︎ Checkpoint