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

Grafana용 Redis 데이터 소스로 구축한 실제 애플리케이션 3가지

2021년 3월 29일 업데이트: 최근 https://coronavirusapi.com/ 이 데이터에 대한 무료 접근을 중단하고, 등록된 응급 대응 요원에게만 제공하도록 변경되었습니다. 아쉽게도 코로나19 확진 현황 시각화 프로젝트 데모는 더 이상 작동하지 않지만, RedisTimeSeries 데이터를 Grafana 월드맵(Worldmap) 패널에 표시해야 하는 다른 많은 구현 사례에는 이 글의 힌트가 여전히 유용하게 활용될 수 있습니다.

앞선 포스트에서는 새롭게 출시된 Grafana용 Redis 데이터 소스(Redis Data Source)를 소개하고 사용 방법을 살펴보았습니다.

  • Grafana용 Redis 데이터 소스 플러그인 소개
  • 새로운 Grafana용 Redis 데이터 소스 플러그인 활용법

이번 글에서는 Redis에 저장할 수 있는 흥미로운 다양한 데이터셋을 Grafana에서 시각화하는 아이디어를 얻으실 수 있도록, 실제 사례 세 가지를 소개합니다.

  1. 날씨 대시보드
  2. 코로나19 확진 현황 시각화
  3. 팝업 스토어 데모

1. 날씨 대시보드

세상에 정말 또 하나의 날씨 대시보드가 필요할까요? 네, 저는 그렇게 생각합니다!

솔직히 말하면 저는 평소 날씨에 크게 집착하는 편이 아닙니다. 날씨가 어떤지 자주 신경 쓰지도 않습니다. 설령 관심이 있더라도 가장 좋은 '날씨 대시보드'는 집 창밖을 내다보는 것일 때가 많죠. 하지만 가끔, 사진을 찍거나 드론을 날릴 여유 시간이 생기면 잠들어 있던 '날씨 덕후' 기질이 깨어납니다.

그때 가장 큰 고민은 바로 '어디로 갈까?'입니다. 뉴저지에 있는 우리 집에서 차로 몇 시간 거리 안에는 흥미로운 장소가 많고, 장소마다 날씨는 천차만별입니다. 제가 진짜 원하는 것은 한 화면에 열두 곳의 날씨를 보여주어 한눈에 비교할 수 있는 대시보드입니다. 특히 서로 가까운 지역만 비교하는 것으로는 충분하지 않습니다.

Grafana용 Redis 데이터 소스로 구축한 실제 애플리케이션 3가지

또 하나 중요한 점은 저는 숫자를 좋아한다는 것입니다. 풍경 사진은 구름량이 20%~50%일 때 가장 잘 나온다는 것을 알고 있습니다. 드론 비행에는 시속 10mph 미만의 풍속이 이상적이고, 10~20mph는 꽤 힘들며, 그 이상은 위험할 수 있습니다. 그래서 아래처럼 귀여운 날씨 아이콘만으로는 큰 도움이 되지 않습니다.

이런 배경에서 Redis를 활용해 날씨 대시보드를 어떻게 구축했는지 소개합니다.

다행히도 요즘은 다양한 날씨 API를 통해 원시 날씨 데이터를 폭넓게 이용할 수 있으며, 그중 상당수가 (일부 제한은 있지만) 무료입니다. 저는 OpenWeatherMap API를 선택했습니다. 무료 플랜만으로도 필요한 모든 것, 즉 48시간 단위 예보, 7일 일별 예보, 현재 기상 상황을 모두 제공하기 때문입니다.

저는 API에서 데이터를 가져와 시간별/일별 예보는 RedisTimeSeries 모듈을 사용해 Redis 데이터베이스에 저장하고, 현재 기상 상황은 별도의 타임 시리즈에 기록해 히스토리로 보관하는 간단한 파이썬 스크립트를 작성했습니다.

제 날씨 대시보드는 두 가지 필수 원칙을 따릅니다.

  1. 모든 데이터는 스크롤 없이 한 화면에 표시되어야 한다.
  2. 대시보드에 표시된 상황을 누구나 최대한 빨리 이해할 수 있어야 한다.
Grafana용 Redis 데이터 소스로 구축한 실제 애플리케이션 3가지

대시보드 상단 섹션에는 특정 위치의 현재 기상 상황이 표시됩니다. 이 위치는 주요 위치나 즐겨찾는 곳일 수도 있고, 사용 가능한 장소 목록에서 선택한 곳일 수도 있습니다(대시보드 왼쪽 상단에 Grafana 템플릿 변수 선택 목록이 있습니다). 또한 해당 위치에서 특정 활동에 적합한 시간대도 함께 보여줍니다. Grafana를 활용하면 온도의 적정/위험 구간을 강조하고, 풍속의 위험 구간을 표시하며, 구름의 양을 나타내고, 주간과 야간 시간대를 구분해 표시할 수 있습니다.

하단 섹션에서는 위치를 활동별로 그룹화하여 손쉽게 비교할 수 있습니다. 원이 클수록 특정 위치에서 특정 활동에 적합한 시간이 많다는 의미입니다.

Grafana용 Redis 데이터 소스로 구축한 실제 애플리케이션 3가지

2. 코로나19 확진 현황 시각화

저는 여행을 좋아하지만, 2020년에는 수백만 명의 사람들이 몇 달 동안 집에 머물러야 했습니다(영원하지 않기를 바랍니다!). 이제 많은 주가 점차 재개방되면서, 출발지와 목적지 양쪽의 COVID-19 상황을 파악하며 스마트하게 여행하는 것이 매우 중요해졌습니다. 즉, 현재 상황뿐 아니라 장기적인 추세까지 함께 주목해야 합니다.

바로 이것이 제 Grafana 미국 주별 코로나19 대시보드가 보여주는 내용입니다. 이 대시보드는 Coronavirus API 데이터를 기반으로 하며, 데이터는 RedisTimeSeries 모듈에 저장됩니다.

Grafana용 Redis 데이터 소스로 구축한 실제 애플리케이션 3가지

표준 그래프 표현 외에도 데이터는 지도 위에 그려집니다. Redis 데이터 소스 플러그인은 Grafana 월드맵 패널에서 공식적으로 지원되지는 않지만, 간단한 두 단계로 사용할 수 있습니다.

1단계: 타임 시리즈 출력 결과에 "Labels to fields" 변환(transformation)을 적용합니다.

Grafana용 Redis 데이터 소스로 구축한 실제 애플리케이션 3가지

2단계: 지도 매개변수 "Location Data"를 테이블(table) 모드로 변경하고 관련 필드를 매핑합니다.

Grafana용 Redis 데이터 소스로 구축한 실제 애플리케이션 3가지

이 두 단계를 거치면 RedisTimeSeries의 "geohash" 라벨로 지정된 지도상의 해당 지점에 타임 시리즈 값을 연결할 수 있습니다. "state" 라벨은 지도에 위치 이름을 표시하는 데 사용됩니다.

3. 팝업 스토어 데모

저는 Redis 5.0에서 새로 도입된 데이터 타입인 Redis Streams의 열렬한 팬이며, 데이터 처리를 위한 큐(queue)를 모니터링할 빠르고 간단한 솔루션을 찾고 있었습니다. Redis 데이터 소스를 개발하던 중, 우리 팀은 다른 프로젝트를 위해 RedisGears, 즉 개발자가 데이터의 분산과 배포를 추상화하면서 Redis에서 데이터 흐름을 구현하는 함수를 작성하고 실행할 수 있게 해주는 동적 프레임워크를 살펴보기 시작했고, 이 팝업 스토어 데이터 파이프라인 데모에 두 기술을 함께 사용하기로 결정했습니다.

RedisGears는 서로 다른 입력 데이터 유형에 대해 작동하는 여러 종류의 리더(reader)를 지원합니다. 스트림 메시지를 감시하기 위해 우리는 이벤트 모드의 StreamReader를 사용했습니다. 이 모드에서는 스트림에 새 메시지가 추가될 때 발생하는 이벤트에 반응하여 리더가 실행됩니다.

# Add Time-Series
def tsAdd(x):
   xlen = execute('XLEN', x['key'])
   execute('TS.ADD', 'ts:len:'+x['key'], '*', xlen)
   execute('TS.ADD', 'ts:enqueue:' + x['key'], '*', x['value'])

# Stream Reader for any Queue
gb = GearsBuilder('StreamReader')
gb.countby(lambda x: x['key']).map(tsAdd)
gb.register(prefix='queue:*', duration=5000, batch=10000, trimStream=False)

StreamReader는 실행 시점을 제어하는 여러 인수를 받습니다. 이 예제에서는 5초마다 또는 10,000개의 메시지를 받을 때마다 리더가 실행되기를 원했습니다. 마지막 옵션인 trimStream은 실행 후 스트림을 트리밍(trim)하지 않도록 지정합니다.

우리는 RedisTimeSeries를 사용해 들어오는 메시지 수와 큐 크기 샘플을 저장했습니다. Grafana용 Redis 데이터 소스 플러그인 소개 블로그 포스트에서 설명했듯이, 타임 시리즈는 Grafana에서 손쉽게 시각화할 수 있습니다.

Grafana용 Redis 데이터 소스로 구축한 실제 애플리케이션 3가지

Redis Streams, RedisTimeSeries, RedisGears, 그리고 Redis 데이터 소스가 어떻게 함께 작동하는지 보여주기 위해, 동적 대시보드가 포함된 팝업 스토어 데모를 만들었습니다.

Grafana용 Redis 데이터 소스로 구축한 실제 애플리케이션 3가지

이 Grafana 대시보드는 다음 항목들을 표시합니다.

  • Product Available(판매 가능 상품): 상품 키의 값으로, 주문이 완료될수록 감소합니다.
  • Customers Ordering / Orders Processing / Orders Completed(주문 중 고객, 처리 중 주문, 완료된 주문): queue:customers, queue:orders, queue:complete 스트림의 길이입니다.
  • Customers Overflow(대기 초과 고객): 고객이 제출한 주문 수와 완료된 주문 수의 차이입니다.
  • Customers Ordering(신규 주문): 5초 동안 생성된 주문 수입니다.
  • Orders In Queue(대기 중인 주문): 처리를 기다리고 있는 주문입니다.
  • Completed Flow(완료 처리량): 5초 동안 완료된 주문 수입니다.

부하(load)를 어떻게 생성했는지, 사용한 RedisGears 스크립트, TS.RANGE 명령으로 RedisTimeSeries 데이터를 조회하도록 Redis 데이터 소스를 구성하는 방법은 이 프로젝트의 GitHub 저장소에서 확인하실 수 있습니다.

결론

이 세 가지 실제 시나리오는 다양한 Redis 모듈과 함께 Grafana용 Redis 데이터 소스를 활용하는 방법을 보여줍니다. 이 사례들이 여러분이 직접 애플리케이션을 만드는 데 영감이 되기를 바랍니다.

여러분은 결코 혼자가 아닙니다. Redis 데이터 소스 플러그인은 Grafana 저장소에 게시된 이후 이미 10,000회 이상 다운로드되었고, Grafana 대시보드를 한층 향상시키는 인기 커뮤니티 플러그인에 포함되었으며, Redis 클러스터, Sentinel, Unix 소켓, 접근 제어 목록(ACL) 지원도 추가되었습니다.

Grafana용 Redis 데이터 소스로 구축한 실제 애플리케이션 3가지

하지만 여기서 끝이 아닙니다. Grafana의 스트리밍 기능과 인터랙티브 기능을 결합해 redis-cli 패널로 Grafana를 관찰 가능성(observability) 그 이상으로 확장하는 흥미로운 프로젝트 이야기도 준비되어 있으니, Redis 기술 블로그에 계속 주목해 주세요.