Redash의 QueryRunner 확장

Redash의 Elasticsearch 용 파서 (QueryRunner)에서 문제 ( Redash에서 데이터 소스에 Elasticsearch를 사용할 때의 문제 )를 발견했으므로 문제를 해결하기 위해 QueryRunner를 확장합니다.
기존 파일을 수정하여 대응하는 것도 가능했지만, 그렇다면 버전 업 시에 번거롭기 때문에 이번에는 QueryRunner를 새로 추가해 보았습니다.

환경



Redash(v7.0.0)
Elasticsearch(v7.3.2)
도커

확장 내용



Elasticsearch에서 여러 Aggregation 쿼리 결과를 Redash의 결과로 표 형식으로 올바르게 표시합니다.
구체적으로는, GROUP BY 항목 1, 항목 2와 같이 지정했을 때와 같은 표 결과를 얻을 수 있으면, Redash로 그래프를 작성하는 것이 가능하기 때문에.

다음과 같은 Elasticsearch의 쿼리 결과를 테이블 형식으로 구문 분석합니다. (결과 구조에서 일부 데이터 생략)
{
    "aggregations": {
        "1st": {
            "buckets": [
                {
                    "key": "2019年10月29日",
                    "doc_count": 60,
                    "2nd": {
                        "buckets": [
                            {
                                "key": "システム部",
                                "doc_count": 10
                            },
                            {
                                "key": "人事部",
                                "doc_count": 20
                            },
                            {
                                "key": "総務部",
                                "doc_count": 30
                            }
                        ]
                    }
                },
                {
                    "key": "2019年10月30日",
                    "doc_count": 600,
                    "2nd": {
                        "buckets": [
                            {
                                "key": "システム部",
                                "doc_count": 100
                            },
                            {
                                "key": "人事部",
                                "doc_count": 200
                            },
                            {
                                "key": "総務部",
                                "doc_count": 300
                            }
                        ]
                    }
                }
            ]
        }
    }
}

Redash에 추가하는 방법



새로운 QueryRunner를 추가하는 경우, 미리 준비되어 있는 환경 변수 "REDASH_ADDITIONAL_QUERY_RUNNERS"로 추가를 할 수 있습니다.

Redash에서 제공하는 환경 변수 목록

추가 로드 설정



docker-compose.yml에 설정을 추가합니다.
추가는 환경 섹션에 추가됩니다.

docker-compose.yml
environment:
  REDASH_ADDITIONAL_QUERY_RUNNERS: "redash.query_runner.elasticsearch_custamize"

추가 파일 배치



이미 기존 파일이 있는 디렉토리에 이번에 추가할 파일을 배치합니다.
redash/query_runner
 elasticsearch.py
 oracle.py
 pg.py
   ・
   ・
 elasticsearch_custamize.py
   ・

Docker 컨테이너 시작(재시작)



개발 버전에서 확인하려면 redash 바로 아래의 docker-compose.yml을 기반으로 docker-compose를 수행합니다.
릴리스 버전에서 확인하는 경우, 미리 파일을 배치한 Redash의 Image를 작성해 두게 되고, redash/setup 바로 아래의 docker-compose.yml를 베이스로, docker-compose를 실시합니다.
※기동시에 추가 지정한 개소에 대상의 파일이 없으면 에러가 됩니다.
redash
  /setup
    docker-compose.yml ← リリース版用
  Dockerfile
  docker-compose.yml  ← 開発用

추가한 QueryRunner 사용



New Data Source에서 추가한 Data Source를 선택합니다.



올바르게 로드하는 경우 데이터 소스 목록에 표시됩니다.
※Data Source에 대한 이미지가 별도로 관리되고 있는 것 같고, 이번은 기존의 Elasticsearch를 남긴 채로 별명으로 작성했으므로, 아무것도 이미지가 표시되어 있지 않은 것 같습니다.



아래와 같이 이름을 어긋나지 않으면 기존의 물건을 덮어쓰기 때문에 주의가 필요.

elasticsearch_custamize.py
class ElasticsearchCustom(BaseElasticSearch):

    @classmethod
    def name(cls):
        return 'ElasticsearchCustom'

register(ElasticsearchCustom)

Elasticsearch 연결 정보를 입력하여 SAVE를 수행합니다.
이번에 추가한 elasticsearch_custamize.py에서 설정 정보를 정의하게 됩니다만, 이번은 기존의 elasticsearch.py의 확장판이기 때문에, 접속 정의 ​​정보는 기존의 Elasticsearch와 같이 등록합니다.



Query에서 등록한 Data Source를 사용하여 쿼리를 작성하고 실행



실행하는 쿼리는 아래와 같다.
{
    "index": "インデックス名",
    "size": 100,
    "aggs": {
        "1st": {
            "terms": {
                "field": "LogDate"
            },
            "aggs": {
                "2nd": {
                    "terms": {
                        "field": "SectionName"
                    }
                }
            }
        }
    }
}

elasticsearch_custamize.py로 처리한 결과가 Table에 표시된다.


1st
2nd
1st_doc_count
2nd_doc_count


2019년 10월 29일
시스템부
60
10

2019년 10월 29일
인사부
60
20

2019년 10월 29일
총무부
60
30

2019년 10월 30일
시스템부
600
100

2019년 10월 30일
인사부
600
200

2019년 10월 30일
총무부
600
300


이 표 결과를 얻으면 그래프를 만들 수 있습니다!

만약 이것으로 커버할 수 없는 요건이 왔을 때, 다양한 쿼리 결과의 JSON 패턴을 가미해, 프로그램을 복잡화시키는 것보다는, QueryResult의 합치기술로 실현하는 것도 손일까라고.

좋은 웹페이지 즐겨찾기