SAP HANA - Amazon Managed Grafana

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

SAP HANA

SAP HANA 是一个高性能的内存数据库,可加快数据驱动的实时决策和\ 操作。它由 SAP 开发和销售。SAP HANA 数据源插件可帮助你将 SAP HANA 实例与 Grafana 连接起来。

借助 SAP HANA Grafana Enterprise 插件,你可以在 Grafana 中将你的 SAP HANA 数据与 Grafana 中的所有其他数据源以及上下文中的日志和指标数据一起可视化。该插件包括内置的查询编辑器,支持注释,并允许您设置警报阈值、控制访问权限、设置权限等。

注意

此数据源仅适用于 Grafana Enterprise。有关更多信息,请参阅管理对企业插件的访问权限

此外,在支持版本 9 或更高版本的工作空间中,此数据源可能需要您安装相应的插件。有关更多信息,请参阅Grafana 插件

功能

  • 查询编辑器 — 该插件带有内置的 SQL 查询编辑器,具有语法突出显示功能,允许您可视化时间序列或表数据,并自动完成基本的 Grafana 宏。

  • 数据源权限 — 控制谁可以在 Grafana 中查看或查询 SAP HANA 数据。

  • 注释 — 在任何 Grafana 图表上叠加 SAP HANA 事件或数据,将事件与其他图形数据关联起来。

  • 警报 — 在 SAP HANA 中设置基于警报的指标存储。

  • 查询变量-在 Grafana 中创建基于 SAP HANA 数据的模板变量,并在 SAP HANA 查询中包含变量以使仪表板具有交互性。

添加数据源

  1. 在亚马逊托管 Grafana 工作区中打开 Grafana 控制台,并确保您已登录。

  2. 在 “配置”(齿轮图标)下的侧面菜单中,选择 “数据源”。

  3. 选择添加数据来源

    注意

    如果您在侧面菜单中看不到数据源链接,则表示您当前的用户没有该Admin角色。

  4. 从数据源列表中选择 SAP HANA

  5. 在 Config 编辑器中,输入以下信息:

    • 对于服务器地址,请提供 SAP HANA 实例的地址。示例:xxxxxxx-xxxx-xxxx-xxxx-xxxxxxx.hana.trial-us10.hanacloud.ondemand.com

    • 对于服务器端口,请提供 SAP HANA 实例的端口。

    • 用户名中,输入用于连接 SAP HANA 实例的用户名。

    • 在 “密码” 中,输入该用户的密码。

    • (可选)如果您想跳过 TLS 验证,请启用 “跳过 TLS 验证”。

    • (可选)如果您需要提供客户端证书和密钥,请启用 TLS 客户端身份验证

    • (可选)如果您要启用验证自签名 TLS 证书,请启用 “使用 CA 证书”。

    • (可选)在默认架构中,输入要使用的默认架构。如果省略此项,则需要在每个查询中指定架构。

访问和权限

要将 Grafana 连接到 SAP HANA,请使用专用凭证。仅向用户提供所需的权限。首先,使用用户名和密码创建一个受限用户。以下查询是创建受限用户的示例。此查询还会禁用强制密码更改。

CREATE RESTRICTED USER <USER> PASSWORD <PASSWORD> NO FORCE_FIRST_PASSWORD_CHANGE;

接下来,允许用户通过诸如 Grafana 之类的客户端使用以下内容连接系统:

ALTER USER <USER> ENABLE CLIENT CONNECT;

最后,允许用户访问必要的视图、表格和架构。

ALTER USER <USER> GRANT ROLE PUBLIC; GRANT SELECT ON SCHEMA <SCHEMA> TO <USER>;

用户级别权限

单击数据源配置页面中的 “权限” 选项卡以启用数据源权限,从而限制对 SAP HANA 的访问权限。在权限页面上,管理员可以启用权限并将查询权限限制为特定的用户和团队。

查询编辑器

SAP HANA Grafana 插件附带一个 SQL 查询编辑器,你可以在其中输入任何 HANA 查询。如果您的查询返回时间序列数据,则可以将其格式化为时间序列,以便在图表面板中对其进行可视化。查询编辑器为支持的 Grafana 宏提供自动完成功能,并突出显示您的 SQL 查询的语法。

注释

你可以使用 SAP HANA 查询作为 Grafana 注解的来源。您的注释查询应至少返回一个时间列和一个文本列。有关注释的更多信息,请参阅注释

通过 SAP HANA 创建注释
  1. 选择仪表板设置齿轮图标。

  2. 从左侧菜单中选择 “批注”、“新建”。

  3. 数据源下拉菜单中,选择您的 SAP HANA 数据源实例。

  4. 查询字段中,输入至少返回一个时间字段和一个文本字段的 SAP HANA 查询。

  5. 格式化为下拉菜单中,选择时间序列

  6. 为每个注释配置 “发件人” 字段。

模板和变量

要添加新的 SAP HANA 查询变量,请参阅添加查询变量。使用你的 SAP HANA 数据源作为数据源。

以下示例查询返回usersusername中的不同列表。

select distinct("username") from "users"
注意

确保在变量查询中只选择一列。如果您的查询返回两列,则第一列将用作显示值,第二列将用作变量的实际值。如果您的查询返回的列超过两列,则它们将被拒绝。

模板和变量

你可以在查询中使用任何 Grafana 变量。以下示例说明如何在查询中使用单/多变量。

-- For example, following query select * from "users" where "city" = ${city} -- will be translated into select * from "users" where "city" = 'london' --- where you can see ${city} variable translated into actual value in the variable

与文本类似,变量也适用于数值字段。在下面的示例中,${age}是一个文本框变量,它接受数字,然后与表中的数值字段进行比较。

select * from "users" where "age" > ${age} --- wil be translated into select * from "users" where "age" > '36'

如果您的变量返回多个值,则可以在 SAP HANA 查询的in条件中使用它,如下所示。请注意变量周围的方括号,以使where in条件在 SAP HANA 中有效。

select * from "users" where "city" in (${cities}) --- will be translated into select * from "users" where "city" in ('london','perth','delhi') --- where you can see ${cities} turned into a list of grafana variables selected. --- You can also write the same query using shorthand notation as shown below select * from "users" where "city" in ($cities)

  • $__timeFilter(<time_column>)— 在原始查询中使用时,将 Grafana 的时间范围应用于指定列。适用于日期/时间戳/长时间列。

  • $__timeFilter(<time_column>, <format>)— 同上。但是可以指定存储在数据库中的 time_column 的格式。

  • $__timeFilter(<time_column>, "epoch", <format>)— 与上面相同,但可以在时间列处于纪元时使用。格式可以是 “s”、“ms” 和 “ns” 之一。

  • $__fromTimeFilter(<time_column>)— 与上面相同,但可以在时间列处于纪元时使用。格式可以是 “s”、“ms” 和 “ns” 之一。

  • $__fromTimeFilter(<time_column>, <comparison_predicate>)— 与上面相同,但能够指定比较谓词。

  • $__fromTimeFilter(<time_column>, <format>)— 与上述相同,但可以指定时间列的格式。

  • $__fromTimeFilter(<time_column>, <format>, <comparison_predicate>)— 与上面相同,但能够指定比较谓词。

  • $__toTimeFilter(<time_column>)— 将基于 grafana 的时间条件返回到时间字段中的时间。

  • $__toTimeFilter(<time_column>, <comparison_predicate>)— 与上面相同,但能够指定比较谓词。

  • $__toTimeFilter(<time_column>, <format>)— 与上述相同,但可以指定时间列的格式。

  • $__toTimeFilter(<time_column>, <comparison_predicate>)— 与上面相同,但能够指定比较谓词。

  • $__timeGroup(<time_column>, <interval>)— 将时间列扩展为间隔组。适用于日期/时间戳/长时间列...

$__timeFilter () 宏 <time_column>

以下示例解释了该$__timeFilter(<time_column>)宏:

- In the following example, the query select ts, temperature from weather where $__timeFilter(ts) --- will be translated into select ts, temperature from weather where ts > '2021-02-24T12:52:48Z' AND ts < '2021-03-24T12:52:48Z' --- where you can see the grafana dashboard's time range is applied to the column ts in the query.

$__timeFilter (,) 宏 <time_column><format>

在某些情况下,数据库中的时间列以自定义格式存储。以下示例解释了该$__timeFilter(<time_column>, <format>)宏,它有助于基于 grafana 的时间选择器筛选自定义时间戳:

SELECT TO_TIMESTAMP("TS",'YYYYMMDDHH24MISS') AS METRIC_TIME , "VALUE" FROM "SCH"."TBL" WHERE $__timeFilter("TS","YYYYMMDDHH24MISS") -- TS is in 20210421162012 format SELECT TO_TIMESTAMP("TS",'YYYY-MON-DD') AS METRIC_TIME , "VALUE" FROM "SCH"."TBL" WHERE $__timeFilter("TS","YYYY-MON-DD") -- TS is in 2021-JAN-15 format

在宏中,该格式可以是与您的时间戳列匹配的有效 HANA 格式之一。例如,当您的数据以格式存储时,YYYYMMDDHH24MISS这是一种有效的20210421162012格式。

$__timeFilter (, “epoch”) 宏 <time_column><format>

在某些情况下,时间戳作为纪元时间戳存储在数据库中。以下示例解释了有助于基于 grafana 的时间选择器过滤纪元时间戳的$__timeFilter(<time_column>, "epoch" <format>)宏。在宏中,格式可以是 ms、s 或 ns 之一。如果未指定,则 s 将被视为默认格式。

SELECT ADD_SECONDS('1970-01-01', "TIMESTAMP") AS "METRIC_TIME", "VALUE" FROM "SCH"."TBL" WHERE $__timeFilter("TIMESTAMP","epoch") -- Example : TIMESTAMP field stored in epoch_second format 1257894000 SELECT ADD_SECONDS('1970-01-01', "TIMESTAMP") AS "METRIC_TIME", "VALUE" FROM "SCH"."TBL" WHERE $__timeFilter("TIMESTAMP","epoch","s") -- Example : TIMESTAMP field stored in epoch_second format 1257894000 SELECT ADD_SECONDS('1970-01-01', "TIMESTAMP"/1000) AS "METRIC_TIME", "VALUE" FROM "SCH"."TBL" WHERE $__timeFilter("TIMESTAMP","epoch","ms") -- Example : TIMESTAMP field stored in epoch_ms format 1257894000000 SELECT ADD_SECONDS('1970-01-01', "TIMESTAMP"/1000000000) AS "METRIC_TIME", "VALUE" FROM "SCH"."TBL" WHERE $__timeFilter("TIMESTAMP","epoch","ns") -- Example : TIMESTAMP field stored in epoch_nanoseconds format 1257894000000000000

你可以使用 epoch_s、epoch_ms 或 epoch_ns 中的一个作为第二个参数,而不是使用 $__TimeFilter 的第三个参数。

SELECT ADD_SECONDS('1970-01-01', "TIMESTAMP"/1000) AS "METRIC_TIME", "VALUE" FROM "SCH"."TBL" WHERE $__timeFilter("TIMESTAMP","epoch","ms") -- is same as SELECT ADD_SECONDS('1970-01-01', "TIMESTAMP"/1000) AS "METRIC_TIME", "VALUE" FROM "SCH"."TBL" WHERE $__timeFilter("TIMESTAMP","epoch_ms")

$__ fromTimeFilter () 和 $__ toTimeFilter () 宏

$__fromTimeFilter()宏会根据 Grafana 时间选择器的时间字段扩展为一个条件。

这接受三个参数。第一个参数是时间字段名称。你可以将 comparison_predicate 或时间列的格式作为第二个参数传递。如果你想同时传递这两个参数,那么 format 就是第二个参数,并使用 comparison_predicate 作为第三个参数。

<format>如果未指定格式,插件将假定时间列为时间戳/日期类型。如果您的时间列以除时间戳/日期之外的任何其他格式存储,则将该格式作为第二个参数传递。 <format>可以是 epoch_s、epoch_ms、epoch_ns 或任何其他自定义格式,比如 YYYY-MM-DD。

<comparison_predicate>可选参数。如果未通过,插件将使用 > 作为比较谓词。 <comparison_predicate>可以是 =、! =、<>、<、<=、>、>=

$__toTimeFilter()工作原理与 $__ fromTimeFilter () 相同。它不会从一开始就使用 Grafana,而是会随着时间的推移而使用。此外,默认比较谓词将为 <。

$__TimeGroup (,) <time_column><interval>

例如,在查询中,宏 $__TimeGroup (timecol,1h) 扩展为 SERIES_ROUND(“timecol”,'INTERVAL 1 HOUR')。

以下示例解释了 $__timeGroup(<time_column>, <interval>) macro.

SELECT $__timeGroup(timestamp,1h), "user", sum("value") as "value" FROM "salesdata" WHERE $__timeFilter("timestamp") GROUP BY $__timeGroup(timestamp,1h), "user" ORDER BY $__timeGroup(timestamp,1h) ASC

这被转换为以下查询,其中扩展$__timeGroup(timestamp,1h)SERIES_ROUND("timestamp", 'INTERVAL 1 HOUR')

SELECT SERIES_ROUND("timestamp", 'INTERVAL 1 HOUR') as "timestamp", "user", sum("value") as "value" FROM "salesdata" WHERE "timestamp" > '2020-01-01T00:00:00Z' AND "timestamp" < '2020-01-01T23:00:00Z' GROUP BY SERIES_ROUND("timestamp", 'INTERVAL 1 HOUR'), "user" ORDER BY "timestamp" ASC
注意

在 $__TimeGroup 宏中使用分组依据时,请确保您选择的按字段排序的名称与按字段分组的名称相同。否则,HANA 可能无法识别查询。

如果你不想在 $__timeGroup () 函数中对间隔进行硬编码,那么你可以通过将 $__interval 指定为间隔来将其留给 Grafana。Grafana 将根据仪表板的时间范围计算该间隔。查询示例:

SELECT $__timeGroup(timestamp, $__interval), sum("value") as "value" FROM "salesdata" WHERE $__timeFilter("timestamp") GROUP BY $__timeGroup(timestamp, $__interval) ORDER BY $__timeGroup(timestamp, $__interval) ASC

根据仪表板的时间范围,该查询将转换为以下查询。

SELECT SERIES_ROUND("timestamp", 'INTERVAL 1 MINUTE'), sum("value") as "value" FROM "salesdata" WHERE "timestamp" > '2019-12-31T23:09:14Z' AND "timestamp" < '2020-01-01T23:17:54Z' GROUP BY SERIES_ROUND("timestamp", 'INTERVAL 1 MINUTE') ORDER BY SERIES_ROUND("timestamp", 'INTERVAL 1 MINUTE') ASC

提示

在 Grafana 中设置 SAP HANA 警报
  1. 在控制面板中创建图表面板。

  2. 以时间序列格式创建 SAP HANA 查询。

  3. 选择 “警报” 选项卡并指定警报标准。

  4. 选择 “测试规则” 以测试警报查询。

  5. 指定警报收件人、消息和错误处理。

  6. 保存控制面板。

针对非时间序列数据发出警报

要提醒非时间序列数据,请使用TO_TIMESTAMP('${__to:date}')宏将非时间序列指标转换为时间序列。这会将您的指标转换为单点时间序列查询。查询的格式如下所示

SELECT TO_TIMESTAMP('${__to:date}'), <METRIC> FROM <TABLE≶ WHERE <YOUR CONDITIONS>

在以下示例中,表中有四个字段,分别是用户名、年龄、城市和角色。此表没有任何时间字段。我们希望在具有开发角色的用户数量少于三时发出通知。

SELECT TO_TIMESTAMP('${__to:date}'), count(*) as "count" FROM ( SELECT 'John' AS "username", 32 AS "age", 'Chennai' as "city", 'dev' as "role" FROM dummy UNION ALL SELECT 'Jacob' AS "username", 32 AS "age", 'London' as "city", 'accountant' as "role" FROM dummy UNION ALL SELECT 'Ali' AS "username", 42 AS "age", 'Delhi' as "city", 'admin' as "role" FROM dummy UNION ALL SELECT 'Raja' AS "username", 12 AS "age", 'New York' as "city", 'ceo' as "role" FROM dummy UNION ALL SELECT 'Sara' AS "username", 35 AS "age", 'Cape Town' as "city", 'dev' as "role" FROM dummy UNION ALL SELECT 'Ricky' AS "username", 25 AS "age", 'London' as "city", 'accountant' as "role" FROM dummy UNION ALL SELECT 'Angelina' AS "username", 31 AS "age", 'London' as "city", 'cxo' as "role" FROM dummy ) WHERE "role" = 'dev'