GraphGists

Geoptima 移动网络事件日志收集

摘要

Geoptima 是一个用于收集蜂窝网络上移动设备产生的被动和主动事件的应用。事件日志可用于分析用户在移动网络上的体验,并帮助跟踪性能问题。例如,在网络的特定区域访问 Facebook 时,iPhone 4 的表现是否比 iPhone 5 更好或更差?有关创建此数据的产品的更多信息,请参阅 Geoptima 的描述。或者,观看我在 vimeo 上的原始视频 https://vimeo.com/17321571

此 GraphGist 描述了一种为瑞典一家名为“Operator X”的假设移动网络收集和管理数据的方法。我自己的手机,一部 HTC One,是主要的示例设备,但大多数其他信息都是匿名的。

数据模型

可以使用 graphviz dot 图来展示数据模型。

allocation1024
图 1. 我们的数据模型

底部浅色的节点代表主要的信息载体,即 JSON 编码的事件文件。这个模型不管理事件本身,只管理文件,因为目的是针对每个文件决定这些数据属于哪里。谁应该访问这些数据,以及如何获取这些数据。管理这些规则的部分在绿色的子图中,图的其余部分为我们将要进行的查询提供了便捷的结构。一旦看到下面的示例查询,这就会更容易理解。

使用 Cypher 构建模型

我们将分阶段构建模型。从最简单的部分开始,即用户和项目。可以使用下面的 Cypher 查询来构建这个子图。

现在我们有了一个简单的图,包含一个项目和三个用户,为了方便起见,还有用于遍历到项目和用户的节点。我们还为用户分配了项目,这意味着访问权限。在实际应用中,访问权限的处理方式要复杂得多,但在此示例中我们保持简单,因为我们希望专注于事件日志数据管理。

可视化工具根据我们使用 Neo4j 2.0 标准为节点分配标签的事实,很方便地将用户标记为蓝色,项目标记为红色。在构建更复杂的图之前,让我们先执行几个简单的查询。

查询图

我们将展示几个在此图上运行的有用查询,例如

  • 谁有权访问该项目?

  • 该项目使用什么规则来决定数据所有权?

  • 'Craig' 为多少设备收集数据?

  • 'Craig' 收集了多少数据?

  • Craig 收集数据持续了多少天?

到目前为止,在这个简单图上只能执行上述第一个查询,所以在构建更多内容之前先尝试一下。

项目

我们来执行一个基本查询。谁有权访问“Operator X”数据?

MATCH (u)-[:su]->(p)
WHERE p.name = 'Operator X'
RETURN u.name AS `Users with access to Operator X data`

三个已定义的用户中有两个有权访问“Operator X”数据。

项目分配规则

现在项目的目的是收集数据。我们需要定义收集哪些数据的规则。让我们先添加两套规则,一套基于设备的内部设备身份编号,另一套基于设备实际运行的移动网络。在实际网络中,这两种类型的规则都很常用。

MATCH (project:Project)
WHERE project.name = 'Operator X'
CREATE
(filter_plmn:Filter {name:"Filter PLMN"}),
(filter_devices:Filter {name:"Filter Devices"}),
(f1:FilterPLMN {name:"Operator X", mcc:'240', mnc:'08'}),
(f2:FilterPLMN {name:"My Operator", mcc:'240', mnc:'18'}),
(f3:FilterPLMN {name:"XTele 2", mcc:'240', mnc:'28'}),
(fd:FilterDevices {name:"Test Devices", devices:[
  '354436058915420','358506046830281','356451041578183','351503053121388','353328059211902'
]}),
(project)-[:filter]->(filter_plmn),
(project)-[:filter]->(filter_devices),
(filter_plmn)-[:filter]->(f1),
(filter_plmn)-[:filter]->(f2),
(filter_plmn)-[:filter]->(f3),
(filter_devices)-[:filter]->(fd)

现在我们可以问这些问题:

  • 选择了多少个运营商?

  • 还包括了多少个特定的测试设备?

选定的运营商

在将数据分配给“Operator X”时,将选择多少个运营商?

MATCH (p:Project)-[:filter*]->(f:FilterPLMN)
WHERE p.name = 'Operator X'
RETURN f.name AS Name, f.mcc AS mcc, f.mnc AS mnc

如果设备在由上述任何一个网络运营商提供服务时收集数据,其数据将与项目“Operator X”关联。

选定的测试设备

MATCH (p:Project)-[:filter*]->(f:FilterDevices)
RETURN f.name AS Name, f.devices AS Devices

如果上面列出的五台设备中的任何一台收集数据,它将被分配到项目“Operator X”。

设备管理

到目前为止,我们只看了用于决定应该收集哪些数据的模型。现在我们来看一下实际收集的数据。我们将为上述过滤器中列出的设备之一,我的手机,一个身份编号为 '354436058915420' 的 HTC One 设备,建模样本数据。

现在图开始看起来相当复杂了。这实际上是页面顶部 graphviz 示例的完整版本。我们对布局的控制不如 graphviz,因此这更难理解,但现在我们可以使用 Cypher 查询它了。

收集的数据

我们在这个图上尝试两个查询:

  • Craig 收集了多少事件?

  • Craig 收集数据持续了多少天?

MATCH (u:User)-[:USED_DEVICE]->(d)-[:ASSOC]->(ds)-[:files]->(f)-[:DATE]->(dd)
WHERE u.name = 'Craig'
RETURN u.name AS Name ,ds.imei AS imei,ds.imsi AS imsi,dd.date AS Date

上面的查询回答了第二个问题。我们从用户遍历图,经过该用户使用的设备,以及设备-SIM 卡关联到文件,以及这些文件包含事件的日期。但是,如果我们只想要天数,我们不应该写出整个表格。相反,我们可以使用 count() 函数,例如:

MATCH (u:User)-[:USED_DEVICE]->(d)-[:ASSOC]->(ds)-[:files]->(f)-[:DATE]->(dd)
WHERE u.name = 'Craig'
RETURN count(dd.date) AS `# Days`

现在我们可以看到我们收集了 9 天的数据。

既然我们知道如何使用 count() 等函数,我们再试一个函数 sum() 来汇总所有事件文件的事件属性:

MATCH (u:User)-[:USED_DEVICE]->(d)-[:ASSOC]->(ds)-[:files]->(f)-[:DATE]->(dd)-[:JSON]->(json)
WHERE u.name = 'Craig'
RETURN count(json.events) AS `# Events`,sum(json.events) AS `Total Events`,sum(json.events)/count(json.events) AS `Avg Events/File`,min(json.events) AS `Min Events/File`,max(json.events) AS `Maximum Events/File`

因此我们可以清楚地看到,我们在三个文件中收集了 1005 个事件,平均每个文件 335 个事件。

摘要

上述示例是作为 AmanziTel 的 Geoptima 数据收集系统某个数据收集组件升级时进行内部文档和头脑风暴的一部分而制作的。这并不是正在使用的实际数据收集系统的精确模型,但确实代表了真实系统正在进行的一些决策逻辑。使用 Neo4j 作为数据库,促进了产品管理的数据建模方面,也方便了实际产品的开发。

© . All rights reserved.