监控 Cortex Search 请求

Cortex Search 会记录有关搜索请求的详细信息,用于监控和调试目的。启用请求日志记录后,您可以查看 Cortex Search 服务的查询模式、响应时间和请求详情。

请求日志中收集的信息

Cortex Search 请求日志包含以下信息:

  • 操作类型(例如,QUERY)

  • 完整的请求正文,包括查询文本和参数

  • 响应状态代码

  • 响应时间(以毫秒为单位)

  • 数据库、架构和服务名称

  • 用户、角色和会话信息

启用请求日志记录

要收集 Cortex Search 服务的请求日志,请在服务上启用 REQUEST_LOGGING 属性。

您可以在创建服务时启用请求日志记录:

CREATE CORTEX SEARCH SERVICE my_search_service
  ON text_col
  ATTRIBUTES category
  WAREHOUSE = my_wh
  TARGET_LAG = '1 hour'
  REQUEST_LOGGING = TRUE
AS (SELECT * FROM my_table);

您还可以在现有服务上启用请求日志记录:

ALTER CORTEX SEARCH SERVICE my_search_service SET REQUEST_LOGGING = TRUE;

要禁用请求日志记录,请执行以下步骤:

ALTER CORTEX SEARCH SERVICE my_search_service SET REQUEST_LOGGING = FALSE;

操作注意事项

日志数据量

每个记录的 Cortex Search 请求都会在 SNOWFLAKE.LOCAL.AI_OBSERVABILITY_EVENTS 中生成一行事件记录。积累的数据量取决于您的请求频率以及日志记录功能保持启用的时间长短。请根据您计划保留的日志量设置保留和存储策略。

成本注意事项

存储在 SNOWFLAKE.LOCAL 表中的数据会产生 Snowflake 存储费用。使用 SQL 查询请求日志时,会像其他查询一样消耗仓库资源。

查询延迟

启用请求日志记录不会影响 Cortex Search 查询请求的延迟。

访问 Cortex Search 请求日志

Cortex Search Service 的请求日志存储在事件表 SNOWFLAKE.LOCAL.AI_OBSERVABILITY_EVENTS 中。您可以通过表函数或直接查询事件表来访问这些日志。

使用 snowflake.local.get_ai_observability_events 函数

在 Cortex Search 服务上拥有 MONITOR 权限的用户可以使用 snowflake.local.get_ai_observability_events 函数查看该服务的请求日志。

  1. 授予 MONITOR 权限:向将使用该函数的角色授予 Cortex Search 服务上的 MONITOR 权限:

    USE ROLE ACCOUNTADMIN;
    GRANT MONITOR ON CORTEX SEARCH SERVICE <service_name> TO ROLE <role_name>;
    
  2. 查询可观察性事件:使用具有 MONITOR 权限的角色调用 snowflake.local.get_ai_observability_events

    USE ROLE <role_name>;
    SELECT * FROM TABLE(snowflake.local.get_ai_observability_events(
      '<database_name>',
      '<schema_name>',
      '<service_name>',
      'CORTEX SEARCH SERVICE'
    ));
    

以 ACCOUNTADMIN 身份查询事件表

具有 ACCOUNTADMIN 角色的用户可以直接查询事件表:

USE ROLE ACCOUNTADMIN;
SELECT * FROM snowflake.local.ai_observability_events
WHERE observed_timestamp > TIMESTAMPADD(minute, -10, CURRENT_TIMESTAMP())
  AND record['name'] = 'CORTEX_SEARCH_REQUEST';

备注

具有 ACCOUNTADMIN 用户的角色可以查询 snowflake.local.ai_observability_events 表并访问账户中所有 Cortex Search 服务的请求事件。

访问控制与权限

要查看 Cortex Search 请求日志,用户必须具备以下条件之一:

  • 对 Cortex Search 服务的 OWNERSHIP 或 MONITOR 权限

  • ACCOUNTADMIN 角色(用于直接事件表访问)

以下示例展示了如何使用 ACCOUNTADMIN 角色创建一个新角色 search_monitoring_role,并授予其查看 Cortex Search 请求日志所需的权限。

USE ROLE ACCOUNTADMIN;
CREATE ROLE search_monitoring_role;
GRANT MONITOR ON CORTEX SEARCH SERVICE my_search_service TO ROLE search_monitoring_role;
GRANT ROLE search_monitoring_role TO USER some_user;

输出架构

snowflake.local.get_ai_observability_events 函数返回一个包含以下列的表:

列名称

数据类型

描述

TIMESTAMP

TIMESTAMP_NTZ(9)

事件的时间

START_TIMESTAMP

TIMESTAMP_NTZ(9)

事件的开始时间(可能是 NULL)

TRACE

OBJECT

事件的跟踪信息(可能是 NULL)

RESOURCE_ATTRIBUTES

OBJECT

包含会话、用户和角色信息,包括会话 ID、用户 ID、用户名、角色 ID 和角色名称

RECORD_TYPE

STRING

记录类型,对于 Cortex Search 请求,通常为“EVENT”

RECORD

OBJECT

包含事件名称,通常为“CORTEX_SEARCH_REQUEST”

RECORD_ATTRIBUTES

OBJECT

包含详细的可观测性元数据,包括数据库、架构、服务、用户、角色和会话信息

VALUE

VARIANT

包含实际请求的详细信息,包括操作类型、请求正文、响应状态码和响应时间

VALUE 列包含以下关键字段:

  • snow.ai.observability.operation_type:选择使用 时默认使用的角色和仓库。操作的类型,例如“QUERY”

  • snow.ai.observability.request_body:选择使用 时默认使用的角色和仓库。包含查询文本和参数的完整请求

  • snow.ai.observability.response_status_code:响应的 HTTP 状态码。

  • snow.ai.observability.response_time_ms:选择使用 时默认使用的角色和仓库。响应时间(以毫秒为单位)

  • snow.ai.observability.database.name:选择使用 时默认使用的角色和仓库。包含 Cortex Search 服务的数据库

  • snow.ai.observability.schema.name:选择使用 时默认使用的角色和仓库。包含 Cortex Search 服务的架构

  • snow.ai.observability.object.name:选择使用 时默认使用的角色和仓库。Cortex Search 服务的名称

以下是 VALUE 列中数据的示例:

{
  "snow.ai.observability.operation_type": "QUERY",
  "snow.ai.observability.request_body": {
    "experimental": null,
    "limit": 10,
    "multi_index_query": null,
    "query": "hello"
  },
  "snow.ai.observability.response_status_code": 200,
  "snow.ai.observability.response_time_ms": 391
}

示例

使用对服务具有 MONITOR 权限的角色,查询过去 24 小时内的请求日志。

SELECT
  timestamp,
  record_attributes['ai.observability.record_id']::STRING as query_id,
  value['snow.ai.observability.request_body']['query']::STRING AS query_text,
  value['snow.ai.observability.request_body']['limit']::INT AS limit,
  value['snow.ai.observability.response_status_code']::INT AS status_code,
  value['snow.ai.observability.response_time_ms']::INT AS response_time_ms,
  record_attributes['snow.ai.observability.database.name']::STRING AS database_name,
  record_attributes['snow.ai.observability.schema.name']::STRING AS schema_name,
  record_attributes['snow.ai.observability.object.name']::STRING AS service_name,
  record_attributes['snow.ai.observability.user.name']::STRING AS user_name,
  record_attributes['snow.ai.observability.role.name']::STRING AS role_name,
  record_attributes['snow.ai.observability.session.id']::STRING AS session_id,
FROM TABLE(snowflake.local.get_ai_observability_events(
  '<database_name>',
  '<schema_name>',
  '<service_name>',
  'CORTEX SEARCH SERVICE'
))
WHERE timestamp > TIMESTAMPADD(hour, -24, CURRENT_TIMESTAMP())
ORDER BY timestamp DESC;