普罗米修斯统计信息上报结构设计
为了实现高效的监控和警报,普罗米修斯提供了一个强大的统计信息上报机制。通过这个机制,可以将应用程序的各种统计信息发送到普罗米修斯,普罗米修斯会对这些信息进行处理,然后提供丰富的监控和警报功能。下面是基本的统计信息上报结构:
1. 指标
在普罗米修斯中,指标是指一个可以被测量的数据,例如请求次数、响应时间等。指标由一个名称和一组标签组成。名称是指标的唯一标识符,标签用于对指标进行分类。
2. 指标类型
普罗米修斯支持四种指标类型:计数器、测量值、直方图和摘要。计数器是一个简单的累加器,用于记录事件发生的次数。测量值记录事件的数值,例如响应时间。直方图和摘要用于记录事件的分布情况。
3. 上报格式
在普罗米修斯中,指标是通过 HTTP POST 请求发送的。请求的主体是一个文本格式的数据,其中包含了要上报的所有指标。数据格式如下:
# TYPE {指标名称} {指标类型}
{指标名称}{标签键}=“{标签值}”,{标签键}=“{标签值”}… {指标值}
- 指标名称(Metric Name):描述要监控的实体,例如:http_requests_total、memory_usage_bytes 等。
- 标签(Labels):是一组键值对,用于对指标进行分类和过滤。例如:{instance=“192.168.1.1:8080”, job=“api_server”}。标签可以帮助开发者更精确地描述和查找数据。
- 指标值(Metric Value):是指标的实际数值,例如:100、3.14 等。这个值是随着时间变化的,因此在不同的时间点可能有不同的数值。
例如,上报一个名为“http_requests_total”的计数器类型指标,其标签键为“method”、“handler”和“status”,标签值分别为“GET”、“/api”和“200”,其值为“1234”:
# TYPE http_requests_total counter
http_requests_total{method=“GET”,handler=“/api”,status=“200”} 1234
另一个例子是一个名为“http_request_duration_seconds”的测量值类型指标,其标签键为“method”和“handler”,标签值分别为“POST”和“/login”,其值为“0.00654”:
# TYPE http_request_duration_seconds gauge
http_request_duration_seconds{method=“POST”,handler=“/login”} 0.00654
最后,一个名为“http_request_duration_histogram”的直方图类型指标,其标签键为“handler”,标签值为“/home”,其值为“{0.005, 0.01, 0.025, 0.05, 0.1}”:
# TYPE http_request_duration_histogram histogram
http_request_duration_histogram_bucket{handler=“/home”,le=“0.005”} 0
http_request_duration_histogram_bucket{handler=“/home”,le=“0.01”} 3
http_request_duration_histogram_bucket{handler=“/home”,le=“0.025”} 5
http_request_duration_histogram_bucket{handler=“/home”,le=“0.05”} 10
http_request_duration_histogram_bucket{handler=“/home”,le=“0.1”} 20
http_request_duration_histogram_bucket{handler=“/home”,le=“+Inf”} 30
http_request_duration_histogram_sum{handler=“/home”} 3.14159265359
http_request_duration_histogram_count{handler=“/home”} 30
通过上述的设计,可以将应用程序的各种统计信息发送到普罗米修斯,并且可以利用普罗米修斯提供的丰富功能进行监控和警报。
下面的时序图展示了应用程序如何将指标发送给普罗米修斯,并且如何使用普罗米修斯的查询功能来检索和分析这些指标。
以下是一个使用Go语言调用Prometheus接口上报内存占用的示例。在这个示例中,将使用 Go 语言编写一个简单的应用程序,该程序将部署在一个容器内,并监听 13499 端口。当收到客户端请求时,服务器将获取容器内存占用信息,然后使用 gRPC 将数据发送回客户端。
首先,确保安装了以下 Go 语言库:
- Prometheus 客户端库:
github.com/prometheus/client_golang/prometheus- gRPC:
google.golang.org/grpc
下面是一个简化的示例代码:
package mainimport ("context""fmt""log""net""github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promauto""google.golang.org/grpc"
)// 定义 gRPC 服务
type server struct{}// 定义指标
var (curMemUsed = promauto.NewGaugeVec(prometheus.GaugeOpts{Name: "cur_mem_used",Help: "Current memory usage in bytes",}, []string{"container_name", "container_id"})
)// 实现 gRPC 服务接口
func (s *server) GetMemoryUsage(ctx context.Context, req *MemoryRequest) (*MemoryResponse, error) {containerName := req.GetContainerName()containerID := req.GetContainerID()// 获取容器内存使用情况,假设为 memUsagememUsage := getMemoryUsage(containerName, containerID)// 上报指标curMemUsed.WithLabelValues(containerName, containerID).Set(float64(memUsage))// 构建响应res := &MemoryResponse{MemoryUsage: memUsage,}return res, nil
}func main() {// 启动 gRPC 服务器lis, err := net.Listen("tcp", ":13499")if err != nil {log.Fatalf("failed to listen: %v", err)}s := grpc.NewServer()RegisterMemoryServiceServer(s, &server{})fmt.Println("Server is running on port 13499")if err := s.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
}func getMemoryUsage(containerName, containerID string) int64 {// 这里应该实现获取容器内存使用情况的逻辑,返回内存使用量(字节)// 在此示例中,我们使用一个固定值作为内存使用情况return 1024 * 1024 * 100 // 假设内存使用量为 100MB
}
此代码示例定义了一个名为 cur_mem_used 的 Prometheus 指标,使用容器名称和容器 ID 作为标签。在接收到客户端请求时,服务器将获取容器内存使用情况,并上报给 Prometheus。同时,服务器还将通过 gRPC 将内存使用数据发送回客户端。
请注意,getMemoryUsage 函数需要根据实际情况实现,以获取容器内存使用情况。这里仅为了演示目的,使用了一个固定值。
接下来,我们将编写一个简单的 Go 语言 gRPC 客户端,该客户端将连接到之前实现的 gRPC 服务器以获取容器内存使用情况。首先,确保安装了以下 Go 语言库:
- gRPC:
google.golang.org/grpc
以下是客户端代码示例:
package mainimport ("context""fmt""log""time""google.golang.org/grpc"
)const (address = "localhost:13499"
)func main() {// 设置连接服务器的超时时间conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock(), grpc.WithTimeout(3*time.Second))if err != nil {log.Fatalf("did not connect: %v", err)}defer conn.Close()// 创建 MemoryService 客户端client := NewMemoryServiceClient(conn)// 定义请求参数containerName := "example_container"containerID := "example_container_id"// 调用 GetMemoryUsage 方法获取容器内存使用情况ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)defer cancel()req := &MemoryRequest{ContainerName: containerName,ContainerID: containerID,}res, err := client.GetMemoryUsage(ctx, req)if err != nil {log.Fatalf("could not get memory usage: %v", err)}fmt.Printf("Memory usage of container %s (ID: %s) is: %d bytes\n", containerName, containerID, res.GetMemoryUsage())
}
在此示例中,创建了一个 gRPC 客户端,连接到之前实现的 gRPC 服务器(监听地址为 “localhost:13499”)。然后,构建了一个 MemoryRequest 对象,包含容器名称和容器 ID。接下来,调用 GetMemoryUsage 方法发送请求,获取容器内存使用情况。最后,打印出获取到的内存使用量。
请注意,需要将 address 变量设置为实际 gRPC 服务器的地址。同时,根据实际需求,可能需要修改容器名称和容器 ID。
总结
通过上述的设计,可以将应用程序的各种统计信息发送到普罗米修斯,并且可以利用普罗米修斯提供的丰富功能进行监控和警报。
相关文章:
普罗米修斯统计信息上报结构设计
为了实现高效的监控和警报,普罗米修斯提供了一个强大的统计信息上报机制。通过这个机制,可以将应用程序的各种统计信息发送到普罗米修斯,普罗米修斯会对这些信息进行处理,然后提供丰富的监控和警报功能。下面是基本的统计信息上报…...
两个系统之间的传值
在两个系统之间传值可以采用以下几种方式: 使用 URL 参数:可以将数据作为 URL 参数传递给另一个系统,另一个系统可以解析 URL 参数并获取数据。例如:Example Domain 使用 Cookie:可以在一个系统中设置 Cookie…...
PostgreSQL(五)JDBC连接串常用参数
目录 1.单机 PostgreSQL 连接串2.集群PostgreSQL 连接串 PostgreSQL JDBC 官方驱动下载地址: https://jdbc.postgresql.org/download/ PostgreSQL JDBC 官方参数说明文档: https://jdbc.postgresql.org/documentation/use/ 驱动类: driver-…...
如何修改浏览器中导航栏的背景色和字体
在日常使用电脑时,我们总会使用浏览器来浏览网页。而浏览器中的导航栏是用户进行网页浏览的主要界面之一,其背景色和字体的选择对用户的体验有着重要的影响。因此,为了让导航栏更加美观和易于使用,我们需要对其背景色和字体进行修…...
如何选择合适的智能氮气柜?
随着电子产品的普及,IC、半导体、精密元件、检测仪器之类的物品对湿度要求越来越高,潮湿、霉菌和金属氧化所造成的损害,随时在发生。人们对于物品的存放环境要求逐渐提高,利用防潮设备如智能氮气柜、电子防潮柜来存储产品也越来越…...
双向链表(数据结构)(C语言)
目录 概念 带头双向循环链表的实现 前情提示 双向链表的结构体定义 双向链表的初始化 关于无头单向非循环链表无需初始化函数,顺序表、带头双向循环链表需要的思考 双向链表在pos位置之前插入x 双向链表的打印 双链表删除pos位置的结点 双向链表的尾插 关…...
离线安装Percona
前言 安装还是比较简单,这边简单进行记录一下。 版本差异 一、离线安装Percona 下载percona官网 去下载你需要对应的版本 jemalloc-3.6.0-1.el7.x86_64.rpm 需要单独下载 安装Percona 进入RPM安装文件目录,执行下面的脚本 yum localinstall *.rpm修改…...
界面控件Telerik UI for WinForms使用指南 - 数据绑定 填充(二)
Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件,所有的UI for WinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 Telerik UI for WinForms组件为可视化任何类…...
通过栈/队列/优先级队列/了解容器适配器,仿函数和反向迭代器
文章目录 一.stack二.queue三.deque(双端队列)四.优先级队列优先级队列中的仿函数手搓优先级队列 五.反向迭代器手搓反向迭代器 vector和list我们称为容器,而stack和queue却被称为容器适配器。 这和它们第二个模板参数有关系,可以…...
leetcode 704. 二分查找
题目描述解题思路执行结果 leetcode 704. 二分查找 题目描述 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示…...
蓝牙耳机什么牌子好?500内好用的蓝牙耳机推荐
随着蓝牙耳机的受欢迎程度越来越高,近几年来,无蓝牙耳机市场呈爆发式增长,蓝牙耳机品牌也越来越多。那么蓝牙耳机什么牌子好?接下来,我来给大家推荐几款500内好用的蓝牙耳机,一起来看看吧。 一、南卡小音舱…...
设计模式 -- 中介者模式
前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…...
人工智能的未来之路:语音识别的应用与挑战
随着人工智能技术的不断发展,语音识别已成为人工智能领域的一个重要应用。语音识别是指通过计算机对语音信号进行处理,将其转换为可以被计算机识别的文本或指令的过程。语音识别技术的应用范围非常广泛,例如智能家居、语音助手、智能客服、智…...
c++ 友元介绍
友元的目的就是让一个函数或类访问另一个函数中的私有成员 友元函数 (1)普通函数作为友元函数 class 类名{friend 函数返回值类型 友元函数名(形参列表);//这个形参一般是此类的对象.... } 经过以上操作后,友元函数就可以访问此类中的私有…...
四维轻云地理空间数据在线管理软件能够在线管理哪些数据?
四维轻云是一款地理空间数据在线管理软件,支持各类地理空间数据的在线管理、浏览及分享,用户可不受时间地点限制,随时随地查看各类地理空间数据。软件还具有项目管理、场景搭建、素材库等功能模块,支持在线协作管理,便…...
学习 GitHub 对我们有什么好处?
学习 GitHub 对我们有什么好处? 为什么要学习 GitHub,或者说学习 GitHub 对我们有什么好处? 理由一:GitHub 上有很多大牛出没,国外的咱先不说,就国内的像百度、腾讯、阿里之类的大公司,里面的很…...
java记录-反射
什么是反射 反射是一种让Java拥有一定动态性的机制,它允许程序在执行期间取得任何类的内部信息,并且直接操作任意对象的内部属性及方法 类加载 类加载后通过堆内存方法区的Class类型对象就能了解该类的结构信息,这个对象就像该类的一面镜子…...
这次彻底不需要账号了,无需魔法永久白嫖GPT
免费GPT 自GPT风靡以来,大家用的是不亦乐乎,你用他去解决过实际问题,你用他去写过代码,你用他去修改过bug,你用他去写过sql,你用他去画过图,你问过他你能想到的任何“刁钻”问题。 你ÿ…...
远程桌面连接是什么?如何开启远程桌面连接详细教程
远程桌面连接是一种非常方便的技术,它允许用户通过互联网在不同的计算机之间共享资源和访问数据。目前这个技术已经广泛地应用于企业、教育、医疗和其他领域,使得人们能够更高效地工作和学习。 这篇文章,我将解释远程桌面连接是什么…...
lua实战(2)
目录 值和类型子类型类型字符串type (v) 值和类型 Lua是一种动态类型语言。这意味着变量没有类型;只有价值观才有意义。该语言中没有类型定义。所有值都有自己的类型。 Lua中的所有值都是一等值。这意味着所有的值都可以存储在变量中,作为参数传递给其他函数&…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
