菜单
文档面包屑箭头 插件面包屑箭头 面包屑箭头 Grafana 的 Snowflake 数据源

Grafana 的 Snowflake 数据源

Snowflake 数据源插件允许您在 Grafana 中查询和可视化 Snowflake 数据指标。

要求

此插件具有以下要求

安装 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 提供程序的说明。

  1. 使用 Azure AD 设置 OAuth

  2. 按照 此处 的说明更新您在步骤 1 中创建的应用程序,并为 Snowflake 添加客户端应用程序。

  3. 更新您在步骤 1 中在 grafana.ini 文件中创建的作用域。添加您在步骤 2 中创建的 api。作用域应如下所示

scopes = api://8c1a0b1c-6bb0-4190-a730-8a1c34237619/session:role-any openid email profile offline_access
  1. 重新启动 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 的配置系统来配置数据源。您可以在 配置文档页面 上阅读有关其工作原理以及可以为数据源设置的所有设置的更多信息

示例

yaml
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 根据面板时间范围过滤 columncolumn 必须包含没有时区的字段。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 转换为 timezonecolumn 必须包含没有时区的字段。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 根据面板时间范围过滤 columncolumn 应包含包含时区的字段。CONVERT_TIMEZONE('UTC', time) < '2017-07-18T11:15:52Z' AND CONVERT_TIMEZONE('UTC', time) > '2017-07-18T11:15:52Z
$__timeTzFilter(column, timezone)$__timeTzFilter 根据面板时间范围过滤 column 并将当前时区转换为 timezonecolumn 应包含包含时区的字段。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 中的大多数查询都最好用表格可视化表示。任何查询都将以表格形式显示数据。如果可以查询,则可以将其放入表格中。

此示例返回表格可视化的结果

sql
SELECT {column_1}, {column_2} FROM {table};

时间序列/图表可视化

对于时间序列/图表可视化,有一些要求

  • 必须选择一个包含 datedatetime 类型的列
  • date 列必须按升序排列(使用 ORDER BY column ASC
  • 还必须选择一个数字列

为了制作更合理的图表,请务必使用 $__timeFilter$__timeGroup 宏。

时间序列查询示例

sql
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 设置为默认插值,并且您有两个名为 queryTypeSinglelimit 的变量。它们的值分别为 SELECT2

sql
SELECT query_type FROM account_usage.query_history WHERE query_type = ${queryTypeSingle} Limit ${limit:raw}

将转换为

sql
SELECT query_type FROM account_usage.query_history WHERE query_type = 'SELECT' Limit 10

在 1.2 版中引入了设置默认变量插值类型。从该版本开始,您可以将默认插值类型设置为 sqlstring

在插件的 1.2 版本之前或如果使用 none 作为默认插值类型,则必须将相同的查询编写如下

sql
SELECT query_type FROM account_usage.query_history WHERE query_type = '${queryTypeSingle}' Limit ${limit:raw}

使用 sqlstring 插值的多分量变量

使用返回多个选项的变量时,您可以使用以下方法使用它。以下示例假设您已将 sqlstring 设置为默认插值,并且您有两个名为 queryTypeMultilimit 的变量。它们的值分别为 CREATE,SELECT2

sql
SELECT query_type FROM account_usage.query_history WHERE query_type in (${queryTypeMulti}) Limit ${limit:raw}

将转换为

sql
SELECT query_type FROM account_usage.query_history WHERE query_type in ('CREATE','SELECT') Limit 10

使用正则表达式的多分量变量

要使用具有多个值的变量,您可以使用 正则表达式修饰符选项regexp Snowflake 函数。例如 ${variable:regex}

例如,此查询将仅使用 queryType 变量中选择的“查询类型”进行过滤

sql
...
  AND query_type regexp '${queryType:regex}'
...

此查询转换为

sql
...
  AND query_type regexp '(DESCRIBE|CREATE_USER|DROP|TRUNCATE_TABLE|ALTER)'
...

将数据可视化为日志

在查询中选择日志格式后,您可以在资源管理器中的日志查看器中可视化数据。使用日志格式查询时,您的查询应至少包含一列时间列和一列字符串/内容列。可选地,查询可以有第三列称为级别来设置特定行的日志级别。支持的日志级别及其关键字可以在 grafana 日志集成文档站点 中找到。如果查询返回任何其他列,它们将被视为日志中的其他字段/检测到的字段。

例如,以下是有效的日志查询。

sql
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 数据源>选择“仪表盘”选项卡中找到,以查看可用的预制仪表盘。

充分利用插件

阅读更多