监控是运维的基础,在所有的时间,监控就是一双眼睛,蒙着眼狂奔,总是会跳坑的。
prometheus是监控的新秀,使用的时间序列来进行存储,最亮眼的地方在于多维数据的监控,在监控数据的时候,可以按照时间,多个维度来划分数据,从而灵活多变。
在使用prometheus监控的时候,分为几个部分,一个是相当于agent,在需要监控的主机上安装,也就是exporter,主要用来收集相关的监控指标;一个是prometheus server,主要负责从exporter里面拉取数据,保存数据,并且提供promql查询语句;一个是alertmanager,主要用来告警通知;一个则是图形界面,用来简单的展示,不过这部分主要由grafna来展现。
在提供监控数据的时候,一般都有对应的exporter作为插件提供数据,使用python的客户端提供相关的监控数据:
[[email protected] ~]# cat kel.py
#!/usr/bin/env python
import time
import random
import http.server
from prometheus_client import start_http_server
from prometheus_client import Counter,Gauge,Summary
REQUESTS = Counter('hello_words_total','Hello requested')
EXCEPTIONS = Counter('hello_world_exceptions_total','Exceptions serving hello world')
INPROGRESS = Gauge('hello_worlds_inprogress','Number of Hello Worlds in progress.')
LAST = Gauge('hello_world_last_time_seconds','The last time a Hello World was served.')
LATENCY = Summary('hello_world_latency_seconds','Time for a request Hello World.')
class MyHandler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
start = time.time()
REQUESTS.inc()
INPROGRESS.inc()
with EXCEPTIONS.count_exceptions():
if random.random() < 0.2:
raise Exception
self.send_response(200)
self.end_headers()
self.wfile.write(b"Hello")
LATENCY.observe(time.time() - start)
LAST.set(time.time())
INPROGRESS.dec()
if __name__ == "__main__":
start_http_server(8000)
server = http.server.HTTPServer(("192.168.1.199",8001),MyHandler)
server.serve_forever()
使用的是python3,在运行之后,会提供两个监听端口,一个是提供监控数据的8000端口,一个则是提供一个访问的web界面,也就是8001端口。
在监控的设计之中,内部应该永远提供一个白盒监控,也就是从内部暴露相关系统的监控指标,而且都是相关的关键信息。
在nginx中,有一个web界面能查看到内部状态;在httpd中,也有相关的界面能查看到内部状态;当写应用程序的时候,可以加入prometheus的客户端,加入几行代码,即可提供相关的监控指标。
在访问如上8000端口的时候,会返回相关的监控数据:
启动prometheus,配置文件中加入相关的监控,可以看到已经开始拉取相关的监控指标数据。
在prometheus之中,可以使用查询语句来进行查询相关的数据,如下:
在grafna中可以添加图标,从而可以监控相关的数据:
告警:
1、 又能怎样???
琐事缠身,居然还有人在纠结加班,在哪里加班又有什么关系。。。在床上加班?在家里加班?还是在公司加班。。。SLI?SLO?SLA?一个高可用低性能的系统简直是让人抓狂。。。
root cause,根源问题的解决。。。不可能的,不参与到研发的过程中,根本无法进行改善各种服务。。。
解决了一个问题,解决了十个问题,解决了一百万个问题,又能怎样?技术得到发展?系统增加了可靠性?系统得到了更高性能?到底是重复的问题重复做?还是要彻底解决。。。
长远的目标是啥?会一个监控又能怎样?解决了一个工单,又能怎样?解决了一个故障,又能怎样?。。。要你有什么用。。。
运维本身。。。让人感觉到despair。。。SRE才是正统,然而绝大部分是不可能实现的,WTF。。。
2、 软件工程思维
陷入一种思维怪圈,无论是运维,还是在写一些小脚本。。。到最后总是会反问一句。。。又有什么用???
写一个小脚本,最后的结论会是,不就是调用一些模块么,就用那么几个方法,又有什么意思???
会的不珍惜,不会的念念不忘。。。思维怪圈?
别人有Borgmon,社区有prometheus,你有xxmon。。。。呵呵,简直就是无趣至极。。。