您当前的位置:首页 > 互联网百科 > 大数据

Prometheus监控业务指标

时间:2021-11-02 13:11:09  来源:  作者:大数据推荐杂谈
Prometheus监控业务指标

 

在Kubernetes已经成了事实上的容器编排标准之下,微服务的部署变得非常容易。但随着微服务规模的扩大,服务治理带来的挑战也会越来越大。在这样的背景下出现了服务可观测性(observability)的概念。在分布式系统里,系统的故障可能出现在任何节点,怎么能在出了故障的时候快速定位问题和解决问题,甚至是在故障出现之前就能感知到服务系统的异常,把故障扼杀在摇篮里。这就是可观测性的意义所在。

 

可观测性

Prometheus监控业务指标

 

可观测性是由Logging,Metrics,Tracing构建的,简称为可观测性三支柱。

Prometheus监控业务指标

 

  • Lgging,展现的是应用运行而产生的事件或者程序在执行的过程中间产生的一些日志,可以详细解释系统的运行状态,但是存储和查询需要消耗大量的资源。所以往往使用过滤器减少数据量。
  • Metrics,是一种聚合数值,存储空间很小,可以观察系统的状态和趋势,但对于问题定位缺乏细节展示。这个时候使用等高线指标等多维数据结构来增强对于细节的表现力。例如统计一个服务的 TBS 的正确率、成功率、流量等,这是常见的针对单个指标或者某一个数据库的。
  • Tracing,面向的是请求,可以轻松分析出请求中异常点,但与Logging有相同的问题就是资源消耗较大。通常也需要通过采样的方式减少数据量。比如一次请求的范围,也就是从浏览器或者手机端发起的任何一次调用,一个流程化的东西,我们需要轨迹去追踪。

 

我们在这篇文章讨论的主题就是可观测性中的Metrics。在 Kubernetes作为基础设施的背景下,我们知道Kubernetes本身是个复杂的容器编排系统,它本身的稳定运行至关重要。与之相伴的指标监控系统 Promethues也已经成为了云原生服务下监控体系的事实标准。相信大家对资源层面比如CPU,Memory,Network;应用层面比如Http请求数,请求耗时等指标的监控都有所了解。那么业务层面的指标又怎么利用Prometheus去监控和告警呢?这就是这篇文章的核心内容。

 

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

 

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

 

指标

Prometheus监控业务指标

 

指标定义

 

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

<metric name>{<label name>=<label value>, ...}

指标的名称(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监控业务指标

 

暴露指标

 

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地址不太适用,在Kubernetes下Promethues通过与Kubernetes API集成目前主要支持5种服务发现模式,分别是:Node、Service、Pod、Endpoints、Ingress。

 

指标展示如下图:

Prometheus监控业务指标

 


Prometheus监控业务指标

 



Tags:Prometheus   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在Kubernetes已经成了事实上的容器编排标准之下,微服务的部署变得非常容易。但随着微服务规模的扩大,服务治理带来的挑战也会越来越大。在这样的背景下出现了服务可观测性(obs...【详细内容】
2021-11-02  Tags: Prometheus  点击:(40)  评论:(0)  加入收藏
概述对于MySQL的监控平台,相信大家实现起来有很多了:基于天兔的监控,还有基于zabbix相关的二次开发。相信很多同行都应该已经开始玩起来了。我这边的选型是Prometheus + Granaf...【详细内容】
2021-07-30  Tags: Prometheus  点击:(86)  评论:(0)  加入收藏
监控系统在这里特指对数据中心的监控,主要针对数据中心内的硬件和软件进行监控和告警。企业的 IT 架构逐步从传统的物理服务器,迁移到以虚拟机为主导的 IaaS 云。无论基础架构...【详细内容】
2021-07-12  Tags: Prometheus  点击:(183)  评论:(0)  加入收藏
Prometheus既是一个时序数据库,又是一个监控系统,更是一套完备的监控生态解决方案。作为时序数据库,在2020年2月的排名中,Prometheus已经跃居到第三名,超越了老牌的时序数据库Ope...【详细内容】
2021-02-26  Tags: Prometheus  点击:(1171)  评论:(0)  加入收藏
Prometheus 数据采集过程介绍Prometheus 从采集数据到将存储的过程中,会对采集目标及数据样本作一系列处理。了解这个过程有利于帮助我们更充分、合理的使用可配参数。一、...【详细内容】
2020-06-23  Tags: Prometheus  点击:(81)  评论:(0)  加入收藏
​Prometheus is an open-source systems monitoring and alerting toolkit originally built at SoundCloud.1、FeaturesPrometheus&#39;s main features are: a multi-di...【详细内容】
2020-06-15  Tags: Prometheus  点击:(140)  评论:(0)  加入收藏
配置Node Exporter 安装Node Exporter我们依然选用Ubuntu 18.04作为监控目标root@prometheous# mkdir node-exporter;cd node-exporterroot@prometheous:~/node-exporter# w...【详细内容】
2020-06-04  Tags: Prometheus  点击:(372)  评论:(0)  加入收藏
本文摘自于《Prometheus 监控技术与实战》一书,从云计算时代的业务特点出发,探讨了云计算监控的目标和挑战,梳理了云资源监控的范围及监控系统实现的一般方式。接着从开源监控...【详细内容】
2020-05-20  Tags: Prometheus  点击:(78)  评论:(0)  加入收藏
这期的分享是监控实战,其实不想写这篇的,因为网上相关的文章也挺多的,但是出于光说不练都是假把式,而且我也想告诉你:当帅气的普罗米修斯(Prometheus)遇到高颜值的格拉法纳(Grafana)...【详细内容】
2019-09-26  Tags: Prometheus  点击:(345)  评论:(0)  加入收藏
概述Prometheus支持多种语言(Go,java,python,ruby官方提供客户端,其他语言有第三方开源客户端)。我们可以通过客户端方面的对核心业务进行埋点。Prometheus的基本原理是通过HTTP协...【详细内容】
2019-09-24  Tags: Prometheus  点击:(203)  评论:(0)  加入收藏
▌简易百科推荐
张欣安科瑞电气股份有限公司 上海嘉定 201801 摘要:随着电力行业各系统接入,海量数据涌现,如何利用电网信息化中大量数据,对客户需求进行判断分析,服务于营销链条,提升企业市场竞...【详细内容】
2021-12-14  安科瑞张欣    Tags:大数据   点击:(9)  评论:(0)  加入收藏
1、什么是数据分析结合分析工具,运用数据分析思维,分析庞杂数据信息,为业务赋能。 2、数据分析师工作的核心流程:(1)界定问题:明确具体问题是什么;●what 发生了什么(是什么)●why 为...【详细内容】
2021-12-01  逆风北极光    Tags:大数据   点击:(25)  评论:(0)  加入收藏
在实际工作中,我们经常需要整理各个业务部门发来的数据。不仅分散,而且数据量大、格式多。单是从不同地方汇总整理这些原始数据就花了大量的时间,更不用说还要把有效的数据收集...【详细内容】
2021-11-30  百数    Tags:数据   点击:(21)  评论:(0)  加入收藏
数据作为新的生产要素,其蕴含的价值日益凸显,而安全问题却愈发突出。密码技术,是实现数据安全最经济、最有效、最可靠的手段,对数据进行加密,并结合有效的密钥保护手段,可在开放环...【详细内容】
2021-11-26  炼石网络    Tags:数据存储   点击:(17)  评论:(0)  加入收藏
导读:网易大数据平台的底层数据查询引擎,选用了Impala作为OLAP查询引擎,不但支撑了网易大数据的交互式查询与自助分析,还为外部客户提供了商业化的产品与服务。今天将为大家分享...【详细内容】
2021-11-26  DataFunTalk    Tags:大数据   点击:(15)  评论:(0)  加入收藏
导读:数据挖掘是一种发现知识的手段。数据挖掘要求数据分析师通过合理的方法,从数据中获取与挖掘项目相关的知识。作者:赵仁乾 田建中 叶本华 常国珍来源:华章科技数据挖掘是一...【详细内容】
2021-11-23  华章科技  今日头条  Tags:数据挖掘   点击:(20)  评论:(0)  加入收藏
今天再给大家分享一个不错的可视化大屏分析平台模板DataColour。 data-colour 可视化分析平台采用前后端分离模式,后端架构设计采用微服务架构模式。 前端技术:Angularjs、Jq...【详细内容】
2021-11-04  web前端进阶    Tags:DashboardClient   点击:(39)  评论:(0)  加入收藏
在Kubernetes已经成了事实上的容器编排标准之下,微服务的部署变得非常容易。但随着微服务规模的扩大,服务治理带来的挑战也会越来越大。在这样的背景下出现了服务可观测性(obs...【详细内容】
2021-11-02  大数据推荐杂谈    Tags:Prometheus   点击:(40)  评论:(0)  加入收藏
同一产品对老客户的要价竟然比新客户要高?这是当下“大数据杀熟”的直接结果。近年来,随着平台经济的蓬勃发展,大数据在为用户服务之外,也引发了多种不合理现象。为了有效遏制“...【详细内容】
2021-10-29    海外网   Tags:大数据   点击:(31)  评论:(0)  加入收藏
本人03年开始从事贸易行业,多年来一直致力于外贸获客和跨境电商选品等领域,最近有些小伙伴反馈海关数据演示的都挺好为啥用起来不是那么回事?大家看到数据时关注的有产品、采购...【详细内容】
2021-10-28  QD云龙    Tags:数据   点击:(33)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条