Prometheus+Grafana实现服务器Go应用监控看板与告警

776 阅读5分钟

前言

Prometheus 一个监控系统和时间序列数据库。

  • 多维数据模型:基于时间序列进行监控,每个时间序列可以通过多维标签进行区分。
  • 强大的查询语言:PromQL 是 Prometheus 的查询语言,用于执行复杂的聚合、过滤和计算操作。
  • 自动化抓取:Prometheus 通过配置抓取(scrape)不同的应用或服务,自动收集指标数据。

Grafana是一个用于监控数据可视化的开源平台,支持多种数据源,包括 Prometheus、Elasticsearch、Graphite 等。Grafana 提供了强大的仪表盘功能,可以以图表、图形等多种形式展示从 Prometheus 或其他来源获取的监控数据。

  • Grafana 允许您查询、可视化、警报和了解您的指标,无论它们存储在何处。
  • 可视化:快速、灵活的客户端图表,具有多种选项。面板插件提供了许多不同的方式来可视化指标和日志。
  • 探索指标:通过即席查询和动态钻取来探索数据。拆分视图并并排比较不同的时间范围、查询和数据源。
  • 灵活的仪表盘:用户可以自定义各种监控面板,以图形化方式展示数据。
  • 丰富的数据源支持:Grafana 不仅支持 Prometheus,还支持 MySQL、PostgreSQL、InfluxDB 等数据源。
  • 实时监控与告警:可以设置定制的告警条件,并通过电子邮件或其他渠道发出通知。

Prometheus 与 Grafana 的集成

Prometheus 负责收集服务器和应用的运行指标,而 Grafana 则负责展示这些指标的可视化仪表盘。通过两者的集成,可以实现对服务器和应用状态的实时监控,并创建自定义的监控看板。

在各种服务器已经应用越来越多的时候,就需要一套监控系统来监控搭建各个服务器上的的应用运行情况,并在按照需求进行告警提醒。

image.png

Prometheus安装

推荐使用docker安装,我这里直接使用1Panel提供的应用商店,直接一键安装,然后运行就可以了。自己安装的可以参考官方示例

  docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus

安装成功后,访问http://localhost:9090/targets ,就能看到Prometheus默认自身监控数据,这就代表安装成功了。 image.png

开启身份认证

在prometheus/conf目录下创建web-config.yml文件,官方示例文件,把web-config.yml挂载到容器prometheus/conf目录下。我这里是设置了用户test,密码test,填入的密码需要进行Bcrypt加密,随便找一个在线网址就可以生成

image.png 然后在docker启动时增加参数Command='--web.config.file=/etc/prometheus/web-config.yml',重新启动,登录的时候就会发现需要认证

image.png

同时因为开启了身份认证,需要修改默认的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

image.png

添加数据源

首先先在添加新连接中,添加Prometheus的数据源 image.png 然后填入刚才Prometheus运行的地址,如果配置了认证就需要填上刚才设置的账号密码,以及TLS配置,填写完毕后拉到最下面点击Save & test,返回成功就是 image.png 注意,如果是用Docker运行的可以直接填入Docker容器的IP地址 image.png

创建仪表盘

在上文我们创建了一个拉取Go程序的性能指标,接下来我们创建一个仪表盘进行展示。点击仪表盘选择新建,可以自己根据数据源的数据进行制作,也可以使用官方或其他人制作的模板。这里直接我们直接导入官方提供的模板,ID为:6617。然后保存就可以查看Go程序的性能指标监控了。 image.png

image.png

配置告警信息

根据监控面板,可以选择各式各样的监控信息,我们现在选择Goroutines来作为监控指标, image.png 在下图中,

  • A为读取Goroutines的值,还可以添加查询条件
  • B为读取值的处理规则,可以进行求和、最大、最小等,这里选择的是最后一个值
  • C为根据B得到的数据,什么时候触发警告。这里是指当Goroutines最后的值大于7时,就触发警告 image.png 接下来需要创建两个文件来保存警告规则和触发频率 image.png 紧接着添加联络点,这里选择了邮箱通知方式,然后填入邮箱保存 image.png image.png 最后第5步,则是配置一些告警通知时发送的消息内容模板,可以不填。最后保存就可以完善一个告警规则了