인플럭스 데이터 이동

growdeveloper ㅣ 2023. 6. 21. 17:11

influxdb에서 데이터를 쿼리할 때, 데이터를 어떤 식으로든 변환해야 하는 경우가 많습니다. 일반적인 예로는 데이터 집계, 다운 샘플링 데이터 등이 있습니다.

 

이 가이드에서는 Flux 함수를 사용하여 데이터를 변환하는 방법을 보여줍니다. 시간 창으로 데이터를 분할하고 각 창에서 _values를 평균화하여 새로운 테이블로 출력하는 flux 스크립트를 생성하는 과정을 안내합니다.

 

from(bucket: "example-bucket")
    |> range(start: -1h)
    |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_system" and r.cpu == "cpu-total")

 

플럭스 함수 (Flux functions)

플럭스는 특정 작업, 변환 및 작업을 수행하는 여러 함수를 제공합니다. 또한 Flux 쿼리에서 사용자 정의 함수를 생성할 수 도 있습니다. 함수에 대한 자세한 내용은 Flux 표준 라이브러리 문서에서 확인할 수 있습니다.

 

Flux 표준 라이브러리 문서에서는 다양한 함수 및 해당 기능에 대해 자세히 다루고 있습니다. 이 문서를 차조하여 Flux에서 사용 가능한 함수들을 살펴보고 원하는 작업을 수행하는 데 필요한 함수를 선택할 수 있습니다. Flux 함수를 활용하면 데이터를 필터링, 변환,집계 조인 등 다양한 작업을 수행할 수 있습니다.

 

Flux 표준 라이브러리 문서는 Flux 함수의 사용법과 예제를 제공하므로 Flux를 사용하여 데이터를 처리하고 변환하는 데 도움이 됩니다. 필요한 함수를 선택하고 문서를 참조하여 Flux 쿼리

 


Flux의 'windows()' 함수는 시간 값을 기준으로 레코드를 파티션으로 나누는 데 사용됩니다. 'every' 매개변수를 사용하여 각 윈도우의 지속 시간을 정의할 수 있습니다. 아래는 Flux에서 'window()' 함수를 사용하는 예시입니다:

 

from(bucket: "example-bucket")
    |> range(start: -1h)
    |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_system" and r.cpu == "cpu-total")
    |> window(every: 5m)

데이터를 window로 나눈 후에는 가 윈도우에 추가적인 연산을 적용할 수 있습니다. 


Aggregate windowed data

Flux의 집계 함수는 각 테이블의 값을 취합하여 어떤 방식으로든 집계합니다. 각 테이블의 값들을 평균화하기 위해 `mean()` 함수를 사용하세요.

 

위의 예시에서는 `from()` 함수를 사용하여 "example-bucket" 버킷에서 데이터를 가져옵니다. 그 다음 `-1h` 범위 내에서 데이터를 필터링 합니다. 필터링 조건은 '_measurement'이 "cpu"이고 "_filed"가 usage_system"이며 `cpu`가 "cpu-total"인 레코드 입니다.

 

그후 `window()` 함수를 사용하여 5분마다의 윈로드로 데이터를 분할합니다. 마지막으로 `mean()` 함수를 사용하여 각 윈도우의 값들을 평균화 합니다.

 

각 윈도우의 행들이 집계되면, 출력 데이터에는 집계된 값만 포함된 단일 행이 있습니다. 윈도우화된 테이블은 여전히 개별적이며, 시각화할 때는 단일하고 연결되지 않은 점으로 표시됩니다.


Add times to your aggregates

앞서 언급한대로, Flux에서 값을 집계할 때 결과 테이블에는 '_time' 열이 없습니다. 이는 집계에 사용되는 원본 레코드들이 서로 다른 타임스템프를 가지기 때문입니다. 그러나 결과 테이블에서 `_time` 열이 필요한 경우, 각 윈도우화된 테이블에 `_stop` 열을 `-time` 열로 복제하기 위해 `duplicate()` 함수를 사용할 수 있습니다. 아래는 이전 예시의 업데이트 된 버전입니다:

from(bucket: "example-bucket")
    |> range(start: -1h)
    |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_system" and r.cpu == "cpu-total")
    |> window(every: 5m)
    |> mean()
    |> duplicate(column: "_stop", as: "_time")

업데이트된 버전에서는 파이프라인에 `duplicate()` 함수가 추가되었습니다. 이 함수는 이전 연산에서 `_stop` 열을 복제하고 `_time` 으로 이름을 변경합니다. 이렇게 하면 결과 테이블에 `_time` 열이 포함되며, 이후의 연산에서 타임스탬프로 사용할 수 있습니다.

 

'duplicate()' 함수를 추가함으로써 출력 테이블에 `_time`열이 있게되므로, 타임스탬프가 필요한 추가적인 연산을 수행할 수 있습니다.


Unwindow aggregate tables

 

윈도우된 집계 테이블의 모든 데이터 포인트를 하나의 무한한 윈도우로 모우기 위해 `window()` 함수를 `every: inf` 매개변수와 함께 사용할 수 있습니다.

from(bucket: "example-bucket")
    |> range(start: -1h)
    |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_system" and r.cpu == "cpu-total")
    |> window(every: 5m)
    |> mean()
    |> duplicate(column: "_stop", as: "_time")
    |> window(every: inf)

업데이트된 버전에서는 `mean()` 함수를 적용하고 `_stop`열을 `_time`으로 복제한 후, 다시 `window()` 함수를 사용하여 `every:inf 로 설정합니다. 이렇게 하면 윈도우의 기간이 무한대로 설정되어, 윈도우의 집계 테이블들이 하나의 테이블로 결합됩니다.

 

윈도우 그룹화가 해제되고 하나의 테이블로 결합되면, 시각화 할 대 집계된 데이터 포인트들은 연결되어 보일 겁니다. 이를 통해 시간에 따른 집계값의 추이와 연속성을 관찰할 수 있습니다.


Helper functions

플럭스는 데이터 집계를 추상화하는 "도우미(helper)" 함수를 제공하며, 이러한 단계를 많이 추상화하여 쿼리 작성 과정을 간겨랗게 만들어 줍니다. 이 가이드 에서 수행한 동일한 작업은 'aggregateWindow()' 함수를 사용하여 수행할 수 있습니다.

다음은 `aggregateWindow()` 를 사용한 업데이트된 쿼리입니다.

from(bucket: "example-bucket")
    |> range(start: -1h)
    |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_system" and r.cpu == "cpu-total")
    |> aggregateWindow(every: 5m, fn: mean)

이 업데이트된 버전에서는 `aggregateWindow()` 함수를 사용하여 데이터를 집계합니다. `every` 매개변수를 사용하여 윈도우 기간(이 경우 5분)을 지정하고 `fn 매개변수를 사용하여 집계 함수(`mean()` 이 경우)를 지정합니다

 

`aggregateWIndow()`를 사용함 으로써, 더 간결하고 명료한 코드 구조로 동일한 데이터 집계 결과를 얻을 수 있습니다. 이와 같은 도우미 함수들은 과정을 간소화하고, 데이터가 각 함수를 통과하면서 어떻게 형태가 변화하는지 이해하기 쉽게 도와줍니다.

'InfluxDB' 카테고리의 다른 글

Query InfluxDB with Flux  (0) 2023.06.15
InfluxDB 설계 원칙  (0) 2023.06.14
인플럭스 DB data elements  (0) 2023.06.13
인플럭스DB 데이터 요소  (0) 2023.03.06
InfluxDB 설치하기  (0) 2023.03.03