**StoreView SQL,让数据分析不受地域限制**
**引言**
日志服务SLS是云原生观测和分析平台,为Log、Metric、Trace等数据提供大规模、低成本、实时的平台化服务。SLS提供了多地域支持,方便用户可以根据数据源就近接入SLS服务,减少不必要网络延迟以及公网费用。然而,如果需要将不同地域的数据进行联合统筹分析时,该怎么办呢?
SLS近期推出的StoreView功能,可以协助用户便捷地进行跨域、跨project的查询和统计分析。StoreView允许将多个project下(支持跨域)的logstore数据组合成一个虚拟的logstore使用,用户可以像使用一个logstore那样,使用StoreView进行各种查询分析。
**数据准备**
下面以4个demo projects对几个常遇到的场景进行说明,这4个projects来自不同的地域,信息如下:

其中,每个project都包含一个名为user-queries的logstore,包含的核心字段如下:
| 字段名称 | 类型 | 含义 |
|---|---|---|
| requestId | 字符串 | 请求的唯一ID |
| status | 整数 | 请求状态,200,400, 500等 |
| latencyMs | 整数 | 请求延迟 |
| resultRows | 整数 | 返回的结果行数 |
| prcessedBytes | 整数 | 处理的原始数据量(字节) |
| prcessedRows | 整数 | 处理的原始数据量(行数) |
| query | 字符串 | SQL的具体内容 |
进入任意一个project,参考文档数据集(StoreView)概述 ,创建如下StoreView定义。

**全域业务指标统计**
这里以核心指标processedBytes和processedRows为例,来统计分析所有地域的query数据。比如,我们可以分析一段时间内,全域每小时处理的数据量。

我们可以统计某段时间内流量最大的Top5的logstore。

我们可以按分钟粒度对全域的平均处理数据量进行同比分析(1天前)。
* | select t, diff[1] as today, diff[2] as yesterday from (
select t, ts_compare(bytes, 86400) as diff
from (select date_trunc('minute', __time__) as t, avg(processedBytes) as bytes from log group by t limit all)
group by t
order by t
)

**全域线上运维分析**
对于运维场景,我们经常需要统计分析线上的错误或异常等情况,特别是对线上所有地域的错误情况进行统计分析,比如错误比例、错误类型的分布等。
统计错误比例

统计错误分布

统计错误时序

**按地域对比统计分析**
StoreView SQL提供了__project__以及__logstore__两个meta字段,它们分别表示数据原始所对应的project以及logstore名称,比如,我们可以通过以下SQL来对比分析每个project下一天的处理数据量。

另外,通过SPL语句,我们可以为StoreView下每个logstore的数据扩充新的字段,比如我们增加一个额外的region字段(其他project进行类似操作)。

通过下面的SQL结果可以看到,我们可以基于新增的region进行统计分析了。

**数据字段按需对齐**
在SQL场景下,StoreView这个虚拟表支持的字段是所有底层logstore开启了统计分析字段的超集。对于多个logstore中同名但类型不同的分析字段,会归一化到varchar类型。但对于名称不同、含义相同的字段,怎么进行统一分析呢?比如,下面的场景中,统计每个project下query的平均延迟,结果发现sls-cn-guangzhou-queries对应的结果为null,这是为什么呢?

经过分析发现,原来sls-cn-guangzhou-queries中的query数据并不包含latencyMs这个字段,它的数据中对应的字段名称实际上为latency。针对这种情况,我们仍然可以通过SPL的extend算子解决这种问题,即为latency字段增加一个alias字段(当前SPL会默认将所有字段作为varchar处理,下面SPL中进行了类型转换)。

经过上面的操作后,SQL的执行结果就符合预期了,具体如下所示。

**数据扫描分析**
正常情况下,SQL分析中用到的字段会要求开启统计功能,否则会报错。如果需要在SQL中使用没有开启统计功能的字段,StoreView支持这种场景吗?同普通logstore一样,StoreView也支持扫描分析,能够在不开启字段统计的情况下,对字段进行统计分析。
比如,我们可以通过扫描模式统计每个region下15分钟内返回的结果总数,结果如下所示。需要说明的是,扫描模式下,所有的字段类型都是varchar,因此在进行聚合之前,下面的SQL对resultRows的类型进行了转换。另外,扫描模式下也会对处理的总数据量有限制。

**结语**
通过上面的实例分析可以看到,SLS StoreView功能为用户提供了极为便捷的跨project查询和分析能力,用户不再需要通过创建加工任务来汇聚数据,节省了用户的使用成本。当前,控制台直接SQL分析以及大盘展示已经支持StoreView(告警目前还不支持,后续也会考虑放开)。当然,因为跨project进行查询和分析,会涉及到跨域读取数据,整个处理链路受网络影响可能较大。后期我们会不断完善StoreView的易用性、稳定性和性能,让用户基于StoreView就能轻松愉悦地查询分析全地域的数据,真正做到数据分析不受地域边界的限制。