摘要:業(yè)務(wù)實(shí)時(shí)監(jiān)控服務(wù)( ARMS)是一款阿里云應(yīng)用性能管理(APM)類監(jiān)控產(chǎn)品。借助本產(chǎn)品,您可以基于前端、應(yīng)用、業(yè)務(wù)自定義等服務(wù),迅速便捷地為企業(yè)構(gòu)建秒級響應(yīng)的業(yè)務(wù)監(jiān)控能力。
業(yè)務(wù)實(shí)時(shí)監(jiān)控服務(wù)( ARMS)是一款阿里云應(yīng)用性能管理(APM)類監(jiān)控產(chǎn)品。借助本產(chǎn)品,您可以基于前端、應(yīng)用、業(yè)務(wù)自定義等服務(wù),迅速便捷地為企業(yè)構(gòu)建秒級響應(yīng)的業(yè)務(wù)監(jiān)控能力。
其中自定義監(jiān)控作為該產(chǎn)品的時(shí)序計(jì)算和存儲的基礎(chǔ),整合和封裝了數(shù)據(jù)收集,消息通道,實(shí)時(shí)計(jì)算,時(shí)序存儲,以及在線報(bào)表等多種先進(jìn)互聯(lián)網(wǎng)技術(shù)組件。
本文主要介紹一下 ARMS 自定義監(jiān)控中聚合邏輯以及時(shí)序查詢設(shè)計(jì)。
離線計(jì)算方式
以一個(gè)sql查詢?yōu)槔?/p>
select count(col1), sum(col2) as sum from data_table
where filterCols
group by groupByCols
order by sum desc/asc
limit limitNum
其中第一部分可以抽象為:聚合(sum, count)、過濾(where)和分組(group by)。
第二部分則是在第一部分的計(jì)算結(jié)果上進(jìn)行排序(order by)和截?cái)?limit)。
實(shí)時(shí)計(jì)算方式
隨著用戶數(shù)據(jù)量的增加,離線的計(jì)算會(huì)越來越慢,難以滿足用戶在某些場景下的實(shí)時(shí)性要求,因此很多解決方案中引入了實(shí)時(shí)計(jì)算。
與離線計(jì)算相比,實(shí)時(shí)計(jì)算有兩點(diǎn)區(qū)別:
需要用戶給定時(shí)間字段。ARMS支持兩種時(shí)間,event time(用戶切分的時(shí)間)和processing time(ARMS切分中的_sysTime)。
數(shù)據(jù)處理分為了預(yù)計(jì)算和后計(jì)算兩個(gè)階段。預(yù)計(jì)算階段計(jì)算原始數(shù)據(jù),并存儲預(yù)計(jì)算的結(jié)果,使得數(shù)據(jù)量大大減少。當(dāng)用戶需要實(shí)時(shí)查詢數(shù)據(jù)的時(shí)候,可以基于預(yù)計(jì)算的結(jié)果,通過后計(jì)算方式,得到最終結(jié)果。
預(yù)計(jì)算
select count(col1), sum(col2) as sum from origin_data
where filterCols
group by groupByCols and timeInterval
其中col1、col2、filterCols、groupByCols、time 都是日志切分后的字段,timeInterval是流數(shù)據(jù)切分所用的時(shí)間間隔,如一分鐘、五分鐘等。
后計(jì)算
select count(col1'), sum(clo2') from 預(yù)計(jì)算結(jié)果
where filterCols'
group by groupByCols' and timeInterval'
TimeRange (minTime, maxTime)
其中col1'、clo2'、filterCols'、groupByCols' 中的字段都是來自預(yù)計(jì)算之后的結(jié)果。
timeInterval' 是用戶查看每個(gè)數(shù)據(jù)點(diǎn)的時(shí)間間隔,TimeRange (minTime, maxTime)是查詢數(shù)據(jù)的時(shí)間區(qū)間。
ARMS 解決方案
針對上面分析,ARMS 通過兩個(gè)步驟解決了用戶的預(yù)計(jì)算和后計(jì)算的問題。
預(yù)計(jì)算
在ARMS 自定義監(jiān)控中,在任務(wù)配置的第三個(gè)步驟(第一個(gè)步驟是配置日志路徑,第二個(gè)步驟是配置切分),用戶需要配置數(shù)據(jù)集(數(shù)據(jù)的預(yù)計(jì)算邏輯),如下圖

其中指標(biāo)是數(shù)據(jù)列的聚合計(jì)算、過濾是filter,維度是group by的條件。在ARMS中,維度分位兩種,一種是平鋪維度,一種是下鉆維度。
平鋪維度是指將聚合結(jié)果按照所有的維度直接存儲,比如按照col1、col2、col3字段進(jìn)行g(shù)roup by,存儲結(jié)果就是一個(gè)包含所有col1、col2、col3字段的全集。
下鉆維度是對平鋪維度的一種優(yōu)化,比如對于機(jī)器基礎(chǔ)監(jiān)控?cái)?shù)據(jù),在問題發(fā)生時(shí),用戶往往需要從機(jī)房維度先發(fā)現(xiàn)問題,然后下鉆到該機(jī)房的應(yīng)用分組,最終定位到某臺機(jī)器IP的問題。這個(gè)時(shí)候,可以針對平鋪維度中的機(jī)房、分組、IP建立單向索引,即機(jī)房中的分組索引,分組中的IP索引,以加快查詢速度。這就是下鉆維度的作用,類似還有省、市、區(qū)的例子。
以三個(gè)維度col1, col2, col3進(jìn)行g(shù)roup by為例,平鋪維度和下鉆維度的不同如下:
平鋪維度在時(shí)序數(shù)據(jù)庫中存儲的是如下三個(gè)維度的聚合結(jié)果:
col1, col2, col3, 聚合指標(biāo)
聚合指標(biāo)里面包含sum、count、max等聚合的結(jié)果
下鉆維度在時(shí)序數(shù)據(jù)庫中存儲的是逐級展開的三個(gè)維度的聚合結(jié)果,相當(dāng)于一個(gè)以空間換時(shí)間的解決方案。
col1,聚合指標(biāo)
col1, col2,聚合指標(biāo)
col1, col2, col3,聚合指標(biāo)
后計(jì)算
在ARMS中,預(yù)計(jì)算的數(shù)據(jù)存儲在時(shí)序數(shù)據(jù)庫中,后計(jì)算則是基于時(shí)序存儲的查詢時(shí)計(jì)算。
與OpenTSDB類似,ARMS提供了 過濾、聚合、降精度和匯總等多種計(jì)算方式。如下圖所示:

在維度中選擇為“全部”表示會(huì)根據(jù)該維度再次group by,選擇“固定值”表示會(huì)在該維度進(jìn)行過濾。
在指標(biāo)中,支持選擇單個(gè)指標(biāo)或者指標(biāo)的組合計(jì)算。
TopN則對應(yīng)到order by desc 和 limit。
時(shí)間粒度可以用戶選擇,也可以由系統(tǒng)根據(jù)用戶選擇的時(shí)間區(qū)間確定。目前提供的有一分鐘、五分鐘、十五分鐘、一小時(shí)、一天等。
相對OpenTSDB,ARMS還提供了數(shù)據(jù)集與數(shù)據(jù)集的 JOIN 操作、占比操作,如果兩個(gè)數(shù)據(jù)集包含同樣的維度,則數(shù)據(jù)集可以JOIN,然后基于JOIN后的數(shù)據(jù)做指標(biāo)復(fù)合計(jì)算。
總結(jié)
ARMS 自定義監(jiān)控將用戶實(shí)際使用中的日志采集、切分、實(shí)時(shí)聚合、存儲,以及在線報(bào)表整合為統(tǒng)一的解決方案,方便了用戶的使用,歡迎大家嘗試。