다중 값 변수에 대한 Grafana, SQL 및 IN() 목록

7243 단어 grafanalistsql
최근에 Grafana를 보았습니다. 장점: 정말 멋집니다. 심미적으로 의미합니다. 상사를 위해 대시보드를 만들거나 탁 트인 공간의 대형 화면에 표시하고 싶다면 그게 아름답습니다. 단점: 성숙하지 못함. 나는 작동하는 기술로 수년 동안 일하고 있습니다. 문제가 생기면 해결책(블로그 게시물, 포럼, 메일링 리스트, 지원 노트)을 찾습니다. 하지만 최신 소프트웨어를 사용하면 처음 접하는 문제는 해결되지 않은 git 문제로 인해 막다른 골목에 놓이게 됩니다. 그리고 실제로 문제를 해결하는 것보다 해결 방법을 찾는 데 더 많은 시간을 보내고 있습니다. 예, Grafana는 훌륭하지만 5분 안에 Excel로 할 수 있는 것과는 거리가 멀습니다. 그러나 해결 방법을 찾으면 다른 사람을 돕기 위해 게시하고 더 나은 솔루션을 가진 사람을 찾길 바랍니다. 내가 하는 일이 완전히 어리석다면 댓글을 남겨주세요.

해결해야 할 문제: 다중 값 변수에서 SQL의 IN() 목록



이 예에서는 PostgreSQL database in Google Cloud SQL , 로드된 sample data from Gerald Venzlfree grafana cloud service 을 생성했습니다. 내 목표는 국가를 하나, 다수, 전부 또는 전혀 선택할 수 없는 것과 같은 것을 얻는 것입니다.


다음과 같이 국가 목록을 쿼리할 수 있습니다.

select country_id __value , name __text from countries order by 2

사용자에게 국가 이름을 표시하기 위해 "값"및 "텍스트"로 내 열의 별칭을 지정하지만 사용자가 선택한 항목에서 국가 코드를 가져옵니다.

그래서 이 쿼리를 사용하여 Grafana 변수를 만들고 사용자가 원하는 조합을 선택할 수 있도록 "다중 값"및 "모두 포함 옵션"을 선택했습니다.


이제 SQL 문에서 데모용으로 "mylist"라고 불렀던 이 변수를 사용해 보겠습니다.

select * from cities where country_id in ($mylist)

다양한 사용자 조합에 대해 생성된 검색어를 보여 드리겠습니다.

select * from cities where country_id in ('AND','ARE','AFG','ATG','ALB','ARM','AGO','ARG','AUT','AUS','AZE','BIH','BRB','BGD','BEL','BFA','BGR','BHR','BDI','BEN','BRN','BOL','BRA','BHS','BTN','BWA','BLR','BLZ','CAN','COD','CAF','COG','CHE','CIV','CHL','CMR','CHN','COL','CRI','CUB','CPV','CYP','CZE','DEU','DJI','DNK','DMA','DOM','DZA','ECU','EST','EGY','ERI','ESP','ETH','FIN','FJI','FSM','FRA','GAB','GBR','GRD','GEO','GHA','GMB','GIN','GNQ','GRC','GTM','GNB','GUY','HND','HRV','HTI','HUN','IDN','IRL','ISR','IND','IRQ','IRN','ISL','ITA','JAM','JOR','JPN','KEN','KGZ','KHM','KIR','COM','KNA','PRK','KOR','KWT','KAZ','LAO','LBN','LCA','LIE','LKA','LBR','LSO','LTU','LUX','LVA','LBY','MAR','MCO','MDA','MNE','MDG','MHL','MKD','MLI','MMR','MNG','MRT','MLT','MUS','MDV','MWI','MEX','MYS','MOZ','NAM','NER','NGA','NIC','NLD','NOR','NPL','NRU','NZL','OMN','PAN','PER','PNG','PHL','PAK','POL','PRT','PLW','PRY','QAT','ROU','SRB','RUS','RWA','SAU','SLB','SYC','SDN','SWE','SGP','SVN','SVK','SLE','SMR','SEN','SOM','SUR','SSD','STP','SLV','SYR','SWZ','TCD','TGO','THA','TJK','TLS','TKM','TUN','TON','TUR','TTO','TUV','TWN','TZA','UKR','UGA','USA','URY','UZB','VAT','VCT','VEN','VNM','VUT','WSM','XKX','YEM','ZAF','ZMB','ZWE')

이것은 사용자가 "모두"를 선택했을 때 내가 가지고 있는 것이며 정확합니다.

select * from cities where country_id in ('BEL','NLD','LUX')

이것은 사용자가 일부 국가를 선택할 때 내가 얻는 것이며, 이것은 다시 정확합니다.

select * from cities where country_id in ()

이것은 사용자가 아무것도 선택하지 않았을 때 얻는 것입니다. 그리고 Grafana 변수에는 이 가능성을 비활성화하는 옵션이 없습니다. 이것은 유효하지 않은 SQL 구문이며 PostgreSQL: pq: ")"근처에서 구문 오류가 발생하면 MySQL은 다음과 같이 표시합니다. SQL 구문에 오류가 있습니다. 1행의 ')' 근처에서 사용할 올바른 구문에 대해서는 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. Oracle은 다음을 표시합니다. ORA-00936: 누락된 표현식, SQL Server는 다음을 표시합니다. Grafana 다채로운 차트는 이와 같이 사용자에게 친숙하지 않은 메시지를 받을 때 덜 매력적입니다. 해결 방법이 필요합니다.

그다지 고급 형식이 아닙니다.



"고급"옵션이 가장 일반적인 데이터 쿼리 언어인 SQL에 대한 형식을 가져야 한다는 희망으로 "Advanced variable format options"을 확인했습니다. 하지만. CSV, OpenTSDB, Doublequote, Graphite, JSON, Elasticsearch, Percentencode, Pipe, Raw, Regex, Singlequote, Sqlstring, Text, URL 형식이 있지만 SQL에 대해서는 아무것도 없습니다! 예, SQL은 regexp에서 필터링할 수 있지만 인덱스 액세스, 동등성 또는 IN() 목록에서만 가능한 파티션 가지치기를 원합니다.

중첩 변수 및 SQL 변환



여기 내 해결 방법이 있습니다. 값 목록에서 IN() 목록을 빌드하기 위해 숨겨질 두 번째 변수를 만들었습니다. SQL 엔진이 있으므로 이를 사용하여 변환을 수행합니다.

select case when length($$${mylist:singlequote}$$)>0 then $$ in ($mylist:singlequote) $$ else ' is null ' end

여기에서는 SQL 쿼리의 기본값인 "작은따옴표"형식으로 이전 변수를 확장합니다. 그러나 CASE 문에 캡슐화합니다. 목록이 비어 있지 않으면 내 변수는 IN(...) 목록을 작성하지만 비어 있으면 사용자가 알 수 없는 값을 선택할 수 있도록 IS NULL로 대체하도록 선택합니다. 물론 항상 참 또는 거짓인 술어를 사용하여 동작을 결정할 수 있습니다.

그런 다음 내 대시보드 패널 쿼리는 다음과 같습니다.

select * from cities where country_id ${mylist_sql:raw}

사용자가 하나, 여러 개 또는 모든 값을 선택할 때 ${mylist}를 사용했을 때와 동일하게 확장됩니다.

그러나 사용자가 아무것도 선택하지 않은 경우:

select * from cities where country_id is null

오류가 없으며 내가 선택한 동작입니다. 최적화 프로그램은 기본 키가 null일 수 없음을 알고 있기 때문에 작업이 없는 행이 없습니다.

좋은 웹페이지 즐겨찾기