Computer >> 컴퓨터 >  >> 프로그래밍 >> Redis

Grafana용 Redis 데이터 소스 플러그인 사용법: 다운로드 통계 추적 실전 가이드

지난 달 초, Redis는 널리 사용되는 오픈소스 애플리케이션 모니터링 도구인 Grafana를 Redis 데이터베이스와 연결해 주는 새로운 'Redis Data Source for Grafana' 플러그인을 출시했습니다. 이 플러그인이 실제로 어떻게 작동하는지 쉽게 이해할 수 있도록, 재미있는 자기 참조형 예제를 하나 준비했습니다. 바로 이 플러그인을 활용해 자신의 누적 다운로드 수가 시간에 따라 어떻게 변하는지 추적하는 것입니다. 참고로 Grafana 플러그인 저장소 자체는 이런 통계를 기본적으로 제공하지 않기 때문에, 직접 데이터를 수집해야 합니다.

더 알아보기: Grafana를 위한 Redis Data Source 플러그인 소개 읽어보기

Grafana용 Redis 데이터 소스란?

Grafana를 처음 접하시는 분들을 위해 간단히 소개하자면, Grafana는 애플리케이션, 인프라, 소프트웨어 구성 요소를 모니터링하기 위한 대시보드를 구축하는 데 가장 널리 쓰이는 도구 중 하나입니다. Grafana용 Redis 데이터 소스는 사용자가 Redis 데이터베이스에 연결하고, Grafana 안에서 대시보드를 만들어 Redis 데이터를 손쉽게 모니터링할 수 있도록 해주는 플러그인입니다.

이 플러그인은 바로 사용할 수 있는 사전 정의된 대시보드를 제공할 뿐만 아니라, 사용자의 특정 요구 사항에 맞춘 커스텀 대시보드를 자유롭게 구성할 수도 있습니다.

Grafana용 Redis 데이터 소스 플러그인 사용법: 다운로드 통계 추적 실전 가이드

Grafana용 Redis 데이터 소스 플러그인은 grafana-cli, Docker를 통해 설치하거나 Grafana Cloud에서 바로 사용할 수 있습니다. 또는 GitHub의 안내 문서를 참고해 소스 코드에서 직접 빌드하는 것도 가능합니다.

grafana-cli plugins install redis-datasource

사전 준비 사항

이번 데모에서는 다음과 같은 환경을 사용합니다:

  • Node.js 10.x 및 Node 패키지 관리자(npm)
  • Docker
  • Docker Compose
  • RedisTimeSeries 모듈이 포함된 Redis 5.0.x 이상 (이 데모는 Redis Docker 컨테이너 사용)
  • Redis 데이터 소스가 설치된 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",

이 예제의 목표는 Grafana용 Redis 데이터 소스 플러그인이 하루에 몇 번 다운로드되었는지 확인하고, 트위터나 Redis 블로그에 게시물을 올린 이후에 다운로드 수가 급증하는지 살펴보는 것이었습니다. 이를 위해 매시간 다운로드 수를 추적할 수 있도록 RedisTimeSeries(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

API를 호출하고 플러그인 정보를 시계열 샘플로 추가하는 간단한 스크립트를 ioredis와 Axios 라이브러리를 사용해 작성했습니다:

/**
 * 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) {
  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;
  }

  /**
   * 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
  );

  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 데이터 소스 플러그인을 자동 설치
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

Redis 데이터 소스 플러그인 테스트하기

스크립트를 실행하고 데이터를 수집하려면, 사용 중인 운영체제에 맞는 공식 설치 지침에 따라 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 데이터 시각화하기

웹 브라우저에서 https://localhost:3000으로 Grafana에 접속한 뒤, Configuration → Data Sources 메뉴에서 데이터 소스를 생성합니다. Grafana용 Redis 데이터 소스는 TLS(전송 계층 보안)를 지원하며, 직접 연결 방식으로 Redis OSS, Redis Enterprise, Redis Enterprise Cloud 등 어디에 있든 데이터베이스에 연결할 수 있습니다.

Grafana용 Redis 데이터 소스 플러그인 사용법: 다운로드 통계 추적 실전 가이드

다음 단계는 그래프 패널이 포함된 대시보드를 만들어 데이터를 시각화하는 것입니다. 쿼리 편집기에서 “Redis Datasource”“RedisTimeSeries 명령”을 선택하고, 플러그인 이름 필터와 함께 TS.MRANGE 명령을 사용합니다.

Grafana용 Redis 데이터 소스 플러그인 사용법: 다운로드 통계 추적 실전 가이드

마지막으로 플러그인 이름을 Legend Labels로, 버전을 Value Label로 지정했습니다. 이렇게 설정해 두면 이후 버전의 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 데이터 소스 플러그인은 3,500회 이상 다운로드되었습니다! 커뮤니티에서 많은 소중한 피드백을 받았으며, 앞으로도 데이터 소스에 새로운 기능을 추가하는 개발을 계속 진행할 예정입니다.

더 자세한 내용은 프로젝트의 GitHub 저장소를 확인하시고, 궁금한 점이 있다면 Issues 탭을 통해 의견을 남겨주세요.

마무리

이 글에서 소개한 'Grafana용 Redis 데이터 소스로 플러그인 다운로드 수를 시간별로 추적하는 예제'가 이 새로운 도구의 강력함과 뛰어난 사용성을 잘 보여주었기를 바랍니다. 여러분도 RedisTimeSeries를 활용해 애플리케이션 데이터(트랜잭션, 스트림, 큐 등)를 손쉽게 모니터링해 보세요. 앞으로 Grafana용 Redis 데이터 소스 플러그인을 어떻게, 왜 활용해야 하는지에 대한 유용한 포스팅을 계속 이어갈 예정이니 많은 기대 부탁드립니다.