如何在Golang中使用Prometheus+Grafana监控_Golang Prometheus Grafana监控实践
技术百科
P粉602998670
发布时间:2025-11-25
浏览: 次 首先集成Prometheus客户端库,定义请求量、响应时间等指标并暴露/metrics接口;接着配置Prometheus抓取目标,确保状态为UP;最后通过Grafana添加数据源并导入或创建Dashboard展示QPS和延迟等关键指标。
在Golang服务开发中,系统可观测性至关重要。Prometheus 和 Grafana 是目前最流行的开源监控与可视化组合。通过集成 Prometheus 客户端库,可以轻松暴露指标数据,再由 Grafana 展示成直观图表。下面介绍如何在 Golang 项目中实践 Prometheus + Grafana 监控。
引入 Prometheus 客户端库
Prometheus 提供了官方的 Go 客户端库 prometheus/client_golang,用于在应用中定义和暴露指标。
安装依赖:
go get github.com/prometheus/client_golang/prometheus go get github.com/prometheus/client_golang/prometheus/promhttp在代码中注册常用指标类型,如计数器(Counter)、直方图(Histogram)、仪表(Gauge)等。
定义并暴露监控指标
以一个 HTTP 服务为例,统计请求次数、响应时间等常见指标。
示例代码:
package mainimport ( "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" )
// 定义指标 var ( httpRequestsTotal = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests.", }, []string{"method", "endpoint", "code"}, )
httpRequestDuration = prometheus.NewHistogram(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "HTTP request latency in seconds.",
Buckets: prometheus.DefBuckets,
},
))
func init() { prometheus.MustRegister(httpRequestsTotal) prometheus.MustRegister(httpRequestDuration) }
func handler(w http.ResponseWriter, r *http.Request) { start := time.Now()
// 模拟业务逻辑
w.WriteHeader(http.StatusOK)
w.Write([]byte("Hello, Prometheus!"))
// 记录指标
httpRequestsTotal.WithLabelValues(r.Method, r.URL.Path, "200").Inc()
httpRequestDuration.Observe(time.Since(start).Seconds())}
启动一个 /metrics 接口供 Prometheus 抓取:
func main() { http.HandleFunc("/", handler) http.Handle("/metrics", promhttp.Handler()) // 暴露指标 http.ListenAndServe(":8080", nil) }配置 Prometheus 抓取数据
修改 prometheus.yml 配置文件,添加你的 Go 应用为监控目标。
scrape_configs: - job_name: 'go-app' static_configs: - targets: ['your-go-app-host:8080']启动 Prometheus 服务后,访问其 Web 界面(默认 9090 端口),在 “T
argets” 中确认状态为 UP,表示抓取正常。
使用 Grafana 可视化监控数据
启动 Grafana(通常使用 Docker):
docker run -d -p 3000:3000 --name=grafana grafana/grafana-enterprise登录 Grafana(默认账号/密码:admin/admin),添加 Prometheus 为数据源,地址填入 Prometheus 服务地址(如 http://host:9090)。
导入或创建 Dashboard:
- 可导入社区常用的 Go 应用模板,如 ID 12683("Go Metrics")
- 自定义面板,查询 http_requests_total 查看 QPS,http_request_duration_seconds 查看 P99 延迟
基本上就这些。只要在 Golang 中正确暴露指标,Prometheus 抓取,Grafana 展示,整套链路就能跑通。关键是指标设计要合理,比如按 endpoint、method、status 分维度,才能支持有效分析。不复杂但容易忽略细节,比如 histogram buckets 设置、label 维度过载等。保持简洁清晰最重要。
# ai
# 就能
# 最重要
# 至关重要
# 为例
# 自定义
# 填入
# app
# 客户端
# 开源
# 响应时间
# 配置文件
# 端口
# http
# go
# docker
# golang
# String
# 接口
# nil
# git
# github
# igs
# var
# prometheus
# number
# grafana
# 最流行
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11如何设置自动关机 Win11定时关机命令
- 如何使用Golang编写单元测试_创建Test函数
- Win11应用商店下载慢怎么办 Win11更改DN
- php能控制zigbee模块吗_php通过串口与c
- 如何解决同一段404代码在不同主机上表现不一致的问
- Windows 10怎么把任务栏放在屏幕上方_Wi
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- Win11怎么关闭系统声音_Win11系统提示音静
- Win10电脑怎么设置休眠快捷键_Windows1
- Win10任务栏天气和资讯怎么关闭 Win10禁用
- 为什么本地php环境运行php脚本卡顿_php执行
- Win11怎么关闭开机声音_Win11系统启动提示
- 静态属性修改会影响所有实例吗_php作用域操作符下
- 如何将竖排文本文件转换为横排字符串
- c# 如何深拷贝和浅拷贝
- c++中如何计算坐标系中两点间距离_c++勾股定理
- Windows Defender扫描失败怎么办_安
- Win11截图快捷键是什么_Win11自带截图工具
- MySQL 中使用 IF 和 CASE 实现查询字
- php下载安装包太大怎么下载_分卷压缩下载方法【教
- Mac怎么查看活动监视器_理解Mac进程和资源占用
- PHP 中如何在函数内持久化修改引用变量的指向
- Windows服务持续崩溃怎样修复_系统服务保护机
- Win10如何更改任务栏高度_Windows10解
- 如何在Golang中实现微服务负载均衡_Golan
- ACF 教程:正确更新嵌套在多层 Group 字段
- Windows怎样关闭开始菜单广告_Windows
- 一文教你快速开通网站LOGO图
- PHP主流架构怎么部署到Docker_容器化流程【
- Win11怎么更改电脑密码_Windows 11修
- MAC如何启用访达侧边栏显示_MAC Finder
- Win11怎么开启智能存储_Windows11存储
- Win11怎么更改鼠标指针_Windows 11自
- 如何在Golang中捕获结构体方法错误_Golan
- Windows电脑如何截屏?(四种快捷方法)
- Win11怎么连接蓝牙耳机_Win11蓝牙设备配对
- Mac系统更新下载慢或失败怎么办_解决macOS升
- Django 密码修改后会话失效的解决方案
- 新手学PHP架构总混淆概念咋办_重点梳理【教程】
- Win11怎么设置触控板手势_Windows11三
- c++怎么用jemalloc c++替换默认内存分
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- Win11任务栏天气怎么关闭 Win11隐藏天气小
- Win11快速助手怎么用_Win11远程协助连接教
- Win11如何设置ipv6 Win11开启IPv6
- Windows资源管理器总是卡顿或重启怎么办?(修
- Win11怎么格式化U盘_Win11系统U盘格式化
- Win10系统怎么查看端口状态_Windows10
- c++的STL算法库find怎么用 在容器中查找指

QQ客服