본문 바로가기

DevOps

Grafana와 엘라스틱서치 사용시 각종 query 조건 사용 방법(and, or, regex 등)

엘라스틱서치는 분산형 RESTful 검색 및 분석엔진이다. ELK라는 스택을 통해서 여러 데이터를 모으고 시각화하여 활용하는데 많이 쓰인다. 데이터를 모아서 Kibana로 사용하는 것도 좋지만 Grafana를 사용하면 미려한 그래프 디자인과 함께 alert기능등 여러 기능을 사용할 수 있다.

 

이번 포스팅에서는 엘라스틱서치와 Grafana를 사용하여 그래프를 그릴 때 Query를 사용하는 방법에 대해서 이야기해보고자 한다.

 

그라파나에 엘라스틱서치 연결하기

엘라스틱서치의 document를 그래프로 그리기 위해서는 index pattern을 그라파나에 등록해야 한다. 아래와 같이 add data source탭을 통해 elasticsearch에 대한 정보를 등록한다.

Grafana > Add data source

그라파나 Query

아래와 같은 형태로 ES가 document를 가지고 있다고 가정하자.

{
  "_index": "burrow-to-elasticsearch",
  "_type": "log",
  "_id": "i_KcuG0BqXIDjsCXkRD7",
  "_version": 1,
  "_score": null,
  "_source": {
    "@timestamp": "2019-10-11T02:18:51.776Z",
    "lag": 0,
    "topic": "discover_log-live",
    "cluster": "live",
    "client_id": "consumer-87",
    "offset": 174482730,
    "owner": "/172.22.212.34",
    "partition_status": "",
    "partition_count": 3,
    "consumer_status": "OK",
    "offset_time": 1570446792051,
    "partition_no": 2,
    "consumer": "discover_log-live-consumers"
  },
  "fields": {
    "@timestamp": [
      "2019-10-11T02:18:51.776Z"
    ]
  },
  "sort": [
    1570760331776
  ]
}

상기 document는 kafka의 lag정보를 확인하기 위해 burrow라는 application으로부터 가져온 데이터이다. 상기와 같은 document를 그래프로 그릴 때 아래와 같은 조건에 따라 어떤 query를 적어야할지 정리해 보았다.

 

Grafana에서 query작성시 상기와 같이 빨강네모 안에 적는다

1) exactly same document value 조건

예를 들어 topic key에 discover_log-live라고 하는 value가 들어간 document만 그래프를 그리고 싶다면 아래와 같이 작성한다.

topic.keyword: "discover_log-live"

콜론 뒤에 쌍따옴표(")로 string을 묶어 표현하면 value가 상기 "discover_log-live" 와 동일한 데이터만 그래프로 보여줄 수 있다.

2) OR 조건

만약 topic key의 value가 discover_log-live 혹은 test_log-dev 두개 중 하나라도 존재하는 document에 대해 그래프를 그리고 싶다면 아래와 같이 작성한다.

topic.keyword: "discover_log-live" or topic.keyword: "test_log-dev" 

3) AND 조건 

만약 topic key의 value가 discover_log-live 이면서 partition_no의 value가 2인것에 대해 그래프를 그리고 힢다면 아래와 같이 작성한다.

topic.keyword: "discover_log-live" and partition_no.keyword: "2"

4) regex document value 조건

Grafana query에서 regex document로 value에 대한 값을 찾을 수도 있다. topic의 value에 live 혹은 alp라는 단어로 끝나는 값이 들어 있는 것만 찾고 싶다면 아래와 같이 regex문법을 사용할 수 있을 것이다.

topic.keyword: /.*[live|alp]/