【Prometheus】如何通过golang生成prometheus格式数据

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,Prometheus监控,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Prometheus监控系统零基础到进阶
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • golang生成prometheus数据
    • 1. 何为exporter
    • 2. exporter简介
    • 3. exporter编写指导
    • 4. 安装依赖
    • 5. 编写代码
    • 6. 运行程序
    • 7. 访问指标
    • 8. 配置Prometheus
    • 9. 总结

golang生成prometheus数据

Prometheus是一个开源的监控系统,拥有许多Advanced Feature,他会定期用HTTP协议来pull所监控系统状态进行数据收集,在加上timestamp等数据组织成time series data,用metric name和label来标识不同的time series,用户可以将数据用可视化工具显示出来,并设置报警阈值进行报警。
本文将介绍Primetheus client的使用,基于golang语言,golang client 是当pro收集所监控的系统的数据时,用于响应pro的请求,按照一定的格式给pro返回数据,说白了就是一个http server。

1. 何为exporter

Prometheus 监控基于一个很简单的模型: 主动抓取目标的指标接口(HTTP 协议)获取监控指标, 再存储到本地或远端的时序数据库. Prometheus 对于指标接口有一套固定的格式要求, 格式大致如下:

# HELP http_requests_total The total number of HTTP requests.
# TYPE http_requests_total counter
http_requests_total{method="post",code="200"} 1027
http_requests_total{method="post",code="400"} 3

对于自己写的代码, 我们当然可以使用 Prometheus 的 SDK 暴露出上述格式的指标. 但对于大量现有服务, 系统甚至硬件, 它们并不会暴露 Prometheus 格式的指标.
比如说:
Linux 的很多指标信息以文件形式记录在 proc 下的各个目录中, 如 /proc/meminfo 里记录内存信息, /proc/stat 里记录 CPU 信息;
Redis 的监控信息需要通过 INFO 命令获取;
路由器等硬件的监控信息需要通过 `SNMP 协议获取;

要监控这些目标, 我们有两个办法, 一是改动目标系统的代码, 让它主动暴露 Prometheus 格式的指标, 当然, 对于上述几个场景这种办法完全是不现实的.
这时候就只能采用第二种办法:
编写一个代理服务, 将其它监控信息转化为 Prometheus 格式的指标
——这个代理服务就是exporter

2. exporter简介

广义上讲所有可以向Prometheus提供监控样本数据的程序都可以被称为一个Exporter。而Exporter的一个实例称为target。
从Exporter的来源上来讲,主要分为两类:
社区提供的
Prometheus社区提供了丰富的Exporter实现,涵盖了从基础设施,中间件以及网络等各个方面的监控功能。这些Exporter可以实现大部分通用的监控需求。
https://exporterhub.io/
用户自定义的
除了直接使用社区提供的Exporter程序以外,用户还可以基于Prometheus提供的Client Library创建自己的Exporter程序,目前Promthues社区官方提供了对以下编程语言的支持:Go、Java/Scala、Python、Ruby。同时还有第三方实现的如:Bash、C++、Common Lisp、Erlang,、Haskeel、Lua、Node.js、PHP、Rust等。

prometheus四种类型的指标Counter 计数,Gauge 观测类,Histogram 直方,Summary 摘要 用golang语言如何构造这4种类型对应的指标,二是搞清楚修改指标值的场景和方式。
在prometheus中如果要监控服务器和应用的各种指标,需要用各种各样的exporter服务,例如node_exportes、mysql_exportes、pgsql_exportes等。这些都是官方或者第三方已经提供好的。
但是如果自己想要监控一些其它exportes没有的指标,则就需要自己去构建一个属于自己的exportes,好在官方提供相关的库,目前支持以下语言:
官方支持语言:
Go
Java or Scala
Python
Ruby
Rust

3. exporter编写指导

Prometheus 官方文档中 Writing Exporter 这篇写得非常全面, 假如你要写 exporter 推荐先通读一遍, 限于篇幅, 这里只概括一下:

做到开箱即用(默认配置就可以直接开始用)

推荐使用 YAML 作为配置格式

指标使用下划线命名

为指标提供 HELP String (指标上的 # HELP 注释, 事实上这点大部分 exporter 都没做好)

为 Exporter 本身的运行状态提供指标

可以提供一个落地页

metric的类型
在开始之前需要了解下metric的类型划分
在这里插入图片描述

要在Golang中生成Prometheus数据,你可以使用Prometheus的官方客户端库 prometheus/client_golang。这个库允许你定义和暴露自定义的指标,并通过HTTP端点将这些指标暴露给Prometheus服务器。

以下是一个简单的示例,展示如何使用Golang生成Prometheus数据:

4. 安装依赖

首先,你需要安装Prometheus的Golang客户端库:

go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp

5. 编写代码

接下来,编写一个简单的Golang程序来生成和暴露Prometheus指标。

package mainimport ("net/http""time""github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp"
)func main() {// 创建一个自定义的Gauge指标customMetric := prometheus.NewGauge(prometheus.GaugeOpts{Name: "my_custom_metric",Help: "This is a custom metric",})// 注册指标prometheus.MustRegister(customMetric)// 启动一个goroutine来更新指标值go func() {for {// 模拟一些业务逻辑,更新指标值customMetric.Set(float64(time.Now().Unix()))time.Sleep(10 * time.Second)}}()// 暴露指标端点http.Handle("/metrics", promhttp.Handler())http.ListenAndServe(":8080", nil)
}

6. 运行程序

运行这个Golang程序:

go run main.go

程序将在本地的8080端口上启动一个HTTP服务器,并暴露 /metrics 端点。

7. 访问指标

你可以通过浏览器或 curl 命令访问 http://localhost:8080/metrics,查看生成的Prometheus指标。

curl http://localhost:8080/metrics

你应该会看到类似以下的输出:

# HELP my_custom_metric This is a custom metric
# TYPE my_custom_metric gauge
my_custom_metric 1.623456789e+09

8. 配置Prometheus

最后,你需要在Prometheus的配置文件中添加这个目标,以便Prometheus服务器可以定期抓取这些指标。

prometheus.yml 中添加以下内容:

scrape_configs:- job_name: 'my_golang_app'static_configs:- targets: ['localhost:8080']

然后重启Prometheus服务器,它将会开始抓取你的Golang应用程序暴露的指标。

9. 总结

通过使用 prometheus/client_golang 库,你可以轻松地在Golang中生成和暴露Prometheus指标。这个示例展示了如何创建一个简单的Gauge指标,并通过HTTP端点暴露它。你可以根据需要扩展这个示例,添加更多的指标类型(如Counter、Histogram等)和更复杂的业务逻辑。

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

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

相关文章

从零开始:OpenCV 图像处理快速入门教程

文章大纲 第1章 OpenCV 概述 1.1 OpenCV的模块与功能  1.2 OpenCV的发展 1.3 OpenCV的应用 第2章 基本数据类型 2.1 cv::Vec类 2.2 cv::Point类 2.3 cv::Rng类 2.4 cv::Size类 2.5 cv:&…

Vim跳转文件及文件行结束符EOL

跳转文件 gf 从当前窗口打开那个文件的内容,操作方式:让光标停在文件名上,输入gf。 Ctrlo 从打开的文件返回之前的窗口 Ctrlwf 可以在分割的窗口打开跳转的文件,不过在我的实验不是次次都成功。 统一行尾格式 文本文件里存放的…

MLA 架构

注:本文为 “MLA 架构” 相关文章合辑。 未整理去重。 DeepSeek 的 MLA 架构 原创 老彭坚持 产品经理修炼之道 2025 年 01 月 28 日 10:15 江西 DeepSeek 的 MLA(Multi-head Latent Attention,多头潜在注意力)架构 是一种优化…

变压器-000000

最近一个项目是木田12V的充电器,要设计变压器,输出是12V,电压大于1.5A12.6*1.518.9W. 也就是可以将变压器当成初级输入的一个负载。输入端18.9W. 那么功率UI 。因为变压器的输入是线性上升的,所以电压为二份之一,也就是1/2*功率…

【DeepSeek】私有化本地部署图文(Win+Mac)

目录 一、DeepSeek本地部署【Windows】 1、安装Ollama 2、配置环境变量 3、下载模型 4、使用示例 a、直接访问 b、chatbox网页访问 二、DeepSeek本地部署【Mac】 1、安装Ollama 2、配置环境变量 3、下载模型 4、使用示例 5、删除已下载的模型 三、DeepSeek其他 …

02vue3实战-----项目目录详解

02vue3实战-----项目目录详解 1.目录完整结构2.extensions.json文件3.node_modules文件夹4.public文件夹5.src文件夹6.文件.gitignore7.文件env.d.ts8.文件index.html9.文件package-lock.json和文件package.json10.文件README.md11.文件vite.config.ts12.文件tsconfig.json和文…

ubuntu20.04+RTX4060Ti大模型环境安装

装显卡驱动 这里是重点,因为我是跑深度学习的,要用CUDA,所以必须得装官方的驱动,Ubuntu的附件驱动可能不太行. 进入官网https://www.nvidia.cn/geforce/drivers/,选择类型,最新版本下载。 挨个运行&#…

Fedora 的 2025 年展望:AI 集成与 HDR 支持打造强大 Linux 桌面体验

Fedora 项目已经从节庆活动中恢复,准备在未来几个月推出一系列关键计划。Red Hat 软件工程总监 Christian Schaller 在他的博客文章中分享了 2025 年 Fedora 发行版的重点发展方向和优先事项,涵盖了人工智能集成、Wayland、HDR 协议、PipeWire 等多个领域…

java时间相关类

时间相关类 JDK7以前时间相关类Date时间时间换算 SimpleDateFormat格式化时间作用格式化时间常用模式对应关系 Calendar日历作用Calendar常用方法 JDK8新增时间相关类Date类ZoneId常用方法 Instant时间戳常见方法 ZoneDateTime带时区的时间常用方法 日期格式化类常用方法 日历类…

js-对象-JSON

JavaScript自定义对象 JSON 概念: JavaScript Object Notation,JavaScript对象标记法. JSON 是通过JavaScript 对象标记法书写的文本。 由于其语法简单,层次结构鲜明,现多用于作为数据载体,在网络中进行数据传输. json中属性名(k…

深入理解 Java 接口的回调机制 【学术会议-2025年人工智能与计算智能(AICI 2025)】

大会官网:www.icaici.org 前言 回调是一种非常重要的编程技术,它广泛应用于事件驱动的编程、异步任务和框架设计中。在 Java 中,回调机制通常通过 接口 来实现。本篇博客将详细解析 Java 接口的回调原理、实现方式,以及实际开发中…

import { Component, Vue, Prop, Watch } from ‘vue-property-decorator‘

文章目录 导入部分的解释总结Vue 3 的推荐替代方案总结 你提供的代码片段是使用 vue-property-decorator 库的示例,这是一个第三方库,它提供了 Vue 组件的装饰器,使得编写类风格的 Vue 组件更加方便。以下是对代码中每个部分的详细解释&…

【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信

引言 我们之前了解了在不同场景下,Kubernetes中Pod之间的通信是如何路由的。 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信现在,我们来看看在集群中,Pod与服务之间的通信是如何…

el-table中的某个字段最多显示两行,超出部分显示“...详情”,怎么办

文章目录 背景需求需求分析 解决方案在线体验灵感来源我的实现方案 总结 背景 需求 比如,有如下一个表格,请你实现它: 要求: 最多显示两行超出部分显示为:“…详情”点击详情,展开全部内容 说明&#x…

如何获取sql数据中时间的月份、年份(类型为date)

可用自带的函数month来实现 如: 创建表及插入数据: create table test (id int,begindate datetime) insert into test values (1,2015-01-01) insert into test values (2,2015-02-01) 执行sql语句,获取月份: select MONTH(begindate)…

数据库系统概论的第六版与第五版的区别,附pdf

我用夸克网盘分享了「数据库系统概论第五六版资源」,点击链接即可保存。 链接:https://pan.quark.cn/s/21a278378dee 第6版教材修订的主要内容 为了保持科学性、先进性和实用性,在第5版教材基础上对全书内容进行了修改、更新和充实。 在科…

告别手动操作!用Ansible user模块高效管理 Linux账户

在企业运维环境中,服务器的用户管理是一项基础但非常重要的任务。比如,当有新员工加入时,我们需要在多台服务器上为他们创建账户并分配合适的权限。而当员工离职或岗位发生变化时,我们也需要迅速禁用或删除他们的账户,…

区块链项目孵化与包装设计:从概念到市场的全流程指南

区块链技术的快速发展催生了大量创新项目,但如何将一个区块链项目从概念孵化成市场认可的产品,是许多团队面临的挑战。本文将从孵化策略、包装设计和市场落地三个维度,为你解析区块链项目成功的关键步骤。 一、区块链项目孵化的核心要素 明确…

51单片机 02 独立按键

一、独立按键控制LED亮灭 轻触按键&#xff1a;相当于是一种电子开关&#xff0c;按下时开关接通&#xff0c;松开时开关断开&#xff0c;实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 #include <STC89C5xRC.H> void main() { // P20xFE;while(1){…

免费windows pdf编辑工具

Epdf&#xff08;完全免费&#xff09; 作者&#xff1a;不染心 时间&#xff1a;2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器&#xff0c;目前仍在开发中。它提供了一系列实用的命令行选项&#xff0c;方便用户对 PDF …