微服务从代码到k8s部署应有尽有系列(十三、服务监控)

我们用一个系列来讲解从需求到上线、从代码到 k8s 部署、从日志到监控等各个方面的微服务完整实践。

整个项目使用了 go-zero 开发的微服务,基本包含了 go-zero 以及相关 go-zero 作者开发的一些中间件,所用到的技术栈基本是 go-zero 项目组的自研组件,基本是 go-zero 全家桶了。

实战项目地址:github.com/Mikaelemmmm/go-zero-loo...

1、概述#

好的服务一定是可以被及时监控的,在 go-zero-looklook 中我们使用目前比较流行的 prometheus 来作为监控工具,然后使用 grafana 来显示

go-zero 已经在代码中给我们集成好了 prometheus

// StartAgent starts a prometheus agent.
func StartAgent(c Config) {
  if len(c.Host) == 0 {
    return
  }

  once.Do(func() {
    enabled.Set(true)
    threading.GoSafe(func() {
      http.Handle(c.Path, promhttp.Handler())
      addr := fmt.Sprintf("%s:%d", c.Host, c.Port)
      logx.Infof("Starting prometheus agent at %s", addr)
      if err := http.ListenAndServe(addr, nil); err != nil {
        logx.Error(err)
      }
    })
  })
}

无论当我们启动 api、rpc 都会额外启动一个 goroutine 提供 prometheus 的服务

【注】如果像我们之前 order-mq 这种使用 serviceGroup 管理的服务,在启动文件 main 中要显式调用一下才可以,api、rpc 不需要,配置都一样

package main
.....
func main() {
  ....
  // log、prometheus、trace、metricsUrl.
  if err := c.SetUp(); err != nil {
    panic(err)
  }

  ......
}

2、实现#

2.1 配置 prometheus 与 grafana#

在项目下的 docker-compose-env.yml 文件中

我们来 deploy/prometheus/server/prometheus.yml 看看 prometheus 配置文件

global:
  scrape_interval:
  external_labels:
    monitor: 'codelab-monitor'

# 这里表示抓取对象的配置
scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s  #重写了全局抓取间隔时间,由15秒重写成5秒
    static_configs:
      - targets: ['127.0.0.1:9090']

  - job_name: 'order-api'
    static_configs:
      - targets: ['order-api:9091']
        labels:
          job: order-api
          app: order-api
          env: dev
  - job_name: 'order-rpc'
    static_configs:
      - targets: ['order-rpc:9091']
        labels:
          job: order-rpc
          app: order-rpc
          env: dev
  - job_name: 'order-mq'
    static_configs:
      - targets: ['order-mq:9091']
        labels:
          job: order-mq
          app: order-mq
          env: dev
  - job_name: 'usercenter-api'
    static_configs:
      - targets: ['usercenter-api:9091']
        labels:
          job: usercenter-api
          app: usercenter-api
          env: dev
  - job_name: 'usercenter-rpc'
    static_configs:
      - targets: ['usercenter-rpc:9091']
        labels:
          job: usercenter-rpc
          app: usercenter-rpc
          env: dev
  - job_name: 'travel-api'
    static_configs:
      - targets: ['travel-api:9091']
        labels:
          job: travel-api
          app: travel-api
          env: dev
  - job_name: 'travel-rpc'
    static_configs:
      - targets: ['travel-rpc:9091']
        labels:
          job: travel-rpc
          app: travel-rpc
          env: dev
  - job_name: 'payment-api'
    static_configs:
      - targets: ['payment-api:9091']
        labels:
          job: payment-api
          app: payment-api
          env: dev
  - job_name: 'payment-rpc'
    static_configs:
      - targets: ['payment-rpc:9091']
        labels:
          job: payment-rpc
          app: payment-rpc
          env: dev
  - job_name: 'mqueue-rpc'
    static_configs:
      - targets: ['mqueue-rpc:9091']
        labels:
          job: mqueue-rpc
          app: mqueue-rpc
          env: dev
  - job_name: 'message-mq'
    static_configs:
      - targets: ['message-mq:9091']
        labels:
          job: message-mq
          app: message-mq
          env: dev
  - job_name: 'identity-api'
    static_configs:
      - targets: ['identity-api:9091']
        labels:
          job: identity-api
          app: identity-api
          env: dev
  - job_name: 'identity-rpc'
    static_configs:
      - targets: [ 'identity-rpc:9091' ]
        labels:
          job: identity-rpc
          app: identity-rpc
          env: dev

2.2 业务配置#

实现上我们业务也不需要添加任何代码(除了 serviceGroup 管理的服务)

我们只需要在业务配置文件中配置即可,我们拿 usercenter 来举例

1)api

2)rpc

3)mq(serviceGroup)

【注】(再强调一次)如果像我们之前 order-mq 这种使用 serviceGroup 管理的服务,在启动文件 main 中要显示调用一下才可以,api、rpc 不需要

package main
.....
func main() {
  ....
  // log、prometheus、trace、metricsUrl.
  if err := c.SetUp(); err != nil {
    panic(err)
  }

  ......
}

2.3 查看#

访问 127.0.0.1:9090/ , 点击上面菜单 “Status”,再点击 Targets , 蓝色的就是启动成了,红色就是没启动成功

2.4 配置 grafana#

访问 http://127.0.0.1:3001, 默认账号、密码都是 admin

配置数据源是 prometheus

然后配置

【注】这里是在 docker 中配置的,所以 http 的 url 不能写 127.0.0.1

查看是否配置成功

配置 dashboard

然后点击第一个

我们添加一个 cpu 指标,在下方输入 cpu 选择

然后我们就可以看到我们想要看的监控指标

3、结尾#

这里只演示了一个指标,其他想看的指标自己配置就可以了,同时你也可以在 grafana 添加 alert 报警配置,这个就不作为演示了自行整理

项目地址#

github.com/zeromicro/go-zero

欢迎使用 go-zerostar 支持我们!

微信交流群#

关注『微服务实践』公众号并点击 交流群 获取社区群二维码。

本作品采用《CC 协议》,转载必须注明作者和本文链接
kevwan
go-zero作者 @ 某互联网公司
文章
102
粉丝
639
喜欢
651
收藏
619
排名:151
访问:6.6 万
私信
所有博文
社区赞助商