Grafana 的 Snowflake 数据源
Snowflake 数据源插件允许您在 Grafana 中查询和可视化 Snowflake 数据指标。
要求
此插件具有以下要求
- 具有适当角色授予的Snowflake 用户。
- 此数据源不需要特定角色。
- Snowflake 用户的角色允许该用户访问表。为了查询您的数据,请确保您的用户具有适当的角色。
- 以下帐户类型之一
- 任何免费或付费的Grafana Cloud 计划或已激活的本地 Grafana 企业版许可证。签约云客户应参考其协议。
安装 Snowflake 数据源插件
要安装数据源,请参阅安装
配置 Snowflake
配置 Snowflake 数据源需要具有用户名和密码的 Snowflake 用户。
Grafana 建议为此数据源创建一个具有有限权限的新用户。
创建用户
为了连接到 Snowflake,您必须创建一个用户或使用现有用户进行身份验证。此用户将运行从 Grafana 发送的所有查询。
如果您希望不同的用户运行不同的查询/工作负载,则应创建多个具有不同设置的 Snowflake 数据源。
要在 Snowflake 中创建用户,您必须登录到您的 Snowflake 实例并运行CREATE USER 命令。
授予角色
现在 Snowflake 用户已创建,必须使用GRANT ROLE 命令向用户授予角色。向用户授予角色允许用户执行该角色允许的操作。
此角色定义了用户可以访问哪些仓库和表。
在 Grafana 中配置数据源
这些连接设置与通过 SnowSQL 连接时使用的设置相同
通过填写以下字段添加数据源
字段 | 描述 |
---|---|
名称 | 此特定 Snowflake 数据源的名称 |
帐户 | 帐户是 Snowflake 分配的 Snowflake 帐户的名称。在帐户配置后从 Snowflake 收到的 URL 中,帐户名称是 snowflakecomputing.com 左侧的整个字符串。如果 Snowflake 实例不在 us-west-2 上,则帐户名称中必须包含区域。例如:xyz123.us-east-1 如果 Snowflake 实例不在 Amazon Web Services 上,则帐户名称中还必须包含平台。例如:xyz123.us-east-1.gcp |
区域 | 已弃用,请使用帐户。区域指定 Snowflake 实例所在的区域 |
用户名 | 将查询 Snowflake 的帐户的用户名 |
身份验证类型 | 身份验证类型。您可以使用密码身份验证或密钥对身份验证 |
密码 | 将查询 Snowflake 的帐户的密码 |
私钥 | 如果您希望使用基于密钥对的身份验证,请在此字段中输入您的未加密私钥。 |
角色 | 此选项允许用户使用不属于用户默认角色的角色连接到 Snowflake 实例。为了能够使用该角色,仍然必须使用GRANT ROLE 命令将其授予用户。 |
仓库 | 查询时默认使用的仓库 |
数据库 | 查询时默认使用的数据库 |
模式 | 查询时默认使用的模式 |
时间间隔 | 可选。$__interval 和 $__interval_ms 宏的下限。如果留空,则默认使用 10s |
默认查询 | 可选。在面板中添加新的 Snowflake 查询时使用的默认查询 |
默认变量查询 | 可选。在仪表盘变量中添加新的 Snowflake 查询时使用的默认查询 |
密钥对身份验证
为了增强安全性,密钥对身份验证可以作为基本身份验证的替代方案。您可以按照引用的 Snowflake 文档 生成公钥和私钥。使用密钥对身份验证时,务必更新 Snowflake 中的 rsa_public_key
,并在数据源配置中提供用户名和未加密的私钥。
OAuth 身份验证
您可以使用 OAuth 身份验证代表登录 Grafana 的用户将令牌传递给 Snowflake。下面提供了一些关于使用 Azure AD 作为 OAuth 提供程序的说明。
使用 Azure AD 设置 OAuth
按照 此处 的说明更新您在步骤 1 中创建的应用程序,并为 Snowflake 添加客户端应用程序。
更新您在步骤 1 中在 grafana.ini 文件中创建的作用域。添加您在步骤 2 中创建的 api。作用域应如下所示
scopes = api://8c1a0b1c-6bb0-4190-a730-8a1c34237619/session:role-any openid email profile offline_access
- 重新启动 Grafana 并使用 Azure AD 登录。使用身份验证类型:OAuth 创建一个 Snowflake 数据源,并切换转发 OAuth 身份。保存并测试以确认令牌正在传递并且有效。
如果我收到无效令牌错误怎么办?步骤 2 说明提供了验证令牌的方法,这些方法将提供有关令牌无效原因的更多信息。
select system$verify_external_oauth_token('<ACCESS_TOKEN>');
其他链接
Azure OAuth。按照“代表用户”流程:https://docs.snowflake.com/en/user-guide/oauth-azure 使用 Postman 测试:https://community.snowflake.com/s/article/How-To-Configure-Postman-for-testing-SQL-API-with-OAuth 设置 Snowflake 安全集成:https://community.snowflake.com/s/article/Create-Security-Integration-User-To-Use-With-OAuth-Client-Token-With-Azure-AD
使用配置进行数据源配置
可以使用配置文件和 Grafana 的配置系统来配置数据源。您可以在 配置文档页面 上阅读有关其工作原理以及可以为数据源设置的所有设置的更多信息
示例
datasources:
- name: Snowflake
type: grafana-snowflake-datasource
access: proxy
basicAuth: false
editable: true
enabled: true
jsonData:
account: xyz123.east-us-2.azure
username: grafana-user
authType: password
timeInterval: 10s
defaultQuery: SELECT \n\t $__timeGroup(<time_column>, $__interval) as time,\n\t <value_column>\n FROM <metric_table>\n WHERE $__timeFilter(time)
defaultVariableQuery: SELECT DISTINCT <column_name> FROM <metric_table> LIMIT 1000
defaultInterpolation: '' # Refer: https://grafana.org.cn/docs/grafana/latest/variables/advanced-variable-format-options/
secureJsonData:
password: grafana-password
- name: Snowflake Billing Data
type: grafana-snowflake-datasource
access: proxy
basicAuth: false
editable: true
enabled: true
jsonData:
account: xyz123.us-east1.gcp
username: grafana-admin-user
database: snowflake
role: ACCOUNTADMIN
timeInterval: 10s
defaultQuery: SELECT \n\t $__timeGroup(<time_column>, $__interval) as time,\n\t <value_column>\n FROM <metric_table>\n WHERE $__timeFilter(time)
defaultVariableQuery: SELECT DISTINCT <column_name> FROM <metric_table> LIMIT 1000
defaultInterpolation: sqlstring # Refer: https://grafana.org.cn/docs/grafana/latest/variables/advanced-variable-format-options/
secureJsonData:
password: grafana-admin-password
查询数据源
提供的查询编辑器是标准的 SQL 查询编辑器。Grafana 包含一些宏来帮助编写更复杂的时序查询。
宏
宏 | 描述 | 输出示例 |
---|---|---|
$__timeFilter(column) | $__timeFilter 根据面板时间范围过滤 column 。column 必须包含没有时区的字段。 | CONVERT_TIMEZONE('UTC', 'UTC', time) < '2017-07-18T11:15:52Z' AND CONVERT_TIMEZONE('UTC', 'UTC', time) > '2017-07-18T11:15:52Z |
$__timeFilter(column, timezone) | $__timeFilter 根据面板时间范围过滤 column 并从 UTC 转换为 timezone 。column 必须包含没有时区的字段。 | CONVERT_TIMEZONE('UTC', 'America/New_York', time) < '2017-07-18T11:15:52Z' AND CONVERT_TIMEZONE('UTC', 'America/New_York', time) > '2017-07-18T11:15:52Z |
$__timeTzFilter(column) | $__timeTzFilter 根据面板时间范围过滤 column 。column 应包含包含时区的字段。 | CONVERT_TIMEZONE('UTC', time) < '2017-07-18T11:15:52Z' AND CONVERT_TIMEZONE('UTC', time) > '2017-07-18T11:15:52Z |
$__timeTzFilter(column, timezone) | $__timeTzFilter 根据面板时间范围过滤 column 并将当前时区转换为 timezone 。column 应包含包含时区的字段。 | CONVERT_TIMEZONE('America/New_York', time) < '2017-07-18T11:15:52Z' AND CONVERT_TIMEZONE('America/New_York', time) > '2017-07-18T11:15:52Z |
$__timeGroup(column, $__interval) | $__timeGroup 按间隔对时间戳进行分组,以便图表上每个 $__interval 只有一个点 | TIME_SLICE(TO_TIMESTAMP(created_ts), 1, 'HOUR', 'START') |
$__timeGroup(column, $__interval, timezone) | $__timeGroup 按间隔对时间戳进行分组,以便图表上每个 $__interval 只有一个点,并转换为给定的时区 | TIME_SLICE(TO_TIMESTAMP(CONVERT_TIMEZONE('UTC', 'America/Los_Angeles', created_ts)), 1, 'HOUR', 'START') |
示例
表格可视化
Snowflake 中的大多数查询都最好用表格可视化表示。任何查询都将以表格形式显示数据。如果可以查询,则可以将其放入表格中。
此示例返回表格可视化的结果
SELECT {column_1}, {column_2} FROM {table};
时间序列/图表可视化
对于时间序列/图表可视化,有一些要求
- 必须选择一个包含
date
或datetime
类型的列 date
列必须按升序排列(使用ORDER BY column ASC
)- 还必须选择一个数字列
为了制作更合理的图表,请务必使用 $__timeFilter
和 $__timeGroup
宏。
时间序列查询示例
SELECT
avg(execution_time) AS average_execution_time,
$__timeGroup(start_time, $__interval),
query_type
FROM
account_usage.query_history
WHERE
$__timeFilter(start_time)
group by
query_type,start_time
order by
start_time,query_type ASC;
检查查询
由于 Grafana 支持 Snowflake 不支持的宏,因此可以在查询检查器中查看可以直接复制/粘贴到 Snowflake 中的完整渲染查询。要查看完整的插值查询,请单击“查询检查器”按钮,完整查询将显示在“查询”选项卡下。如果需要进一步调试,请查看 Snowsight 中的“查询历史记录”页面。在此处了解更多信息:https://docs.snowflake.com/en/user-guide/ui-snowsight-activity
模板和变量
要添加新的 Snowflake 查询变量,请参阅 添加查询变量。将您的 Snowflake 数据源用作以下可用查询的数据源
从 Snowflake 表中查询的任何值都可以用作变量。请务必避免选择太多值,因为这可能会导致性能问题。
如果变量查询返回两列,则第二列中的值将用作显示值
使用变量
创建变量后,您可以使用 变量语法 在 Snowflake 查询中使用它。有关变量的更多信息,请参阅 模板和变量。
在查询中使用变量时,可以选择设置 插值格式。您还可以在数据源配置中配置默认插值格式。
单值变量
如果变量返回单个值,则可以使用以下格式之一。以下示例假设您已将 sqlstring
设置为默认插值,并且您有两个名为 queryTypeSingle
和 limit
的变量。它们的值分别为 SELECT
和 2
。
SELECT query_type FROM account_usage.query_history WHERE query_type = ${queryTypeSingle} Limit ${limit:raw}
将转换为
SELECT query_type FROM account_usage.query_history WHERE query_type = 'SELECT' Limit 10
在 1.2 版中引入了设置默认变量插值类型。从该版本开始,您可以将默认插值类型设置为
sqlstring
在插件的 1.2 版本之前或如果使用 none
作为默认插值类型,则必须将相同的查询编写如下
SELECT query_type FROM account_usage.query_history WHERE query_type = '${queryTypeSingle}' Limit ${limit:raw}
使用 sqlstring 插值的多分量变量
使用返回多个选项的变量时,您可以使用以下方法使用它。以下示例假设您已将 sqlstring
设置为默认插值,并且您有两个名为 queryTypeMulti
和 limit
的变量。它们的值分别为 CREATE,SELECT
和 2
。
SELECT query_type FROM account_usage.query_history WHERE query_type in (${queryTypeMulti}) Limit ${limit:raw}
将转换为
SELECT query_type FROM account_usage.query_history WHERE query_type in ('CREATE','SELECT') Limit 10
使用正则表达式的多分量变量
要使用具有多个值的变量,您可以使用 正则表达式修饰符选项 和 regexp
Snowflake 函数。例如 ${variable:regex}
例如,此查询将仅使用 queryType
变量中选择的“查询类型”进行过滤
...
AND query_type regexp '${queryType:regex}'
...
此查询转换为
...
AND query_type regexp '(DESCRIBE|CREATE_USER|DROP|TRUNCATE_TABLE|ALTER)'
...
将数据可视化为日志
在查询中选择日志格式后,您可以在资源管理器中的日志查看器中可视化数据。使用日志格式查询时,您的查询应至少包含一列时间列和一列字符串/内容列。可选地,查询可以有第三列称为级别来设置特定行的日志级别。支持的日志级别及其关键字可以在 grafana 日志集成文档站点 中找到。如果查询返回任何其他列,它们将被视为日志中的其他字段/检测到的字段。
例如,以下是有效的日志查询。
SELECT 'hello foo' as "content", (timestamp '2021-12-31') as "start_time", 'warn' as "level" UNION
SELECT 'hello bar' as "content", (timestamp '2021-12-30 14:12:59') as "start_time", 'error' as "level" UNION
SELECT 'hello baz' as "content", (timestamp '2021-12-30') as "start_time", 'warn' as "level" UNION
SELECT 'hello qux' as "content", (timestamp '2021-12-29') as "start_time", 'info' as "level" UNION
SELECT 'hello world' as "content", (timestamp '2021-12-28') as "start_time", 'unknown' as "level" UNION
SELECT 'hello user' as "content", (timestamp '2021-12-27') as "start_time", 'info' as "level"
导入 Snowflake 仪表盘
捆绑的 Snowflake 仪表盘需要具有 ACCOUNTADMIN
角色的数据源才能查看计费数据。配置部分中有一个示例。
按照这些 说明 导入仪表盘。
导入的仪表盘可以在“配置”>“数据源”>选择您的 Snowflake 数据源>选择“仪表盘”选项卡中找到,以查看可用的预制仪表盘。