什么是 Prometheus

Prometheus 是一个开源的系统监控和警报工具,最初由 SoundCloud 开发,并于 2012 年发布为开源项目。它是一个非常强大和灵活的工具,用于监控应用程序和系统的性能,并根据预定义的规则触发警报。以下是对 Prometheus 的详细介绍:

特点和优势:

  1. 多维数据模型: Prometheus 使用多维数据模型来存储时间序列数据。每个时间序列都由一组键值对唯一标识,这使得数据非常灵活且容易查询。
  2. 灵活的查询语言: Prometheus 使用一种称为 PromQL(Prometheus Query Language)的查询语言,允许用户执行复杂的查询和数据分析操作。你可以使用 PromQL 从存储的度量数据中提取有价值的信息。
  3. 内置 Web UI: Prometheus 提供了一个内置的 Web 用户界面,用于查询和可视化度量数据。这个用户界面使得用户能够更直观地查看数据,而无需编写查询语言。
  4. 持久性存储: Prometheus 使用本地存储引擎来保存时间序列数据,这使得它能够高效地存储大量数据,并且不需要依赖外部数据库。它还支持数据快照和备份。
  5. 警报和通知: Prometheus 具有强大的警报功能,允许用户定义警报规则,当某些条件满足时触发警报。警报可以发送到各种通知渠道,如电子邮件、Slack 等。
  6. 自动发现: Prometheus 支持服务自动发现,可以自动发现并监控新的目标(如容器、虚拟机等)。这使得在动态环境中维护监控系统变得更容易。
  7. 社区支持和生态系统: Prometheus 拥有一个活跃的社区,以及丰富的插件和集成,可与其他工具和服务(如Grafana、Alertmanager、Kubernetes等)集成。

Prometheus 架构:

Prometheus 由以下几个核心组件组成:

  1. Prometheus 服务器(Prometheus Server): 这是主要的后端组件,负责抓取和存储时间序列数据,执行查询和计算度量数据。
  2. Exporters: 这些是用于将应用程序和系统度量数据公开为 Prometheus 可以抓取的时间序列的代理。Prometheus 社区维护了许多 Exporter,用于监控各种常见的服务和应用程序。
  3. Client Libraries: Prometheus 提供各种语言的客户端库,允许应用程序开发者轻松将度量数据暴露给 Prometheus。这些库可用于记录自定义应用程序指标。
  4. Alertmanager: 这是用于处理警报的组件。它负责根据预定义的规则管理和分发警报,可以将警报发送到不同的通知渠道。

Prometheus 工作流程:

  1. 数据抓取: Prometheus 定期轮询配置的目标,如应用程序和 Exporters,以获取度量数据。这些数据以时间序列的形式存储在 Prometheus 内部数据库中。
  2. 数据存储: Prometheus 使用内置的本地存储引擎将时间序列数据持久化存储在本地磁盘上。存储数据的持久性使得用户可以访问历史数据以进行分析。
  3. 查询和分析: 用户可以使用 PromQL 查询语言执行各种查询和分析操作,以从存储的度量数据中提取有用的信息。查询结果可以在 Prometheus Web 用户界面中查看。
  4. 警报和通知: 用户可以定义警报规则,当某些条件满足时,Prometheus 将触发警报。Alertmanager

使用 Prometheus 监控应用程序

下面是关于如何在 Go 中使用 Prometheus 的详细介绍:

步骤1:安装 Prometheus

首先,你需要安装和配置 Prometheus 服务器。你可以从 Prometheus 的官方网站下载适合你操作系统的二进制文件,并根据官方文档配置 Prometheus 服务器。安装完成后,启动 Prometheus 服务器。

步骤2:引入 Prometheus Go 客户端库

Prometheus 提供了一个用于 Go 应用程序的客户端库,你需要引入这个库以便在应用程序中生成度量数据。你可以使用 Go 模块来引入 Prometheus Go 客户端库:

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

步骤3:创建度量指标

在你的 Go 应用程序中,你需要创建要监控的度量指标。Prometheus 支持多种度量类型,包括计数器(Counter)、测量仪(Gauge)和直方图(Histogram)等。以下是一些示例:

创建计数器(Counter):

import (
"github.com/prometheus/client_golang/prometheus"
) var requestsTotal = prometheus.NewCounter(
prometheus.CounterOpts{
Name: "myapp_requests_total",
Help: "Total number of requests",
},
) func init() {
prometheus.MustRegister(requestsTotal)
}

创建测量仪(Gauge):

import (
"github.com/prometheus/client_golang/prometheus"
) var freeMemory = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "myapp_free_memory",
Help: "Free memory in bytes",
},
) func init() {
prometheus.MustRegister(freeMemory)
}

步骤4:导出度量数据

要使 Prometheus 能够收集应用程序生成的度量数据,你需要创建一个 HTTP 处理程序来暴露这些数据。通常,Prometheus 使用 /metrics 路径来获取度量数据。

import (
"net/http"
"github.com/prometheus/client_golang/promhttp"
) func main() {
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":8080", nil)
}

步骤5:生成和导出度量数据

在你的应用程序中,使用创建的度量指标来生成和更新度量数据。例如,如果你想增加请求数计数器的值,可以执行以下操作:

requestsTotal.Inc()

Prometheus 会定期轮询你的应用程序的 /metrics 路径,以获取最新的度量数据。

步骤6:配置 Prometheus 服务器

在 Prometheus 服务器的配置文件中,添加你的应用程序的终端(即要抓取度量数据的地址):

scrape_configs:
- job_name: 'myapp'
static_configs:
- targets: ['your_app_host:8080']

步骤7:查询和可视化

启动 Prometheus 服务器后,你可以访问 Prometheus Web UI(默认地址为 http://localhost:9090 ),使用 PromQL 查询语言来查询和可视化度量数据。

步骤8:设置报警规则

Prometheus 还支持设置报警规则,以便在达到某些条件时触发警报。你可以在 Prometheus 配置文件中定义这些规则。

以上就是使用 Prometheus 在 Go 应用程序中进行监控的基本步骤。通过创建自定义的度量指标并将其导出到 Prometheus,你可以轻松地监控和分析你的应用程序性能。同时,Prometheus 提供了丰富的查询和可视化工具,可以帮助你更好地理解应用程序的行为和趋势。


声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意


每日一库:Prometheus的更多相关文章

  1. Go 每日一库之 flag

    缘起 我一直在想,有什么方式可以让人比较轻易地保持每日学习,持续输出的状态.写博客是一种方式,但不是每天都有想写的,值得写的东西. 有时候一个技术比较复杂,写博客的时候经常会写着写着发现自己的理解有偏 ...

  2. Go 每日一库之 viper

    简介 上一篇文章介绍 cobra 的时候提到了 viper,今天我们就来介绍一下这个库. viper 是一个配置解决方案,拥有丰富的特性: 支持 JSON/TOML/YAML/HCL/envfile/ ...

  3. Go 每日一库之 fsnotify

    简介 上一篇文章Go 每日一库之 viper中,我们介绍了 viper 可以监听文件修改进而自动重新加载. 其内部使用的就是fsnotify这个库,它是跨平台的.今天我们就来介绍一下它. 快速使用 先 ...

  4. Go 每日一库之 go-flags

    简介 在上一篇文章中,我们介绍了flag库.flag库是用于解析命令行选项的.但是flag有几个缺点: 不显示支持短选项.当然上一篇文章中也提到过可以通过将两个选项共享同一个变量迂回实现,但写起来比较 ...

  5. Go 每日一库之 go-homedir

    简介 今天我们来看一个很小,很实用的库go-homedir.顾名思义,go-homedir用来获取用户的主目录. 实际上,使用标准库os/user我们也可以得到这个信息: package main i ...

  6. Go 每日一库之 go-ini

    简介 ini 是 Windows 上常用的配置文件格式.MySQL 的 Windows 版就是使用 ini 格式存储配置的. go-ini是 Go 语言中用于操作 ini 文件的第三方库. 本文介绍g ...

  7. Go 每日一库之 cobra

    简介 cobra是一个命令行程序库,可以用来编写命令行程序.同时,它也提供了一个脚手架, 用于生成基于 cobra 的应用程序框架.非常多知名的开源项目使用了 cobra 库构建命令行,如Kubern ...

  8. go每日一库 [home-dir] 获取用户主目录

    关于我 我的博客|文章首发 顾名思义,go-homedir用来获取用户的主目录.实际上,通过使用标准库os/user我们也可以得到内容,使用以下方式 标准库使用 package main import ...

  9. Go 每日一库之 go-carbon,优雅的golang日期时间处理库

    Carbon 是一个轻量级.语义化.对开发者友好的 golang 时间处理库,支持链式调用. Carbon 已被 awesome-go 收录, 如果您觉得不错,请给个 star 吧. github.c ...

  10. Golang每日一库之bcrypt

    本文 官方文档: https://pkg.go.dev/golang.org/x/crypto/bcrypt 前言 之前讲过JWT Token https://www.cnblogs.com/zich ...

随机推荐

  1. Galaxy 平台下 LEfSe 安装与使用教程

    LEfSe (Linear discriminant analysis Effect Size) 是一种用于发现和解释高维度数据生物标识(基因.通路和分类单元等)的分析工具,可以进行两个或多个分组的比 ...

  2. 【电脑Tips】Win11自动更新之后开机黑屏

    目录 0.问题描述 1. 释放静电 具体操作 效果 参考博客 2. 运行explorer.exe 具体操作: [问题]:如何打开任务管理器? 效果 参考博客 另外的运行方法 3. 禁用APP Read ...

  3. Python Selenium UI自动化测试

    Python Selenium UI自动化测试 1.自动化测试基础 1.1 自动化测试的定义 将人为的测试行为转化为机器自动执行的过程 1.2 自动化测试的目的 减少成本,提高测试效率 减少人为因素对 ...

  4. 前端Vue图片上传组件支持单个文件多个文件上传 自定义上传数量 预览删除图片 图片压缩

    前端Vue图片上传组件支持单个文件多个文件上传 自定义上传数量 预览删除图片 图片压缩, 下载完整代码请访问uni-app插件市场址:https://ext.dcloud.net.cn/plugin? ...

  5. 前端vue echart自定义图表(柱形图 折线图 饼图 树形结构图 关系图谱 )

    快速实现echart自定义图表(柱形图 折线图 饼图 树形结构图 关系图谱 ); 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id= ...

  6. 迟来的秋招面经,17家公司,Java岗位

    一位朋友秋招面试了17家公司(都是中小公司或者银行),Java 后端岗.下面是他的个人情况.求职经验已经这17家公司的面经. 个人情况和求职经验 其实现在是挺后悔大学没有好好的学习的,因为基本上都会提 ...

  7. Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录

    前言 之前自己写的flask使用gunicorn上线生产环境没有什么问题,但是最近搭建了一个现成的flask项目,当使用python直接运行时不会有问题,而使用gunicorn时则会出现一些问题. 部 ...

  8. 2023-07-20:假设一共有M个车库,编号1~M,时间点从早到晚是从1~T, 一共有N个记录,每一条记录如下{a, b, c}, 表示一辆车在b时间点进入a车库,在c时间点从a车库出去, 一共有K

    2023-07-20:假设一共有M个车库,编号1 ~ M,时间点从早到晚是从1 ~ T, 一共有N个记录,每一条记录如下{a, b, c}, 表示一辆车在b时间点进入a车库,在c时间点从a车库出去, ...

  9. 代码随想录贪心专题-day1

    35. 分发糖果 n 个孩子站成一排.给你一个整数数组 ratings 表示每个孩子的评分. 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻两个孩子评分更高的孩子会获 ...

  10. 【AltWalker】模型驱动:轻松实现自动化测试用例的自动生成和组织执行

    模型驱动的自动化测试 模型驱动的自动化测试(Model-Based Testing, 后文中我们将简称为MBT)是一种软件测试方法,它将系统的行为表示为一个或多个模型,然后从模型中自动生成和执行测试用 ...