匯總新舊事件的統計數據
我們希望將 CDN 日誌提供給 Graphite,並在其中找到匯總數據(不同 HTTP 狀態程式碼的比率、平均響應大小、平均記憶體命中率等)
然而,日誌只是偶爾上傳給我們,有時甚至是亂序的——偶爾,早上的日誌可以在晚上上傳,也就是下午的日誌上傳和處理後的幾個小時。此外,因為 CDN(顯然)有多個伺服器和數據中心,不同的日誌可以覆蓋重疊的時間段。
這意味著,任何聚合器都需要保持對所有早期統計數據的訪問,以便在處理新日誌時能夠增強聚合……
什麼——如果有的話——可以做到這一點?以及如何配置 logstash 來輸入它?謝謝!
眾所周知,這是一個複雜的問題。你在你的問題中標記了 Logstash,所以我假設你有這個。
攝取日誌是 Logstash 所做的。它有一個
file {}
輸入外掛:input { file { path => [ '/opt/export/cdn_logs/*.csv' tags => [ 'cdnlogs' ] } }
和一個
csv {}
過濾器來簡化 CSV 數據的攝取。filter { if 'cdnlogs' in [tags] { csv { source => "message" columns => [ 'cdndate', 'host_server', [...] 'response_time' ] } } }
如果您沒有 CSV 數據,也許這些行是看起來相當正常的 Apache 格式,一切都不會失去。您可能需要花時間與 grok 相處。那是它自己的事。
只要您注意保留時間戳並且不使用明顯不保留它們的statsd ,日期排序就不是問題。如果您還沒有這樣做,Logstash 可以獲取日誌文件中的日期並將其作為事件的日期/時間戳。
filter { date { match => [ "cdndate", "ISO8601" ] } }
這將日誌行的日期/時間戳作為事件的時間戳。酷,現在把它變成有用的東西。
Logstash 的庫存數據儲存是 elasticsearch , Elastic(該公司)正忙於嘗試將其作為與 InfluxDB 或 OpenTSDB 等專用工具一樣好的時間序列數據儲存。可以,儘管根據我的經驗,專用的性能更好。所有這些都可以,假設你輸入正確,以正確的順序儲存亂序事件,以便以後的查詢可以吸收新資訊。
Logstash的
graphite {}
輸出將保留時間戳,如果您願意,您可以使用石墨作為備份儲存。
influxdb {}
存在和輸出外掛,opentsdb {}
並將您的數據放入真正的時間序列數據庫。從那裡,近期數據的聚合/匯總(距您的解釋幾天)應在查詢時完成。像grafana這樣的工具可以在其中幾個數據儲存前面,並使顯示更容易。一旦您越過了日誌到達的風險區域,您就可以執行稍後的 ETL 過程以基於完整的數據集生成數據庫內聚合/匯總。然後根據需要清除完整詳細日誌。
簡而言之,方法: