Go语言微服务框架 - 13.监控组件Prometheus的引入

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
简介: 今天我们专注于自定义服务中的Prometheus的监控,在框架中引入Prometheus相关的组件。关于更细致的使用方式,我会给出相关的链接,有兴趣进一步学习Prometheus的同学可以边参考资料边实践。

作为云原生程序监控的标准组件,Prometheus支持了各类Paas、Saas平台,并提供了一整套采集+存储+展示的解决方案。

今天我们专注于自定义服务中的Prometheus的监控,在框架中引入Prometheus相关的组件。关于更细致的使用方式,我会给出相关的链接,有兴趣进一步学习Prometheus的同学可以边参考资料边实践。

v0.8.0:监控组件Prometheus的引入

项目链接 https://github.com/Junedayday/micro_web_service/tree/v0.8.0

目标

引入prometheus组件,提供标准与自定义的metrics。

关键技术点

  1. metrics接口的开放
  2. 示例counter的初始化
  3. 示例counter的计数
  4. 学习Prometheus监控使用方法

目录构造

--- micro_web_service            项目目录
    |-- gen                            从idl文件夹中生成的文件,不可手动修改
       |-- idl                             对应idl文件夹
          |-- demo                             对应idl/demo服务,包括基础结构、HTTP接口、gRPC接口
            |-- order                            对应idl/order服务,同上
     |-- swagger.json                    openapiv2的接口文档
    |-- idl                            原始的idl定义
       |-- demo                            业务package定义,protobuffer的原始定义
       |-- order                           业务order定义,同时干
    |-- internal                       项目的内部代码,不对外暴露
       |-- config                          配置相关的文件夹,viper的相关加载逻辑
       |-- dao                             Data Access Object层,是model层的实现
       |-- gormer                          从pkg/gormer中生成的相关代码,不允许更改
       |-- metrics                         新增:自定义监控指标
       |-- model                           model层基本定义由gormer自动生成
       |-- mysql                           MySQL连接,支持日志打印
       |-- server                          服务器的实现,对idl中定义服务的具体实现
       |-- service                         service层,作为领域实现的核心部分
     |-- zlog                            封装zap日志的代码实现
  |-- pkg                            开放给第三方的工具库
     |-- gormer                          gormer二进制工具,用于生成Gorm相关Dao层代码
    |-- buf.gen.yaml                   buf生成代码的定义,新增参数校验逻辑
    |-- buf.yaml                       buf工具安装所需的工具,从v1beta升到v1
    |-- format.sh                      新增:格式化代码的脚本
    |-- gen.sh                         生成代码的脚本:buf+gormer
    |-- go.mod                         Go Module文件
    |-- gormer.yaml                    将gormer中的参数移动到这里
    |-- main.go                        项目启动的main函数
    |-- swagger.sh                     生成openapiv2的相关脚本

1.metrics接口的开放

Prometheus官方推荐的metrics开放方式为http。将它引入到程序中的代码如下面几行,不过有几个点值得注意:

go func() {
   
  mux := http.NewServeMux()
  mux.Handle("/metrics", promhttp.Handler())
  http.ListenAndServe(fmt.Sprintf(":%d", config.Viper.GetInt("server.prometheus.port")), mux)
}()
  1. http.ListenAndServe 函数是阻塞的,所以需要开一个goroutine。
  2. 为了保证Prometheus的指标监控不与应用的http服务冲突,这里采用了端口隔离,也就是另起一个http服务。
  3. Gohttp 库如果要支持多port的运行,需要引入mux的概念;默认会注册到http库中的DefaultServeMux

为了验证我们的metrics已经正常running,我们可以调用一个curl请求查看一下(具体返回结果不细讲)。

# 示例的metrics起在8083端口
curl --request GET 'http://127.0.0.1:8083/metrics'

2.示例counter的初始化

我们先以一个最简单的counter累加器为例,实现一个自定的指标监控。

package metrics

import "github.com/prometheus/client_golang/prometheus"

func init() {
   
    prometheus.MustRegister(OrderList)
}

var OrderList = prometheus.NewCounterVec(
    prometheus.CounterOpts{
   
        Name: "order_list_counter",
        Help: "List Order Count",
    },
    []string{
   "service"},
)

代码的逻辑比较简单,我们注意以下三个关键点:

  1. OrderList 是一个全局变量,方便使用方调用;
  2. NewCounterVec 表示这个Counter是一个向量,包括了两块 - opts和labels
    1. opts包括Name和Help,Name是metrics唯一的名称,Help是metrics的帮助信息
    2. labels是用来过滤、聚合功能的关键参数,提前声明有利于存储端进行优化(可类比数据库索引)
  3. prometheus.MustRegister(OrderList) 是将metrics注册到prometheus的全局变量里,与main函数里的注册对应

3.示例counter的计数

从指标的定义可以看到,我们设计的这个metrics是为了统计订单查询接口的次数,于是我们在代码侧引入:

func (s *Server) ListOrders(ctx context.Context, req *order.ListOrdersRequest) (*order.ListOrdersResponse, error) {
   
    metrics.OrderList.With(map[string]string{
   "service": "example"}).Inc()
  // ...
}

函数是一个链式调用,包括两块:

  1. With,也就是label信息,用一个map[string]string填入,是个通用功能;
  2. Inc,即计数+1,这个方法和具体的metrics类型相关。

接着,我们调用两次对应的接口,可以从metrics信息中看到下面的内容:

# HELP order_list_counter List Order Count
# TYPE order_list_counter counter
order_list_counter{service="example"} 2

除非程序重启,否则这个Counter会不断累加。

4.学习Prometheus监控使用方法

Prometheus监控埋点的使用方式比较直观,上手难度不大。如果你希望进一步了解这块,我推荐两个核心的资料:

这两份资料是英文的,可能对部分同学来说学成本比较高,可以考虑先去搜索一些中文翻译文档、了解梗概后,再回过头来看这两篇。如果你希望深入了解Prometheus,必须要仔细看这两块内容,保证实时性。

总结

对接Prometheus的自定义metrics是一个应用程序很常见的功能,例如业务指标埋点。在埋点的过程中,有一个大误区需要刚接触Prometheus的同学注意:把计算的工作交给Prometheus引擎,而不要放在你开发的程序里。

例如,你希望计算某个订单的成功率,你不应该用一个metrics对应成功率,而应该给出两个指标,即订单总量和成功的订单量(也可以放在一个指标中,用label区分成功与否),交由Prometheus进行计算,方便后续的各种metrics的扩展。

更多Prometheus的实践,需要大家边学习边实践。如果反响热烈,我也会抽几讲谈谈Prometheus。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
目录
相关文章
|
9天前
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
|
16天前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
90 3
|
6天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
7天前
|
Go 数据处理 API
Go语言在微服务架构中的应用与优势
本文摘要采用问答形式,以期提供更直接的信息获取方式。 Q1: 为什么选择Go语言进行微服务开发? A1: Go语言的并发模型、简洁的语法和高效的编译速度使其成为微服务架构的理想选择。 Q2: Go语言在微服务架构中有哪些优势? A2: 主要优势包括高性能、高并发处理能力、简洁的代码和强大的标准库。 Q3: 文章将如何展示Go语言在微服务中的应用? A3: 通过对比其他语言和展示Go语言在实际项目中的应用案例,来说明其在微服务架构中的优势。
|
6天前
|
Prometheus 监控 Cloud Native
在 HBase 集群中,Prometheus 通常监控哪些类型的性能指标?
在 HBase 集群中,Prometheus 监控关注的核心指标包括 Master 和 RegionServer 的进程存在性、RPC 请求数、JVM 内存使用率、磁盘和网络错误、延迟和吞吐量、资源利用率及 JVM 使用信息。通过 Grafana 可视化和告警规则,帮助管理员实时监控集群性能和健康状况。
|
26天前
|
Cloud Native Go API
Go语言在微服务架构中的创新应用与实践
本文深入探讨了Go语言在构建高效、可扩展的微服务架构中的应用。Go语言以其轻量级协程(goroutine)和强大的并发处理能力,成为微服务开发的首选语言之一。通过实际案例分析,本文展示了如何利用Go语言的特性优化微服务的设计与实现,提高系统的响应速度和稳定性。文章还讨论了Go语言在微服务生态中的角色,以及面临的挑战和未来发展趋势。
|
27天前
|
运维 Go 开发者
Go语言在微服务架构中的应用与优势
本文深入探讨了Go语言在构建微服务架构中的独特优势和实际应用。通过分析Go语言的核心特性,如简洁的语法、高效的并发处理能力以及强大的标准库支持,我们揭示了为何Go成为开发高性能微服务的首选语言。文章还详细介绍了Go语言在微服务架构中的几个关键应用场景,包括服务间通信、容器化部署和自动化运维等,旨在为读者提供实用的技术指导和启发。
|
1月前
|
负载均衡 Go API
探索Go语言在微服务架构中的应用与优势
在这篇技术性文章中,我们将深入探讨Go语言(又称为Golang)在构建微服务架构时的独特优势。文章将通过对比分析Go语言与其他主流编程语言,展示Go在并发处理、性能优化、以及开发效率上的优势。同时,我们将通过一个实际的微服务案例,详细说明如何利用Go语言构建高效、可扩展的微服务系统。
|
1月前
|
安全 Go 云计算
探索Go语言在微服务架构中的应用与优势
在本文中,我们将深入探讨Go语言(又称为Golang)在构建微服务架构中的独特优势。文章将分析Go语言的并发模型、简洁的语法以及高效的编译速度,以及这些特性如何使其成为微服务架构的理想选择。我们将通过一个简单的微服务示例,展示Go语言在实际开发中的表现,并讨论其在性能和可维护性方面的优势。
|
15天前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第27天】在智能运维中,Prometheus和Grafana的组合已成为监控和告警体系的事实标准。Prometheus负责数据收集和存储,支持灵活的查询语言PromQL;Grafana提供数据的可视化展示和告警功能。本文介绍如何配置Prometheus监控目标、Grafana数据源及告警规则,帮助运维团队实时监控系统状态,确保稳定性和可靠性。
80 0