让跨 project 联查更轻松,SLS StoreView 查询和分析实践
作者:章建(处知)
概述
日志服务 SLS 是云原生观测和分析平台,为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务。SLS 提供了多地域支持 [ 1] ,方便用户可以根据数据源就近接入 SLS 服务,减少不必要网络延迟以及公网费用。然而,当前 SLS 并不支持跨域(更准确说是跨 project)进行查询和分析,如果需要将不同地域的数据进行联合查询或分析,该怎么办呢?
当前的做法是:通过加工任务将不同地域的数据复制到同一个 project 下(查询要求写到同一个 logstore)。然而,对于联合查询或分析不频繁的场景来说(比如定期生成报表),这样做成本显然太高(额外全量数据的存储费用和公网流量费用),而且比较繁琐(为每个地域的 logstore 创建加工任务)。有没有更好的方式解决这种问题呢?
为了解决上面的问题以及其他相关的问题,我们推出了 StoreView 相关的功能。StoreView 允许将多个 project(支持跨域)的 logstore 数据组合成一个虚拟的 logstore 使用,不仅支持跨 project 的联合查询和分析,还支持以 ad-hoc 的方式对数据进行隔离、富化以及对齐等。下面通过具体实例对 StoreView 功能加以详细说明,主要分为查询和分析两大块。
数据准备
本文测试数据来自两个不同地域的 project,具体信息说明如下:
为了方便测试 StoreView 功能,上面两个数据集的 schema 故意引入了两类不一致的地方,即字段 UnitsSold 的类型以及计价相关字段名称(walmart 采用 usd 计价,rtmart 采用 rmb 计价)。
查询
联合查询
首先,在任意一个支持 StoreView 功能的地域创建如下 StoreView 定义:
等待一分钟左右后,就可以在控制台像使用 logstore 一样来使用新建的 StoreView all_market_data 了。
从上面的执行结果(日志条目数量以及 historgram 的柱状图)不难看出,StoreView all_market_data 的查询结果和预期是完全匹配的。
数据隔离
当前 SLS 仅支持 logstore 级别的授权,即要么对整个 logstore 有读或写权限,要么没有。但有时用户希望某些子账号仅仅能访问 logstore 中的部分数据,之前是无法做到的。但有了 StoreView 功能后,这个就比较容易实现了。比如,不允许某个子账号访问 walmart-market 和 rtmart-mart 的全部数据,但允许他访问来自 China 的 market 数据,那么可以定义如下 StoreView:
上面的 StoreView定义中,对每个 logstore 加上了查询条件,限定了 StoreView 只能读取 Country 字段为 China 的数据。具体查询效果如下所示:
通过上面的查询对比可以知道,StoreView market_data_from_china 只能看到来自 China 的 market data,而其他地域的数据是无法查询到的。因此,StoreView 提供了灵活的数据隔离能力。
数据富化
当前 StoreView 联合查询多个 logstore 时,返回的是用户原始日志数据,而数据本身可能缺少一些重要的区分特性,比如日志数据具体来自那个底层的 logstore。因此,StoreView 还支持通过 SPL 语句进行数据富化以及加工操作(当前仅仅支持 where 和 extend 算子)。比如,希望 market_data_from_china 返回的结果中,可以显示具体数据来自底层哪个 logstore,则可以定义如下 StoreView:
上图红框中,| 线后面便是 SPL 语句,它为日志扩展了 logstoreName 字段,具体执行效果如下:
可以看到,返回的结果中增加了字段 logstoreName。当然,上面的 SPL 语句仅仅是为了说明富化功能,logstore 以及 project 信息其实已经自动包含在了日志的 tags 中了。另外,extend 算子是动态新增字段到返回结果中的,这种字段不能用于查询过滤,否则会报错。
分析
联合分析
除了能够基于 StoreView 对跨 project 进行联合查询外,还可以进行联合分析,比如对 Country 为 China 的 market 数据,按照 ItemType 统计订单的数量:
可以看到,对 StoreView 进行 SQL 分析和对 Logstore 进行 SQL 分析并没有什么区别。
meta columns
同 StoreView 进行查询类似,进行 SQL 分析时,服务端自动提供了两个 meta columns:project 和 logstore。通过这两个字段,用户可以在 SQL 中识别数据具体来自哪个 project 以及 logstore(可以在 where 条件中通过 project 或者 logstore 过滤 StoreView 的结果)。比如,当需要按照 project 对 StoreView 中的结果进行分析统计时,可以采用如下 SQL:
column 类型兼容处理
使用 SQL 分析时,对于 StoreView 下所有 logstore 共有的 column,如果它们的类型一致,那么在分析时不会有歧义。但如果类型不一致时,可能出现什么问题呢?比如上面 walmart-market 和 rtmarkt-market 两个 logstore 中都包含 column UnitsSold,但其中是一个 long 类型,另一个为 text 类型(本来也应该为 long,但创建索引时,配错了类型)。比如,按 Country 统计卖出货物的总件数:
上图中的 SQL,会报错,即参数不符合 sum 函数的要求。这是因为,当多个 logstore 定义了不同类型的同名 column 时,服务端会将这种 column 统一为 text 类型。因此,上面的 SQL 只要对 UnitsSold 做个类型转换,就能正常工作了。
column 自动补齐
StoreView 中,不仅存在类型不兼容的 column,还可能存在 column 名称没有对齐的情况,比如 logstore#1 包含(column#1, column#2),logstore#2 包含(column#2, column#3, column#4)。那么 StoreView 会包含哪些 column 呢?答案是:(column#1, column#2, column#3, column#4)。对于 logstore#1,column#3 和 column#4 会自动设置为 null;而对于 logstore#2,column#1 则会自动设置为 null。
对于上面的 SQL 结果,rtmart-market 因为没有包含 TotalRevenueUsd,所以 TotalRevenueUsd 列为 null;相反,对于 walmart-market,TotalRevenueRmb 列则为 null。
column 扩展和加工
对于 rtmart-market 和 walmart-market 两个 logstore 的所有数据,如果按照 region 统计 TotalRevenue,该怎么操作?因为 rtmart-market 的 TotalRevenueRmb 列和 walmart-market的 TotalRevenueUsd 列,不仅名称不一样,计价单位也不一样,要统计总收入,需要统一到相同的货币,比如采用如下 SQL:
虽然上面的 SQL 可以工作,但每次统计都要输入这么复杂的语句,显然不太方便,是否有更好的做法呢?必须有,和上面查询进行数据富化类似,StoreView 允许通过 SPL 句法对 SQL column 进行扩展,比如定义如下 StoreView:
上面 StoreView 定义中,通过 SPL 将 TotalRevenueRmb 和 TotalRevenueUsd 统一到相同语义的新增列 TotalRevenue,基于 StoreView all_aligned_market_data 按照 Region 统计总收入的 SQL 可以简化为:
总结
通过上面的实例分析可以看到,SLS StoreView 功能为用户提供了极为便捷的跨 project 查询和分析能力,用户不再需要通过创建加工任务来汇聚数据,节省了用户的使用成本。另外,StoreView 还集成了数据隔离的能力,提供了方便灵活的数据授权方式。当然,因为跨 project 进行查询和分析,会涉及到跨域读取数据,整个处理链路受网络影响可能较大。后期我们会不断完善 StoreView 的易用性、稳定性和性能,让用户基于 StoreView 就能轻松愉悦地查询分析全地域的数据,真正做到数据分析不受地域边界的限制。
相关链接:
[1] 多地域支持
https://help.aliyun.com/zh/sls/product-overview/supported-regions
相关文章:

让跨 project 联查更轻松,SLS StoreView 查询和分析实践
作者:章建(处知) 概述 日志服务 SLS 是云原生观测和分析平台,为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务。SLS 提供了多地域支持 [ 1] ,方便用户可以根据数据源就近接入 SLS 服务࿰…...
20240107-类型转换
1. 自动类型转换 不损失数据精度的前提下,可自动完成变量的类型转换;不损失数据精度指不将超出变量可表示范围的值赋给该变量。 2.强制类型转换 若出现精度损失,java不会自动完成类型转换,需强制进行,见下代码的第8…...
关于Linux PAM模块下的pam_listfile
讲《Linux下禁止root远程登录访问》故事的时候,说好会另开一篇讲讲pam_listfile。我们先看看pam_listfile的man文档怎么介绍的。 下面这些就好比人物的简介,甚是恼人;让人看得不明就里,反正“他大舅他二舅都是他舅”。可以直接跳…...

OKHttp调用第三方接口,响应转string报错okhttp3.internal.http.RealResponseBody@4a3d0218
原因分析 通过OkHttp请求网络,结果请求下来的数据一直无法解析并且报错,因解析时String res response.body().toString() 将toString改为string即可!...

弱电与电力工程领域,如何通过工程项目管理软件提升效率
在弱电与电力工程领域,通过益企工程云等工程项目管理软件提升效率的方法主要体现在以下几个方面: 1.智能化管理 自动化流程:益企工程云通过自动化处理日常任务和流程,减少手动操作,提高工作效率。 智能预警ÿ…...
引领实时数据分析新时代:阿里云实时数仓 Hologres
在数字化和智能化转型的浪潮中,数据已成为企业决策和运营优化的重要资产。传统的数据仓库解决方案虽然在一定程度上能够帮助企业管理数据,但随着业务需求的不断变化,实时数据处理和高效分析的能力显得愈加重要。为了应对这一挑战,…...

什么是中间件中间件有哪些
什么是中间件? 中间件(Middleware)是指在客户端和服务器之间的一层软件组件,用于处理请求和响应的过程。 中间件是指介于两个不同系统之间的软件组件,它可以在两个系统之间传递、处理、转换数据,以达到协…...

css中的部分文字特性
文章目录 一、writing-mode二、word-break三、word-spacing;四、white-space五、省略 总结归纳常见文字特性,后续补充 一、writing-mode 默认horizontal-tbwriting-mode: vertical-lr; 从第一排开始竖着排,到底部再换第二排,文字与文字之间从…...

PyQt5 UI混合开发,控件的提升
PromoteLabelTest.py 提升的类 import sys from PyQt5.QtWidgets import QApplication, QWidget,QVBoxLayout,QTextEdit,QPushButton,QHBoxLayout,QFileDialog,QLabelclass PromoteLabel(QLabel):def __init__(self,parent None):super().__init__(parent)self.setText("…...

IP查询于访问控制保护你我安全
IP地址查询 查询方法: 命令行工具: ①在Windows系统中,我们可以使用命令提示符(WINR)查询IP地址,在弹窗中输入“ipconfig”命令查看本地网络适配器的IP地址等配置信息; ②在Linux系统中&…...
SpringBoot数据层解决方案
文章目录 1. 数据层解决方案2. 数据源技术 1. 数据层解决方案 现有数据层解决方案技术选型:Druid MyBatis-Plus MySQL 数据源:DruidDataSource持久化技术:MyBatis-Plus / MyBatis数据库:MySQL 下面的研究就分为三个层面进行研…...
前端数据模拟器 mockjs 和 fakerjs
功能:帮助前端生成随机数据,独立于后端单独开发 一、mockjs 安装:npm install mockjs 优点:官网是中文。 缺点:目前该库已经无人维护,也没人解决github上的bug。 官网 github地址 二、fakerjs 安装…...
Python 类 Class
在 Python 中,类(Class)是一种创建对象(Object)的模板,它允许我们定义对象的属性和方法。类是 Python 中实现面向对象编程(OOP)的核心结构。 定义一个类 定义一个类的基本语法如下…...
PHP语言的并发编程
PHP语言的并发编程 引言 随着互联网技术的迅速发展,Web 应用的复杂性和用户并发请求的增加,要求开发者在构建高性能应用时考虑并发编程。并发编程允许程序在同一时间执行多个任务,这对于处理高流量网站、API 和实时应用程序至关重要。虽然 …...
小米智能哑铃上市,代理 IP 视角下的智能健身新篇
在智能科技与健康生活深度融合的时代,小米以其敏锐的市场洞察力和强大的创新能力,不断拓展智能生态版图。米家智能哑铃的发布,无疑是其在智能健身领域的又一重要举措。而当我们从代理 IP 的独特视角来审视这一产品,会发现其中蕴含…...
业务日志设计
当一个项目足够大的时候,我们需要将统计系统完全独立出去,那么就无法避免数据采集的问题,我们可以在业务触发处增加log日志来记录当前变化的原始数据,提供统计系统进行采集 设计一个统计系统的日志记录机制时,主要需要…...

对话|全年HUD前装将超330万台,疆程技术瞄准人机交互“第一屏”
2024年,在高阶智驾进入快速上车的同时,座舱人机交互也在迎来新的增长点。Chat GPT、AR-HUD、车载投影等新配置都在带来新增量机会。 高工智能汽车研究院监测数据显示,2024年1-10月,中国市场(不含进出口)乘用…...

【论文笔记】QLoRA: Efficient Finetuning of Quantized LLMs
🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: QLoRA: Efficient Finetun…...
计算机网络之---物理层的基本概念
物理层简介 物理层(Physical Layer) 是 OSI(开放系统互联)模型 中的第 1 层,它主要负责数据在物理媒介上的传输,确保原始比特(0 和 1)的传输不受干扰地从一个设备传送到另一个设备。…...

Burpsuite20241102macM1版安装
1、安装jdk11 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew update brew install openjdk11 echo export PATH"/opt/homebrew/opt/openjdk11/bin:$PATH" >> ~/.zshrc source ~/.zshrc j…...

基于Spring Boot 电商书城平台系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
HTML实战:爱心图的实现
设计思路 使用纯CSS创建多种风格的爱心 添加平滑的动画效果 实现交互式爱心生成器 响应式设计适应不同设备 优雅的UI布局和色彩方案 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <meta nam…...
由浅入深一文详解同余原理
由浅入深一文详解同余原理 一、同余原理的基本概念1.1 同余的定义1.2 剩余类与完全剩余系 二、同余原理的基本性质2.1 自反性2.2 对称性2.3 传递性2.4 加减性2.5 乘性2.6 幂性 三、同余原理的运算与应用3.1 同余运算在计算中的应用3.2 密码学中的应用3.3 日期与周期问题 四、案…...
STM32 HAL库函数学习 GPIO篇
1、void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, const GPIO_InitTypeDef *pGPIO_Init) GPIO外设属于是任何芯片的最基础功能 ,STM32各个系列的GPIO初始化都是一致的,有不同的是部分系列在IO复用使用了单独一个成员属性Alternate 来表明这个IO的具体复用功…...

【开发技巧指北】IDEA修改默认绑定Maven的仓库地址
【开发技巧指北】IDEA修改默认绑定Maven的仓库地址 Microsoft Windows 11 家庭中文版 IIntelliJ IDEA 2025.1.1.1 默认的IDEA是有自己捆绑的Maven的(这是修改完毕的截图) 修改默认的Maven配置,路径是IDEA安装路径下的plugins D:\Softwares\I…...
GIT命令行的一些常规操作
放弃修改 git checkout . 修改commit信息 git commit --amend 撤销上次本地commit 1、通过git log查看上次提交的哈希值 2、git reset --soft 哈希值 分支 1.创建本地分支 git branch 分支名 2.切换本地分支 git checkout mybranch; 3.创建一个新分支并…...

VBA数据库解决方案二十:Select表达式From区域Where条件Order by
《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...
MapReduce 分布式计算模型
练习题 单词计数 需求:统计每个单词数量 "Hello World Hello Hadoop Hello MapReduce" 实现: map阶段:拆分成单词,执行map函数输出键值对<word, 1> <Hello, 1> <World, 1> <Hello, 1> <…...

Python 训练营打卡 Day 41
简单CNN 一、数据预处理 在图像数据预处理环节,为提升数据多样性,可采用数据增强(数据增广)策略。该策略通常不改变单次训练的样本总数,而是通过对现有图像进行多样化变换,使每次训练输入的样本呈现更丰富…...
Flask中关于app.url_map属性的用法
目录 一、app.url_map 是什么? 二、可以查看哪些信息? 三、示例:打印所有路由 四、结合 url_for() 使用 五、常见用途场景 六、结合 Flask CLI 使用 总结 app.url_map 是 Flask 中非常重要的一个属性,用于查看或操作整个应用的 URL 路由映射表(routing map)。它展…...