自定义prometheus监控获取nginx_upstream指标

1、前言

        上篇文章介绍了nginx通过nginx_upstream_check_module模块实现后端健康检查,这篇介绍一下如何自定义prometheus监控获取nginx的upstream指标来实时监控nginx。

2、nginx_upstream_status状态

支持以下三种方式查看nginx_upstream的状态

  • /status?format=html

  • /status?format=csv

  • /status?format=json 【本文监控使用方式】

3、Python脚本自定义prometheus监控

# -*- coding:utf-8 -*-
import requests
import prometheus_client
import time
from prometheus_client import Counter, Gauge, Summary
from prometheus_client.core import CollectorRegistry
from flask import Flask, Response
from wsgiref.simple_server import make_serverapp = Flask(__name__)class Monitor:def __init__(self):self.collector_registry = CollectorRegistry(auto_describe=True)self.ngx_uptream_status_gauge = Gauge(name="ngx_uptream_status",documentation="nginx upstream status",labelnames=("env", "nginxUrl", "upstreamName", "upstreamAddress"),registry=self.collector_registry)self.ngx_status_gauge = Gauge(name="ngx_status",documentation="nginx status",labelnames=("env", "nginxUrl"),registry=self.collector_registry)# 获取/metrics结果def get_prometheus_metrics_info(self):return self.collector_registrydef get_ngx_uptream_status(self):ngx_list = [{"ngx_env": "test", "ngx_status_url": "http://192.168.100.210:8888/nginx_status?format=json"}]for ngx_info in ngx_list:ngxEnv = ngx_info["ngx_env"]ngxStatusUrl = ngx_info["ngx_status_url"]try:requests.get(ngxStatusUrl, timeout=2)except:self.ngx_status_gauge.labels(ngxEnv, "http://"+ ngxStatusUrl.split('/')[2]).set(0)print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + " " + ngxStatusUrl + " 请求异常")else:self.ngx_status_gauge.labels(ngxEnv, "http://"+ ngxStatusUrl.split('/')[2]).set(1)ngxInfo = requests.get(ngxStatusUrl)ngxInfo.encoding = 'utf-8'ngxInfoJson = ngxInfo.json()print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + " " + ngxStatusUrl + " 请求数据: " + str(ngxInfoJson))ngxServerList = ngxInfoJson["servers"]["server"]if len(ngxServerList) == 0:print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + " " + ngxStatusUrl + " 请配置upstream检测")else:for server in ngxServerList:upstream = server["upstream"]upstreamAddr = server["name"]nginxUrl = "http://"+ ngxStatusUrl.split('/')[2]status = server["status"]if status == "up":upstreamStatus = 1else:upstreamStatus = 0self.ngx_uptream_status_gauge.labels(ngxEnv, nginxUrl, upstream, upstreamAddr).set(upstreamStatus)@app.route('/metrics', methods=['POST', 'GET'])
def metrics():g_monitor = Monitor()g_monitor.get_ngx_uptream_status()registry = g_monitor.get_prometheus_metrics_info()return Response(prometheus_client.generate_latest(registry), mimetype="text/plain")if __name__ == '__main__':server = make_server('0.0.0.0', 3200, app)server.serve_forever()

4、运行Python脚本,并调用接口获取metrics

Python脚本以flask服务的形式运行,通过/nginx_status?format=json接口获取到nginx_upstream的指标数据后,转换为prometheus可接受的数据形式,然后对接到prometheus即可监控。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/384261.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PyTorch】基于LSTM网络的气温预测模型实现

假设CSV文件名为temperature_data.csv,其前五行和标题如下: 这里,我们只使用Temperature列进行单步预测。以下是整合的代码示例: import pandas as pd import numpy as np import torch import torch.nn as nn import torch.op…

NLP基础知识2【各种大模型的注意力】

注意力 传统Attention存在的问题优化方向变体有哪些现在的主要变体集中在KVMulti-Query AttentionGrouped-query AttentionFlashAttention 传统Attention存在的问题 上下文约束速度慢,显存占用大(因为注意力考虑整体信息,所以每一个位置都要…

Redis7(二)Redis持久化双雄

持久化之RDB RDB的持久化方式是在指定时间间隔,执行数据集的时间点快照。也就是在指定的时间间隔将内存中的数据集快照写入磁盘,也就是Snapshot内存快照,它恢复时再将硬盘快照文件直接读回到内存里面。 RDB保存的是dump.rdb文件。 自动触发…

Docker-Compose实现MySQL之主从复制

1. 主服务器(IP:192.168.186.77) 1.1 docker-compose.yml services:mysql-master:image: mysql:latest # 使用最新版本的 MySQL 镜像container_name: mysql-master # 容器的名称environment:MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码MYSQL_DATABASE: masterd…

-XX:MaxDirectMemorySize和-Dio.netty.maxDirectMemory区别

-XX:MaxDirectMemorySize是java运行参数,用户控制java程序可以使用的最大直接内存(堆外/本地); -Dio.netty.maxDirectMemory是netty运行参数,用户控制netty程序可以使用的最大直接内存(堆外/本地&#xff…

【深度学习】yolov8-seg分割训练,拼接图的分割复原

文章目录 项目背景造数据训练 项目背景 在日常开发中,经常会遇到一些图片是由多个图片拼接来的,如下图就是三个图片横向拼接来的。是否可以利用yolov8-seg模型来识别出这张图片的三张子图区域呢,这是文本要做的事情。 造数据 假设拼接方式有…

Django—admin后台管理

Django官网 https://www.djangoproject.com/ 如果已经有了Django跳过这步 安装Django: 如果你还没有安装Django,可以通过Python的包管理器pip来安装: pip install django 创建项目: 使用Django创建一个新的项目: …

常见的CSS属性(一)——字体、文本、边框、内边距、外边距、背景、行高、圆角、透明度、颜色值

一、字体 二、文本 三、边框 四、外边距 五、内边距 六、背景 七、行高 八、圆角 九、透明度 九、颜色值 元素的继承性是指给父元素设置了某些属性,子元素或后代元素也会有作用。 一、字体 “font-*”是字体相关的属性,具有继承性。代码如下&a…

普乐蛙VR航天航空体验馆知识走廊VR体验带你登陆月球

VR航天航空设备是近年来随着虚拟现实(VR)技术的快速发展而兴起的一种新型设备,它结合了航天航空领域的专业知识与VR技术的沉浸式体验,为用户提供了前所未有的航天航空体验。以下是对VR航天航空设备的详细介绍: 一、设备…

nodejs编译报错 集合

目录 一、使用命令编译typescript时报错,报错文件tsconfig.json 二、npm start运行后报错,could not find module 一、使用命令编译typescript时报错,报错文件tsconfig.json npx tsc 报错: Specified include paths were [&…

PyTorch安装CUDA标准流程(可解决大部分GPU无法使用问题)

最近一段时间在研究PyTorch中的GPU的使用方法,之前曾经安装过CUDA,不过在PyTorch中调用CUDA时无法使用。考虑到是版本不兼容问题,卸载后尝试了其他的版本,依旧没有能解决问题,指导查阅了很多资料后才找到了解决方案。 …

uni-app声生命周期

应用的生命周期函数在App.vue页面 onLaunch:当uni-app初始化完成时触发(全局触发一次) onShow:当uni-app启动,或从后台进入前台时显示 onHide:当uni-app从前台进入后台 onError:当uni-app报错时触发,异常信息为err 页面的生命周期 onLoad…

什么是设备运维管理系统?有什么作用?(6款设备运维管理系统推荐)

一、什么是设备运维管理系统? 设备运维管理系统是一种集成了监控、管理、维护和优化设备性能的软件平台。它旨在通过自动化的手段,提高设备运行的可靠性和效率,降低运维成本,并优化资源利用。 设备运维管理系统能够实时监控设备…

图片上传成功却无法显示:静态资源路径配置问题解析

1、故事的背景 最近,有个学弟做了一个简单的后台管理页面。于是他开始巴拉巴拉撘框架,写代码,一顿操作猛如虎,终于将一个简单的壳子搭建完毕。但是在实现功能:点击头像弹出上传图片进行头像替换的时候,卡壳…

Hyperledger Fabric 网络体验 - 网络启动过程概览

进入fabric-samples/test-network目录,执行指令: ./network.sh up -i 2.5执行完指令能看到fabric已经启动。 作为第一次Fabric网络体验,网络启动主要包含三个操作,分别是生成配置文件、启动网络和操作网络。 配置文件 使用cr…

Java面试八股之后Spring、spring mvc和spring boot的区别

Spring、spring mvc和spring boot的区别 Spring, Spring Boot和Spring MVC都是Spring框架家族的一部分,它们各自有其特定的用途和优势。下面是它们之间的主要区别: Spring: Spring 是一个开源的轻量级Java开发框架,最初由Rod Johnson创建&…

基于 HTML+ECharts 实现的数据可视化大屏案例(含源码)

数据可视化大屏案例:基于 HTML 和 ECharts 的实现 数据可视化已成为企业决策和业务分析的重要工具。通过直观、动态的图表展示,数据可视化大屏能够帮助用户快速理解复杂的数据关系,发现潜在的业务趋势。本文将介绍如何利用 HTML 和 ECharts 实…

DBeaver Ultimate 22.1.0 连接数据库(MySQL+Mongo+Clickhouse)

前言 继续书接上文 Docker Compose V2 安装常用数据库MySQLMongo,部署安装好之后我本来是找了一个web端的在线连接数据库的工具,但是使用过程中并不丝滑,最终还是选择了使用 DBeaver ,然后发现 mongo 还需要许可,又折…

Kafka快速入门+SpringBoot简单的秒杀案例

1. 主题相关 1.1 创建主题 kafka-topics.sh --create --bootstrap-server [服务器地址] --replication-factor [副本数] --partitions [分区数] --topic [主题名]liberliber-VMware-Virtual-Platform:/home/zookeeper$ docker-compose exec kafka /bin/bash #进入kafka容器 b…

vue3 常用的知识点

setup:容许在script当中书写组合式API 并且vue3的template不再要求唯一的根元素 <script setup>const name app; </script>组合式API的用法&#xff1a; 可以直接在script标签中定义变量或者函数&#xff0c;然后直接在template当中使用 <template>{{mes…