需求描述

运行监控需求,需要采集Nginx 每个URL请求的相关信息,涉及两个指标:一分钟内平均响应时间,调用次数,并且为每个指标提供3个标签:请求方法,请求状态,请求URL,并向普罗米修斯暴露这些指标相关数据

实践环境

Python 3.6.5

Django 3.0.6

prometheus-client 0.11.0

代码设计与实现

说明:为了更好的表达主题,代码中数据采集部分暂且采用data变量替代。

基于官方SDK

Gauge Metric为例

view视图实现

CustomExporters.url_exporter_views.UrlExporterView

#!/usr/bin/env python
# -*- coding:utf-8 -*-# Create your views here.
from django.http import HttpResponse
from django.views.generic import View
from prometheus_client import CollectorRegistry, Gauge, generate_latestimport logging
import traceback
logger = logging.getLogger('mylogger')REGISTRY = CollectorRegistry()
LABELS = ['req_status', 'req_method', 'req_url'] # 标签定义# 指标定义
g_requests_total = Gauge('requests_total', 'url request num each minute', LABELS, registry=REGISTRY)
g_avg_response_time_seconds = Gauge('avg_response_time_seconds', 'url avg response time of one minute', LABELS, registry=REGISTRY)class UrlExporterView(View):def get(self, request, *args, **kwargs):try:data = {'count': 34,'method': 'get','status': 200,'url': 'url','avg_rt':50}g_requests_total.labels(data.get('status'),data.get('method'),data.get('url')).set(data.get('count')) #set设定值g_avg_response_time_seconds.labels(data.get('status'),data.get('method'),data.get('url')).set(data.get('avg_rt'))return HttpResponse(generate_latest(REGISTRY),status=200, content_type="text/plain")except Exception:error_msg = '%s' % traceback.format_exc()logger.error(error_msg)return HttpResponse('# HELP Error occured', status=500, content_type="text/plain")

注意:通过官方SDK无法向普罗米修斯暴露数据生成时间(非采集时间),以上实现方式无法满足这种需求

项目URL路由配置

CustomPrometheusExporters.CustomPrometheusExporters.urls.py

from django.contrib import admin
from django.urls import path, re_path, includeurlpatterns = [re_path(r'^exporters/',  include('CustomExporters.urls')),path('admin/', admin.site.urls),
]

应用urls.py url路由配置

CustomExporters.urls.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-from django.urls import path,re_pathfrom CustomExporters.url_exporter_views import UrlExporterViewurlpatterns = [re_path(r'url-exporter/metrics$', UrlExporterView.as_view(), name='url-exporter')
]

查看运行结果

浏览器中访问 http://127.0.0.1:8000/exporters/url-exporter/metrics,输出如下:

# HELP requests_total url request num each minute
# TYPE requests_total gauge
requests_total{req_method="get",req_status="200",req_url="url"} 34.0
# HELP avg_response_time_seconds url avg response time of one minute
# TYPE avg_response_time_seconds gauge
avg_response_time_seconds{req_method="get",req_status="200",req_url="url"} 50.0

不基于官方SDK

view视图实现

CustomExporters.url_exporter_views.UrlExporterView

#!/usr/bin/env python
# -*- coding:utf-8 -*-# Create your views here.
from django.http import HttpResponse
from django.views.generic import View
from prometheus_client.utils import floatToGoStringimport logging
import traceback
logger = logging.getLogger('mylogger')class UrlExporterView(View):def get(self, request, *args, **kwargs):try:data = {'count': 34,'method': 'get','status': 200,'url': 'url','avg_rt':50,'timestamp': 1634099490000}requests_total_line_list = ['# HELP requests_total The total requests number of url to req_service, req_method, status \n'] # 存放 requests_total指标输出avg_response_time_line_list = ['# HELP avg_response_time_milseconds average request response time for url correspond to req_service, req_method, status\n'] # 存放 avg_response_time_seconds指标输出line_template = '%(metric_name)s{req_method="%(req_method)s",req_status="%(req_status)s",req_url="%(req_url)s"} %(label_value)s %(timestamp)s\n'requests_total_line_list.append(line_template % {'metric_name':'requests_total','req_method':data.get('method'),'req_status':data.get('status'),'req_url':data.get('url'),'label_value':floatToGoString(data.get('count')),'timestamp':data.get('timestamp')})avg_response_time_line_list.append(line_template % {'metric_name':'avg_response_time_milseconds','req_method':data.get('method'),'req_status':data.get('status'),'req_url':data.get('url'),'label_value':floatToGoString(data.get('avg_rt')),'timestamp':data.get('timestamp')})output_list = []output_list.extend(requests_total_line_list)output_list.append('\n')output_list.extend(avg_response_time_line_list)return HttpResponse(''.join(output_list).encode('utf-8'), status=200, content_type="text/plain")except Exception:error_msg = '%s' % traceback.format_exc()logger.error(error_msg)return HttpResponse('# HELP Error occured', status=500, content_type="text/plain")

查看运行结果

浏览器中访问 http://127.0.0.1:8000/exporters/url-exporter/metrics,输出如下:

# HELP requests_total The total requests number of url to req_service, req_method, status
requests_total{req_method="get",req_status="200",req_url="url"} 34.0 1634099490000# HELP avg_response_time_milseconds average request response time for url correspond to req_service, req_method, status
avg_response_time_milseconds{req_method="get",req_status="200",req_url="url"} 50.0 1634099490000

样本数据格式说明

普罗米修斯基于文本的(text-based)格式是面向行的。行由换行符(\n)分隔。最后一行必须以换行字符结尾。空行将被忽略

在一行中,tokens可以由任意数量的空格和/或制表符分隔(如果它们与前一个令牌合并,则必须至少由一个空格分隔)。忽略行收尾随空格。

以 # 作为首个非空白字符的行,被当作注释,且除非#后面第一个token为HELPTYPE,形如 # HELP# TYPE,否则罗米修斯会自动忽略该行。

如果token为HELP,则至少需要1个token,该token为Metric名称,剩余所有token为该属性的文档字符串说明(dockstring)。HELP行可以是任意UTF-8序列字符,如果包含反斜杠 \、 换行符\n字符,需要进行显示转义,形如 \\\n

如果token为TYPE,则至少需要2个token,第一个token为Metric名称,第二个为counter,gaugehistogramsummary, 或者 untyped,定义名称指定的Metric的类型。针对同一个给定的Metric名称,只能存在一种TypeTYPE行必须位于该Metric的第一行数据样本行之前。如果该Metric没有定义对应的TYPE行,则默认TYPEuntyped

剩余的行描述样本(每行对应一个数据样本)使用以下格式

metric_name[{label_name1="label_value",label_name2="label_value",..,label_nameN="label_valueN"}] value [timestamp]
  • metric_name 和label_name遵守普罗米修斯惯用的语言表达式限制
  • label_value 可以是任意UTF-8序列字符,如果包含反斜杠 \、双引号"、 换行符\n字符,需要进行显示转义,形如 \\\"\n
  • value 代表浮点数,正如Go ParseFloat()所需参数。此外,除标准数值外,NaN+Inf-Inf分别表示非数字、正无穷大和负无穷大的有效值
  • timestamp 数据自身生成时间,为64整数(1970-01-01 00:00:00 UTC到现在的毫秒数) ,正如Go ParseInt()所需参数

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

① 2000多本软件测试电子书(主流和经典的书籍应该都有了)

② 软件测试/自动化测试标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python编程语言、API接口自动化测试、web自动化测试、App自动化测试(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

在我的QQ技术交流群里(技术交流和资源共享,广告进来腿给你打断)

可以自助拿走,群号953306497(备注“csdn111”)群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

基于Python Django实现Prometheus Exporter相关推荐

  1. 基于Python+Django的Kubernetes集群管理平台

    时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调度管理等方面都有其难以言喻的优 ...

  2. 基于Python + Django + mysql的协同推荐算法的电影推荐系统

    基于Python + Django + mysql的协同推荐算法的电影推荐系统 本系统一共分为前台系统功能和后台系统功能两个模块,两个模块之间虽然在表面上是相互独立的,但是在对数据库的访问上是紧密相连 ...

  3. 【基于python+Django的物品协同过滤音乐推荐系统-哔哩哔哩】 https://b23.tv/V2zN54R

    [基于python+Django的物品协同过滤音乐推荐系统-哔哩哔哩] https://b23.tv/V2zN54R https://b23.tv/V2zN54R

  4. 【基于python+Django的博客系统-哔哩哔哩】 https://b23.tv/bmRfAMu

    [基于python+Django的博客系统-哔哩哔哩] https://b23.tv/bmRfAMu https://b23.tv/bmRfAMu

  5. 基于Python+django的 医院排队叫号系统-计算机毕业设计

    项目介绍 随着时代发展,越来越多的人需要到医院进行挂号检查等操作,如果全部都到医院现场挂号,一方面的浪费大量的时间和精力,另一方面是浪费大量的医疗资源,为了能够让患者更加方便的进行挂号,我们通过pyt ...

  6. 基于Python+django的 天天生鲜超市网上购物商城-计算机毕业设计

    项目介绍 根据毕业设计的需求,设计一个界面友好的网上生鲜超市系统,用户能够直观的浏览及查询到想要的信息,了解消费者的习惯,实现系统的基本功能,用户操作起来更方便.为了让管理者了解自己的权限,方便直观的 ...

  7. 基于Python+django的网购平台购物商城-计算机毕业设计

    项目介绍 当下人们已经进去了网络时代,很多时候人们在买一些日用品的时候已经不再是传统的到超市进行购买和挑选的方式了,更多的人年人通过网络选购所需的商品,然后有物流配送到家,这是当前网络时代给人们很大的 ...

  8. 基于Python+django的 古诗词在线学习网站-计算机毕业设计

    项目介绍 基于Python+django的 古诗词在线学习网站则旨在通过标签分类管理等方式,实现管理员:首页.个人中心.用户管理.诗词管理.主题管理.情感色彩管理.风格管理.我的收藏管理.诗词论坛.系 ...

  9. 基于Python+django的茶叶销售商城网站-计算机毕业设计

    项目介绍 ​茶叶在我国历史悠久,这很多时候,人们在谈论事情的时候,都喜欢泡上一杯清茶这样不仅可以提神醒脑而且可以提升自己的品味.当前我国也有很多的爱茶人士.他们经常会购买自己所喜欢的茶叶在闲暇之时进行 ...

最新文章

  1. JDBC+Servlet+JSP整合开发之29-JSP表达式语言(EL)
  2. 设计模式C++实现(16)——状态模式
  3. Web 设计:实现干净代码的12条定律
  4. python生成器、迭代器、__call__、闭包简单说明
  5. 【lucene】lucene 分词 以及自定义分词器
  6. 解决WORD文档无法显示链接的图像问题
  7. python中遇到的问题及解决方法_自己编程中遇到的Python错误和解决方法汇总整理...
  8. wince +C#拼音码形成代码
  9. 使用Go语言实现单词翻译功能/simpledict 命令行词典
  10. SystemVerilog之interface
  11. Java+MySql存储表情符
  12. 笃志前行 锐意进取 | 中创算力在区块链比赛中展现新风采
  13. 机械祭天法力无边:C++primer之书店程序包含Sales_item.h源码
  14. java版mc植物生长条件_教程/种植紫颂果
  15. one 主格 复数 宾格_人称代词的主格和宾格
  16. ABAP BTE增强举例
  17. ORB-SLAM2 --- LoopClosing::ComputeSim3 函数
  18. EasyRecovery最新中文Win/Mac全版本下载安装激活数据恢复软件
  19. Java面向对象知识点小结
  20. 重构碎片化知识_《碎片化与重构》之如何整合知识碎片

热门文章

  1. java中Map集合、模拟斗地主洗牌发牌、JDK9对集合添加的优化
  2. SAP软件系统合规性审计介绍
  3. 记录mumu模拟器AMD SVM(VT)开启失败的问题
  4. 按照日期:蓝桥杯真题、洛谷题单、力扣题单汇总
  5. 面向对象的讨论-2022年5月4日
  6. php cms 2017 排名,cms系统排行_PHP CMS系统排行榜
  7. VBoxManage 命令操作,详细的网络设置命令
  8. NLPer福利-中文语言理解基准测【CLUEbenchmark】
  9. JAVA拾遗 — JMH与8个代码陷阱
  10. 国王游戏 [NOIP2012 提高组]