前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >监控利器 prometheus 使用步骤

监控利器 prometheus 使用步骤

作者头像
用户2825413
发布于 2022-11-30 07:17:33
发布于 2022-11-30 07:17:33
86500
代码可运行
举报
运行总次数:0
代码可运行

1. 监控

完善的监控和合理的指标采集方便我们去观察线上的健康情况, 更好的预测和处理问题.

监控我们可以分为白盒监控和黑盒监控, 那它们具体表示什么意思呢?

⿊盒监控:站在⽤户的⻆度看到的东⻄。⽹站不能打开,⽹站打开的⽐较慢, 监控机器的磁盘空间、内存占用、链接句柄等信息, 更多的是全局表象的信息, 一般不容易定位到具体问题.

⽩盒监控:监控服务内部自定义的数据,比如最近sql耗时情况、redis链接情况、服务一些业务方面数据等, 完善的白盒监控能让我们清楚了解到服务运行中的情况, 成为定位问题的根因.

监控工具众多, 在当今云原生时代提起监控自然少不了 prometheus.

2. 为什么选择 prometheus

黑盒监控方面 prometheus 提供了丰富的node_export, 不仅有拿来即用的机器监控基础指标, 还有丰富的mysql、memcache等服务的export可以直接使用.

在白盒监控方面 prometheus 提供了各类语言的包, 可以非常方便集成到项目里面, 例如 go 语言默认带有 goroutine、thread、gc、heap 等服务指标监控, 还方便自己定义业务指标, 集成到监控体系中去, 下文我们将会有此案例展示.

prometheus 背景

Prometheus是一个开源系统监控和警报工具包,最初在 SoundCloud构建。自 2012 年成立以来,许多公司和组织都采用了 Prometheus。它现在是一个独立的开源项目,独立于任何公司维护。为了强调这一点,并明确项目的治理结构,Prometheus 于 2016 年加入 云原生计算基金会,成为继Kubernetes之后的第二个托管项目.

更多详细资料可参考最下方给出的官方文档

我们来看下具体 prometheus 是怎么工作的?

image.png

1.采集部分

左侧部分是采集部分, prometheus 采集数据全部都是通过 http pull 的模式来获取服务指标数据的.

对于一些临时性job等场景, 则提供了Pushgateway组件, 将指标信息push到gateway上, prometheus 通过拉取 gateway 获取指标数据.

关于 pull 和 push 的争论有很多, 无疑pull模式对于双方来说, 对于业务侵入性和接入复杂度都是最小的, 感兴趣读者可查阅下方总结链接

2. prometheus server

prometheus 怎么知道要去拉取哪些机器地址指标呢?

Time Series Database (TSDB) 时序数据库, 负责存储我们的指标数据.

Retrieval 通过服务发现或文件配置获取到目标地址进行 pull 抓取指标数据, 写入TSDB.

HTTP server 提供访问 TSDB 数据的接口, 用于与外部交互

3. PromQL

PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言,它能实现对事件序列数据的查询、聚合、逻辑运算等处理, 功能非常强大

PromQL 广泛存在于以 Prometheus 为核心的监控体系中。所以需要用到数据筛选的地方,就会用到 PromQL。例如:监控指标的设置、报警指标的设置等等

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 过去五分钟平均每秒增长率
rate(http_requests_total{job="api-server"}[5m])

// 过去五分钟内 HTTP 请求数
increase(http_requests_total{job="api-server"}[5m])

//计算过去十分钟内请求持续时间的 90 百分位
histogram_quantile(0.9, rate(http_request_duration_seconds_bucket[10m]))

值得一提的是不仅可以使用自己的 prometheus 查询界面, 并且还很好的配合 grafana 完成图表配置.

4. Alertmanager

报警一直是整个监控系统中的重要组成部分,Prometheus监控系统中,采集与警报是分离的.

Alertmanager模块负责配置告警的配置

3. prometheus Metrics 指标类型

3.1 counter 单调递增

通常 counter 用来表示服务的请求数、服务错误数、累加值数据, 通常结合PromQL的rate、increase等函数配置.

对应接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Counter interface {
   // Inc increments the counter by 1. Use Add to increment it by arbitrary
   // non-negative values.
   Inc()
   // Add adds the given value to the counter. It panics if the value is <
   // 0.
   Add(float64)
}

我们可以看到counter类型的, 只提供了累加值功能

案例: 接口请求数统计

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_metricServerErrorRequest := prometheus.NewCounterVec(prometheus.CounterOpts{
   Name: "lib_server_request_error_total",
   Help: "The total number of http or grpc request error",
}, []string{"kind", "action"})

// kind=http action=/activity/health 请求数+1
_metricServerErrorRequest.WithLabelValues("http", "/activity/health").Inc()

3.2 Gauge 可增可减

Guage 类型代表⼀种样本数据可以任意变化的指标,即可增可减. 例如我们统计的当前协程数、线程数、CPU占用率等.

对应接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Gauge interface {
   // Set sets the Gauge to an arbitrary value.
   Set(float64)
   // Inc increments the Gauge by 1. Use Add to increment it by arbitrary
   // values.
   Inc()
   // Dec decrements the Gauge by 1. Use Sub to decrement it by arbitrary
   // values.
   Dec()
   // Add adds the given value to the Gauge. (The value can be negative,
   // resulting in a decrease of the Gauge.)
   Add(float64)
   // Sub subtracts the given value from the Gauge. (The value can be
   // negative, resulting in an increase of the Gauge.)
   Sub(float64)

   // SetToCurrentTime sets the Gauge to the current Unix time in seconds.
   SetToCurrentTime()
}

案例: 当前系统并发数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
inFlightGauge := prometheus.NewGauge(prometheus.GaugeOpts{
   Name: "client_in_flight_requests",
   Help: "A gauge of in-flight requests for the wrapped client.",
})

//累加1
inFlightGauge.Inc()

// dosomething

//减少1
inFlightGauge.Sub(1)

结构类似下图, go_threads 表示当前的线程数

image.png

3.3 Histogarm 直方图

服务请求耗时通常具有长尾问题, 如果我们更想关注有多少请求是在50ms内完成的, 有多少是在100ms完成的, 则需要用到分桶, Histogarm 或 Summary 就是做这个事情的.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Histogram interface {
   // Observe adds a single observation to the histogram. Observations are
   // usually positive or zero. Negative observations are accepted but
   // prevent current versions of Prometheus from properly detecting
   // counter resets in the sum of observations. See
   // https://prometheus.io/docs/practices/histograms/#count-and-sum-of-observations
   // for details.
   Observe(float64)
}

案例: 接口耗时统计

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_metricUrlDuration := prometheus.NewHistogramVec(prometheus.HistogramOpts{
   Name:    "lib_url_duration_ms",
   Help:    "server requests duration(ms).",
   Buckets: []float64{25, 50, 100, 200, 500, 1000},
}, []string{"action"})

// activity/health 接口耗时58ms
_metricUrlDuration.WithLabelValues("/activity/health").Observe(58)

结构类似下图 (action表示接口, le表示时间ms)

image.png

在使用此类型时, 要合理评估指标产生量和bucket区间, 如果不注意很可能一条配置成指数级扩增, 影响采集效率.

3.4 Summary 简化直方图

与 Histogram 类型类似, ⽤于表示⼀段时间内的数据采样结果(通常是请求持续时间或响应⼤⼩等), 但它直接 存储了分位数(通过客户端计算,然后展示出来), ⽽不是通过区间来计算.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Summary interface {
   // Observe adds a single observation to the summary. Observations are
   // usually positive or zero. Negative observations are accepted but
   // prevent current versions of Prometheus from properly detecting
   // counter resets in the sum of observations. See
   // https://prometheus.io/docs/practices/histograms/#count-and-sum-of-observations
   // for details.
   Observe(float64)
}

4. go项目如何引入prometheus

go 引入 prometheus 也非常简单,

4.1 第一步 引入系统自导指标

引入 github.com/prometheus/client_golang/prometheus/promhttp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ....
import "github.com/prometheus/client_golang/prometheus/promhttp"

// 默认已经包含了go的常用服务监控指标
srv.HandlePrefix("/metrics", promhttp.Handler())

默认prometheus会自动抓取 /metrics 路径, 只要网络是畅通的, 我们指标就自动被采集到 prometheus 上去了, 业务端不用感知任何 proemtheus 节点且对业务无影响, 这是 pull 模式最大的好处.

引入包后默认自带了 goroutine、heap、gc 等go应用的统计指标, 当然我们再延伸更希望定义一些指标.

第二步 加入自定义指标

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//服务请求耗时/总请求数
_metricUrlDuration := prometheus.NewHistogramVec(prometheus.HistogramOpts{
   Name:    "lib_url_duration_ms",
   Help:    "server requests duration(ms).",
   Buckets: []float64{25, 50, 100, 200, 500, 1000},
}, []string{"action"})

//服务异常数
_metricServerErrorRequest := prometheus.NewCounterVec(prometheus.CounterOpts{
   Name: "lib_server_request_error_total",
   Help: "The total number of http or grpc request error",
}, []string{"kind", "action"})

//sql请求耗时
_metricSqlDuration := prometheus.NewHistogramVec(prometheus.HistogramOpts{
   Name:    "lib_sql_duration_ms",
   Help:    "sql requests duration(ms).",
   Buckets: []float64{25, 50, 100, 200, 500},
}, []string{})

prometheus.MustRegister(_metricServerErrorRequest, _metricUrlDuration, _metricSqlDuration)

上面代码在指标类型展出那出现过, histogram 和 counter 类型的指标

第三步, 根据不同请求打点计数

可以在业务代码中使用定义好的 metric 对象打点计数.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 设置请求耗时58ms
_metricUrlDuration.WithLabelValues("/activity/health").Observe(58)

// activity/health 接口请求数量+1
_metricServerErrorRequest.WithLabelValues("http", "/activity/health").Inc()

最终效果图例:

image.png

image.png

image.png

5.参考

prometheus官方文档 https://prometheus.io/docs/introduction/overview/

中文文档 https://icloudnative.io/prometheus/

pull 和 push 模式的对比 https://developer.aliyun.com/article/786418

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小宇技术研究所 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
用javascript实现轮播图效果
程序媛夏天
2024/01/18
2750
用三种方式实现轮播图
顾名思义,轮播图就是实现图片的轮换播放效果。先显示一张图片,一定的时间,让这张图片消失,下一张图片显示。让它们实现跟淘宝首页一样的广告轮播效果。
微醺
2019/01/17
2.8K0
情人节程序员用HTML网页表白【七夕活动邀请函手机动态模板】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
1 网页简介:基于 HTML+CSS+JavaScript 制作七夕情人节表白网页、生日祝福、七夕告白、 求婚、浪漫爱情3D相册、炫酷代码 ,快来制作一款高端的表白网页送(他/她)浪漫的告白,制作修改简单,可自行更换背景音乐,文字和图片即可使用
IT司马青衫
2022/08/20
6760
情人节程序员用HTML网页表白【七夕活动邀请函手机动态模板】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
微信小程序--层叠轮播图
效果展示 Demo代码 wxml <view class="selection_cards" bindtouchstart="touchstart" bindtouchmove="touchmove"
海轰Pro
2021/04/09
1.7K0
微信小程序--层叠轮播图
JS-运动基础——案例应用:淡入淡出效果
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>淡入淡出</title> <style type="text/css"> .div { width: 100px; height: 100px; background-color: red;
xing.org1^
2018/05/17
1.8K0
原生js实现淡入淡出轮播图效果
程序媛夏天
2024/01/18
5630
原生js实现淡入淡出轮播图效果
实战SSM_O2O商铺_40【前端展示】首页轮播图和一级商铺View层的实现
在完成了后端 实战SSM_O2O商铺_39【前端展示】首页轮播图和一级商铺Dao+Service+Controller层的开发 的开发之后,我们来实现View层的部分
小小工匠
2021/08/17
2710
使用swiper制作拓展效果(跑马灯)
Swiper是纯javascript打造的滑动特效插件,面向手机、平板电脑等移动终端。
天天_哥
2018/09/29
4.1K0
原生JS实现呼吸轮播图
今天给大家分享一个用原生JS实现的呼吸轮播图,效果如下: 以下是代码实现,欢迎大家复制粘贴。 <!DOCTYPE html> <html> <head> <meta charset="ut
越陌度阡
2020/11/26
9.5K0
原生JS实现呼吸轮播图
Swiper做轮播图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" conten
明知山
2020/09/03
1.4K0
Swiper实现全屏视觉差轮播
Swiper作为当代流行的js框架,非常受到青睐,这里演示swiper在pc端全屏视觉轮播的效果,这也是pc端常用的一种特性
用户3159471
2018/09/13
3.6K0
图片轮播(淡入淡出)--JS原生和jQuery实现
图片轮播(淡入淡出)--js原生和jquery实现 图片轮播有很多种方式,这里采用其中的 淡入淡出形式 js原生和jQuery都可以实现,jquery因为封装了很多用法,所以用起来就简单许多,转换成js使用,其实也就是用js原生模拟出这些用法。 但不管怎样,构造一个最基本的表现层是必须的
书童小二
2018/09/03
24.6K0
图片轮播(淡入淡出)--JS原生和jQuery实现
swiper.animate实现轮播展示动画效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Swiper demo</title> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1"> <link rel="stylesheet" href="https://cdn.bootc
明知山
2020/09/03
1.7K0
get几个小技能:轮播图插件、进度条插件、筛选过滤插件
最近参加了一个网页设计大赛,趁这个机会做了一个个人简历的网页:点击欣赏 用到了许多有趣的东西们今天分享一下。
不愿意做鱼的小鲸鱼
2022/09/24
1.8K0
get几个小技能:轮播图插件、进度条插件、筛选过滤插件
轮播图技术实战
张哥编程
2024/12/13
1220
Vue实现轮播效果
文章转载自:Swiper中文网 [https://www.swiper.com.cn]
Li_XiaoJin
2022/06/10
1.1K0
Vue实现轮播效果
JavaScript 轮播图:让网页焕发生机
欢迎大家来到本篇博客,今天我们将一起探讨如何使用 JavaScript 创建一个精美的轮播图。轮播图是现代网站设计的关键元素之一,它能够使网页更加吸引人,提高用户体验。无需担心,本文将面向基础小白,从头开始解释每一步。
繁依Fanyi
2023/11/03
1.3K0
javascript写淡入淡出效果的轮播图
更多内容请见原文,文章转载自:https://blog.csdn.net/weixin_44519496/article/details/118599165
马克社区
2022/04/15
7180
第54天:原生js实现轮播图效果
一系列的大小相等的图片平铺,利用CSS布局只显示一张图片,其余隐藏。通过计算偏移量利用定时器实现自动播放,或通过手动点击事件切换图片。
半指温柔乐
2018/09/11
7K0
第54天:原生js实现轮播图效果
css循环淡入淡出播放(二)
之前在docusaurus实现了css的循环淡入淡出播放,发现效果有一点局限,遂还是用js结合css实现了,目前代码为:
阿超
2025/02/08
1820
推荐阅读
相关推荐
用javascript实现轮播图效果
更多 >
目录
  • 1. 监控
  • 2. 为什么选择 prometheus
    • prometheus 背景
    • 1.采集部分
    • 2. prometheus server
    • 3. PromQL
    • 4. Alertmanager
  • 3. prometheus Metrics 指标类型
    • 3.1 counter 单调递增
    • 3.2 Gauge 可增可减
    • 3.3 Histogarm 直方图
    • 3.4 Summary 简化直方图
  • 4. go项目如何引入prometheus
    • 4.1 第一步 引入系统自导指标
    • 第二步 加入自定义指标
    • 第三步, 根据不同请求打点计数
  • 5.参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档