Prometheus 基于Python Django实现Prometheus Exporter

技术Prometheus 基于Python Django实现Prometheus Exporter Prometheus 基于Python Django实现Prometheus Exporter基于Py

普罗米修斯基于教程实现普罗米修斯出口商

基于Python Django实现Prometheus Exporter

需求描述

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

实践环境

Python 3.6.5

Django 3.0.6

普罗米修斯-客户端0.11.0

代码设计与实现

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

基于官方SDK

仪表公制为例

view视图实现

customexporters。网址_导出器_视图.UrlExporterView

#!/usr/bin/env python

# -*- coding:utf-8 -*-

#在此创建您的视图。

来自django.http导入HttpResponse

来自django.views.generic导入视图

从普罗米修斯客户端导入收集器注册表,仪表,生成_最新

导入日志记录

导入追溯

logger=日志记录。getlogger('我的记录器')

REGISTRY=CollectorRegistry()

标签=['请求状态','请求方法','请求url'] #标签定义

# 指标定义

g _ requests _ total=Gauge(' requests _ total ','每分钟的全球资源定位器(Uniform Resource Locator)请求数,LABELS,registry=REGISTRY)

g _ avg _ response _ time _ seconds=Gauge(' avg _ response _ time _ seconds ',' url平均响应时间一分钟,LABELS,registry=REGISTRY)

类UrlExporterView(视图):

def get(self,request,*args,**kwargs):

尝试:

数据={ 0

计数: 34,

方法: 'get ',

状态' : 200,

url': 'url ',

avg_rt':50

}

g _ requests _ total。标签(数据。get(' status ')、data.get('method ')、data.get('url ').设置(数据。get(' count ')# set设定值

g _ avg _ response _ time _ sec。标签(数据。get(' status ')、data.get('method ')、data.get('url ').set(data.get('avg_rt ')

返回HttpResponse(generate _ latest(REGISTRY),状态=200,content_type='text/plain ')

除外:

error _ msg=' % s ' %追溯。format _ exc()

记录器。错误(错误消息)

返回HttpResponse(')出现# HELP错误,状态=500,内容类型='文本/纯文本)

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

项目URL路由配置

CustomPrometheusExporters .customprometheusexporters。网址。巴拉圭

来自django.contrib导入管理

来自姜戈。

urls import path, re_path, include
urlpatterns = [
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_path
from CustomExporters.url_exporter_views import UrlExporterView
urlpatterns = [
    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 floatToGoString
import 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,gauge, histogram, summary, 或者 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_namelabel_name遵守普罗米修斯惯用的语言表达式限制
  • label_value 可以是任意UTF-8序列字符,如果包含反斜杠 \、双引号"、 换行符\n字符,需要进行显示转义,形如 \\, \", \n
  • value 代表浮点数,正如Go ParseFloat()所需参数。此外,除标准数值外,NaN+Inf-Inf分别表示非数字、正无穷大和负无穷大的有效值
  • timestamp 数据自身生成时间,为64整数(1970-01-01 00:00:00 UTC到现在的毫秒数) ,正如Go ParseInt()所需参数

作者:授客

QQ:1033553122

全国软件测试QQ交流群:7156436

Git地址:https://gitee.com/ishouke

友情提示:限于时间仓促,文中可能存在错误,欢迎指正、评论!

作者五行缺钱,如果觉得文章对您有帮助,请扫描下边的二维码打赏作者,金额随意,您的支持将是我继续创作的源动力,打赏后如有任何疑问,请联系我!!!

微信打赏
支付宝打赏全国软件测试交流QQ群

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/37475.html

(0)

相关推荐

  • k8s百度百科(k8的特征)

    技术k8s的本质是什么这篇文章给大家介绍k8s的本质是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。当下 k8s 算是比较火的一个内容,那么它到底是什么呢,它为什么会这么火呢,它解决的是什么问题

    攻略 2021年12月15日
  • Unity3d的基础是什么

    技术Unity3d的基础是什么今天就跟大家聊聊有关Unity3d的基础是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、Unity中的坐标系是使用的左手坐标

    攻略 2021年11月11日
  • vue开发实战常用三大实用功能(vue开发应该用到哪些技术)

    技术Vue开发的常用方法是什么本篇文章为大家展示了Vue开发的常用方法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。$nextTick()this.$nextTick()将

    攻略 2021年12月20日
  • c语言中主要有几种循环语句(c语言循环语句基础知识)

    技术怎么深入了解c语言的循环语句怎么深入了解c语言的循环语句,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C语言循环语句大多数人都希望自己是体格强健,天

    攻略 2021年12月14日
  • 春城的意思,《寒食》春城……的意思

    技术春城的意思,《寒食》春城……的意思对皇都春色的陶醉和对盛世承平的歌咏。《寒食》作者春城的意思:韩翎春城无处不飞花,寒食东风御柳斜。日暮汉宫传蜡烛,轻烟散入五侯家。【译文】:春天,长安城处处飘飞着落花;寒食节,东风把御

    生活 2021年10月23日
  • 怎么解决IE7和IE8兼容性问题

    技术怎么解决IE7和IE8兼容性问题怎么解决IE7和IE8兼容性问题,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。IE8会是福音还是又一个光环据称全面兼容标

    攻略 2021年11月17日