通过Prometheus监控Go应用

通过在应用中埋点来暴露应用数据,使用阿里云Prometheus抓取数据,借助Prometheus Grafana大盘来展示数据,并创建告警,即可实现利用阿里云Prometheus监控Go应用的目的。本文以阿里云容器服务K8s集群和阿里云容器镜像服务为例,介绍如何通过阿里云Prometheus监控Go应用。

前提条件

Demo

如需快速体验如何通过阿里云Prometheus监控Go应用,您可以使用已埋点的Demo工程

操作流程

通过阿里云Prometheus监控Go应用的操作流程如下图所示。

flow

步骤一:为应用埋点

为应用埋点以暴露Go应用数据的操作步骤如下:

  1. 将监控包导入Go应用。

    import (
        "fmt"
        "github.com/prometheus/client_golang/prometheus/promhttp"
        "net/http"
        "strconv"
    )
  2. 将监控接口绑定至promhttp.Handler()

    http.Handle(path, promhttp.Handler()) //初始化一个HTTP Handler。

步骤二:上传应用

将完成埋点的应用制作成镜像并上传至阿里云容器镜像服务的镜像仓库的操作步骤如下:

  1. 执行以下命令重新编译模块。

    go build
  2. 执行以下命令构建镜像。

    docker build -t <本地临时Docker镜像名称>:<本地临时Docker镜像版本号> . --no-cache

    示例命令:

    docker build -t prometheus-go-demo:v0 . --no-cache
  3. 执行以下命令为镜像打标。

    sudo docker tag <本地临时Docker镜像名称>:<本地临时Docker镜像版本号> <Registry域名>/<命名空间>/<镜像名称>:<镜像版本号>

    示例命令:

    sudo docker tag prometheus-go-demo:v0 registry.cn-hangzhou.aliyuncs.com/testnamespace/prometheus-go-demo:v0
  4. 执行以下命令将镜像推送至镜像仓库。

    sudo docker push <Registry域名>/<命名空间>/<镜像名称>:<镜像版本号>

    示例命令:

    sudo docker push registry.cn-hangzhou.aliyuncs.com/testnamespace/prometheus-go-demo:v0

    容器镜像服务控制台镜像版本页面显示上传的应用镜像。镜像

步骤三:部署应用

将应用部署至容器服务K8s集群的操作步骤如下:

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 创建容器组。

    1. 无状态页面,单击使用YAML创建资源

    2. 创建页面的模板代码框输入以下内容,然后单击创建

      apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
      kind: Deployment
      metadata:
        name: prometheus-go-demo
        labels:
          app: go-exporter
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: go-exporter
        template:
          metadata:
            labels:
              app: go-exporter
          spec:
            containers:
            - name: prometheus-go-demo
              imagePullPolicy: Always
              image: <Registry域名>/<命名空间>/<镜像名称>:<镜像版本号>
              ports:
              - containerPort: 8077
                name: arms-go-demo

      示例代码:

      apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
      kind: Deployment
      metadata:
        name: prometheus-go-demo
        labels:
          app: go-exporter
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: go-exporter
        template:
          metadata:
            labels:
              app: go-exporter
          spec:
            containers:
            - name: prometheus-go-demo
              imagePullPolicy: Always
              image: registry.cn-hangzhou.aliyuncs.com/fuling/prometheus-go-demo:v0
              ports:
              - containerPort: 8077
                name: arms-go-demo

    无状态页面显示创建的容器组。go-exporter

  4. 创建服务。

    1. 在左侧导航栏,选择网络 > 服务

    2. 服务页面,单击使用YAML创建资源

    3. 创建页面的模板代码框输入以下内容,然后单击创建

      apiVersion: v1
      kind: Service
      metadata:
        labels:
          app: prometheus-go-demo
        name: prometheus-go-demo
      spec:
        ports:
        - name: arms-go-demo
          port: 8077
          protocol: TCP
          targetPort: 8077
        type: NodePort
        selector:
          app: prometheus-go-demo

    服务页面显示创建的服务。go服务-客户端

步骤四:配置服务发现

配置可观测监控 Prometheus 版的服务发现以抓取Go应用数据的操作步骤如下:

  1. 登录ARMS控制台
  2. 在左侧导航栏选择Prometheus监控 > 实例列表,进入可观测监控 Prometheus 版的实例列表页面。

  3. Prometheus监控页面的顶部菜单栏,选择K8s集群所在的地域,单击目标实例名称。

  4. 在左侧导航树单击服务发现,然后单击配置页签。

  5. 配置页面单击ServiceMonitor页签,然后单击添加ServiceMonitor

  6. 添加ServiceMonitor对话框中输入以下内容,然后单击确定

    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      # 填写一个唯一名称
      name: prometheus-go-demo
      # 填写目标命名空间
      namespace: default
    spec:
      endpoints:
      - interval: 30s
        # 填写Prometheus Exporter对应的PortName字段的值
        port: arms-go-demo
        # 填写Prometheus Exporter对应的Path的值
        path: /metrics
      namespaceSelector:
        any: true
        # Demo的命名空间
      selector:
        matchLabels:
          app: prometheus-go-demo

    ServiceMonitor页签下显示配置的服务发现。image

步骤五:配置大盘

本文以Grafana 9.0.x版本为示例配置大盘:

  1. 工作区管理页面,单击目标工作区右侧的访问地址URL链接进入Grafana。

    说明

    如果需要登录Grafana,可以使用GrafanaAdmin账号和创建工作区时设置的密码登录Grafana,或单击Sign in with Alibaba Cloud直接使用当前购买工作区的阿里云账号登录Grafana。

  2. 在左侧导航栏,选择image > + Import

  3. Import页面的Import via grafana.com文本框,输入Prometheus提供的Go应用大盘模板ID6671,然后单击右侧的Load

  4. Import页面输入以下信息,然后单击Import

    image

    1. Name文本框中输入自定义的大盘名称。

    2. Folder列表中,选择您的阿里云容器服务K8s集群。

    3. prometheus-apl下拉框中选择您的阿里云容器服务K8s集群。

    配置完毕后的Grafana大盘如图所示。image

步骤六:创建告警

创建告警的具体操作,请参见Prometheus告警规则