大數據時代里,運維工程師的自我修養
“凡是過去,皆為序曲”
— 莎士比亞
前言:本文其實是給公司寫的一篇文章,不過因為時間倉促,當時文章并沒有關于代碼的分析,只是關于數據的展示,不過覺得很有價值,所以再做分享。
了解我的人,當然知道,本寶寶要大家跟我做的第一件事是什么~
首先,大家跟我念,Python大fa好。
本文皆是一家之言,如有偏頗還望指正。
在筆者的看來,如果數據不能可視化話,那么很大程度來說就是在扯淡,當然數據可視化也僅僅是萬里長征第一步。數據就像一堆堆的石子,也許不能就這一篇文章帶領大家觀其全貌,但至少管中窺豹,可見一斑。
那么數據到底長什么樣呢?
它可能長這樣。
又或者是這樣
如果你 Excel 足夠牛逼我想你是能夠用 excel 做出足夠厲害的圖的,但也只是足夠而已。
在筆者看來數據至少是長這樣。
再或者是這樣的。
注:上面使用的是 ELK 套件
ELK安裝文檔,參考: http://youerning.blog.51cto.com/10513771/1726338
但這只是冰山一角,還遠遠不夠,工具誰能用,怎么用是一個層次,在這基礎上再次利用則是另一個層次,為了文章篇幅,本文主要著重于后者并將視線鎖定在日志數據,其他數據暫不考慮。
日志的數據至少得有三個作用
一:數據應該能說明問題或者現象。
二:數據應該能解決問題。
三:數據應該能預測與預防問題。
第一點很好理解那就是,數據在可視化的過程能夠很直觀的說明問題或者現象,即使通過最基本的提取過濾,我們能夠知道在一段時間內多大的訪問量,客戶端的設備是什么,響應時間多少,在往下細化,應該是每個 ip 的訪問次數,并且訪問了什么內容,常訪問什么內容,在知道響應時間的前提上,了解哪個訪問鏈接耗時最長等等,以及一些可能職責之外的事,具體細節請自行腦洞。
下面是簡單的全球訪問 IP 熱點圖:
注:不要問我為什么不用 ELK 自帶的熱點圖,兩個字,任性 ~
第二點,既然日志能說明問題當然能解決問題,日志文件除了最基本的 info 記錄,當然還有 debug 信息,通過 debug 信息我們知道程序運行到什么地方拋出了這個 bug ,為什么拋出這個 bug ,為了第一時間響應,我們還得快速定位到拋出 bug 的主機。
通過簡單的查詢我們可以快速定位到 404 狀態發生的主機,及其發生時間,以及客戶端的使用設備為什么,以及在訪問什么的時候拋出 404 。
第三點,問題在一定程度上并不可怕,可怕的是不能及時處理以及反復出現卻束手無策,所以怎樣有效的利用數據的基礎上再配合可靠并實時監控報警機制就顯得至關重要了。而關于預測,可以通過的一定的算法數據都量化,然后評估以及模擬。
談完了基礎,我們著重談談日志數據的再次利用。
也主要分為三個部分:
一:簡單統計,無論通過 rrdtool 或者 Excel ,或者 Python ,只要有數據,通過預選及數據清洗,就能得到自己想要的數據,在擁有數據的情況下,可視化也就顯得自然而然了。
二:統計細化,數據的可視化可能只是數據分析的一部分,因為可視化只能展示很簡單的結果,并不能聽見數據內心中吶喊的聲音,所以一定程度的統計技術以及編程基礎相當重要,慶幸的是 Python 有足夠的支持庫。
三:統計分析,這一方面可能較于大多數人并無用處,并且并不關心,所以在此略過。
一:簡單統計
單日的 Top IP , Top URL , Top City 開始吧。
Top IP
Top URL
Top 城市
由上面三個圖,我們就能直觀知道我們當日最常訪問的 IP , URL ,以及城市,單個 IP 太頻繁并次數過多我們需要注意, URL 可以幫助我們評估,而城市可以讓我們知道服務的受眾分布情況,而最簡單的一個作用可能就是 CDN 加速了,其他方面請大家自行腦洞,這里不做展開。
二:統計細化
我們在上面的基礎上再次細化,比如每個城市中的終端設備使用情況,如下圖
當然也可以反過來看
三:統計分析
我們簡單看看用戶終端設備,安卓與蘋果的相關系數。
基本走勢圖分析
以及各終端相關關系,如下
再或者
相關關系。
無論是從走勢或者相關系數,當日安卓與蘋果存在一定的的相關性。
在第三部分的附圖中,可能大多數人除了走勢圖,大都看不懂,在這里也不會過多的講解各個參數以及所對應的關系,因為講解這些內容的時間可能比這一篇文章還會長,雖然這并算不上大數據,但是還是想借用《大數據時代》里的一句話,作為本文的結尾。“大數據告訴我們“是什么”而不是“為什么”。在大數據時代,我們不必知道現象背后的原因,我們只要讓數據自己發聲。”
注:因為是取的其中一天的數據,在誤差存在的同時數據處理過程中也存在也有很多的不規范,但這篇文章主要是為了給大家一些關于數據的認識。
好吧,上面就是傳說中的PPT了,就算你不看文字內容,但是你也大概能知道通過數據可視化,我們能夠將數據的展現形式做到上面程度,而下面的內容只要就是關于其中一部分可視化的代碼講解。
因為本文的數據是基于Elasticsearch存儲的,所以先決條件,你得有存在Elasticsearch里的數據內容,如果你對Pandas有所了解,你可能看看代碼也就知道怎么回事了
# -- coding: utf-8 --==============================================================================
用于生成Top IP,Top URL,歷史 Top IP,Top URL
==============================================================================
import pandas as pd from pandas import DataFrame import matplotlib.pyplot as plt import numpy as np import seaborn as sns from elasticsearch import Elasticsearch import arrow
es api
es = Elasticsearch(["http://IP:9200/"])
時間設定
time_now = arrow.now().format("X") + "000"
index_today = "logstash-" + arrow.now().format("YYYY.MM.DD") index_all = "logstash-*"
time_yesterday = arrow.now().replace(days=-1).format("X") + "000"
time_year = arrow.now().replace(years=-1).format("X") + "000"
查詢字段
q_url="xxx_url" q_ip="xxxx_ip"
查詢語句設定函數
def top_search(query_str): rets = """{ "size":0, "query":{ "filtered":{ "filter":{ "bool":{ "must":[ { "term":{"type":"xxxxx_access"}} ] } }, "query": { "query_string": { "query": "!xxxxx", "analyze_wildcard": true } } } }, "aggs":{ "%s":{ "terms":{"field":"%s", "size":15} } } }""" %(query_str,query_str + ".raw") return rets
執行查詢
today_top_ip = es.search(index=index_today,body=top_search(q_ip)) today_top_url = es.search(index=index_today,body=top_search(q_url)) year_top_ip = es.search(index=index_all,body=top_search(q_ip)) year_top_url = es.search(index=index_all,body=top_search(q_url)) df_today_ip = DataFrame(today_top_ip["aggregations"][q_ip]["buckets"]) df_today_url = DataFrame(today_top_url["aggregations"][q_url]["buckets"]) df_all_ip = DataFrame(year_top_ip["aggregations"][q_ip]["buckets"]) df_all_url = DataFrame(year_top_url["aggregations"][q_url]["buckets"]) p1 = sns.factorplot(x="key",y="doc_count",data=df_today_ip, kind="bar",palette="summer") p1.set_xticklabels(rotation=90) p1.set_titles("Today Top 15 IP") p1.savefig("topip_today.png",dpi=100) p3 = sns.factorplot(x="key",y="doc_count",data=df_all_ip, kind="bar",palette="summer") p3.set_xticklabels(rotation=90) p3.set_titles("Top 15 IP") p3.savefig("topip.png",dpi=100)</pre>
通過上面的代碼,我們能夠生成當日的Top 15 IP以及歷史Top 15 IP。
值得注意的是,你是能夠單純通過Kibana過濾出這些數據的,并且也很好看,但是為什么用Python呢,因為通過Kibana能夠數據可視化,不過對于數據的再利用就不那么理想了,比如生成報表或者一些更高級的可視化定制,這里主要是為了給大家一個通過Python調用Elasticsearch APi的基本認識。
下面主要挑幾個重要的部分講解。
首先安裝依賴庫:
pip install elasticsearch至于pandas之類的科學分析庫安裝請參考: http://youerning.blog.51cto.com/10513771/1711008
然后基本調用。
from elasticsearch import Elasticsearch import arrowes api
es = Elasticsearch(["http://IP:9200/"])</pre>
查詢語句參考官方:https://www.elastic.co/guide/en/elasticsearch/reference/1.7/search.html
doc = """{"size":0, "query":{ "filtered":{ "filter":{ "bool":{ "must":[ { "term":{"type":"xxxxx_access"}} ] } }, "query": { "query_string": { "query": "!xxxxx", "analyze_wildcard": true } } } }, "aggs":{ "ip":{ "terms":{"field":"xxx_ip", "size":15} } } }"""上面的語句的意思分別是返回查詢結果0 =>size = 0
然后查詢條件type為“xxxx_access”的數據,并查詢非”xxxxx”的內容,即過濾有xxxx的字符串。
然后就是我們主要用到的aggs,aggs代表聚合,因為Elasticsearch的其中一個強大之處,就是關于數據的處理,我們有過aggs,聚合條件為xxx_ip,所以返回的結果是統計過的結果,比如這個IP一共多少次,而這里的我們設置size=15,即返回15條聚合過的數據。
然后我們執行查詢:
In [19]: es.search(index=index_today,body=top_search(q_ip))
![]()
查詢結果如上
總結:數據的使用多種多樣,只要你腦洞夠大 ~~~
后記:其實運維工程師手里擁有大量資源,但是無論上級或者運維工程師本人卻不予重視,一方面是是因為編程的一定門檻,再者就是畫地為牢,不過像我這樣的運維工程師,應該可能也不太像個傳統的運維工程師了吧,畢竟最本質的職責是對于系統的維護,以及故障處理等,在本文的數據再利用的三個方面,我想大多數同行覺得第一層利用就遠遠足夠了,不過隨著時代的發展,數據爆發式的增長的今天,我們真的能對自己手上的大量資源,不聞不問么。
來自: http://www.linuxeden.com/html/news/20160125/164525.html