1. 程式人生 > >【翻譯】OpenTSDB 2.3 文件-查詢過濾器(Query Filters)

【翻譯】OpenTSDB 2.3 文件-查詢過濾器(Query Filters)

查詢過濾器(Query Filters)

任何資料庫系統的關鍵功能是使用某種形式的過濾來啟用獲取完整資料集的子集。自版本1.x以來,OpenTSDB提供了過濾功能,擴充套件功能從2.2及更高版本開始。過濾器目前對標籤值進行操作。這意味著在獲取資料時,必須是資料庫中存在的指標和tag。

示例資料

下面解釋了每個過濾器的用法,需要使用資料,本文中用到的是以下資料。它由一個單一的指標metric 組成,在各種標籤tag上定義了多個時間序列。T1中僅給出一個數據點作為示例。

在這裡插入圖片描述

分組

分組,是使用聚合函式和過濾器把多個時間序列組合成一個時間序列的過程。預設情況下,OpenTSDB按指標metric對所有內容進行分組,如果查詢返回10個時間序列並且聚合器為sum時,則所有10個時間序列將隨時間相加聚合成一個值。有關如何合併時間系列的詳細資訊,請參閱[聚合](

http://opentsdb.net/docs/build/html/user_guide/query/aggregators.html)。

要避免在沒有任何聚合的情況下對序列進行分組和獲取,在OpenTSDB2.2以後可以使用聚合none。或者,可以使用OpenTSDB 2.2及更高版本,每個過濾器基都可以禁用分組。有關如何操作的資訊,請參閱API文件。

OpenTSDB 1.x - 2.1

在最初的OpenTSDB版本中,最多隻有2.1,只有兩種型別的過濾器可供使用,它們是隱式配置的,用於分組。允許的兩個操作符是:

    • 星號(或萬用字元)將為檢測到的每個唯一標記值返回單獨的分組結果。例如,如果標籤鍵host與有web01和web02兩個值,返回結果中將分為兩組,一個在web01和一個上web02。
      | - 管道(或literal_or)將僅為指定的確切標記值返回單獨的結果。即它將僅匹配具有給定標籤值的時間序列和每個匹配的組。

可以為每個查詢提供多個過濾器,並且結果始終一起進行AND運算。這些過濾器仍可在2.x及更高版本中使用。

示例

以下示例使用v1 HTTP URI語法,其中m指定由聚合器,冒號後面是指標,括號中的是metric和值,這裡使用的是等號。

例1: http://host:4242/q?start=1h-ago&m=sum:sys.cpu.system{host=web01}
在這裡插入圖片描述

在這種情況下,聚合標籤集將為空,因為時間序列4和5具有與整個集合不相同的標籤。

例2: http://host:4242/q?start=1h-ago&m=sum:sys.cpu.system{host=web01,dc=dal}


在這裡插入圖片描述

例3: http://host:4242/q?start=1h-ago&m=sum:sys.cpu.system{host=*,dc=dal}
在這裡插入圖片描述

這次host為*,dc為dal。這將對host標記鍵進行分組,並返回每個唯一主機標記值的時間序列。

例4: http://host:4242/q?start=1h-ago&m=sum:sys.cpu.system{dc=dal|lax}
在這裡插入圖片描述

這裡,|運算子僅用於匹配dc查詢中提供的標記鍵的值。因此,TSD將任何時間序列與這些值組合在一起。該host標籤被移動到聚集標籤列表中由於每個時間序列有一個host標籤,並有用於標記鍵多個值。

**警告:**由於這些過濾器是有限的,如果使用者編寫#1,#4和#5這樣的時間序列,則可能會因聚合時間序列而返回意外結果,這些時間序列可能包含一個公共tag但不同的附加tag。2.3和顯式標記在某種程度上解決了這個問題。

OpenTSDB 2.2

在OpenTSDB 2.2中,添加了一個更靈活的過濾器框架,允許禁用分組以及其他過濾器型別,如正則表示式和萬用字元。過濾器框架是可插入的,允許繫結到外部系統,例如資產管理或供應系統。

**允許在同一標記鍵上使用多個過濾器,並且在處理時,它們將進行AND運算,**例如,如果我們有兩個過濾器host=literal_or(web01),並且host=literal_or(web02)查詢將始終返回空。如果同一個標記鍵包含兩個或更多個過濾器,其中一個啟用了分組group by,則另一個不啟用,則對於該標記鍵上的所有過濾器,分組group by實際上將是啟用的true。

警告:某些型別的過濾器可以導致查詢慢,特別是正則表示式regexp,萬用字元wildcard和不區分大小寫的過濾器。在從儲存中獲取資料之前,會基於配置的過濾器生成基於UID創的資料庫過濾器,因此使用區分大小寫的literal_or過濾器總是比正則表示式regexp好,因為我們可以將字串解析為UID並將其傳送到儲存系統進行過濾。相反,如果您要求使用pre,post或infix過濾的正則表示式或萬用字元,TSD必須使用標記鍵UID從儲存中檢索所有行,然後對於每個唯一行,將UID解析回字符串,然後在生成結果。此外,有大量字元的過濾器集將在後儲存處理,為了避免為後端儲存系統處理建立大量過濾器,將限制過濾器資料量。此限制預設為4096並可通過tsd.query.filter.expansion_limit引數進行配置。

顯式標籤

從2.3及更高版本開始,如果您知道給metric的所有tag,則可以使用該explicitTags功能大大提高查詢延遲。這有兩個好處:

  • 對於具有高基數的metric,後端可以切換到更高效的查詢,以從儲存中獲取較小的資料子集。(特別是在2.4)
  • 對於具有不同tag的度量標準,可以使用此標準來避免聚合不應包含在最終結果中的時間序列。

顯式標記將建立一個底層儲存查詢,該查詢僅獲取具有給定tag的那些行。這可以允許資料庫跳過不相關的行並在更短的時間內回答。

例子

以下示例使用v2 HTTP URI語法,其中m引數由聚合器,冒號,explicit_tagsURI標誌組成,然後括號中的tag標籤和標籤過濾器由等號分隔。

例1: http://host:4242/q?start=1h-ago&m=sum:explicit_tags:sys.cpu.system{host=web01}
在這裡插入圖片描述

這解決了標籤鍵不一致的問題,允許我們只挑選#4時間序列。

例2: http://host:4242/q?start=1h-ago&m=sum:explicit_tags:sys.cpu.system{host=}{dc=}
在這裡插入圖片描述

此查詢使用v2 URI語法,以避免將dc標記鍵放在第二組花括號中進行分組。這允許我們僅篩選出具有a host和dctag鍵的時間序列,同時僅對host值進行分組。它跳過時間序列#4和#5。

注意:使用HBase(0.98及更高版本)或Bigtable時,請確保tsd.query.enable_fuzzy_filter在配置中啟用(預設情況下啟用)。向後端提供了一個特殊的過濾器,它允許向前跳到我們查詢所需的行,而不是迭代每個行鍵並比較正則表示式。

注意:使用2.4,TSDB將get針對後端發出多個請求,而不是使用掃描程式。這可以通過多個因素減少查詢時間,特別是對於高基數時間序列。但是,過濾器必須只包含literal_or。

內建2.x過濾器

以下列表是OpenTSDB附帶的內建過濾器。可以將其他過濾器作為外掛載入。每個標題都是type在URI或JSON查詢中使用的過濾器。在編寫URI查詢時,通過在標記鍵的等號後面放置過濾器名稱並將過濾器值放在括號中來使用過濾器。例如{host=regexp(web[0-9]+.lax.mysite.com)}。對於JSON查詢,只需使用過濾器名稱作為type引數,並使用過濾器值作為filter引數,例如

{ 
  “type” : “regexp” ,
  “filter” : “web [0-9] +。lax.mysite.com” ,
  “tagk” : “host” ,
  “groupBy” : false 
}

以下示例使用URI語法。

literal_or
採用單個文字值或以|管道分隔的值列表,並返回與區分大小寫的基礎上的結果匹配的任何時間系列。這是一個非常有效的過濾器,因為它可以將字串解析為UID並將其傳送到儲存層以進行預過濾。在SQL中,這類似於IN或=謂詞。

例子

host=literal_or(web01|web02|web03) 在SQL中: WHERE host IN ('web01', 'web02', 'web03')
host=literal_or(web01) 在SQL中: WHERE host = 'web01'

ilteral_or

與literal_or功能相同但不區分大小寫。請注意,這不像lteral一樣有效,因為它必須從儲存中後處理所有行。

not_literal_or
區分大小的literal_or,將返回與給定值列表不匹配的系列。高效,因為它可以通過儲存進行預處理。

not_iliteral_or
不區分大小寫not_literal_or。

wildcard
提供區分大小寫的字尾,字首,中綴和多中綴過濾。萬用字元是星號(星號)*。可以使用多個萬用字元。如果僅給出星號,則過濾器有效地返回包含標記鍵的任何時間序列(並且是可以預處理的有效過濾器)。在SQL領域,這類似於LIKE謂詞,具有更大的靈活性。

例子

host=wildcard(*mysite.com) 在SQL中: WHERE host='%mysite.com'
host=wildcard(web*)
host=wildcard(web*mysite.com)
host=wildcard(web*mysite*)
host=wildcard(*) 這相當於v1中基本分組,並且效率很高。 

iwildcard
同樣wildcard但不區分大小寫。

正則表示式
從儲存中提取後使用POSIX相容正則表示式的過濾器。過濾器使用Java的內建正則表示式操作。根據使用的查詢方法,請小心轉義特殊字元。

例子

regexp(web.) 在SQL中: WHERE host REGEXP 'web.
regexp(web[0-9].mysite.com)

載入過濾器
要在OpenTSDB 2.2及更高版本中顯示已載入的過濾器,請呼叫HTTP /api/config/filters端點。這將列出載入的外掛以及描述和示例用法。

外掛
當開發人員新增外掛時,我們會在這裡列出它們。

要開發外掛,只需擴充套件net.opentsdb.query.filter.TagVFilter類,根據外掛文件建立JAR 並將其放在plugins目錄中。一開始,TSD將搜尋外掛並載入它。如果執行錯誤,TSD將無法啟動並將記錄異常。