当前位置: 首页 > article >正文

Go语言中的监控系统:从基础到高级

Go语言中的监控系统从基础到高级1. 引言在生产环境中监控是保证系统稳定运行的重要手段。通过监控我们可以了解系统的运行状态、发现潜在问题、及时处理故障。Go语言生态中有丰富的监控工具和库可以帮助开发者构建完善的监控系统。本文将深入探讨Go语言中的监控技术从基础到高级帮助开发者掌握监控技术构建更可靠的系统。2. 监控的基本概念2.1 什么是监控监控是收集、处理、展示系统运行状态数据的过程目的是了解系统的健康状况、性能指标和业务指标及时发现和解决问题。2.2 监控的重要性故障发现及时发现系统故障减少停机时间性能分析分析系统性能找出瓶颈容量规划了解资源使用情况合理规划容量业务洞察了解业务指标辅助决策2.3 监控的分类监控可以分为多种类型基础设施监控CPU、内存、磁盘、网络等应用监控请求量、响应时间、错误率等业务监控订单量、用户数、转化率等日志监控收集和分析日志3. Prometheus入门Prometheus是一个开源的监控和告警工具是云原生监控的事实标准。3.1 安装Prometheus客户端go get github.com/prometheus/client_golang/prometheus go get github.com/prometheus/client_golang/prometheus/promhttp3.2 基本使用package main import ( net/http time github.com/prometheus/client_golang/prometheus github.com/prometheus/client_golang/prometheus/promhttp ) var ( // Counter计数器只增不减 requestCount prometheus.NewCounter( prometheus.CounterOpts{ Name: http_requests_total, Help: Total number of HTTP requests, }, ) // Gauge仪表盘可以增减 inFlightRequests prometheus.NewGauge( prometheus.GaugeOpts{ Name: http_in_flight_requests, Help: Number of in-flight HTTP requests, }, ) // Histogram直方图统计分布 requestDuration prometheus.NewHistogram( prometheus.HistogramOpts{ Name: http_request_duration_seconds, Help: HTTP request latencies in seconds, Buckets: prometheus.DefBuckets, }, ) // Summary摘要统计分位数 requestSize prometheus.NewSummary( prometheus.SummaryOpts{ Name: http_request_size_bytes, Help: HTTP request sizes in bytes, Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, }, ) ) func init() { // 注册指标 prometheus.MustRegister(requestCount) prometheus.MustRegister(inFlightRequests) prometheus.MustRegister(requestDuration) prometheus.MustRegister(requestSize) } func main() { // HTTP处理器 http.HandleFunc(/, func(w http.ResponseWriter, r *http.Request) { start : time.Now() inFlightRequests.Inc() defer inFlightRequests.Dec() requestCount.Inc() requestSize.Observe(float64(len(r.Body))) // 模拟处理 time.Sleep(100 * time.Millisecond) duration : time.Since(start).Seconds() requestDuration.Observe(duration) w.Write([]byte(Hello, World!)) }) // Prometheus指标端点 http.Handle(/metrics, promhttp.Handler()) println(服务器启动在 :8080) http.ListenAndServe(:8080, nil) }4. 四种指标类型详解4.1 Counter计数器Counter用于累计值只增不减适用于请求数、错误数等。package main import ( github.com/prometheus/client_golang/prometheus ) // 定义Counter var apiRequestsTotal prometheus.NewCounterVec( prometheus.CounterOpts{ Name: api_requests_total, Help: Total number of API requests, }, []string{method, endpoint, status}, // 标签 ) func init() { prometheus.MustRegister(apiRequestsTotal) } func handleRequest(method, endpoint, status string) { apiRequestsTotal.WithLabelValues(method, endpoint, status).Inc() }4.2 Gauge仪表盘Gauge用于瞬时值可以增减适用于内存使用、连接数等。package main import ( github.com/prometheus/client_golang/prometheus ) var activeConnections prometheus.NewGauge( prometheus.GaugeOpts{ Name: active_connections, Help: Number of active connections, }, ) func init() { prometheus.MustRegister(activeConnections) } func connectionOpened() { activeConnections.Inc() } func connectionClosed() { activeConnections.Dec() }4.3 Histogram直方图Histogram用于统计分布适用于响应时间、请求大小等。package main import ( time github.com/prometheus/client_golang/prometheus ) var requestLatency prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: request_latency_seconds, Help: Request latency distribution, Buckets: []float64{0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10}, }, []string{endpoint}, ) func init() { prometheus.MustRegister(requestLatency) } func handleRequestWithLatency(endpoint string, duration time.Duration) { requestLatency.WithLabelValues(endpoint).Observe(duration.Seconds()) }4.4 Summary摘要Summary用于统计分位数适用于需要精确分位数的场景。package main import ( time github.com/prometheus/client_golang/prometheus ) var responseSize prometheus.NewSummaryVec( prometheus.SummaryOpts{ Name: response_size_bytes, Help: Response size distribution, Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, MaxAge: time.Hour, AgeBuckets: 5, }, []string{endpoint}, ) func init() { prometheus.MustRegister(responseSize) } func recordResponseSize(endpoint string, size int) { responseSize.WithLabelValues(endpoint).Observe(float64(size)) }5. Gin框架集成Prometheuspackage main import ( strconv time github.com/gin-gonic/gin 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, path, status}, ) httpRequestDuration prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: http_request_duration_seconds, Help: HTTP request duration, Buckets: prometheus.DefBuckets, }, []string{method, path}, ) ) func init() { prometheus.MustRegister(httpRequestsTotal) prometheus.MustRegister(httpRequestDuration) } func prometheusMiddleware() gin.HandlerFunc { return func(c *gin.Context) { start : time.Now() path : c.FullPath() method : c.Request.Method c.Next() status : strconv.Itoa(c.Writer.Status()) duration : time.Since(start) httpRequestsTotal.WithLabelValues(method, path, status).Inc() httpRequestDuration.WithLabelValues(method, path).Observe(duration.Seconds()) } } func main() { r : gin.Default() // 使用Prometheus中间件 r.Use(prometheusMiddleware()) r.GET(/hello, func(c *gin.Context) { c.JSON(200, gin.H{message: Hello, World!}) }) // Prometheus指标端点 r.GET(/metrics, gin.WrapH(promhttp.Handler())) r.Run(:8080) }6. 自定义Collectorpackage main import ( github.com/prometheus/client_golang/prometheus ) type CustomCollector struct { metricDesc *prometheus.Desc } func NewCustomCollector() *CustomCollector { return CustomCollector{ metricDesc: prometheus.NewDesc( custom_metric, A custom metric, []string{label}, prometheus.Labels{}, ), } } func (c *CustomCollector) Describe(ch chan- *prometheus.Desc) { ch - c.metricDesc } func (c *CustomCollector) Collect(ch chan- prometheus.Metric) { // 采集指标 value : 100.0 ch - prometheus.MustNewConstMetric( c.metricDesc, prometheus.GaugeValue, value, label_value, ) } func main() { collector : NewCustomCollector() prometheus.MustRegister(collector) // 启动HTTP服务 }7. 告警规则Prometheus可以配置告警规则当指标满足条件时触发告警。groups: - name: example rules: - alert: HighErrorRate expr: rate(http_requests_total{status~5..}[5m]) 0.1 for: 5m labels: severity: warning annotations: summary: High error rate detected description: Error rate is {{ $value }} errors/s - alert: HighLatency expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) 1 for: 5m labels: severity: critical annotations: summary: High latency detected description: 95th percentile latency is {{ $value }}s8. 使用Grafana可视化Grafana是一个开源的可视化工具可以与Prometheus配合使用创建漂亮的仪表盘。添加Prometheus数据源创建仪表盘添加面板选择Prometheus查询配置图表样式常用的PromQL查询请求量rate(http_requests_total[5m])错误率rate(http_requests_total{status~5..}[5m])P95延迟histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))活跃连接http_in_flight_requests9. 监控的最佳实践9.1 指标设计命名规范使用有意义的名称遵循prometheus命名规范合理使用标签标签用于维度不要使用高基数标签选择合适的指标类型根据场景选择Counter、Gauge、Histogram或Summary9.2 性能考虑避免高基数高基数标签会导致内存爆炸合理设置bucketHistogram的bucket要合理设置采样率生产环境可以考虑采样9.3 告警策略分级告警warning、critical等级别避免告警风暴合理设置告警条件和抑制规则告警收敛合并相关告警10. 总结监控是保证系统稳定运行的重要手段Prometheus是一个强大的监控工具Go语言与Prometheus的集成非常方便。通过合理设计指标、配置告警、使用Grafana可视化可以构建完善的监控系统及时发现和解决问题保证系统的稳定运行。11. 参考资料Prometheus官方文档Prometheus Go客户端Grafana官方文档PromQL入门

相关文章:

Go语言中的监控系统:从基础到高级

Go语言中的监控系统:从基础到高级 1. 引言 在生产环境中,监控是保证系统稳定运行的重要手段。通过监控,我们可以了解系统的运行状态、发现潜在问题、及时处理故障。Go语言生态中有丰富的监控工具和库,可以帮助开发者构建完善的监…...

Boost搜索引擎:正倒排索引实战解析

基于正倒排索引的Boost搜索引擎项目日志、Server代码及详解在本项目中,我们构建了一个高效的搜索引擎,使用正排索引和倒排索引技术,基于C和Boost库实现。正排索引存储文档ID到文档内容的映射,便于快速检索文档内容;倒排…...

vue el-table 切换页面、组件销毁会内存泄漏吗?99% 的人都误解了

el-table 切换页面、组件销毁会内存泄漏吗?99% 的人都误解了 前言 在 Vue 后台项目里,el-table 几乎是必用组件。 很多同学反馈:页面切走、组件销毁后,内存居高不下,怀疑 el-table 本身内存泄漏。 本文一次性讲清真相&…...

深度解析DHCP协议:工作原理、4步交互流程及应用场景

深度解析DHCP协议:工作原理、4步交互流程及应用场景 摘要一、DHCP协议:基础定义1.1 DHCP协议:是什么1.2 DHCP协议:解决什么问题 二、DHCP协议:核心工作原理(4步标准流程)2.1 DHCP 4步交互流程图…...

GLM-. 全面支持与 Gemini CLI 集成:HagiCode 的多模型进化之路赂

1. 流图:数据的河流 如果把传统的堆叠面积图想象成一块块整齐堆叠的积木,那么流图就像一条蜿蜒流淌的河流,河道的宽窄变化自然流畅,波峰波谷过渡平滑。 它特别适合展示多个类别数据随时间的变化趋势,尤其是当你想强调整…...

微软常用运行库 安装教程:一键修复VC++运行环境(AIO合集)

一、工具简介 微软运行库合集(MSVBCRT AIO)​ 是一款集成了多个版本 Microsoft Visual C Redistributable 的运行库安装工具。 许多 Windows 软件(尤其是游戏、专业工具)依赖这些运行库才能正常运行,缺失时常会提示类…...

面试题设计模式

策略模式:定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。 模板方法模式:模板的价值就在于骨架的定义,骨架内部将问题处理的流程已经定义好,通用的处理逻辑一般由父类实现,个性化…...

3、主从复制实现同步数据过滤

在 MySQL 8 主从复制中,指定数据库同步有两种方案:主库过滤(binlog-do-db) 和 从库过滤(replicate-do-db / replicate-wild-*)。推荐在从库配置,更灵活、更安全。 一、核心参数说明 1. 主库&…...

嵌入式Linux开发常见问题解决:内核编译与NFS根文件系统启动卡住

在移植Linux系统到ARM开发板的过程中,编译内核和通过NFS启动根文件系统是两个常见环节,但也经常遇到各种“小坑”。本文结合两个实际案例,分析问题原因并给出解决方案。一、编译内核时出现 lzop: not found 错误问题现象在执行 make zImage 编…...

某手热门短剧逆向AI直接秒

地址:aHR0cHM6Ly93d3cua3VhaXNob3UuY29tL3NlYXJjaC8lRTclODMlQUQlRTklOTclQTglRTclOUYlQUQlRTUlODklQTc一、为什么要做这个? 你是不是想自动获取快手的搜索结果,却发现直接调用API会被“风控”拦截?别担心,这是因为快手用了加密参…...

支付密钥硬编码、调试模式未关闭、日志泄露token——PHP生产环境支付接口的3大“自杀式配置”

第一章:支付接口安全配置的致命认知误区许多开发者将“启用HTTPS”等同于“支付接口已安全”,却忽视了服务端密钥管理、签名验证逻辑与回调校验机制的根本性缺陷。这种简化式安全观,恰恰是黑产批量盗刷和中间人劫持事件频发的核心诱因。误信客…...

详细解析Spring如何解决循环依赖问题事

AI训练存储选型的演进路线 第一阶段:单机直连时代 早期的深度学习数据集较小,模型训练通常在单台服务器或单张GPU卡上完成。此时直接将数据存储在训练机器的本地NVMe SSD/HDD上。 其优势在于IO延迟最低,吞吐量极高,也就是“数据离…...

体系结构论文(九十八):NPUEval: Optimizing NPU Kernels with LLMs and Open Source Compilers

NPUEval: Optimizing NPU Kernels with LLMs and Open Source Compilers 【AMD 2025报告】一、这篇文章在做什么这篇文章讨论的不是一般的软件代码生成,而是一个更窄、也更难的问题:大语言模型能不能为 NPU 写出“既能跑、又真正高效”的 kernel 代码&am…...

GEO 科普指南

GEO 科普指南 什么是 GEO? GEO(Generative Engine Optimization) 即「生成式引擎优化」,是针对 AI 搜索引擎(如 ChatGPT、Claude、Perplexity 等)进行内容优化的新兴策略。 简单来说:SEO 是让 G…...

Spire实现Wod与Pdf相互转换

在 Java 中使用 Spire 库进行 Word 和 PDF 的转换,你需要用到两个不同的库:Word 转 PDF:使用 Spire.Doc for Java (免费版)PDF 转 Word:使用 Spire.PDF for Java (免费版)重要提示: 免费版(Free Spire&…...

IOFILE结构体的介绍与House of orange轮

认识Pass层级结构 Pass范围从上到下一共分为5个层级: 模块层级:单个.ll或.bc文件 调用图层级:函数调用的关系。 函数层级:单个函数。 基本块层级:单个代码块。例如C语言中{}括起来的最小代码。 指令层级:单…...

Untrunc视频修复工具:让损坏的MP4文件重获新生

Untrunc视频修复工具:让损坏的MP4文件重获新生 【免费下载链接】untrunc Restore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video. 项目地址: https://gitcode.com/gh_mirrors/unt/untrunc 当你熬夜剪辑完成…...

、SEATA分布式事务——XA模式泳

MySQL 中的 count 三兄弟:效率大比拼! 一、快速结论(先看结论再看分析) 方式 作用 效率 一句话总结 count(*) 统计所有行数 最高 我是专业的!我为统计而生 count(1) 统计所有行数 同样高效 我是 count(*) 的马甲兄弟…...

加州大学洛杉矶分校、腾讯混元等推出Unify-Agent

这项由加州大学洛杉矶分校、腾讯混元、香港中文大学和香港科技大学联合研究团队发表于2026年3月的研究(arXiv:2603.29620v1),彻底改变了我们对AI图像生成的认知。想象一下,如果你请AI画一个不太知名的动漫角色或者某个地方的特色小…...

rapidocr v3.8.0发布了

🚀 功能特性 在 ClawHub 中添加 RapidOCR Skill (https://clawhub.ai/rapidai/rapidocr)(docker) 为每个引擎添加 Docker 开发环境 (#649),由 LocNgoXuan23 在 1f78b76 中贡献(python) 为 API 和 CLI 添加 model_root_dir(模型根目录&#x…...

【国家级数字农场认证标准】:PHP可视化配置合规性检查清单(含GDPR+农业农村部2024新规适配)

第一章:国家级数字农场认证标准的农业数字化背景与合规性演进农业正经历从机械化、自动化向数字化、智能化的历史性跃迁。国家层面推动“数字乡村”战略与“智慧农业三年行动计划”,将数据要素深度融入耕、种、管、收全链条,催生对可验证、可…...

3大技术突破重新定义多模态交互:AudioCLIP的跨模态语义对齐解决方案

3大技术突破重新定义多模态交互:AudioCLIP的跨模态语义对齐解决方案 【免费下载链接】AudioCLIP Source code for models described in the paper "AudioCLIP: Extending CLIP to Image, Text and Audio" (https://arxiv.org/abs/2106.13043) 项目地址:…...

视频分析神器video-analyzer:5分钟学会AI智能视频内容理解终极指南

视频分析神器video-analyzer:5分钟学会AI智能视频内容理解终极指南 【免费下载链接】video-analyzer Analyze videos using LLMs, Computer Vision and Automatic Speech Recognition 项目地址: https://gitcode.com/gh_mirrors/vi/video-analyzer 面对海量视…...

mysql如何在本地开发环境模拟生产环境_利用Docker克隆

用Docker快速拉起与生产一致的MySQL实例需:拉取对应版本镜像(如mysql:8.0.33)、挂载生产my.cnf、显式指定字符集(utf8mb4)和SQL模式、处理GTID导致的导入失败(加--set-gtid-purgedOFF或RESET MASTER&#x…...

20个核心AI概念拆解:小白也能轻松入门大模型,收藏这份学习秘籍!

本文以通俗易懂的方式,拆解了20个AI领域的核心概念,涵盖神经网络、迁移学习、Transformer架构、大语言模型等。通过比喻和实例,帮助读者理解AI底层逻辑,消除学习AI的障碍。文章强调AI并非高不可攀,只要掌握基本原理&am…...

ESP32/8266利用闪存文件系统创建 Web服务实现交互控制

ESP32/8266利用SPIFFS(闪存文件系统)创建 Web服务实现交互控制 ✨从ESP8266 Arduino Core 2.7.0版本开始被官方标记为“已弃用”,并推荐使用LittleFS作为替代方案。 在本教程中,将展示如何构建一个web服务,以提供存储在ESP32/8266文件系统中的HTML和CSS文件,创建的HTML和CS…...

Java 线程、进程、CPU缓存、MESI

一、进程&线程 1、什么是进程(process) 进程是操作系统中运行的一个任务(一个应用程序运行在一个进程中)。 进程是一块包含了某些资源的内存区域,操作系统利用进程把它的工作划分为一些功能单元。 进程中包含的…...

3分钟开启浏览器编程:Core72在线IDE零配置开发指南 [特殊字符]

3分钟开启浏览器编程:Core72在线IDE零配置开发指南 🚀 【免费下载链接】core Online IDE powered by Visual Studio Code ⚡️ 项目地址: https://gitcode.com/gh_mirrors/core72/core 还在为复杂的开发环境配置而烦恼吗?Core72在线ID…...

终极指南:5分钟快速配置OpenTabletDriver开源数位板驱动

终极指南:5分钟快速配置OpenTabletDriver开源数位板驱动 【免费下载链接】OpenTabletDriver Open source, cross-platform, user-mode tablet driver 项目地址: https://gitcode.com/gh_mirrors/op/OpenTabletDriver 还在为昂贵的数位板驱动软件发愁吗&#…...

AI 时代:祛魅、适应与重新定义磐

指令替换 项目需求:将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一,测试代码示例 test.c // test.c #includ…...