2016-10-07 1 views
3

path (/mnt/disk1, /mnt/disk2 등) 및 total 디스크 공간이 포함 된 시리즈가 있습니다. 또한 freeused 값을 포함합니다. 이 값은 지정된 간격으로 업데이트됩니다. 내가 뭘하고 싶은지, 쿼리 total 각 경로의 last()의 합계를 얻을 수 있습니다. freeused에 대해서도 동일한 작업을 수행하여 내 서버에있는 전체 디스크의 전체 크기, 사용 가능한 공간 및 사용 된 공간을 합산합니다. (GROUP BY

select last(total) as total from disk where path =~ /(mnt\/disk).*/ group by path

는 현재이 5 시리즈를 반환 각각 포함하는 1 행 :

나는 나에게 (구별)의 경로에 의해 그룹화 된 모든 디스크의 last(total)을 얻을 것이다 여기에 쿼리를 최신) 및 그 값인 total. 그런 다음 해당 시리즈의 합계를 가져오고 싶지만 last(total)sum() 함수 호출로 감쌀 수 없습니다. 내가 누락 된 방법이 있나요?

+0

여기서는 InfluxDB에서 아직 일반적으로 지원되지 않는 중첩 된 함수에 대해 설명합니다. https://github.com/influxdata/influxdb/issues/6823. 해결 방법은 하나의 값 (예 : 합계)에 대해 CQ를 작성하고 다른 함수 (예 : last())를 사용하여 CQ를 쿼리하는 것입니다. – Jason

답변

3

위에서 중첩 된 기능에 관한 내 의견을 수행합니다. 장난감 예 구축

:

INSERT disk,path="/mnt/disk1" total=30 
INSERT disk,path="/mnt/disk2" total=32 
INSERT disk,path="/mnt/disk3" total=33 
:

CREATE CONTINUOUS QUERY disk_sum_total ON FOO 
BEGIN 
    SELECT sum("total") AS "total_1m" INTO disk_1m_total FROM "disk" 
    GROUP BY time(1m) 
END 

그럼 일부 값을 푸시 :

CREATE DATABASE FOO 
USE FOO 

는 데이터 [1] 매분보다 큰 간격 갱신되었다고 가정

그리고 1 분 이상 기다리십시오. 그 다음 :

INSERT disk,path="/mnt/disk1" total=41 
INSERT disk,path="/mnt/disk2" total=42 
INSERT disk,path="/mnt/disk3" total=43 

그리고 잠깐 + 다시 기다려주세요. 그런 다음 :

SELECT * FROM disk_1m_total 

name: disk_1m_total 
------------------- 
time     total_1m 
1476015300000000000  95 
1476015420000000000  126 

두 값은 30+32+33=9541+42+43=126 있습니다.

거기에서

, 그것은 쿼리에 대한 사소한 : 도움이

SELECT last(total_1m) FROM disk_1m_total 

name: disk_1m_total 
------------------- 
time     last 
1476015420000000000  126 

희망.

[1] 업데이트 빈도보다 작은 간격을 선택하면 사소한 타이밍 불안정으로 인해 주어진 그룹에 대해 실수로 모든 데이터가 실수로 두 번 합산되는 것을 방지 할 수 있습니다. "0 업데이트"간격이있을 수 있지만 "이중 계산"간격은 없을 수 있습니다. 나는 일반적으로 Shannon의 정리를 호출하고 업데이트를 두 배 빨리 실행합니다. CQ에 창에 대한 데이터가 없으면 해당 창에 대해 CQ가 수행되지 않으므로 last()은 여전히 ​​올바른 대답을 제공합니다. 예를 들어, 밤새 CQ를 실행하고 새로운 데이터를 넣지 않았습니다. last(total_1m)은 "no new data"에 대해 0이 아닌 동일한 대답을 제공합니다.