Grafana와 InfluxDB 연동하기

junsangyu·2024년 3월 23일
post-thumbnail

Grafana라는 모니터링툴과 InfluxDB라는 시계열 데이터베이스를 연동해보자!

1. InfluxDB에 데이터 import

테스트 용도로 엑셀에 있는 데이터 샘플을 InfluxDB에 넣어보자

1-1. 엑셀 csv로 변환

Google Sheet에서 파일 -> 다운로드 -> .csv

1-2. csv파일 InfluxDB에 쓰기

  1. 먼저 InfluxDB에서 bucket을 생성해주자
    Load Data -> Buckets -> + Create Bucket

  2. influx cli에서 write 해주자

# influx write -b 버킷이름 -f csv파일.csv --header "measurement헤더" --header "datatype헤더"
influx write -b buc1 -f cell3.csv --header "#constant measurement,cell" --header "#datatype long,dateTime:RFC3339,double,double,double,double,double,double"

measurement, datatype 헤더란?

InfluxDB에서 csv를 import하려면 Annotated CSV이란 포맷을 써야하는데, 보통 measurement, datatype 헤더가 필요하다. measurement는 db에서 테이블이름 같은거고, datatype은 말그대로 데이터타입을 나열한 것이다.
#constant measurement,cell 은 measurement 이름으로 cell을 사용하겠다는 뜻
#datatype long,dateTime:RFC3339,double,double,double,double,double,double 은 csv 컬럼 순서로 다음 데이터 타입을 사용하겠다는 뜻이다.
참고로 long타입은 int, dateTime:RFC3339은 2023-06-01T01:20:30.296Z 같은 datetime 형식을 뜻한다. 그 외로는 다음 공식문서를 참고하자.
https://docs.influxdata.com/influxdb/cloud/reference/syntax/annotated-csv/

2. grafana에서 influxdb 연결하기

2-1. Date source 추가

  1. Grafana에서 Home -> Connections -> Data Sources -> + Add new data source
  2. InfluxDB 선택
  3. Query language Flux 선택
  4. URL에 InfluxDB 주소 작성
  5. InfluxDB Details 에서 org, default bucket 작성
  6. Token으로 InfluxDB에서 Api Token 생성후 작성

2-2. Dashboard 만들기

대쉬보드 생성 후 Data source로 아까 만든 InfluxDB 데이터소스 선택

그 후 flux 쿼리로 데이터 지지고 볶고 하시면 되겠슴니다~~

개인적으로 힘들었던 점 메모

아니 row 하나에 column 하나씩밖에 안떠요...(Y must be in the same frame as X 오류)

아니 grafana에서 influxdb를 가져오면 row 하나에 column 하나씩밖에 안뜬다. 그래서 row 하나에 어떻게 여러개의 column(field)를 보여주지 생각하면서 기능 여러개 만져보니까 join을 하면 되더라...
Transform Data -> Join by field 로 하면 time값에 맞춰져서 column들이 하나의 row에 보임

근데 어떻게 timeshift 비교하죠?(현재 데이터와 하루 전 데이터랑 비교해야할 때)

이거는 내가 여러가지 시도해 본게 있는데
Query options 에서 Time shift 는 여러개 쿼리를 쓸데 한번에 다 적용되서 안된다. 나는 하나 쿼리만 time shift 하고싶음
flux 쿼리에서 timeShift() 함수는 time range를 바꾸는게 아니라 그냥 보이는 시간만 바뀌는 거라서 안됨

결국 정답은 flux쿼리에서 직접 date.add() 함수로 timerange를 더하면 된다. 다음은 예시코드이다.

import "date"

a = date.add(d: 21d, to: v.timeRangeStart)
b = date.add(d: 21d, to: v.timeRangeStop)

from(bucket: "buc1")
  |> range(start: a, stop: b)
  |> filter(fn: (r) => r._measurement == "cell1")

진짜 flux query 여러게 날리면 row가 하나로 합쳐저서 구분이 안되는데요????

이건 아직 정확하게 해결이 안되서 야매 해결법인데, _measurement를 rename했다. 약간 이상하게 작동하는 것 같지만 It Works for me ㅎㅎ

import "date"

a = date.add(d: 21d, to: v.timeRangeStart)
b = date.add(d: 21d, to: v.timeRangeStop)

from(bucket: "buc1")
  |> range(start: a, stop: b)
  |> filter(fn: (r) => r._measurement == "cell1")
  |> rename(columns: {_measurement: "cell234"})

timezone 문제

timeShift(duration: -9h) 를 flux 쿼리에 추가해주자. 이건 그냥 보이는 시간만 바꾸는 건데 어쩔수 업자나... 문제가 없으면 안해도됨

profile
👨🏻‍💻

0개의 댓글