扩展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的同时,用不同的名称创建了一个新的数据源,因此似乎没有显示任何图片。

如果不按照下述方式更改名称,将会覆盖现有的物品,因此需要注意。
class ElasticsearchCustom(BaseElasticSearch):
@classmethod
def name(cls):
return 'ElasticsearchCustom'
register(ElasticsearchCustom)
请输入Elasticsearch的连接信息并保存。
我们将在新添加的elasticsearch_custamize.py文件中定义配置信息,因为这是elasticsearch.py的扩展版本,所以连接定义信息将与现有的Elasticsearch相同注册。

使用Query中已注册的数据源创建和执行查询。
以下是要执行的查询。
{
"index": "インデックス名",
"size": 100,
"aggs": {
"1st": {
"terms": {
"field": "LogDate"
},
"aggs": {
"2nd": {
"terms": {
"field": "SectionName"
}
}
}
}
}
}
经过elasticsearch_custamize.py的处理,结果将在Table中显示出来。
如果我们能获得这个表的结果,就可以制作出图表来!
如果有无法满足的要求出现时,考虑到各种查询结果的 JSON 模式,与其让程序变得复杂,不如通过 QueryResult 的组合技来实现也不错。