# 需求说明

有时候我们想要将变量设置为级联关系,比如在做筛选的时候,先选择国家,然后加载该国家对应的省或州,最后再是省或州下面的市等。通过 grafana 的 variable 绑定变量可以将这种情况实现。

具体可以参考 官方说明

下面是以 elasticsearch 为数据源的具体实现细节。

# 信息录入 ES

我们可以从网上下载一份省市的关联信息表,可以直接导入 es 或者通过一些简单脚本写入 es。

from elasticsearch import Elasticsearch, helpers
import pandas as pd

if __name__ == '__main__':
    sql = "select country, province, city from tb_location_mapping"
    df = pd.read_sql_query(sql, engine)
    data = df.to_dict(orient='records')
    es_host_list = '192.168.0.1,192.168.0.2,192.168.0.3'.split(',')
    es_client = Elasticsearch(hosts=es_host_list, http_auth=('es_username', 'es_password'))
    documents = [{
        "_index": 'tb_location_mapping',
        "_source": doc,
        '_id': f"{doc['country']}{doc['province']}{doc['city']}"
    } for doc in data]
    helpers.bulk(es_client, documents)

# 添加 Grafana 数据源

因为上面我们将数据写到 tb_location_mapping 这个 index 下面了,所以我们要在 grafana 里新增一个 es 数据源指向这个 index。

# 给 Dashboard 添加变量

打开 dashboard,点开配置,找到 variable,如下新增 3 条变量

  • country 变量: {"find": "terms", "field": "country.keyword"}
  • province 变量: {"find": "terms", "field": "province.keyword", "query": "country: $country"}
  • city 变量: {"find": "terms", "field": "city.keyword", "query": "province: $province"}

注意下每个变量命令的 name,这样通过 $ 绑定才会起作用。