背景信息
Cloud Native
随着数字化新时代的全面展开以及 5G 与物联网(IoT)技术的迅速普及,操作系统正面临前所未有的变革需求。在这个背景下,华为公司自主研发的鸿蒙操作系统(HarmonyOS)应运而生,旨在满足万物互联时代的多元化设备接入、高效协同和安全可靠运行的需求。
HarmonyOS 不仅着眼于智能手机市场,更是全球首个面向全场景智能生态的操作系统,支持从手机、平板电脑到智能家居、穿戴设备乃至工业控制等多种终端形态。2024 年 1 月 18 日正式推出 HarmonyOS NEXT 鸿蒙星河开发者预览,深圳市于 2024 年 3 月 3 日也发布了支持开源鸿蒙原生应用发展的 2024 年行动计划。
日志服务(SLS)介绍
Cloud Native
日志服务(SLS,后文简称 SLS)是云原生观测与分析平台,为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务。SLS 一站式提供数据采集、加工、查询与分析、可视化、告警、消费与投递等功能,全面提升您在研发、运维、运营、安全等场景的数字化能力。
在构建复杂而庞大的应用和智能生态系统过程中,SLS 作为开发调试、性能优化、运维监控和故障排查的重要基础设施。为确保各类应用程序能够在鸿蒙操作系统上实现无缝对接并高效利用 SLS,对 SLS SDK 进行 HarmonyOS 原生适配成为必然之举。
SDK 特性介绍
HarmonyOS 下的 SLS SDK 基于共同的基座 C Core SDK 适配,底层适配鸿蒙NDK。C Core 部分使用纯 C 语言编写,对性能进行了极端优化(包括缓存管理、文件管理、PB 序列化等),能够适用于 IoT、移动端、服务端等各种场景。SDK 提供 ArkTS 语言原生调用 API。SDK 具备以下特性:
-
异步 -
客户端线程写入无阻塞 -
日志队列异步发送 -
聚合&压缩上传 -
日志聚合发送(支持按超时时间、日志数、日志大小聚合) -
支持 lz4、zstd 压缩 -
多实例 -
支持创建多个实例分别发送到不同的目标 -
可以实例配置独立,互不影响 -
缓存 -
支持设置可允许占用的缓存内存上限 -
超过内存缓存上限时,日志写入会失败 -
自定义标识 -
支持设置自定义 Tag 和 Topic -
断点续传 -
支持日志缓存到本地文件,只有发送成功才会删除,确保日志上传 At Least Once -
日志上下文 -
支持查看某条日志的上下文,可以更好的定位问题
SDK 使用最佳实践
Cloud Native
在使用 HarmonyOS SDK 进行日志采集之前,您需要做一些准备工作。
-
已开通日志服务(SLS),请参见开通日志服务 [ 1] 。 -
已创建好对应的 Project 和 Logstore,请参见管理 Project [ 2] 和管理 Logstore [ 3] 。 -
已创建并获取 AccessKey,请参见访问密钥 [ 4] 。阿里云账号 AccessKey 拥有所有 API 的访问权限,风险很高。强烈建议您创建并使用 RAM 用户进行 API 访问或日常运维。RAM 用户需具备操作日志服务(SLS)资源的权限。具体操作,请参见为 RAM 用户授权 [ 5] 。 -
[可选]搭建 HarmonyOS 开发环境。开发鸿蒙应用需要使用 HarmonyOS 的 IDE 进行开发,具体内容请参考 HarmonyOS 官网开发文档 [ 6] 。
安装 SDK
在项目的 entry 或 library 目录下执行如下命令。
ohpm install @aliyunsls/producer --registry=https://ohpm.openharmony.cn/ohpm
以上命令执行完成后,在 entry 或 library 目录下的 oh-package.json5 文件中会自动增加以下信息。
"dependencies": {
"@aliyunsls/producer": "^0.1.0"
}
集成 SDK
SDK 安装成功后,您可以按照实际业务需要,在指定的 ets 文件中导入 SLS 模块。
import { AliyunLog } from "@aliyunsls/producer"
let aliyunLog: AliyunLog = new AliyunLog(
"https://cn-qingdao.log.aliyuncs.com", // 需要根据实际业务需要,替换为您Project所在Region
"test-project-yuanbo", // 需要根据实际业务需要,替换为您的Project
"applog", // 需要根据实际业务需要,替换为您的Logstore
"
" ,"
" ,"
" // 仅当AccessKey是通过STS方式获取时才需要);
日志采集
完成 SDK 的初始化之后,可以通过以下方式完成日志的采集。
aliyunLog.addLog(new Map(
[
// 根据实际业务需要,调整您需要上报的业务字段
["from", "Home"],
["page", "HomePage"],
]
));
场景一:查询和可视化分析
数据通过 SDK 采集上来之后,我们可以通过 SLS 控制台进行日志的查询和分析。
首先在 SLS 控制台 Project 列表中找到您的 Project,并进入到 Project 页面。如下:
注意: 如果您的日志是在开启索引之前写入的,您需要重建索引后才能看到历史写入的数据。如何重建索引?您可以参考文档重建索引 [ 13] 。
可视化分析示例一:分析 CartPage 的访问趋势
基于示例数据,我们可以通过 SQL 查询出 page 字段的访问趋势,如下:
* and page: CartPage | select date_trunc('minute', __time__) as minute, count(*) as cnt group by minute order by minute asc
-
“|”之前的部分,是通过查询语句 page: CartPage 过滤出 page 为 CartPage 的页面数据。请参考更多关于查询语法 [ 14] 的信息。 -
“|”之后的部分,是通过 SQL 语句对过滤出来的数据进行分析,即:通过 date_trunc 语句把时间对齐到分钟级别,然后使用 count(*) 计算出每分钟页面的访问次数。请参考更多关于分析语法 [ 15] 的信息。
通过 SLS 可视化能力,可以对查询分析的结果使用丰富的图表展示,如下图是通过“线图 Pro”类型的图表,按照时间升序展示每分钟的页面访问次数。
可视化分析示例二:分析 CartPage 页面的访问来源
基于示例数据,可以使用如下查询分析语句查询 Cart 页面的来源分布:
* and page: CartPage | select "from" as "from", count(*) as cnt group by "from"
备注: 因为 from 是 SQL 的保留字段,因此示例中使用了双引号""对 from 进行包装。
下图是通过饼图 Pro 类型的图表,绘制的来源页面分布。
SLS 拥有非常强大的可视化分析能力,以上仅是非常简单的示例。实际使用中,可能会涉及到多种指标的同比/环比,漏斗转化实时分析等等。SLS 对此提供了非常灵活和丰富的能力进行支持。更多信息可以参考查询与分析 [ 16] 以及可视化 [ 17] 。
如果从鸿蒙设备上采集到的原始数据格式没有事先约定好,或者数据格式较为复杂,或者需要对个别字段做富化/脱敏等,您可以使用 SLS 数据加工能力对原始数据做富化和清洗。您可以参考以下步骤。
可根据实际业务的需要,提前对该 Logstore 进行索引等配置。
您可以通过 Logstore 名称右侧的“数据加工”超链接进入到数据加工配置页面。
如上图,您可以参考以下步骤配置数据加工任务。
b. 在脚本编辑区域,根据实际业务需要输入数据加工脚本规则,示例如下:
# 富化__tag__:__client_ip__字段,提取出省、市、经纬度等信息
e_set("x", geo_parse(v("__tag__:__client_ip__")))
e_json("x", prefix="geo_") # 平铺x节点,并增加geo_前缀
e_drop_fields("x")
# 平铺content节点
e_json("content")
e_drop_fields("content")
如下图,是以上数据加工脚本的预览结果:
数据加工预览结果符合预期后,您就可以保存当前数据加工任务了,后续的具体操作请参考创建数据加工任务 [ 19] 。
除了上文中提到的查询与可视化分析、日志加工处理之外,SLS 还支持基于业务日志创建自定义告警监控业务,通过流处理、批处理(定时SQL)功能对数据进一步加工、聚合处理,通过消费与投递功能投递业务数据到 OSS、MaxCompute 等。您可以通过访问日志服务(SLS) [ 20] 官网文档等方式进一步了解 SLS 各种功能,助力您的业务发展。
总结
Cloud Native
除了以上能力外,SLS 还提供基于 OTel(OpenTelemetry)协议的多平台数据采集插件,您可以借助这些插件实现端到端的 Trace 数据采集和分析能力。
-
通过 OpenTelemetry 接入 Android Trace 数据 https://help.aliyun.com/zh/sls/user-guide/import-trace-data-from-android-apps-to-log-service-1
-
通过 OpenTelemetry 接入 iOS Trace 数据 https://help.aliyun.com/zh/sls/user-guide/import-trace-data-from-ios-apps-to-log-service-46
-
通过 OpenTelemetry 接入 Flutter/Dart Trace 数据 https://help.aliyun.com/zh/sls/user-guide/import-trace-data-from-flutter-and-dart-applications-by-using-opentelemetry-sdk-for-flutter
-
通过 OpenTelemetry 接入 C++ Trace 数据 https://help.aliyun.com/zh/sls/user-guide/import-trace-data-from-cpp-applications-to-log-service
-
接入 Web Trace 数据 https://help.aliyun.com/zh/sls/user-guide/import-data-from-web-pages-to-log-service
-
接入小程序 Trace 数据 https://help.aliyun.com/zh/sls/user-guide/import-data-from-mini-programs-to-log-service