dot Redis 8 来了——而且是开源的

了解更多

如何使用适用于 Grafana 插件的新 Redis 数据源

本月早些时候,Redis 发布了新的 适用于 Grafana 插件的 Redis 数据源,它将广泛使用的开源应用程序监控工具连接到 Redis。为了让您了解它的工作原理,让我们看一个自引用的例子:使用该插件查看它随时间被下载了多少次。(Grafana 插件存储库本身不提供开箱即用的此类统计信息。)

想要了解更多?请阅读适用于 Grafana 的 Redis 数据源插件介绍

什么是适用于 Grafana 的 Redis 数据源?

如果您不熟悉 Grafana,它是一个非常流行的工具,用于构建仪表板来监控应用程序、基础设施和软件组件。 适用于 Grafana 的 Redis 数据源是一个插件,允许用户连接到 Redis 数据库并在 Grafana 中构建仪表板,以便轻松监控 Redis 数据。 它提供了一个开箱即用的预定义仪表板,但也允许您构建针对您的特定需求定制的仪表板。

适用于 Grafana 插件的 Redis 数据源的每小时下载量。

可以使用 grafana-cli、Docker 安装适用于 Grafana 插件的 Redis 数据源,或在 Grafana Cloud 中使用。 另外,可以按照 GitHub 上的说明从头开始构建该插件。

grafana-cli plugins install redis-datasource

先决条件

此演示使用

如何检索 Grafana 插件信息

可以使用 JSON 格式的 API 检索 Grafana 存储库中任何已注册插件的信息

GET https://grafana.org.cn/api/plugins/redis-datasource/versions/latest
{
  "id": 2613,
  "pluginId": 639,
  "pluginSlug": "redis-datasource",
  "version": "1.1.2",
  "url": "https://github.com/RedisTimeSeries/grafana-redis-datasource/",
...
  "downloads": 1153,
  "verified": false,
  "status": "active",
  "packages": {
    "any": {
      "md5": "ea0a2c9cb11c9fad66703ba4291e61cb",
      "packageName": "any",
      "downloadUrl": "/api/plugins/undefined/versions/1.1.2/download"
    }
  },

对于这个例子,我想知道适用于 Grafana 插件的 Redis 数据源每天被下载了多少次,并寻找我们在推特上发布或在 Redis 博客上发布后出现的峰值。 我决定使用 RedisTimeSeries(一个将时间序列数据结构添加到 Redis 的 Redis 模块)来跟踪每小时的下载次数。

为了填充数据,我使用了带有自动时间戳和标签 `plugin` 和 `version` 的 TS.ADD 命令。 X 是下载次数,最新版本 `1.1.2` 从 API 检索。 标签将在以后用于查询时间序列。

127.0.0.1:6379> ts.add redis-datasource * X LABELS plugin redis-datasource version 1.1.2

我使用 ioredisAxios 库编写了一个 简单脚本来调用 API 并使用插件信息来添加时间序列样本

/**
 * A robust, performance-focused and full-featured Redis client for Node.js.
 *
 * @see https://github.com/luin/ioredis
 */
const Redis = require("ioredis");

/**
 * Promise based HTTP client for the browser and node.js
 *
 * @see https://github.com/axios/axios
 */
const axios = require("axios");

/**
 * You can also specify connection options as a redis:// URL or rediss:// URL when using TLS encryption
 */
const redis = new Redis("redis://localhost:6379");

/**
 * Main
 *
 * @async
 * @param {string} plugin Plugin name
 */
async function main(plugin) {
  /**
   * Get Plugin's data
   *
   * @see https://grafana.org.cn/api/plugins/redis-datasource/versions/latest
   */
  const response = await axios.get(
    `https://grafana.org.cn/api/plugins/${plugin}/versions/latest`
  );

  /**
   * Response
   */
  const data = response.data;
  if (!data) {
    console.log("Where is the data?");
    return;
  }

  /**
   * Add Time-series sample with plugin and version labels
   */
  await redis.send_command(
    "TS.ADD",
    data.pluginSlug,
    "*",
    data.downloads,
    "LABELS",
    "plugin",
    data.pluginSlug,
    "version",
    data.version
  );

  /**
   * Close Redis connection
   */
  await redis.quit();
}

/**
 * Start
 */
main("redis-datasource");

我的脚本环境

我使用了一个 package.json 文件来安装依赖项,并使用 `npm` 运行命令,如下所示

{
  "author": "Mikhail Volkov",
  "dependencies": {
    "axios": "^0.19.2",
    "ioredis": "^4.17.3"
  },
  "description": "Get statistics for Grafana Plugin",
  "devDependencies": {
    "@types/node": "^14.0.27"
  },
  "license": "ISC",
  "name": "grafana-plugin-stats",
  "scripts": {
    "redis-cli": "docker exec -it redistimeseries redis-cli",
    "start": "docker-compose up",
    "start:app": "node grafana-plugin-stats.ts"
  },
  "version": "1.0.0"
}

为了编排 Docker 容器,我使用了 docker-compose

  • Redis 服务基于一个 redis/redistimeseries 镜像,该镜像启用了 RedisTimeSeries 模块。
  • Grafana 服务使用最新的 Grafana 版本,其中安装了来自存储库的 Redis 数据源插件。
version: "3.4"

services:
  redis:
    container_name: redistimeseries
    image: redis/redistimeseries:latest
    ports:
      - 6379:6379

  grafana:
    container_name: grafana
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_BASIC_ENABLED=false
      - GF_ENABLE_GZIP=true
      - GF_INSTALL_PLUGINS=redis-datasource

为了每小时运行一次脚本并收集下载数据,我在云中的 Linux 服务器上使用了 crontab

root@grafana:~# crontab -l
5 * * * * node /root/grafana-plugin-stats/stats.ts

测试适用于 Grafana 插件的 Redis 数据源

要运行脚本并收集数据,您需要按照操作系统的说明安装 Node.jsDockerDocker Compose

> docker-compose up -d

Starting grafana         ... done
Starting redistimeseries ... done
...
redistimeseries | 1:M 08 Aug 2020 21:13:20.405 * <timeseries> Redis version found by RedisTimeSeries : 6.0.1 - oss
...
grafana    | installing redis-datasource @ 1.1.2
grafana    | from: https://grafana.org.cn/api/plugins/redis-datasource/versions/1.1.2/download
...
grafana    | t=2020-08-08T21:13:23+0000 lvl=info msg="Registering plugin" logger=plugins name=Redis
grafana    | t=2020-08-08T21:13:23+0000 lvl=info msg="HTTP Server Listen" logger=http.server address=[::]:3000 protocol=http subUrl= socket=

运行脚本后,我们可以使用 TS.MRANGE 命令检查 RedisTimeSeries 数据。 您可以通过使用正向或反向方向的过滤器来查询多个时间序列的范围

127.0.0.1:6379> ts.mrange - + withlabels filter plugin=redis-datasource
1) 1) "diff:redis-datasource"
   2) 1) 1) "value"
         2) "diff"
      2) 1) "type"
         2) "datasource"
      3) 1) "plugin"
         2) "redis-datasource"
      4) 1) "version"
         2) "1.1.2"
   3)   1) 1) (integer) 1597125602559
           2) 0
        2) 1) (integer) 1597129202847
           2) 1
        3) 1) (integer) 1597132802738
           2) 10

带有过滤器 `plugin` 的命令 TS.MRANGE 仅检索 `redis-datasource` 插件的样本。 使用选项 WITHLABELS 返回标签。

如何在 Grafana 中显示 RedisTimeSeries 数据

使用 `http://localhost:3000` 在 Web 浏览器中打开 Grafana,并通过选择“配置”->“数据源”来创建数据源。 适用于 Grafana 的 Redis 数据源支持传输层安全性 (TLS),并且可以使用直接连接连接到任何地方的开源 Redis OSS、Redis Enterprise 和 Redis Enterprise Cloud 数据库。

将 Redis 数据源添加到 Grafana 配置信息。

下一步是创建一个带有图表面板的仪表板来可视化数据。 在查询编辑器中选择“Redis Datasource”和“RedisTimeSeries commands”。 使用带有插件名称过滤器的命令 TS.MRANGE

使用 Redis 数据源可视化数据的图表面板。

最后,我将插件命名为“图例标签”,并将版本设置为“值标签”,这将使显示适用于 Grafana 的 Redis 数据源的后续版本系列更加容易。

检查结果

使用命令 TS.INFO 查看时间序列的信息和统计信息。 到目前为止,我已经收集了 250 小时的下载数据,可以看到分配了多少内存(以字节为单位)来存储时间序列和其他信息。

127.0.0.1:6379> ts.info diff:redis-datasource
 1) totalSamples
 2) (integer) 250
 3) memoryUsage
 4) (integer) 4313
 5) firstTimestamp
 6) (integer) 1597125602559
 7) lastTimestamp
 8) (integer) 1598022003033
 9) retentionTime
10) (integer) 0
11) chunkCount
12) (integer) 1
13) maxSamplesPerChunk
14) (integer) 256
15) labels
16) 1) 1) "value"
       2) "diff"
    2) 1) "type"
       2) "datasource"
    3) 1) "plugin"
       2) "redis-datasource"
    4) 1) "version"
       2) "1.1.2"
17) sourceKey
18) (nil)
19) rules
20) (empty list or set)

在发布时,适用于 Grafana 插件的 Redis 数据源已被下载超过 3500 次! 我们收到了来自社区的宝贵反馈,并将继续开发数据源的新功能。

有关更多信息,请查看该项目的 GitHub 存储库,如果您在问题中遇到任何问题,请告诉我们。

结论

我希望这篇文章,以及我使用适用于 Grafana 的 Redis 数据源来跟踪插件随时间推移的下载量的示例,已经证明了这种新工具的强大功能和易用性,并激发您使用 RedisTimeSeries 监控您的应用程序数据(事务、流、队列等)。 请继续关注更多关于如何以及为何使用适用于 Grafana 插件的 Redis 数据源的帖子。