Grafana向けRedisデータソースプラグインの使い方を実例で解説
今月初め、RedisはGrafana向けの新しい「Redis Data Source」プラグインをリリースしました。このプラグインにより、広く使われているオープンソースの監視ツールGrafanaとRedisを簡単に接続できるようになります。本記事では、その仕組みを理解するために、少しメタな実例として「このプラグイン自体がどれだけダウンロードされたかを時系列で追跡する」方法を紹介します。実は、Grafanaのプラグインリポジトリにはこうした統計情報が標準では提供されていないのです。
さらに詳しく知りたい方は、「Introducing the Redis Data Source Plug-in for Grafana」(Redis Data Sourceプラグイン紹介記事)もあわせてご覧ください。
Grafana向けRedisデータソースとは?
Grafanaをご存じない方のために簡単に説明すると、Grafanaはアプリケーション、インフラ、ソフトウェアコンポーネントを監視するためのダッシュボードを作成できる、非常に人気の高いツールです。「Redis Data Source for Grafana」は、ユーザーがRedisデータベースに接続し、Grafana上でRedisデータを簡単に監視できるダッシュボードを構築できるようにするプラグインです。
このプラグインには、すぐに使える事前定義済みダッシュボードが付属していますが、自分のニーズに合わせてカスタマイズしたダッシュボードを作成することも可能です。
プラグインのインストールは、grafana-cli、Docker、またはGrafana Cloud経由で行えます。また、GitHub上の手順に従ってソースからビルドすることもできます。
grafana-cli plugins install redis-datasource
前提条件
このデモでは以下を使用します。
- Node.js 10.x(npm:Nodeパッケージマネージャー付き)
- Docker
- Docker Compose
- RedisTimeSeriesモジュール有効化済みのRedis 5.0.x以降(本デモではRedis公式Dockerコンテナを使用)
- Redis Data Sourceプラグイン導入済みのGrafana 7.0以降(本デモではGrafana公式Dockerコンテナを使用)
Grafanaプラグイン情報の取得方法
Grafanaリポジトリに登録されている任意のプラグインに関する情報は、APIを使ってJSON形式で取得できます。
GET https://grafana.com/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"
}
},
今回の例では、「Redis Data Source for Grafana」プラグインが1日に何回ダウンロードされたかを把握し、TwitterでのツイートやRedisブログでの投稿後にスパイク(急増)が発生していないかを確認したいと考えました。そこで、RedisTimeSeries(Redisに時系列データ構造を追加するRedisモジュール)を使って、毎時のダウンロード数を記録することにしました。
データ投入には、自動タイムスタンプとpluginおよびversionというラベルを付けたTS.ADDコマンドを使用します。Xはダウンロード数、バージョンはAPIから取得した最新版「1.1.2」です。これらのラベルは後の時系列クエリで使用します。
127.0.0.1:6379> ts.add redis-datasource * X LABELS plugin redis-datasource version 1.1.2
次に、ioredisとAxiosライブラリを使ったシンプルなスクリプトを作成し、APIを呼び出して取得したプラグイン情報をもとに時系列サンプルを追加します。
/**
* Node.js向けの堅牢かつ高パフォーマンスなフル機能Redisクライアント。
*
* @see https://github.com/luin/ioredis
*/
const Redis = require("ioredis");
/**
* ブラウザおよびnode.js向けのPromiseベースHTTPクライアント。
*
* @see https://github.com/axios/axios
*/
const axios = require("axios");
/**
* 接続オプションはredis:// URL形式でも指定可能。
* TLS暗号化を使用する場合はrediss:// URLを利用。
*/
const redis = new Redis("redis://localhost:6379");
/**
* メイン処理
*
* @async
* @param {string} plugin プラグイン名
*/
async function main(plugin) {
/**
* プラグインデータの取得
*
* @see https://grafana.com/api/plugins/redis-datasource/versions/latest
*/
const response = await axios.get(
`https://grafana.com/api/plugins/${plugin}/versions/latest`
);
/**
* レスポンス
*/
const data = response.data;
if (!data) {
console.log("Where is the data?");
return;
}
/**
* pluginおよびversionラベル付きで時系列サンプルを追加
*/
await redis.send_command(
"TS.ADD",
data.pluginSlug,
"*",
data.downloads,
"LABELS",
"plugin",
data.pluginSlug,
"version",
data.version
);
/**
* Redis接続を閉じる
*/
await redis.quit();
}
/**
* 実行開始
*/
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サービス: RedisTimeSeriesモジュールが有効になっているredis/redistimeseriesイメージをベースにしています。
- Grafanaサービス: 最新版のGrafanaを使用し、リポジトリからRedis Data Sourceプラグインをインストールしています。
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
1時間ごとにスクリプトを実行してダウンロードデータを収集するため、クラウド上のLinuxサーバーでcrontabを設定しました。
root@grafana:~# crontab -l
5 * * * * node /root/grafana-plugin-stats/stats.ts
Redis Data Source for Grafanaプラグインのテスト
スクリプトを実行してデータを収集するには、お使いのOSの手順に従ってNode.js、Docker、Docker 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.com/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データを表示する方法
Webブラウザでhttps://localhost:3000を開き、「Configuration → Data Sources」からデータソースを作成します。Redis Data Source for GrafanaはTLS(トランスポート層セキュリティ)に対応しており、直接接続によって、オープンソースのRedis OSS、Redis Enterprise、Redis Enterprise Cloudなど、あらゆる種類のRedisデータベースに接続できます。
次に、グラフパネルを含むダッシュボードを作成してデータを可視化します。クエリエディタで「Redis Datasource」と「RedisTimeSeries commands」を選択し、プラグイン名フィルターを付けたTS.MRANGEコマンドを使用します。
最後に、凡例ラベル(Legend Labels)にプラグイン名を、値ラベル(Value Label)にバージョンを設定しました。これにより、今後リリースされる新しいバージョンのRedis Data Source for Grafanaについても、系列を見分けやすく表示できます。
結果の確認
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)
公開時点で、Redis Data Source for Grafanaプラグインのダウンロード数は3,500回を突破しました!コミュニティから貴重なフィードバックをいただいており、このデータソースの新機能開発も継続的に進めています。
詳細についてはプロジェクトのGitHubリポジトリをご覧ください。質問がある場合は、Issuesでお気軽にお知らせください。
まとめ
本記事と、Redis Data Source for Grafanaを使ってプラグインのダウンロード数を時系列で追跡した実例を通じて、この新しいツールのパワーと手軽さをお伝えできたなら幸いです。ぜひ皆さんも、RedisTimeSeriesを活用してアプリケーションデータ(トランザクション、ストリーム、キューなど)の監視に挑戦してみてください。Redis Data Source for Grafanaプラグインの使い方や活用理由に関する今後の記事にもご期待ください。
-
Grafana用Redisデータソースで構築した実用的なアプリケーション3選
【2021年3月29日更新】https://coronavirusapi.com/ は最近、無料でのデータアクセスを終了し、登録済みの一次対応者のみが利用できる仕様に変更されました。残念ながら、これにより新型コロナウイルス感染症の症例可視化プロジェクトのデモは動作しなくなりましたが、RedisTimeSeriesデータをGrafanaのWorldmapパネルに表示したい場合には、本記事で紹介するヒントは他の多くの実装にも引き続き役立つでしょう。 以前の記事では、新しく登場したGrafana用Redisデータソースの概要と基本的な使い方を解説しました。 Grafana用Redisデータソース
-
Grafana用Redisデータソースプラグイン徹底解説:導入から監視ダッシュボード構築まで
Grafanaは、広く知られ多くの現場で活用されているオープンソースのアプリケーション監視ツールです。そして現在、新しい「Grafana用Redisデータソース」プラグインの登場により、GrafanaでRedisを直接扱えるようになりました。 この新機能により、DevOpsエンジニアやデータベース管理者は、すでに使い慣れたツールをそのまま活用して、Redisデータベースやアプリケーションデータを監視するダッシュボードを簡単に作成できます。新しいGrafana用Redisデータソースプラグインでは、RedisTimeSeriesのデータや、Strings(文字列)、Hashes(ハッシュ)、S