0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Prometheus监控业务指标详解

马哥Linux运维 来源:51CTO 2024-01-24 10:32 次阅读

Prometheus 监控业务指标

在 Kubernetes 已经成了事实上的容器编排标准之下,微服务的部署变得非常容易。但随着微服务规模的扩大,服务治理带来的挑战也会越来越大。在这样的背景下出现了服务可观测性(observability)的概念。

在分布式系统里,系统的故障可能出现在任何节点,怎么能在出了故障的时候快速定位问题和解决问题,甚至是在故障出现之前就能感知到服务系统的异常,把故障扼杀在摇篮里。这就是可观测性的意义所在。

可观测性

可观测性是由 logging, metrics, tracing 构建的, 简称为可观测性三支柱。

3a4aac54-b9d5-11ee-8b88-92fbcf53809c.jpg

Lgging,展现的是应用运行而产生的事件或者程序在执行的过程中间产生的一些日志,可以详细解释系统的运行状态,但是存储和查询需要消耗大量的资源。所以往往使用过滤器减少数据量。

Metrics,是一种聚合数值,存储空间很小,可以观察系统的状态和趋势,但对于问题定位缺乏细节展示。这个时候使用等高线指标等多维数据结构来增强对于细节的表现力。例如统计一个服务的 TBS 的正确率、成功率、流量等,这是常见的针对单个指标或者某一个数据库的。

Tracing,面向的是请求,可以轻松分析出请求中异常点,但与 logging 有相同的问题就是资源消耗较大。通常也需要通过采样的方式减少数据量。比如一次请求的范围,也就是从浏览器或者手机端发起的任何一次调用,一个流程化的东西,我们需要轨迹去追踪。

这篇文章讨论的主题就是可观测性中的 metrics。在 k8s 作为基础设施的背景下,我们知道 K8s 本身是个复杂的容器编排系统,它本身的稳定运行至关重要。与之相伴的指标监控系统 Promethues 也已经成为了云原生服务下监控体系的事实标准。

相信大家对资源层面比如 CPU,Memory,Network;应用层面比如 Http 请求数,请求耗时等指标的监控都有所了解。那么业务层面的指标又怎么利用 Prometheus 去监控和告警呢?这就是这篇文章的核心内容。

以我们一个业务场景为例,在系统中有多种类型的 task 在运行,并且 task 的运行时间各异,task 本身有各种状态包括待执行、执行中、执行成功、执行失败等。如果想确保系统的稳定运行,我们必须对各个类型的 task 的运行状况了如指掌。比如当前是否有任务挤压,失败任务是否过多,并且当超过阈值是否告警。

为了解决上述的监控告警问题,我们先得了解一下 Prometheus 的指标类型

指标

指标定义

在形式上,所有的指标(Metric)都通过如下格式标示:

{

指标的名称(metric name)可以反映被监控样本的含义(比如,http_request_total- 表示当前系统接收到的HTTP请求总量)。指标名称只能由ASCII字符、数字、下划线以及冒号组成并必须符合正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*。

标签(label)反映了当前样本的特征维度,通过这些维度Prometheus可以对样本数据进行过滤,聚合等。标签的名称只能由ASCII字符、数字以及下划线组成并满足正则表达式[a-zA-Z_][a-zA-Z0-9_]*。

指标类型

Prometheus定义了4种不同的指标类型(metric type):Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)。

Counter

Counter类型的指标其工作方式和计数器一样,只增不减(除非系统发生重置)。常见的监控指标,如http_requests_total,node_cpu都是 Counter 类型的监控指标。一般在定义Counter类型指标的名称时推荐使用_total作为后缀。

通过 counter 指标我们可以和容易的了解某个事件产生的速率变化。

例如,通过rate()函数获取HTTP请求量的增长率:

rate(http_requests_total[5m])

Gauge

Gauge类型的指标侧重于反应系统的当前状态。因此这类指标的样本数据可增可减。常见指标如:node_memory_MemFree(主机当前空闲的内容大小)、node_memory_MemAvailable(可用内存大小)都是Gauge类型的监控指标。

通过Gauge指标,我们可以直接查看系统的当前状态

node_memory_MemFree

Summary

Summary 主用用于统计和分析样本的分布情况。比如某 Http 请求的响应时间大多数都在 100 ms 内,而个别请求的响应时间需要 5s,那么这中情况下统计指标的平均值就不能反映出真实情况。而如果通过 Summary 指标我们能立马看响应时间的9分位数,这样的指标才是有意义的。

例如

# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 3.98e-05
go_gc_duration_seconds{quantile="0.25"} 5.31e-05
go_gc_duration_seconds{quantile="0.5"} 6.77e-05
go_gc_duration_seconds{quantile="0.75"} 0.0001428
go_gc_duration_seconds{quantile="1"} 0.0008099
go_gc_duration_seconds_sum 0.0114183
go_gc_duration_seconds_count 85

Histogram

Histogram 类型的指标同样用于统计和样本分析。与 Summary 类型的指标相似之处在于 Histogram 类型的样本同样会反应当前指标的记录的总数(以_count作为后缀)以及其值的总量(以_sum作为后缀)。不同在于 Histogram 指标直接反应了在不同区间内样本的个数,区间通过标签len进行定义。同时对于Histogram的指标,可以通过histogram_quantile()函数计算出其值的分位数。

例如

# HELP prometheus_http_response_size_bytes Histogram of response size for HTTP requests.
# TYPE prometheus_http_response_size_bytes histogram
prometheus_http_response_size_bytes_bucket{handler="/",le="100"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="1000"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="10000"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="100000"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="1e+06"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="+Inf"} 1
prometheus_http_response_size_bytes_sum{handler="/"} 29
prometheus_http_response_size_bytes_count{handler="/"} 1

应用指标监控

暴露指标

Prometheus 最常用的方式是通过 pull 去抓取 metrics。所以我们首先在服务通过/metrics接口暴露指标,这样 Promethues server 就能通过 http 请求抓取到我们的业务指标。

接口示例

server := gin.New()
server.Use(middlewares.AccessLogger(), middlewares.Metric(), gin.Recovery())




server.GET("/health", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{        "message": "ok",
    })
})




server.GET("/metrics", Monitor)func Monitor(c *gin.Context) {
    h := promhttp.Handler()
    h.ServeHTTP(c.Writer, c.Request)
}

定义指标

为了方便理解,这里选取了三种类型和两种业务场景的指标
示例

var (    
    //HTTPReqDuration metric:http_request_duration_seconds
    HTTPReqDuration *prometheus.HistogramVec    
    //HTTPReqTotal metric:http_request_total
    HTTPReqTotal *prometheus.CounterVec    
    // TaskRunning metric:task_running
    TaskRunning *prometheus.GaugeVec
)




func init() {
    // 监控接口请求耗时
    // 指标类型是 Histogram
    HTTPReqDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
        Name:    "http_request_duration_seconds",
        Help:    "http request latencies in seconds",
        Buckets: nil,
    }, []string{"method", "path"})
    // "method"、"path" 是 label




    // 监控接口请求次数
    // 指标类型是 Counter
    HTTPReqTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
        Name: "http_requests_total",
        Help: "total number of http requests",
    }, []string{"method", "path", "status"})    // "method"、"path"、"status" 是 label




    // 监控当前在执行的 task 数量
    // 监控类型是 Gauge
    TaskRunning = prometheus.NewGaugeVec(prometheus.GaugeOpts{
        Name: "task_running",
        Help: "current count  of running task",
    }, []string{"type", "state"})
    // "type"、"state" 是 label




    prometheus.MustRegister(
        HTTPReqDuration,
        HTTPReqTotal,
        TaskRunning,
    )
}

通过上述的代码我们就定义并且注册了我们的想要监控的指标。

生成指标

示例

start := time.Now()
c.Next()




duration := float64(time.Since(start)) / float64(time.Second)




path := c.Request.URL.Path




// 请求数加1
controllers.HTTPReqTotal.With(prometheus.Labels{    
    "method": c.Request.Method,    
    "path":   path,    
    "status": strconv.Itoa(c.Writer.Status()),
}).Inc()




//  记录本次请求处理时间
controllers.HTTPReqDuration.With(prometheus.Labels{    
    "method": c.Request.Method,    
    "path":   path,
}).Observe(duration)




// 模拟新建任务
controllers.TaskRunning.With(prometheus.Labels{    
    "type":  shuffle([]string{"video", "audio"}),    
    "state": shuffle([]string{"process", "queue"}),
}).Inc()




// 模拟任务完成
controllers.TaskRunning.With(prometheus.Labels{    
    "type":  shuffle([]string{"video", "audio"}),    
    "state": shuffle([]string{"process", "queue"}),
}).Dec()

抓取指标

Promethues 抓取 target 配置

# 抓取间隔
scrape_interval: 5s




# 目标
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['prometheus:9090']
  - job_name: 'local-service'
    metrics_path: /metrics
    static_configs:
      - targets: ['host.docker.internal:8000']

在实际应用中静态配置 target 地址不太适用,在 k8s 下 Promethues通过与 Kubernetes API 集成目前主要支持5种服务发现模式,分别是:Node、Service、Pod、Endpoints、Ingress。

指标展示如下图:

3a5811e6-b9d5-11ee-8b88-92fbcf53809c.jpg

3a6f8db2-b9d5-11ee-8b88-92fbcf53809c.jpg

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10442

    浏览量

    206559
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79541
  • 容器
    +关注

    关注

    0

    文章

    481

    浏览量

    21876
  • Prometheus
    +关注

    关注

    0

    文章

    26

    浏览量

    1676

原文标题:轻松驾驭!Prometheus 如何监控指标,快速定位故障

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Prometheus的架构原理从“监控”谈起

    。 去年10月我们快速落地了一套易用、灵活、有亮点的业务监控平台,其中使用到了Prometheus。从技术选型阶段,Pr
    的头像 发表于 10-10 15:47 4161次阅读
    <b class='flag-5'>Prometheus</b>的架构原理从“<b class='flag-5'>监控</b>”谈起

    Prometheus的基本原理与开发指南

      导读      本文由梯度科技云管研发部高级工程师周宇明撰写,共分为7章,紧密围绕Prometheus的基本原理与开发指南展开介绍: 监控系统概述 Prometheus入门 PromQL入门
    的头像 发表于 11-09 10:45 546次阅读
    <b class='flag-5'>Prometheus</b>的基本原理与开发指南

    prometheus监控服务的整个流程介绍

    服务,端口为9098,并且监听RabbitMQ的15672接口,获取其中的指标数据,转换成prometheus可以识别的metrics;如果需要对业务进行监控,这时候就需要自定义
    发表于 12-23 17:34

    django-prometheus数据监控

    django-prometheus.zip
    发表于 04-26 11:07 0次下载
    django-<b class='flag-5'>prometheus</b>数据<b class='flag-5'>监控</b>

    Prometheus服务监控系统

    prometheus.zip
    发表于 04-26 10:23 3次下载
    <b class='flag-5'>Prometheus</b>服务<b class='flag-5'>监控</b>系统

    使用Thanos+Prometheus+Grafana构建监控系统

    对于弹性伸缩和高可用的系统来说,一般有大量的指标数据需要收集和存储,如何为这样的系统打造一个监控方案呢?本文介绍了如何使用 Thanos+Prometheus+Grafana 构建监控
    的头像 发表于 05-05 21:14 2225次阅读

    监控神器:Prometheus

    Prometheus发展速度很快,12年开发完成,16年加入CNCF,成为继K8s 之后第二个CNCF托管的项目,目前Github 42k的,而且社区很活跃,维护频率很高,基本稳定在1个月1个小版本的迭代速度。
    的头像 发表于 07-31 11:55 845次阅读

    如何基于kube-prometheus设计一个监控系统

    本文提供了作者的应用示例,另外还记录了作者在学习、使用 Prometheus 过程中的一些笔记,如 arm 版镜像获取、一些工具的使用等。
    的头像 发表于 09-13 09:47 798次阅读

    关于Prometheus监控系统相关的知识体系

    今天浩道跟大家分享关于Prometheus监控系统相关的知识体系,让你通过本文可以大体掌握其相关知识体系!
    的头像 发表于 10-20 09:06 881次阅读

    prometheus下载安装教程

    Prometheus 是一个开放性的监控解决方案,用户可以非常方便的安装和使用 Prometheus 并且能够非常方便的对其进行扩展。 在Prometheus的架构设计中,
    的头像 发表于 01-13 16:07 6710次阅读
    <b class='flag-5'>prometheus</b>下载安装教程

    Prometheus存储引擎简析

    Prometheus 作为云原生时代的时序数据库, 是当下最流行的监控平台之一,尽管其整体架构一直没怎么变,但其底层的存储引擎却演进了几个版本。
    的头像 发表于 03-28 17:57 450次阅读

    基于kube-prometheus的大数据平台监控系统设计

    本文介绍了如何基于 kube-prometheus 设计一个监控系统, 以灵活简单的方式对 kubernetes 上的应用进行指标采集,并实现监控报警功能。
    的头像 发表于 05-30 17:02 438次阅读

    40个步骤安装部署Prometheus监控系统

    Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社区也十分活跃,他们便将它独立成开源项目,并且有公司来运作。
    的头像 发表于 08-14 11:53 3.1w次阅读
    40个步骤安装部署<b class='flag-5'>Prometheus</b><b class='flag-5'>监控</b>系统

    基于Prometheus开源的完整监控解决方案

    每一个被 Prometheus 监控的服务都是一个 Job,Prometheus 为这些 Job 提供了官方的 SDK ,利用这个 SDK 可以自定义并导出自己的业务
    发表于 10-18 09:15 180次阅读
    基于<b class='flag-5'>Prometheus</b>开源的完整<b class='flag-5'>监控</b>解决方案

    Prometheus新手常犯的6项错误你知道吗?

    这是 Prometheus 使用者经常会犯的一个错,因为 Prometheus 时序是基于多标签的,它非常灵活,有时你想新增一个标签,从而将一个粗粒度的指标进行拆分,但切记添加的标签的值应该做到尽量收敛
    的头像 发表于 12-26 10:18 208次阅读
    <b class='flag-5'>Prometheus</b>新手常犯的6项错误你知道吗?