背景
随着IT数字化发展,企业级业务量不断增加,产生的日志量也逐渐加大,由此产生的问题定位也越来越复杂。为了快捷完成日志数据采集、消费、投递以及查询分析等功能,提升运维、运营效率,建立DT时代海量日志处理能力。阿里云日志服务(Log Service,简称SLS)应运而生。
日志服务的典型应用场景包括:数据采集与消费、数据清洗与流计算 (ETL/Stream Processing)、数据仓库对接(Data Warehouse)、日志实时查询与分析。本文将围SLS日志服务中“日志实时查询与分析”的一些基础操作做一些技术分享。
日志实时查询与分析
实时查询分析(LogAnalytics)可以实时索引LogHub中数据,提供关键词、模糊、上下文、范围、SQL聚合等丰富查询手段。
- 实时性强:写入后即可查询。
- 海量低成本:支持PB/Day索引能力,成本为自建方案15%。
- 分析能力强:支持多种查询手段,及SQL进行聚合分析,并提供可视化及报警功能。
基本概念
日志(Log)
日志(Log)是系统在运行过程中变化的一种抽象,其内容为指定对象的某些操作和其操作结果按时间的有序集合。文件日志(LogFile)、事件(Event)、数据库日志(BinLog)、度量(Metric)数据都是日志的不同载体。在文件日志中,每个日志文件由一条或多条日志组成,每条日志描述了一次单独的系统事件,是日志服务中处理的最小数据单元。
日志组(LogGroup)
日志组(LogGroup)是一组日志的集合,写入与读取的基本单位。
日志主题(Topic)
一个日志库内的日志可以通过日志主题(Topic)来划分。用户可以在写入时指定日志主题,并在查询时指定查询的日志主题。
项目(Project)
项目(Project)是日志服务中的资源管理单元,用于资源隔离和控制。您可以通过项目来管理某一个应用的所有日志及相关的日志源。它管理着用户的所有日志库(Logstore),采集日志的机器配置等信息,同时它也是用户访问日志服务资源的入口。
日志库(Logstore)
日志库(Logstore)是日志服务中日志数据的收集、存储和查询单元。每个日志库隶属于一个项目,且每个项目可以创建多个日志库。
分区(Shard)
每个日志库分若干个分区(Shard),每个分区由MD5左闭右开区间组成,每个区间范围不会相互覆盖,并且所有的区间的范围是MD5整个取值范围。
索引
索引是一种存储结构,用于对日志数据中的一列或多列进行排序。您只有配置索引后,才能进行查询和分析操作。不同的索引配置,会产生不同的查询和分析结果,请根据您的需求,合理配置索引。
常用SLS-SQL语法
基本语法
example:
student_type : freshman or junior |SELECT time_series(__time__,'1d','%Y-%m-%d','0')ASTime, student_type,count(*)as PV GROUPBYTime, student_type ORDERBYTimeASC, student_type ASC
查询语句和分析语句以竖线(|)分割
(|)前的部分表示查询语句,指定日志查询时的过滤规则,返回符合条件的日志。查询语句可以为关键词、数值、数值范围、空格、星号(*)等。 如果为空或星号(*),表示无过滤条件;
(|)后的部分表示分析语句,用于对查询结果或全量数据进行计算和统计。
获取日志聚类结果
*|select a.pattern, a.count,a.signature, a.origin_signaturesfrom(select log_reduce(3)as a from log)limit1000
字符串函数
使用问号(?)拆分request_uri字段的值并返回第一个子串
*|SELECTcount(*)AS PV, split_part(request_uri,'?',1)AS Path GROUPBY Path ORDERBY pv DESCLIMIT3
同比环比函数
计算当前1小时和昨天同时段的访问PV比值:
*|SELECT compare(PV,86400)FROM(SELECTcount(*)AS PV FROM log)
返回结果如下图所示:
结果共有三个参数
- 第一个参数表示当前时间范围的结果。
- 第二个参数表示n秒前(例子中表示86400秒,即一天前),当前时间范围的结果。
- 第三个参数表示当前时间范围和n秒前该时间范围,结果的比值。
当您需要分列显示分析结果时,可执行如下查询和分析语句:
*|SELECT diff[1]AS today, diff[2]AS yesterday, diff[3]AS ratio FROM(SELECT compare(PV,86400)AS diff FROM(SELECTcount(*)AS PV FROM log))
IP地理函数
统计请求总数Top10的省份
*|SELECTcount(*)as PV, ip_to_province(client_ip)AS province GROUPBY province ORDERBY PV descLIMIT10
client_ip:日志中表示IP的字段;
ip_to_province(client_ip) :分析目标IP地址所属省份,返回结果为省份的中文名称。
技术细节
Maven依赖
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-sts</artifactId><version>3.0.0</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>3.5.0</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.5</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency>
创建日志服务Client
String accessId = "your_access_id"; //阿里云访问密钥AccessKey ID。更多信息,请参见访问密钥。阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维。 String accessKey = "your_access_key"; //阿里云访问密钥AccessKey Secret。 String host = "cn-hangzhou-intranet.log.aliyuncs.com"; //日志服务的域名。更多信息,请参见服务入口。此处以杭州为例,其它地域请根据实际情况填写。 Client client = new Client(host, accessId, accessKey); //创建日志服务Client。
开启SLS日志服务
请求语法
POST https://sls.aliyuncs.com/ ?AccessKeyId=yourAccessKeyId &Action=OpenSlsService &Format=Format &SignatureMethod=HMAC-SHA1 &SignatureNonce=SignatureNonce &SignatureVersion=SignatureVersion &Timestamp=Timestamp &Version=Version &Signature=Signature
创建Project
请求语法
POST / HTTP/1.1 Authorization: LOG yourAccessKeyId:yourSignature x-log-bodyrawsize: 0 User-Agent: UserAgent x-log-apiversion: 0.6.0 Host: ProjectName.Endpoint x-log-signaturemethod: hmac-sha1 Date: GMT Date Content-Type: application/json Content-MD5: Content-MD5 Content-Length: ContentLength Connection: Keep-Alive { "projectName": ProjectName, "description": Description }
创建LogStore
请求语法
POST /logstores HTTP/1.1 x-log-bodyrawsize: 0 Content-Type: application/json Content-Length: 140 Content-MD5: F3EFCA28442BEEC487451FAD30D78650 x-log-apiversion: 0.6.0 x-log-signaturemethod: hmac-sha1 Host: ProjectName.Endpoint Date: GMT Date Authorization: LOG yourAccessKeyId:yourSignature, x-log-date: Fri, 27 Nov 2020 08:25:10 GMT { "logstoreName" : logStoreName, "ttl": ttl, "shardCount": shardCount, "enable_tracking": enable_tracking, "autoSplit": autoSplit, "maxSplitShard": maxSplitShard, "appendMeta": appendMeta }
其中,host由Project名称和日志服务Endpoint构成,您需要在host中指定Project。
创建EtlJob
该步骤由SLS团队创建,用来绑定项目的分发规则,配合本地创建的EtlMeta使用。
创建EtlMeta
// 创建metaValue对象, 指定创建etlMeta的必要参数JSONObjectmetaValueJsonObject=newJSONObject(); metaValueJsonObject.put("projectName", "projectName"); metaValueJsonObject.put("logStoreName", "logStoreName"); metaValueJsonObject.put("role", "role"); ... // 创建etlMeta对象, 用来配合etlJob进行日志分发EtlMetaetlMeta=newEtlMeta(); etlMeta.setEnable(true); etlMeta.setMetaKey("metaKey"); etlMeta.setMetaName("metaName"); etlMeta.setMetaTag("metaTag"); etlMeta.setMetaValue(metaValueJsonObject); client.createEtlMeta("projectName", etlMeta);
可视化
仪表盘创建
通过SLS日志分析语句,可以绑定对应的图表,完成分析结果的可视化展示
控制台内嵌
1.获取STS临时AK和Token;
2.使用获得的临时AK和Token获取securityToken;
3.生成免登录链接。
http://signin.aliyun.com/federation?Action=Login &LoginUrl=<登录失效跳转的地址,一般配置为自建Web配置302跳转的URL。> &Destination=<实际访问日志服务页面,支持查询页面和仪表盘页面。如果有参数,则需要使用encodeURL对参数进行转码。> &SigninToken=<获取的登录Token>
PS:
以上为这次开发过程中,通过不断的学习和尝试梳理的一些重点流程,如果有纠正或者补充,欢迎讨论。