zoukankan      html  css  js  c++  java
  • prometheus自定义监控指标——实战

    上一节介绍了pushgateway的作用、优劣以及部署使用,本机通过几个实例来重温一下自定义监控指标是如何使用的。


    一、监控容器启动时间(shell)

      使用prometheus已经两个月了,但从未找到容器运行时间的指标(有一个类似的指标是容器创建时间)。学会自定义监控指标后,第一个实例就应该来搞定它。

      前提条件是,部署好pushagateway!

      在被监控机器上(linux),创建以下脚本

    #!/bin/bash
      
    allname=`docker ps --format "{{.Names}}"`              #获取所有运行的容器名称
    
    function dockerruntime(){
        t=`docker inspect -f '{{.State.StartedAt}}' $1`          #获取各个容器的启动时间
        t1=`date +%s -d "$t"`                                    #将时间转成时间戳
        t2=`date +%s`                                            #获取当前时间的时间戳
        let tt=t2-t1                                             #计算运行时间
        echo $tt
    }
    
    sudo rm -f a
    echo """# TYPE docker_runtime gauge
    # HELP docker_runtime time sec""" >> a                       #将往pushgateway上传的数据写入a文件
    
    for i in ${allname}
    do
        t=`dockerruntime $i`
        echo "docker_runtime{name="$i"} $t" >> a               #格式化写入数据  不能使用单引号  会屏蔽$i的
    done
    
    curl --data-binary "@a" http://pushgatewayIP:9091/metrics/job/docker_runtime/instance/xa-lsr-billubuntu       #修改地址和参数名向特定的url上传数据 数在a文件中
    
    sudo rm -f a    #清空临时文件
    

      给该脚本加执行权限,执行后,登陆pushgateway的webUI

    可以看到被监控机器给pushgateway,PUSH了数据,意思是在被监控机器上搜索到了三个容器,每个job的名称叫“docker_runtime”

    将该脚本加入周期性计划任务中,每分钟执行一次,若对时间有要求,可以将上述脚本稍加修改,每15s或30s执行一次。

    此时在prometheus中的query的查询框中输入“docker_runtime”便可获取上述数据。

    【注意】

    注意上传数据的类型

    如果上传的数据类型是 UNTYPE 那么 prometheus将无法识别,导致整个pushgateway数据无法接受!因此需要格外关注发送的数据格式。
    数据类型只有四种 counter gauge summary histogram

    二、python向pushgateway发送数据

    安装prometheus客户端

      pip install prometheus_client

    1、counter类型

    #counter是可增长的,重启时候会被置成0,用于任务个数,只增不减
    #使用flask构建一个建议的网页

         import prometheus_client
    	from prometheus_client import Counter
    	from prometheus_client.core import CollectorRegistry
    	from flask import Response, Flask
    	
    	app = Flask(__name__)
    	
    	requests_total = Counter("request_count", "Total request cout of the host")
    	
    	@app.route("/metrics")
    	def requests_count():
    	    requests_total.inc()
    	    # requests_total.inc(2)	每一次刷新会增加2
    	    return Response(prometheus_client.generate_latest(requests_total),
    	                    mimetype="text/plain")
    	
    	@app.route('/')
    	def index():
    	    requests_total.inc()
    	    return "Hello World"
    	
    	if __name__ == "__main__":
    	    app.run(host="0.0.0.0")
    

    结果: 

     

    2、gauage类型

    	import prometheus_client
    	from prometheus_client import Counter,Gauge
    	from prometheus_client.core import CollectorRegistry
    	from flask import Response, Flask
    	
    	app = Flask(__name__)
    	
    	g = Gauge("random_value", "Random value of the request")
    	
    	@app.route("/metrics")
    	def s():
    	    with open("a.txt",'r') as f:
    	        num=f.read()
    	    g.set(num)
    	    return Response(prometheus_client.generate_latest(g),
    	                    mimetype="text/plain")
    	
    	
    	@app.route('/')
    	def index():
    	    requests_total.inc()
    	    return "Hello World"
    	
    	if __name__ == "__main__":
        app.run(host="0.0.0.0")
    

    结果: 

     

    以上作用是在本地生成一个小型网站,下一步是将选定的数据发送到pushgateway 

    #在被监控机上写python代码
    #CollectorRegistry可以同时注册多个自定义指标并返回给prometheus
    
    	
    importprometheus_client
    fromprometheus_clientimportGauge
    fromprometheus_client.coreimportCollectorRegistry
    importrequests
    
    defv1(): #获取监控数据的值
    	return2.3
    
    defv2():
    	return3.60
    
    n1=v1()
    n2=v2()
    
    REGISTRY=CollectorRegistry(auto_describe=False)
    #自定义指标必须利用CollectorRegistry进行注册,注册后返回给prometheus
    #CollectorRegistry必须提供register,一个指标收集器可以注册多个collectoryregistry
    
    
    jin=Gauge("jin_kou","zhegezuoyongshijinkoudaxiao",["l1",'l2','instance'],registry=REGISTRY)
    chu=Gauge("chu_kou","zhegezuoyongshichukoudaxiao",["l1",'l2','instance'],registry=REGISTRY)
    	#“jin_kou” 指标名称
    	# "zhegezuoyongshichukoudaxiao"  指标的注释信息
    	# "[]"  定义标签的类别及个数
    
    jin.labels(l1="label1",l2="label2",instance="windows1").inc(n1)
    chu.labels(l1="label1",l2="label2",instance="windows1").inc(n2)
    	#“[]”中有几个,就需要写几个个数要完全一致
    
    requests.post("http://pushgatewayIP:9091/metrics/job/python/",data=prometheus_client.generate_latest(REGISTRY))
    	#向指定的API发送post信息,将注册的信息发过去
    	#API中的 “python”是 job的名字
    

     结果:

  • 相关阅读:
    【转载】面对酱紫的情况,肿么办哇?
    webform 基础
    LINQ 语句实现分页
    LINQ to SQL 语句
    发送邮件&Timer
    treeview递归
    进程&线程
    登录框记住账号
    窗体-对话框,记事本
    日期与地区的三级联动
  • 原文地址:https://www.cnblogs.com/zqj-blog/p/11106724.html
Copyright © 2011-2022 走看看