在现代云计算环境中,数据的实时监控和分析变得尤为重要。Azure Monitor 提供了一套强大的工具,能够帮助从无状态的链接缩短器应用中自动收集信息,并通过 Application Insights 提供深入的分析和洞察。本文将带了解如何利用这些工具,以及如何通过 Kusto 查询语言来挖掘数据的潜在价值。
Azure Monitor 自动从服务器无状态链接缩短器应用中收集信息,并通过 Application Insights 展示分析和洞察。日志通过 Log Analytics 自动捕获,可以使用 Azure Data Explorer 来调查数据。存储和处理交互式分析的服务叫做 Kusto,它具有独特的查询语法,类似于 SQL。Kusto 有大量的深入文档,但在开始 .NET 数据产品经理新角色并开始研究 .NET 用户如何在他们的应用程序中管理数据的遥测数据之前,一直对它感到困惑。想分享一些经历。
使用 Application Insights 增强无服务器函数就像在创建主机时勾选一个框一样简单。这会在不触碰代码的情况下生成大量的指标。可以使用额外的功能来扩展开箱即用的功能。自定义了代码,以发出一个列出点击事件媒介的事件。例如,如果在 Twitter 上分享了链接,就会发出一个 "twitter" 事件。代码如下:
public static TelemetryClient telemetry = new TelemetryClient() {
#if !DEBUG
InstrumentationKey = Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY")
#endif
};
// other code
telemetry.TrackEvent(medium);
// other code
非常简单,对吧?现在让找到结果。首先,导航到 Application Insights 实例在门户中。滚动到 Monitoring 并选择 Logs。这将带到数据浏览器。得到了一个方便的数据源列表,可以工作,并有一个文本框输入查询。已经突出显示了两个有趣的数据源。
真正理解 Kusto 的 "啊哈" 时刻来自于它是如何工作的。如果把它想象成一个管道,会做得很好。让先检查 customEvents 数据源。仅仅声明数据源名称就将其注入到管道中,并返回其行。
customEvents
注意在浏览器中得到了完整的自动补全。这对于表格和属性都有效。
首先,想确保不要加载太多的数据。五行应该足以塑造数据。所以,在管道中插入一个命令来限制行数:
customEvents | take 5
这给了五行:
让对 pageViews 做同样的事情。
pageViews | take 5
太好了!现在可以开始做一些更有趣的事情了。
目标是:在过去的24小时内,向展示点击次数最多的前五个页面,并按媒介进行细分。
首先,需要过滤过去一天的数据,并按页面(URL存储在 name 属性中)进行汇总。
pageViews | where timestamp >= ago(24h) | summarize totalclicks=count() by name
这是结果。注意总共有50条记录。
接下来,想要按点击次数排序,并获取前五名。这里 Kusto 与 SQL 在如何编写查询方面有所不同:在 SQL 中,需要考虑集合,并可能使用表表达式或诉诸于临时表。在 Kusto 中,只是在遍历一个管道。所以像这样添加顺序和总结:
pageViews | where timestamp >= ago(24h) | summarize totalclicks=count() by name | order by totalclicks desc | take 5
结果是在过去24小时内点击次数最多的页面。
想在稍后的管道中使用点击次数最多的前五个页面,而不是尝试加入到完整的查询中,可以简单地为其创建别名,并在稍后的管道中像视图一样引用它。以下是如何为查询创建别名:
let top5pages=pageViews | where timestamp >= ago(24h) | summarize totalclicks=count() by name | order by totalclicks desc | take 5;
这不会自己运行,因为 Kusto 期望每个查询都以表格数据结束。已经为查询创建了别名,但还没有使用它。要使其 "可运行",只需在管道中表达视图:
let top5pages=pageViews | where timestamp >= ago(24h) | summarize totalclicks=count() by name | order by totalclicks desc | take 5;
top5pages;
提示:很容易将查询想象成有多个步骤。然而,一切都被认为是一个单一的工作批次,Kusto 将检查整个语句集,以优化并产生结果。
现在想看看自定义事件。遇到的第一个问题是事件属性 name 与页面属性 name 相同。因此,想将属性名称更改为 type。customEvents 数据源有很多属性。只对两个感兴趣:type 或 medium,以及 operation_Id。这是一个可以回联到 pageViews 数据源的唯一标识符。
extend 语句允许注入新的列。可以分配一个文字,或者像在这里做的那样,将其从一个属性移动到另一个属性。要将 name 转移到 type,简单地添加:
| extend type=name
project 语句允许指定想要的属性,就像 SQL 中的 select。这是完整的查询:
customEvents | where timestamp >= ago(24h) | extend type=name | project type, operation_Id;
结果是类型和操作标识符的列表。
将最后一个视图别名为 custom。意识到有两个过滤器看起来像是回溯24小时。确保它们是一致的很有意义,所以也为那个表达式创建了一个别名。这是进展(这个查询还不能运行,因为它还没有返回任何数据)。
let cutoff = ago(24h);
let top5pages = pageViews | where timestamp >= cutoff | summarize totalclicks=count() by name | order by totalclicks desc | take 5;
let custom = customEvents | where timestamp >= cutoff | extend type=name | project type, operation_Id;
现在让得到一些结果!
想包括自定义事件的确切匹配,所以第一个连接需要是一个 inner join。只想包括点击次数最多的前五个页面,所以也将与那个表进行 inner join。最后,想按页面点击次数最多的顺序排列。这是管道中的最后一个查询。注意是如何像连接普通表格或数据源一样连接到创建的别名的。
pageViews | join kind=inner custom on operation_Id | join kind=inner top5pages on name | summarize clicks=count(), total=max(totalclicks) by name, type | extend page=name | project page, type, clicks, total | order by total desc, page asc, clicks desc;
注意连接语法(如果属性被命名为不同的东西,比如 id,语法将是 custom on $left.id == $right.operation_Id)。创建了两个标量列:一个包含媒介内的点击次数,另一个包含页面的总点击次数。最后,塑造并排序了数据。
别名帮助构建了查询,并使其更容易阅读和更易于维护。这是没有使用别名的确切相同查询,它产生了相同的结果:
pageViews | join kind=inner (customEvents | where timestamp >= ago(24h) | extend type=name | project type, operation_Id) on operation_Id | join kind=inner (pageViews | where timestamp >= ago(24h) | summarize totalclicks=count() by name | order by totalclicks desc | take 5) on name | summarize clicks=count(), total=max(totalclicks) by name, type | extend page=name | project page, type, clicks, total | order by total desc, page asc, clicks desc;
"展开" 方法并不像维护起来那么容易。别名在需要多次连接到同一个查询时也更有用。查询代码重用,胜利!
这是文章中最短的部分,因为要可视化数据,只需点击 Chart 选项。它立即渲染出基于数据的最有意义的图表,同时允许根据需要调整类型和内容。在这里,Kusto 足够聪明,能够确定想按页面分组,并查看媒介或类型对点击的相对影响。
立即明显,Twitter 是参与度的明显领导者,其次是 LinkedIn,位居第二。现在已经有一个工作的查询,可以保存它,并在毫秒内看到一个实时视图,显示过去24小时内点击次数最多的前五个页面。