Kibana:使用 Maps 来显示分布式的团队

1,679 阅读7分钟

在我之前的文章 “Kibana:如何在 Maps 应用中显示图片提示” 里,我展示了如何在 Kibana 中使用图片来展示一个图片的提示。这个在很多情况下是非常有用的,比如在疫情发生期间,我可以通过点击地图上的点来查看发生疫情人员的详细情况。我们甚至可以显示当事人的照片信息等。

在像 Elastic 这样的分布式公司工作很棒,但有时很难掌握。 回答一些看似简单的问题可能会出奇地复杂,例如:

  • 在地图上显示我们的团队,这样我就可以解释我们的范围和结构。
  • 让我找到某个地区的任何人,这样我们就知道谁是“本地人”。
  • 在附近找一个有特定技能的人。
  • 显示团队随时间的增长。
  • 记录区域覆盖范围,以便任何人都可以查找。

幸运的是,Kibana 可以提供帮助,这篇文章的目标是创建一个这样的地图:

Elasticsearch 中的映射和数据

在你进入可视化之前,你需要创建正确的映射(或 schema — 这与地图还没有直接关系)。 在 Kibana 的控制台中运行以下请求以创建映射:

`

1.  PUT team
2.  {
3.    "mappings": {
4.      "dynamic": "strict",
5.      "properties": {
6.        "name": {
7.          "type": "keyword"
8.        },
9.        "team": {
10.          "type": "keyword"
11.        },
12.        "role": {
13.          "type": "keyword"
14.        },
15.        "start_date": {
16.          "type": "date"
17.        },
18.        "country_code": {
19.          "type": "keyword"
20.        },
21.        "city": {
22.          "type": "keyword"
23.        },
24.        "location": {
25.          "type": "geo_point"
26.        },
27.        "technology": {
28.          "type": "keyword"
29.        },
30.        "region": {
31.          "type": "keyword"
32.        },
33.        "picture": {
34.          "type": "keyword"
35.        }
36.      }
37.    }
38.  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

映射中最重要的是:

  • geo_point是地图上使用的最重要的数据类型。
  • date 字段对于显示随时间的发展是必需的。

为简单起见,使用的示例数据集仅包括欧洲的社区团队:

`

1.  PUT team/_doc/david
2.  {
3.    "name": "David Pilato",
4.    "team": "community",
5.    "role": "Developer 🥑",
6.    "start_date": "2013-01-10",
7.    "country_code": "fr",
8.    "city": "Cergy",
9.    "location": {
10.      "lat": 49.05,
11.      "lon": 2.04
12.    },
13.    "technology": ["java", "elasticsearch", "search"],
14.    "picture": "https://avatars.githubusercontent.com/u/274222"
15.  }

17.  PUT team/_doc/philipp
18.  {
19.    "name": "Philipp Krenn",
20.    "team": "community",
21.    "role": "Developer 🥑 | EMEA Lead",
22.    "start_date": "2016-04-01",
23.    "country_code": "at",
24.    "city": "Vienna",
25.    "location": {
26.      "lat": 48.21,
27.      "lon": 16.37
28.    },
29.    "technology": ["java", "automation", "observability"],
30.    "picture": "https://avatars.githubusercontent.com/u/432211"
31.  }

33.  PUT team/_doc/adrienne
34.  {
35.    "name": "Adrienne de Vries",
36.    "team": "community",
37.    "role": "Community Programs",
38.    "start_date": "2019-12-02",
39.    "country_code": "nl",
40.    "city": "Rotterdam",
41.    "location": {
42.      "lat": 51.92,
43.      "lon": 4.48
44.    },
45.    "region": ["FR", "ES", "PT", "IT", "GR", "TR", "CY", "NL", "BE", "DK", "LU", "NO", "SE", "FI", "IS", "EE", "LV", "LT", "MA", "TN", "DZ"],
46.    "picture": "https://ca.slack-edge.com/T0CUZ52US-UQQ55JABU-56457843fc81-512"
47.  }

49.  PUT team/_doc/naoise
50.  {
51.    "name": "Naoise Rush",
52.    "team": "community",
53.    "role": "Community Programs",
54.    "start_date": "2022-02-28",
55.    "country_code": "gb",
56.    "city": "Belfast",
57.    "location": {
58.      "lat": 54.60,
59.      "lon": -5.93
60.    },
61.    "region": ["GB", "IE", "DE", "AT", "CH", "PL", "CZ", "SK", "SI", "HU", "RO", "BG", "MD", "UA", "HR", "RS", "BA", "AL", "XK", "ME", "MK", "IL", "SA", "EG", "AE", "JO", "LB", "KW", "QA", "OM", "BH"],
62.    "picture": "https://ca.slack-edge.com/T0CUZ52US-U033ZF1HPM3-3f8511dbc26f-512"
63.  }

65.  PUT team/_doc/carly
66.  {
67.    "name": "Carly Richmond",
68.    "team": "community",
69.    "role": "Developer 🥑",
70.    "start_date": "2022-04-25",
71.    "country_code": "uk",
72.    "city": "London",
73.    "location": {
74.      "lat": 51.55,
75.      "lon": 0.16
76.    },
77.    "technology": ["javascript", "frontend", "observability"],
78.    "picture": "https://avatars.githubusercontent.com/u/74931905"
79.  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

如上所示,我们有列出来开始工作的日期(start_date),所在的城市(city),以及 region 信息。这个 region 是指负责的地区。

我们接下来在 Kibana 中为 team 创建 data view:

 

 

 

 

这样我们就创建了一个叫做 team 的 data view。我们点击 picture 来进行修该设置:

 

如果我们点击上面的 picture 链接,它将会显示:

 

这样我们就为 picture 字段修改为 Url 格式。

设置完成后,你可以在 Discover 中查看基础文档并将时间范围更改为 10 年(默认为 15 分钟): 

添加第一个地图

Kibana 中的地图有很多功能,但示例会使其保持简单。 添加一个文档(Documents)类型的层: 

 

 

 

 

 

 

这就是我们让团队出现在地图上所需要的。点击上面的 Save & close 按钮。 如果你没有看到任何内容,请再次检查你是否选择了过去 10 年,而不仅仅是 15 分钟。 将鼠标悬停在其中一个上会显示他们的个人资料,你可以根据颜色判断他们的角色: 

我从图上面可以看到先前输入的五个文档。我们点击其中的一个文档:

我们可以看到该文档的所有信息。

Mapping time

基于每个团队成员的 start_date 字段,您可以显示它是如何随着时间的推移发展的,甚至可以逐年自动播放: 

这个对于我们筛查一个时间段的文档非常有用。比如,在疫情防控期间,我们筛查出来在一个时间段的文档变化。

在地图上进行搜索:

搜索是我们工作的核心。 因此,如果你想了解我们团队中的哪些人可以帮助你解决所有 “前端(frontend)” 问题,你也可以在地图上找到:

Mapping regions 

我们团队也有拥有某些区域的概念。 是时候向地图添加另一个图层了——这次是 Choropleth。 Elasticsearch 文档的 region 数组映射到国家/地区的 ISO 3166-1 alpha-2 代码。 我们可以将其限制为 “Community Programs 的角色,因为只有他们拥有区域:

 

 

 

 

 

 

从上面的图中我们可以看出来,有两个员工做 Community Programs 的。他们各自分管的区域显示图。 

帮助圣诞老人找到团队

要添加更多与圣诞节相关的内容,让我们帮助圣诞老人找到团队。 此信息应放入一个新索引中,并在一个文档中对 source 和 destination 地理点进行简单映射:

`

1.  PUT santa
2.  {
3.    "mappings": {
4.      "dynamic": "strict",
5.      "properties": {
6.        "@timestamp": {
7.          "type": "date"
8.        },
9.        "source": {
10.          "type": "geo_point"
11.        },
12.        "destination": {
13.          "type": "geo_point"
14.        }
15.      }
16.    }
17.  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

 这些是实际旅行路线的文件: 

`

1.  POST santa/_doc
2.  {
3.    "@timestamp": "2022-12-24T19:30Z",
4.    "source": {
5.      "lat": 48.21,
6.      "lon": 100
7.    },
8.    "destination": {
9.      "lat": 48.21,
10.      "lon": 16.37
11.    }
12.  }

14.  POST santa/_doc
15.  {
16.    "@timestamp": "2022-12-24T19:40Z",
17.    "source": {
18.      "lat": 48.21,
19.      "lon": 16.37
20.    },
21.    "destination": {
22.      "lat": 49.05,
23.      "lon": 2.04
24.    }
25.  }

27.  POST santa/_doc
28.  {
29.    "@timestamp": "2022-12-24T19:50Z",
30.    "source": {
31.      "lat": 49.05,
32.      "lon": 2.04
33.    },
34.    "destination": {
35.      "lat": 51.92,
36.      "lon": 4.48
37.    }
38.  }

40.  POST santa/_doc
41.  {
42.    "@timestamp": "2022-12-24T20:00Z",
43.    "source": {
44.      "lat": 51.92,
45.      "lon": 4.48
46.    },
47.    "destination": {
48.      "lat": 51.55,
49.      "lon": 0.16
50.    }
51.  }

53.  POST santa/_doc
54.  {
55.    "@timestamp": "2022-12-24T20:10Z",
56.    "source": {
57.      "lat": 51.55,
58.      "lon": 0.16
59.    },
60.    "destination": {
61.      "lat": 54.60,
62.      "lon": -5.93
63.    }
64.  }

66.  POST santa/_doc
67.  {
68.    "@timestamp": "2022-12-24T20:20Z",
69.    "source": {
70.      "lat": 54.60,
71.      "lon": -5.93
72.    },
73.    "destination": {
74.      "lat": 54.60,
75.      "lon": -20.00
76.    }
77.  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

在上面,我们写入了6个文档。它形成了圣诞老人的行走轨迹。我们按照介绍的方法为这个新的索引 santa 创建一个 data view。

我们接下来再添加一层,这次使用点对点。 在其中映射 source 和 destination:

 

 

 

 

 

总结 

我们希望这能给您一些关于如何将分布式团队放在地图上的想法。 Kibana 仍然可以做更多的事情 — Maps  的文档是一个很好的起点。