記一次在Grafana中使用Worldmap Panel的經歷

背景

因與工作相關,以下內容皆做了脫敏處理

主要的需求是要根據地理位置查看可視化的數據。

安裝及創建

安裝命令來源於官網

grafana-cli plugins install grafana-worldmap-panel

安裝成功後創建

通過ip獲取所在地區

請見開源項目ip2region

//github.com/lionsoul2014/ip2region

通過所在地區獲取經緯度

因為worldmap使用的是OpenStreetMap,所以需要找個能根據地區查詢經緯度的接口
以下是一個返回值示例,請求的url為://nominatim.openstreetmap.org/search?format=json&state=北京,返回值如下:

[
    {
        "place_id": 235181418,
        "licence": "Data © OpenStreetMap contributors, ODbL 1.0. //osm.org/copyright",
        "osm_type": "relation",
        "osm_id": 912940,
        "boundingbox": [
            "39.4416113",
            "41.0595584",
            "115.4172086",
            "117.5079852"
        ],
        "lat": "40.190632",
        "lon": "116.412144",
        "display_name": "北京市, 中國",
        "class": "boundary",
        "type": "administrative",
        "importance": 0.8344014383682882,
        "icon": "//nominatim.openstreetmap.org/images/mapicons/poi_boundary_administrative.p.20.png"
    }
]

可以看到latlon字段,分別是維度、精度。

Prometheus準備數據

因為我們Grafana中已經配置了Prometheus數據源,所以現在提供一個Metric就可以了。

Metric的獲取邏輯如下:

  • 根據從ip查詢到的城市進行分組,並記錄他們的值。
  • 通過緩存過的城市到經緯度的映射查詢對應的經緯度
  • 調用Prometheus的sdk提供Metric接口

接口格式如下:
userip為Metric名稱,label分別為維度、精度、名稱,值是分佈數量,在worldmap表現為圈的大小

# HELP userip 用戶IP分佈
# TYPE userip gauge
userip{latitude="40.190632",longitude="116.412144",name="北京市"} 20
userip{latitude="31.2322758",longitude="121.4692071",name="上海市"} 33

配置worldmap

Metric選項配置

指標名填寫上一步的userip,注意圈起來的地方

Worldmap選項配置

Metric Field中的ValueV是大寫,其他三個字段分別與label對應。

保存後就大功告成

來吧,展示!

以下為部分測試數據