Snowpark Container Services:监控服务¶
访问容器日志¶
Snowflake 会收集应用程序容器输出到标准输出和标准错误的内容。您应确保代码输出有用的信息,以便调试服务。
Snowflake 提供了两种访问这些服务(包括作业服务)容器日志的方法:
使用 SYSTEM$GET_SERVICE_LOGS 系统函数: 访问特定容器中的日志。容器退出后,您可以继续使用系统函数短时间访问日志。系统函数在开发和测试过程中,即在最初授权服务或作业时最有用。有关更多信息,请参阅 SYSTEM$GET_SERVICE_LOGS。
使用事件表: 账户的事件表使您可以访问来自多个容器的服务日志,这些服务 在其规范中启用日志收集。Snowflake 会将日志持久保存在事件表中,以便日后访问。事件表最适合用于服务和作业的回顾分析。有关更多信息,请参阅 使用事件表。
使用 SYSTEM$GET_SERVICE_LOGS¶
您需要提供服务名称、实例 ID、容器名称,还可选择提供要检索的最新日志行数。如果只有一个服务实例正在运行,则服务实例 ID 为 0。例如,以下语句命令会从名为 echo
的容器的日志中检索末尾的 10 行,该容器属于名为 echo_service
的服务的实例 0:
SELECT SYSTEM$GET_SERVICE_LOGS('echo_service', '0', 'echo', 10);
输出示例:
+--------------------------------------------------------------------------+
| SYSTEM$GET_SERVICE_LOGS |
|--------------------------------------------------------------------------|
| 10.16.6.163 - - [11/Apr/2023 21:44:03] "GET /healthcheck HTTP/1.1" 200 - |
| 10.16.6.163 - - [11/Apr/2023 21:44:08] "GET /healthcheck HTTP/1.1" 200 - |
| 10.16.6.163 - - [11/Apr/2023 21:44:13] "GET /healthcheck HTTP/1.1" 200 - |
| 10.16.6.163 - - [11/Apr/2023 21:44:18] "GET /healthcheck HTTP/1.1" 200 - |
+--------------------------------------------------------------------------+
1 Row(s) produced. Time Elapsed: 0.878s
如果没有调用该函数所需的服务相关信息(如实例 ID 或容器名称),您可以先运行 SHOW SERVICE CONTAINERS IN SERVICE 命令获取每个实例中运行的服务实例和容器的相关信息。
SYSTEM$GET_SERVICE_LOGS 函数有以下限制:
它将标准输出和标准错误流合并。该函数没有说明输出来自哪个流。
它在单个服务实例中报告特定容器的捕获数据。
它只报告运行中容器的日志。该函数无法从先前重新启动的容器或者已停止或已删除的服务容器中获取日志。
该函数最多可返回 100 KB 数据。
使用事件表¶
Snowflake 可以获取从容器发送到标准输出的日志,并将标准错误流发送到为您的账户配置的事件表中。有关配置事件表的更多信息,请参阅 日志记录、跟踪和指标。
您可以通过使用服务规范文件中的 spec.logExporters 字段 来控制要收集哪些流(全部、仅标准错误或无)并将其存储在事件表中。
然后您可以查询事件表中的事件。例如,以下 SELECT 语句可检索过去一小时内记录的 Snowflake 服务和作业事件:
SELECT TIMESTAMP, RESOURCE_ATTRIBUTES, RECORD_ATTRIBUTES, VALUE
FROM <current-event-table-for-your-account>
WHERE timestamp > dateadd(hour, -1, current_timestamp())
AND RESOURCE_ATTRIBUTES:"snow.service.name" = <service-name>
AND RECORD_TYPE = 'LOG'
ORDER BY timestamp DESC
LIMIT 10;
Snowflake 建议您在事件表查询的 WHERE 子句中包含时间戳,如本例所示。这一点尤为重要,因为各种 Snowflake 组件可能会生成大量数据。通过应用筛选器,可以检索到较小的数据子集,从而提高查询性能。
事件表包括以下列,这些列提供了有关 Snowflake 从您的容器收集的日志的有用信息:
TIMESTAMP: 显示 Snowflake 收集日志的时间。
RESOURCE_ATTRIBUTES: 提供 JSON 对象,用于标识 Snowflake 服务和生成日志消息的服务中的容器。例如,它提供了服务运行时指定的服务名称、容器名称和计算池名称等详细信息。
{ "snow.account.name": "SPCSDOCS1", "snow.compute_pool.id": 20, "snow.compute_pool.name": "TUTORIAL_COMPUTE_POOL", "snow.compute_pool.node.id": "a17e8157", "snow.compute_pool.node.instance_family": "CPU_X64_XS", "snow.database.id": 26, "snow.database.name": "TUTORIAL_DB", "snow.schema.id": 212, "snow.schema.name": "DATA_SCHEMA", "snow.service.container.instance": "0", "snow.service.container.name": "echo", "snow.service.container.run.id": "b30566", "snow.service.id": 114, "snow.service.name": "ECHO_SERVICE2", "snow.service.type": "Service" }
RECORD_ATTRIBUTES: 对于 Snowflake 服务,它标识错误源(标准输出或标准错误)。
{ "log.iostream": "stdout" }
VALUE: 标准输出和标准错误被分成若干行,每一行都会在事件表中生成一条记录。
"echo-service [2023-10-23 17:52:27,429] [DEBUG] Sending response: {'data': [[0, 'Joe said hello!']]}"
访问指标¶
Snowflake 为账户中的 计算池 和在这些计算池上运行的 服务 提供指标。这些由 Snowflake 提供的指标也称为平台指标。
事件表服务指标: 各个服务发布指标。这些是提供特定于服务的信息的计算池指标的子集。其目标用例是观察特定服务的资源利用率。在服务规范中,您可以定义希望 Snowflake 在服务运行时在事件表中记录哪些指标。
计算池指标: 每个计算池还发布指标,提供有关该计算池内部发生情况的信息。其目标用例是观察计算池利用率。要访问计算池指标,您需要编写一个服务,该服务使用与 Prometheus 兼容的 API 来轮询计算池发布的指标。
访问事件表服务指标¶
要将服务指标记录到为账户配置的事件表中,请在服务规范中包含以下部分:
platformMonitor:
metricConfig:
groups:
- <group 1>
- <group 2>
- ...
其中,每个 group N
指的是您感兴趣的 预定义指标组 <label-spcs_available_platform_metrics>`(例如,``system`、network
或 storage
)。有关更多信息,请参阅服务规范文档中的 spec.platformMonitor 字段 部分。
在服务运行时,Snowflake 会将这些指标记录到账户中的事件表中。您可以查询事件表来读取指标。以下查询检索了过去一小时内为服务 my_service
记录的服务指标:
SELECT timestamp, value
FROM my_event_table_db.my_event_table_schema.my_event_table
WHERE timestamp > DATEADD(hour, -1, CURRENT_TIMESTAMP())
AND RESOURCE_ATTRIBUTES:"snow.service.name" = 'MY_SERVICE'
AND RECORD_TYPE = 'METRIC'
ORDER BY timestamp DESC
LIMIT 10;
如果您不知道该账户的活动事件表的名称,请执行 SHOW PARAMETERS 命令来显示账户级别 EVENT_TABLE 参数的值:
SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
有关事件表的更多信息,请参阅 使用事件表。
示例
按照以下步骤创建一个示例服务,将指标记录到为您的账户配置的事件表中。
按照 教程 1 创建一个名为
echo_service
的服务,但有一处变化。在第 3 步中,创建服务时,使用以下 CREATE SERVICE 命令在修改后的服务规范中添加platformMonitor
字段。CREATE SERVICE echo_service IN COMPUTE POOL tutorial_compute_pool FROM SPECIFICATION $$ spec: containers: - name: echo image: /tutorial_db/data_schema/tutorial_repository/my_echo_service_image:latest env: SERVER_PORT: 8000 CHARACTER_NAME: Bob readinessProbe: port: 8000 path: /healthcheck endpoints: - name: echoendpoint port: 8000 public: true platformMonitor: metricConfig: groups: - system - system_limits $$ MIN_INSTANCES=1 MAX_INSTANCES=1;
服务运行后,Snowflake 开始将指定的指标组中的指标记录到事件表中,供您之后查询。以下查询检索了 Echo 服务在过去一小时内报告的指标。
SELECT timestamp, value ROM my_events WHERE timestamp > DATEADD(hour, -1, CURRENT_TIMESTAMP()) AND RESOURCE_ATTRIBUTES:"snow.service.name" = 'ECHO_SERVICE' AND RECORD_TYPE = 'METRIC' ORDER BY timestamp, group DESC LIMIT 10;
访问计算池指标¶
计算池 指标可提供对计算池中的节点及其上运行的服务的洞察。每个节点可报告特定于节点的指标(例如容器的可用内存量),以及服务指标(例如各个容器的内存使用情况)。计算池指标从节点的角度提供信息。
每个节点都有一个指标发布器,用于监听 TCP 端口 9001。其他服务可以使用指向节点上端口 9001 的路径 /metrics
发出 HTTP GET 请求。要发现节点的 IP 地址,请从 DNS 中检索 discover.monitor.compute_pool_name.snowflakecomputing.internal
主机名的 SRV 记录(或 A 记录)。然后,在您的账户中创建另一项服务,用于主动轮询每个节点以检索指标。
响应中的正文使用 ` Prometheus 格式 <https://prometheus.io/docs/instrumenting/exposition_formats/#text-based-format (https://prometheus.io/docs/instrumenting/exposition_formats/#text-based-format)>`_ 提供指标,如以下示例指标所示:
# HELP node_memory_capacity Defines SPCS compute pool resource capacity on the node
# TYPE node_memory_capacity gauge
node_memory_capacity{snow_compute_pool_name="MY_POOL",snow_compute_pool_node_instance_family="CPU_X64_S",snow_compute_pool_node_id="10.244.3.8"} 1
node_cpu_capacity{snow_compute_pool_name="MY_POOL",snow_compute_pool_node_instance_family="CPU_X64_S",snow_compute_pool_node_id="10.244.3.8"} 7.21397383168e+09
请注意以下事项:
响应主体以
# HELP
和# TYPE
开头,提供简短描述和指标类型。在本示例中,node_memory_capacity
指标类型为gauge
。然后是指标的名称、描述特定资源(数据点)的标签列表及其值。在本示例中,指标(名为
node_memory_capacity
)提供了内存信息,表明节点有 7.2 GB 可用内存。该指标还包括标签形式的元数据,如下所示:snow_compute_pool_name="MY_POOL", snow_compute_pool_node_instance_family="CPU_X64_S",snow_compute_pool_node_id="10.244.3.8"
您可以选择任何方式来处理这些指标;例如,您可以将指标存储在数据库中,然后使用 UI(例如 Grafana 仪表板)来显示信息。
备注
Snowflake 不提供任何指标的聚合。例如,要获取给定服务的指标,您必须查询正在运行该服务实例的所有节点。
计算池必须具有与 DNS 兼容的名称,以便您访问指标。
服务可以使用对计算池具有 OWNERSHIP 或 MONITOR 权限的角色,访问计算池公开的端点。
有关可用计算池指标的列表,请参阅 可用平台指标。
示例
有关配置 Prometheus 以轮询计算池来获取指标的示例,请参阅 计算池指标教程 (https://github.com/Snowflake-Labs/spcs-templates/tree/main/user-metrics)。
可用平台指标¶
以下是可用平台指标组以及每个组内的指标的列表。请注意,当前仅从块存储卷收集 storage
指标。
指标组 . 指标名称 |
单位 |
类型 |
描述 |
---|---|---|---|
system . container.cpu.usage |
CPU 核心数 |
gauges |
自上次测量以来使用的 CPU 内核的平均数。1.0 表示 1 个 CPU 内核的充分利用率。最大值是容器可用的 CPU 内核数。 |
system . container.memory.usage |
bytes |
gauge |
已使用的内存(以字节为单位)。 |
system . container.gpu.memory.usage |
bytes |
gauge |
已使用的每 GPU 内存(以字节为单位)。源 GPU 在“gpu”属性中表示。 |
system . container.gpu.utilization |
比率 |
gauge |
每个 GPU 使用率与容量的比率。源 GPU 在“gpu”属性中表示。 |
system_limits . container.cpu.limit |
CPU 核心数 |
gauge |
服务规范中的 CPU 资源限制。如果没有定义限制,则默认为节点容量。 |
system_limits . container.gpu.limit |
GPU 数 |
gauge |
服务规范中的 GPU 计数限制。如果没有定义限制,则不会发出该指标。 |
system_limits . container.memory.limit |
bytes |
gauge |
服务规范的内存限制。如果没有定义限制,则默认为节点容量。 |
system_limits . container.cpu.requested |
CPU 核心数 |
gauge |
服务规范中的 CPU 资源请求。如果没有定义限制,则默认为 Snowflake 选择的值。 |
system_limits . container.gpu.requested |
GPU 数 |
gauge |
服务规范中的 GPU 计数。如果没有定义限制,则不会发出该指标。 |
system_limits . container.memory.requested |
bytes |
gauge |
服务规范中的内存请求。如果没有定义限制,则默认为 Snowflake 选择的值。 |
system_limits . container.gpu.memory.capacity |
bytes |
gauge |
每 GPU 内存容量。源 GPU 在“gpu”属性中表示。 |
status . container.restarts |
重启次数 |
gauge |
Snowflake 重新启动容器的次数。 |
status . container.state.finished |
布尔 |
gauge |
当容器处于“完成”状态时,该指标将以值 1 发出。 |
status . container.state.last.finished.reason |
布尔 |
gauge |
如果容器之前已经重启过,该指标将以值 1 发出。“原因”标签描述了容器上次完成的原因。 |
status . container.state.last.finished.exitcode |
整数 |
gauge |
如果容器之前已经重启过,则该指标将包含上次运行的退出代码。 |
status . container.state.pending |
布尔 |
gauge |
当容器处于“待处理”状态时,该指标将以值 1 发出。 |
status . container.state.pending.reason |
布尔 |
gauge |
当容器处于“待处理”状态时,该指标将以值 1 发出。“原因”标签描述了容器最近处于待处理状态的原因。 |
status . container.state.running |
布尔 |
gauge |
当容器处于“正在运行”状态时,该指标的值为 1。 |
status . container.state.started |
布尔 |
gauge |
当容器处于“已启动”状态时,该指标的值为 1。 |
network . network.egress.denied.packets |
数据包数 |
gauge |
由于策略验证失败,网络出口拒绝的数据包总数。 |
network . network.egress.received.bytes |
bytes |
gauge |
网络出口从远程目的地接收的总字节数。 |
network . network.egress.received.packets |
数据包数 |
gauge |
网络出口从远程目的地接收的数据包总数。 |
network . network.egress.transmitted.bytes |
字节 |
gauge |
网络出口传输到远程目的地的总字节数。 |
network . network.egress.transmitted.packets |
数据包数 |
gauge |
网络出口传输到远程目的地的数据包总数。 |
storage . volume.capacity |
bytes |
gauge |
文件系统的大小。 |
storage . volume.io.inflight |
操作数 |
gauge |
活动文件系统 I/O 操作的数量。 |
storage . volume.read.throughput |
字节/秒 |
gauge |
文件系统读取吞吐量(以每秒字节数为单位)。 |
storage . volume.read.iops |
操作数/秒 |
gauge |
文件系统的每秒读取操作数。 |
storage . volume.usage |
bytes |
gauge |
文件系统中使用的总字节数。 |
storage . volume.write.throughput |
字节/秒 |
gauge |
文件系统的写入吞吐量(以每秒字节数为单位)。 |
storage . volume.write.iops |
操作数/秒 |
gauge |
文件系统的每秒写入操作数。 |