Docker 部署 Prometheus 实现一个极简的 QPS 监控

背景 : Prometheus 是近年来最流行的开源监控框架, 其功能强大且易于使用, 拥有各种主流后端语言(Java/Go/Python/Node.js等)与各种场景(如web handler/ k8s/Nginx/MySQL等)的客户端, 并自带图形化显示页面。分享一个快速入门Prometheus 的教程, 实现一个极简的, 后端开发需要特别关注的 QPS 监控。

Docker 部署 Prometheus

命令行输入

 

css

复制代码

docker run -d --name prometheus-node1 -p 9090:9090 bitnami/prometheus:latest

这条命令会创建一个名为 prometheus-node1 的容器, 使用 bitnami/prometheus:latest 的镜像, 宿主机的 9090 端口与容器内的9090端口相通。

修改 prometheus 配置文件

 

bash

复制代码

docker cp prometheus-node1:/opt/bitnami/prometheus/conf/prometheus.yml prometheus.yml

这将 prometheus-node1 容器内的 prometheus.yml 配置文件拷贝出来, 大概长这样:

 

yaml

复制代码

# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: "prometheus" # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9090']

简单看看这个配置文件里面最重要的两个配置。先看 global 下面的两个配置项, scrape_interval: 15 s 表示 每15秒获取一次监控指标(prometheus 中叫 target), evaluation_interval: 15s 表示 每15秒执行一次 rules。 scrape_configs 直接定义了监控的 target. job_name 为 这个 target的名字, static_configs 下面的 tartgets 直接指出了监控的 IP:端口。剩下的配置留给大家自己去学习,出于快速上手 Prometheus的目的,我就不细讲了。

我们下面修改一下 targets 配置, 变成这样:

 

yaml

复制代码

# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: "prometheus" # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['172.17.0.2:20001'] # 需要监控的 IP:端口

我们修改了 targets 配置, 将他修改成需要监控的 IP:端口, 这里的 172.17.0.2 为另外一个 docker 容器的 IP地址(待会会将), 20001 为要监控的端口(待会会将)

然后将修改后的 配置文件放回 docker 容器

 

bash

复制代码

docker cp prometheus.yml prometheus-node1:/opt/bitnami/prometheus/conf/prometheus.yml

再重启 容器

 

复制代码

docker restart prometheus-node1

写一个 Web Handler 和 Web Client

创建一个 prometheus_demo 目录, 命令行输入

 

go

复制代码

go mod init prometheus_demo go mod tidy

文件目录如下:

 

lua

复制代码

-- prometheus_demo -- go.mod -- main.go -- client --- client.go

其中main.go 为 server 端, client.go 为客户端

其中 main.go 如下:

 

go

复制代码

package main import ( "fmt" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "net/http" "time" ) // 只可增加的一个计数器 var req_counter_vec = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "req_counter_vec", Help: "request counter vector", }, []string{"endpoint"}, ) func main() { prometheus.MustRegister(req_counter_vec) http.Handle("/metrics", promhttp.Handler()) http.HandleFunc("/hello", HelloHandler) errChan := make(chan error) go func() { errChan <- http.ListenAndServe(":20001", nil) }() err := <-errChan if err != nil { fmt.Println("Hello server stop running.") } } func HelloHandler(w http.ResponseWriter, r *http.Request) { path := r.URL.Path req_counter_vec.WithLabelValues(path).Inc() time.Sleep(100 * time.Millisecond) }

服务端比较简单, 定义了 一个 counter vector, 里面装的是prometheus 四种数据类型的 Counter。Name 为 vector 的 名字, help 为详细的解释, 都可以自取。[]string{"endpoint"} 表示以 endpoint 进行区分 vector 内不同的 counter。这就好比一个数组, 用 索引0,1,2 区分数组内的不同元素。

Counter 正如我注释里面写的, 就是一个计数器, 一次只能增加1, 比如每次来一个请求, 那么就增加1。与 Counter 相对的是 Prometheus 的四种数据类型中的 Gauge。 Gauge 可加可减。数据类型 name 为变量名字, help 为变量详细 解释, 随后将这个变量注册一下, 以便被 prometheus 监控到。当然还有另外两种用于直方图的 数据类型 Histogram 和 Summary, 我就不细说了。

随后定义了一个简单的 web handler, 里面干了两件事, 一件是记录将 counter 加 1, withLabelValues 就是就和刚才的 endpoint 相对应, 相当于标记一下这个 vector 中的 哪一个 counter 加一。 另一件事情就是休眠100ms, 不至于太快结束不利于观察。

client.go 如下

 

go

复制代码

package main import ( "log" "net/http" "sync" "time" ) func main() { for { wg := sync.WaitGroup{} for i := 0; i < 50; i++ { wg.Add(1) go func(i int) { defer wg.Done() resp, err := http.Get("http://localhost:20001/hello") if err != nil { log.Println(err) return } resp.Body.Close() }(i) } wg.Wait() time.Sleep(5 * time.Second) } }

客户端就更简单了, 死循环里面开50个 go routine 不断发请求。

随后将 prometheus_demo 文件部署到 docker 中, 如何在 docker 中搭建 go 开发环境可以参考我的另一篇 文章: 保姆级从0到1讲解go远程开发环境搭建(从Docker安装到使用Goland远程部署和调试)。

然后在docker容器中 prometheus_demo 目录 和 prometheus_demo/client 目录下 分别使用下面两个命令运行服务端和客户端

 

go

复制代码

go run main.go go run client.go

打开 Prometheus Web 界面

在宿主机上用浏览器打开 http://localhost:9090/targets?search= 如果可以观察到下面这样, 说明 prometheus 部署成功。

promethus_targets.PNG

注意,上面这幅图一定要启动 prometheus_demo 的 main.go 才能观察得到, 因为 prometheus 监控 20001 端口, 如果 server 端没启动, prometheus 当然啥都监控不到。

下面来看如何监控 QPS, 在宿主机上用浏览器打开, http://localhost:9090/graph

然后在放大镜旁边的框框内输入下面这一串指令

 

ini

复制代码

rate(req_counter_vec{endpoint="/hello"}[15s])

再点击 graph 应该看到下面这样类似的图片

promethus_graph.PNG

解释一下, rate(req_counter_vec{endpoint="/hello"}[15s]) 这句指令是什么意思。 req_counter_vec 就是之前定义的装 counter 的 vector, {endpoint="/hello"} 也就是 HelloHandler 里面记录请求次数的 那个counter, rate 接 [15s] 表示每15秒(和 配置文件里面的15秒保持一致)记录一下 counter 的变化情况(因为 counter只能增加, 所以变化为一个 非负数), 总请求次数除以时间段, 就是一个范围内的 QPS。我们这里并不是1秒, 而是15秒, 也就可以近似看作 QPS。

如果有同学发现没有图形出现, 显示 empty query result, 可能是北京时间和标准时间不同步, 可以勾选 use local time, 或者 调整一 图形界面的窗口时间(我图片上的 5m 和 2022-12-27 20:14:02 那里) 。

还有点同学出现的不是直方图而是一个个小的线段, 这是因为图形的不同展示方式的原因, 可以 点一下 Hide Exemplars 左边的两个小图标。

巨人的肩膀

yunlzheng.gitbook.io/prometheus-…

hub.docker.com/r/bitnami/p…

juejin.cn/post/707865…

cjting.me/2017/03/12/…

  

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux 6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 10、开放性测试题,11、安全测试,12、计算机基础

​编辑资料获取方式 :xiaobei_upup,添加时备注“csdn alex”

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

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

相关文章

Nginx-基础-基础配置-Location

Location 参数匹配模式 参数匹配方式匹配模式说明注意事项精准匹配普通字符串匹配用于标准uri前&#xff0c;要求请求字符串与uri精准匹配&#xff0c;成功则立即处理&#xff0c;nginx停止搜索其他匹配。~正则匹配正则表达式匹配用于正则uri&#xff0c;表示uri包含正则表达…

基于SSM的理发店会员管理系统的设计和实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的理发店会员管理系统的设计和实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0…

Docker安装达梦数据库

1.确保已安装Docker 可参考&#xff1a;Linux安装Docker-CSDN博客 2.上传dm镜像并导入安装包 可以从&#xff1a;产品下载 | 达梦数据库下载dm镜像&#xff0c;如下图&#xff1a; docker load -i dm8_20230808.tar 3.导入后查看镜像 docker images 4.启动容器 docker run …

图的概念、性质和存储与简单遍历

前置知识&#xff1a;树的基本概念及性质 为了保证学习效果&#xff0c;请保证已经掌握前置知识之后&#xff0c;再来学习本章节&#xff01;如果在阅读中遇到困难&#xff0c;也可以回到前面章节查阅。 学习目标 掌握图的基本概念掌握图的一些性质 图的概念 基本概念 图 (…

Pytorch如何计算网络参数

方法一. 利用pytorch自身 PyTorch是一个流行的深度学习框架&#xff0c;它允许研究人员和开发者快速构建和训练神经网络。计算一个PyTorch网络的参数量通常涉及两个步骤&#xff1a;确定网络中每个层的参数数量&#xff0c;并将它们加起来得到总数。 以下是在PyTorch中计算网…

如何在 CloudFlare 里屏蔽/拦截某个 IP 或者 IP 地址段

最近除了接的 CloudFlare 代配置订单基本很少折腾自己的 CloudFlare 配置了,今天给大家简单的讲解一下如何在 CloudFlare 里屏蔽/拦截 IP 地址和 IP 地址段,虽然明月一直都很反感针对 IP 的屏蔽拦截,但不得不说有时候还是很有必要的。并且,既然可以拦截屏蔽 IP 自然也可以但…

鸿蒙内核源码分析(VFS篇) | 文件系统和谐共处的基础

基本概念 | 官方定义 VFS&#xff08;Virtual File System&#xff09;是文件系统的虚拟层&#xff0c;它不是一个实际的文件系统&#xff0c;而是一个异构文件系统之上的软件粘合层&#xff0c;为用户提供统一的类Unix文件操作接口。由于不同类型的文件系统接口不统一&#x…

Flink HA模式下JobManager切换时发送告警

资源&版本信息 Flink版本1.14.6 运行平台&#xff1a;K8s HA使用ZK&#xff08;使用K8s的ETC应该是一个道理&#xff09; 详解Flink HA原理 Flink启动时会创建HighAvailabilityServices提供HA和相关基础服务&#xff0c;其中包括leaderRetrievalService和LeaderElecti…

搜索引擎的设计与实现(二)

目录 3 搜索引擎的基本原理 3.1搜索引擎的基本组成及其功能 l.搜索器 (Crawler) 2.索引器(Indexer) 3.检索器(Searcher) 4.用户接口(UserInterface) 3.2搜索引擎的详细工作流程 4 系统分析与设计 4.1系统分析 4.2系统概要设计 4.2系统实现目标 前面内容请移步 搜索引…

宁夏银川市起名专家的老师颜廷利:死神(死亡)并不可怕,可怕的是...

在中国优秀传统文化之中&#xff0c;汉语‘巳’字与‘四’同音&#xff0c;在阿拉伯数字里面&#xff0c;通常用‘4’来表示&#xff1b; 湖南长沙、四川成都、重庆、宁夏银川最靠谱最厉害的起名大师的老师颜廷利教授指出&#xff0c;作为汉语‘九’字&#xff0c;倘若是换一个…

[ACTF新生赛2020]SoulLike

没见过的错误&#xff1a; ida /ctg目录下的hexrays.cfg文件中的MAX_FUNCSIZE64 改为 MAX_FUNCSIZE1024 然后就是一堆数据 反正就是12个字符 from pwn import * flag"actf{" k0 for n in range(12):for i in range(33,127):pprocess("./SoulLike")_flag…

94.二叉树的中序遍历

刷算法题&#xff1a; 第一遍&#xff1a;1.看5分钟&#xff0c;没思路看题解 2.通过题解改进自己的解法&#xff0c;并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步&#xff0c;下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…

Python爬虫入门:网络世界的宝藏猎人

今天阿佑将带你踏上Python的肩膀&#xff0c;成为一名网络世界的宝藏猎人&#xff01; 文章目录 1. 引言1.1 简述Python在爬虫领域的地位1.2 阐明学习网络基础对爬虫的重要性 2. 背景介绍2.1 Python语言的流行与适用场景2.2 网络通信基础概念及其在数据抓取中的角色 3. Python基…

ssm+vue的公务用车管理智慧云服务监管平台查询统计(有报告)。Javaee项目,ssm vue前后端分离项目

演示视频&#xff1a; ssmvue的公务用车管理智慧云服务监管平台查询统计&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&…

求阶乘n!末尾0的个数溢出了怎么办

小林最近遇到一个问题&#xff1a;“对于任意给定的一个正整数n&#xff0c;统计其阶乘n&#xff01;的末尾中0的个数”&#xff0c;这个问题究竟该如何解决&#xff1f; 先用n5来解决这个问题。n的阶乘即n!5!5*4*3*2*1120&#xff0c;显然应该为2个数相乘等于10才能得到一个结…

量化交易包含些什么?

我们讲过许多关于量化交易的内容&#xff0c;但是量化交易具体可以做些什么&#xff1f;很多朋友都还不清楚&#xff0c;我们详细来探讨下&#xff01; 第一&#xff1a;什么是量化交易&#xff1f; 量化交易是一种利用先进的数学模型和计算机技术&#xff0c;从大量的历史数…

制造业精益生产KPI和智慧供应链管理方案和实践案例分享

随着工业4.0的推进和国家对制造业高质量发展的重视&#xff0c;工业数据已跃升为生产经营活动中不可或缺的核心要素&#xff0c;同时&#xff0c;工业数据也是形成新质生产力的优质生产要素&#xff0c;助力企业实现高效精益生产。 工业数据在制造业中的作用不可忽视&#xff…

Linux: 默认进程介绍

进程名称介绍systemdSystemd 可以管理所有系统资源。不同的资源统称为 Unit&#xff08;单位&#xff09;。 Unit 一共分成12种。 systemctl list-units命令可以查看当前系统的所有 Unitkthreaddkthreadd进程由idle通过kernel_thread创建&#xff0c;并始终运行在内核空间, 负责…

Hbase基础操作Demo(Java版)

一、前置条件 HBase服务&#xff1a;【快捷部署】023_HBase&#xff08;2.3.6&#xff09;开发环境&#xff1a;Java&#xff08;1.8&#xff09;、Maven&#xff08;3&#xff09;、IDE&#xff08;Idea 或 Eclipse&#xff09; 二、相关代码 代码结构如上图中①和② pom.x…

vue项目中使用websocke即时通讯实现系统公告实时获取并提醒

一、使用场景 发布者设置需要发布的公告内容、公告接收用户和发布时间&#xff0c;到达发布时间时及时通知提醒已登录系统用户&#xff0c;使用websocke来实现前端与服务器保持长连接&#xff0c;以便实时过去公告信息。 WebSocket是一种在单个TCP连接上进行全双工通信的协议…