扩展Redash的QueryRunner能力

由于在 Redash 中使用 Elasticsearch 作为数据源时发现了 Redash 的 Elasticsearch 解析器(QueryRunner)存在问题,为解决这个问题,我们决定扩展 QueryRunner。
虽然我们也可以修改现有文件来解决问题,但这样做可能会在升级时带来麻烦,因此我们决定本次尝试新增 QueryRunner。

环境

Redash(版本7.0.0)
Elasticsearch(版本7.3.2)
Docker

扩展内容

使用Elasticsearch进行多个聚合查询,并将结果以表格形式正确显示在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文件中添加配置。
添加内容将追加到environment部分。

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

从新数据来源中选择要添加的数据源。

如果成功加载,将在数据源列表中显示。
※似乎图片是单独管理的,这次我们在保留现有的Elasticsearch的同时,用不同的名称创建了一个新的数据源,因此似乎没有显示任何图片。

image.png

如果不按照下述方式更改名称,将会覆盖现有的物品,因此需要注意。

class ElasticsearchCustom(BaseElasticSearch):

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

register(ElasticsearchCustom)

请输入Elasticsearch的连接信息并保存。
我们将在新添加的elasticsearch_custamize.py文件中定义配置信息,因为这是elasticsearch.py的扩展版本,所以连接定义信息将与现有的Elasticsearch相同注册。

image.png

使用Query中已注册的数据源创建和执行查询。

以下是要执行的查询。

{
    "index": "インデックス名",
    "size": 100,
    "aggs": {
        "1st": {
            "terms": {
                "field": "LogDate"
            },
            "aggs": {
                "2nd": {
                    "terms": {
                        "field": "SectionName"
                    }
                }
            }
        }
    }
}

经过elasticsearch_custamize.py的处理,结果将在Table中显示出来。

1st2nd1st_doc_count2nd_doc_count2019年10月29日システム部60102019年10月29日人事部60202019年10月29日総務部60302019年10月30日システム部6001002019年10月30日人事部6002002019年10月30日総務部600300

如果我们能获得这个表的结果,就可以制作出图表来!

如果有无法满足的要求出现时,考虑到各种查询结果的 JSON 模式,与其让程序变得复杂,不如通过 QueryResult 的组合技来实现也不错。

广告
将在 10 秒后关闭
bannerAds