前言
Prometheus 一个监控系统和时间序列数据库。
- 多维数据模型:基于时间序列进行监控,每个时间序列可以通过多维标签进行区分。
- 强大的查询语言:PromQL 是 Prometheus 的查询语言,用于执行复杂的聚合、过滤和计算操作。
- 自动化抓取:Prometheus 通过配置抓取(scrape)不同的应用或服务,自动收集指标数据。
Grafana是一个用于监控数据可视化的开源平台,支持多种数据源,包括 Prometheus、Elasticsearch、Graphite 等。Grafana 提供了强大的仪表盘功能,可以以图表、图形等多种形式展示从 Prometheus 或其他来源获取的监控数据。
- Grafana 允许您查询、可视化、警报和了解您的指标,无论它们存储在何处。
- 可视化:快速、灵活的客户端图表,具有多种选项。面板插件提供了许多不同的方式来可视化指标和日志。
- 探索指标:通过即席查询和动态钻取来探索数据。拆分视图并并排比较不同的时间范围、查询和数据源。
- 灵活的仪表盘:用户可以自定义各种监控面板,以图形化方式展示数据。
- 丰富的数据源支持:Grafana 不仅支持 Prometheus,还支持 MySQL、PostgreSQL、InfluxDB 等数据源。
- 实时监控与告警:可以设置定制的告警条件,并通过电子邮件或其他渠道发出通知。
Prometheus 与 Grafana 的集成
Prometheus 负责收集服务器和应用的运行指标,而 Grafana 则负责展示这些指标的可视化仪表盘。通过两者的集成,可以实现对服务器和应用状态的实时监控,并创建自定义的监控看板。
在各种服务器已经应用越来越多的时候,就需要一套监控系统来监控搭建各个服务器上的的应用运行情况,并在按照需求进行告警提醒。
Prometheus安装
推荐使用docker安装,我这里直接使用1Panel提供的应用商店,直接一键安装,然后运行就可以了。自己安装的可以参考官方示例
docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus
安装成功后,访问http://localhost:9090/targets ,就能看到Prometheus默认自身监控数据,这就代表安装成功了。
开启身份认证
在prometheus/conf目录下创建web-config.yml文件,官方示例文件,把web-config.yml挂载到容器prometheus/conf目录下。我这里是设置了用户test,密码test,填入的密码需要进行Bcrypt加密,随便找一个在线网址就可以生成
然后在docker启动时增加参数Command='--web.config.file=/etc/prometheus/web-config.yml',重新启动,登录的时候就会发现需要认证
同时因为开启了身份认证,需要修改默认的prometheus.yml,加上basic_auth块
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'
static_configs:
- targets: [ 'localhost:9090' ]
# 如果开启用了认证,那在访问时需要加上basic_auth_users
basic_auth:
username: test
password: test
Go程序基本信息监控
Prometheus有提供各种语言的API接口,方便调用Prometheus,并提供了基本的Demo,这里运行一个Go的示例
package main
import (
"github.com/gin-gonic/gin"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/collectors"
"github.com/prometheus/client_golang/prometheus/promhttp"
"time"
)
var (
defaultReg = prometheus.NewRegistry()
customReg = prometheus.NewRegistry()
opsProcessed = prometheus.NewCounter(prometheus.CounterOpts{
Name: "myapp_processed_ops_total",
Help: "The total number of processed events",
})
)
func main() {
recordMetrics()
r := gin.Default()
//go程序占用性能指标
r.GET("/metrics", gin.WrapH(promhttp.HandlerFor(defaultReg, promhttp.HandlerOpts{Registry: defaultReg})))
//自定义参数指标
r.GET("/metrics_custom", gin.WrapH(promhttp.HandlerFor(customReg, promhttp.HandlerOpts{Registry: customReg})))
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
func recordMetrics() {
go func() {
for {
opsProcessed.Inc()
time.Sleep(2 * time.Second)
}
}()
}
func init() {
//初始化注册器
defaultReg.MustRegister(
collectors.NewGoCollector(),
collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}),
)
//自定义注册器
customReg.Register(opsProcessed)
}
然后在Prometheus中添加拉取信息,如之前所示,配置成功后重启,查看是否拉取能拉取到应用数据
- job_name: 'go_app'
metrics_path: /metrics # 指定抓取的路径
scheme: http # 使用 https 协议
scrape_timeout: 10s # 设置超时时间为 10 秒
scrape_interval: 30s # 调整为每 30 秒抓取一次
static_configs:
- targets:
- 172.18.0.5:8080
labels:
namespace: 'server'
pod: 'go_server'
Grafana安装
一样使用1Panel提供的应用商店,直接一键安装,然后初始化进入面板界面重置账户密码
面板设置中文
进入面板后点击右上角 Profile,然后选择Language。
添加数据源
首先先在添加新连接中,添加Prometheus的数据源
然后填入刚才Prometheus运行的地址,如果配置了认证就需要填上刚才设置的账号密码,以及TLS配置,填写完毕后拉到最下面点击Save & test,返回成功就是
注意,如果是用Docker运行的可以直接填入Docker容器的IP地址
创建仪表盘
在上文我们创建了一个拉取Go程序的性能指标,接下来我们创建一个仪表盘进行展示。点击仪表盘选择新建,可以自己根据数据源的数据进行制作,也可以使用官方或其他人制作的模板。这里直接我们直接导入官方提供的模板,ID为:6617。然后保存就可以查看Go程序的性能指标监控了。
配置告警信息
根据监控面板,可以选择各式各样的监控信息,我们现在选择Goroutines来作为监控指标,
在下图中,
- A为读取Goroutines的值,还可以添加查询条件
- B为读取值的处理规则,可以进行求和、最大、最小等,这里选择的是最后一个值
- C为根据B得到的数据,什么时候触发警告。这里是指当Goroutines最后的值大于7时,就触发警告
接下来需要创建两个文件来保存警告规则和触发频率
紧接着添加联络点,这里选择了邮箱通知方式,然后填入邮箱保存
最后第5步,则是配置一些告警通知时发送的消息内容模板,可以不填。最后保存就可以完善一个告警规则了