当前位置: 首页 > news >正文

普罗米修斯统计信息上报结构设计

为了实现高效的监控和警报,普罗米修斯提供了一个强大的统计信息上报机制。通过这个机制,可以将应用程序的各种统计信息发送到普罗米修斯,普罗米修斯会对这些信息进行处理,然后提供丰富的监控和警报功能。下面是基本的统计信息上报结构:

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

通过上述的设计,可以将应用程序的各种统计信息发送到普罗米修斯,并且可以利用普罗米修斯提供的丰富功能进行监控和警报。

下面的时序图展示了应用程序如何将指标发送给普罗米修斯,并且如何使用普罗米修斯的查询功能来检索和分析这些指标。

App Prometheus User 发送指标 返回响应 发送查询请求 返回响应 App Prometheus User

以下是一个使用Go语言调用Prometheus接口上报内存占用的示例。在这个示例中,将使用 Go 语言编写一个简单的应用程序,该程序将部署在一个容器内,并监听 13499 端口。当收到客户端请求时,服务器将获取容器内存占用信息,然后使用 gRPC 将数据发送回客户端。

首先,确保安装了以下 Go 语言库:

  1. Prometheus 客户端库:github.com/prometheus/client_golang/prometheus
  2. 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 语言库:

  1. 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&#xf…...

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,你用他去画过图,你问过他你能想到的任何“刁钻”问题。 你&#xff…...

远程桌面连接是什么?如何开启远程桌面连接详细教程

远程桌面连接是一种非常方便的技术,它允许用户通过互联网在不同的计算机之间共享资源和访问数据。目前这个技术已经广泛地应用于企业、教育、医疗和其他领域,使得人们能够更高效地工作和学习。 这篇文章,我将解释远程桌面连接是什么&#xf…...

lua实战(2)

目录 值和类型子类型类型字符串type (v) 值和类型 Lua是一种动态类型语言。这意味着变量没有类型;只有价值观才有意义。该语言中没有类型定义。所有值都有自己的类型。 Lua中的所有值都是一等值。这意味着所有的值都可以存储在变量中,作为参数传递给其他函数&…...

UI自动化测试案例——简单的Google搜索测试

以下是一个UI自动化测试的经典案例: import unittest from selenium import webdriverclass GoogleSearchTest(unittest.TestCase):def setUp(self):# 创建Chrome浏览器实例self.driver webdriver.Chrome()self.driver.maximize_window() # 最大化浏览器窗口def t…...

C++之虚函数原理

对象数据和函数的存储方式 注意说的是对象。 C中的对象存储方式是 每个对象占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分),函数属于公共部分。 虚函数表 虚函数是通过虚函数表实现的。 C实现虚函数的方法是…...

Windows Information Protection(WIP)部署方案

目录 前言 一、方案准备工作 1、确定哪些数据需要保护 2、选择合适的加密方式...

细说Hibernate的缓存机制

Hibernate 的缓存机制主要包括一级缓存和二级缓存。 1. 一级缓存(Session 缓存): 一级缓存是 Hibernate 的 Session 级别的缓存,与每个 Session 对象相关联。当您通过 Session 对象执行查询、保存或更新操作时,Hibern…...

初识C++之线程库

目录 一、C中的线程使用 二、C的线程安全问题 1. 加锁 2. 变为原子操作 3. 递归里面的锁 4. 定时锁 5. RAII的锁 三、条件变量 1. 为什么需要条件变量 2. 条件变量的使用 2.1 条件变量的相关函数 2.2 wait函数 一、C中的线程使用 线程的概念在linux中的线程栏已经…...

ChatGLM-LLaMA-chinese-insturct 学习记录(含LoRA的源码理解)

ChatGLM-LLaMA-chinese-insturct 前言一、实验记录1.1 环境配置1.2 代码理解1.2.1 LoRA 1.4 实验结果 二、总结 前言 介绍:探索中文instruct数据在ChatGLM, LLaMA等LLM上微调表现,结合PEFT等方法降低资源需求。 Github: https://github.com/27182812/Ch…...

JuiceFS-K8s部署

目录 1、部署JuiceFS-CSI驱动2、创建OBS认证信息Secret3、创建存储类4、创建PVC--PVC创建时会自动创建PV5、创建测试Pod--测试Pod创建容器内是否挂载成功 官网文档地址:https://juicefs.com/docs/zh/csi/introduction/ 1、部署JuiceFS-CSI驱动 部署yaml如下&#x…...

2023最新版本Camtasia电脑录屏软件好不好用?

在当今数字化时代,屏幕录制成为了许多用户制作教学视频、演示文稿、游戏攻略等内容的首选。本文将为您介绍几款常用的电脑录屏软件,包括Camtasia、OBS Studio、Bandicam等,并对其进行功能和用户体验方面的比较,同时给出10款电脑录…...

第三章 Linux 初步

第三章 Linux 初步 一、 基本操作 ①登录: Linux 是多用户系统,必须用正确的用户名和口令登录后才能 进入 Linux Shell 提示符状态。 默认的文本界面 Shell 提示符有两种: •root 用户登录后的提示符: # •普通用户登录后的…...

linux环境安装使用mysql详解

01-安装MySQL并启动 1.1 环境准备 # 1.卸载mariadb,否则安装mysql会出现冲突 (1).执行命令rpm -qa | grep mariadb 会列出所有被安装的mariadb rpm 包; (2).执行命令rpm -e --nodeps mariadb-libs-5.5.56…...