「潮流」通过Prometheus的Exporter收集你只想的一切
永安娱乐新闻网 2025-08-31
#TYPE 的内容音频如下附注,能够填满举例来说英文名称和举例来说子类(如果未明确的举例来说子类,能够来到 untyped)。
TYPE跟踪试样部分能够受限制如下音频规约。
metric_name [ "{" label_name "=" " label_value " { "," label_name "=" " label_value " } [ "," ] "}" ] value [ timestamp ]其那时候面,metric_name 和 label_name 不必遵循 PromQL 的音频规约。value 是一个 f loat 音频的将近据集,timestamp 的子类为 int64(从 1970-01-01 00:00:00 开始至今的总毫秒将近),可另设其意味着为当前小时。
具有相近 metric_name 的试样不必按照一个组的形式排列,并且每正要不必是唯一的举例来说英文名称和标签键绝对值对一组。Prometheus 为了方便 client library 的运用于缺少了四种将近据集子类:
Counter:Counter 是一个累加的将近据集子类。一个 Counter 子类的举例来说只都会随着小时逐渐递增(当系统设计者据报导的时候,Counter 举例来说都会被重置为 0)。历史纪录系统设计者顺利完成的总任务生产量、系统设计者从不不算可能一次触发到目前为止遭遇的总缺失将近等场景都适合运用于 Counter 子类的举例来说。Gauge:Gauge 举例来说主要运用于历史纪录一个瞬时绝对值,这个举例来说可以增加也可以减少,比如 CPU 的运用于可能、存储器运用于量以及闪存当前的紧致容量等。Histogram:Histogram 说明柱状图,主要运用于统计将近字一些将近据集分布的可能,可以推算在一定范围内的将近据集分布可能,同时还缺少了举例来说绝对值的总和。在大多将近前提,服务器都会运用于某些举例来说的总和作为参阅,例如,运用于系统设计者的平均自发小时来衡量系统设计者的自发并能。这种方法有个明显的关键问题——如果大多将近催促的自发小时都维持在 100ms 内,而个别催促的自发小时能够 1s 甚至不够久,那么自发小时的总和充分体现不出自发小时那时候面的尖刺,这就是只不过的“长嘴关键问题”。为了不够加真实地反映系统设计者自发并能,都用的方法是按照催促提早的范围来进行分组,例如在上述示例那时候面,可以分别统计将近字自发小时在[0,100ms]、[100,1s]和[1s,∞]这 3 个上行的催促将近,通过查询这 3 个的区那时候面催促量的分布,就可以相对客观地比对出系统设计者的自发并能。Summary:Summary 与 Histogram 相似,也都会统计将近字举例来说的据统计将近字(以_count 作为后缀)以及 sum 绝对值(以_sum 作为后缀)。两者的主要相异在于,Histogram 举例来说如此一来历史纪录了在相异上行内试样的乘积,而 Summary 子类则由IP推算相异的分位将近。例如上头展示了一个 Summary 子类的举例来说,其那时候面 quantile=”0.5”说明那时候面位将近,quantile=”0.9”说明九分位将近。广义上说是,所有可以向 Prometheus 缺少跟踪试样将近据集的服务器端都可以被称为一个 Exporter,Exporter 的一个实例被称为 target,Prometheus 都会通过轮询的形式经常性从这些 target 那时候面获取试样将近据集。
自己动手改写出一个 Exporter并不一定,绝大多将近 Exporter 都是基于 Go 词汇改写出的,一小部分是基于 Python 词汇改写出的,还有很小一部分是运用于 Java 词汇改写出的。比如其网站缺少的 Consul Metrics 图标野外器 Exporter,如果是在 Go 词汇的检修环境下,能够按照如下附注文档检修这个 Exporter。
package main import ( "log" "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp") var ( cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{ NameSpace: "our_idc", Subsystem: "k8s" Name: "cpu_temperature_celsius", Help: "Current temperature of the CPU.", }) hdFailures = prometheus.NewCounterVec( prometheus.CounterOpts{ NameSpace: "our_idc", Subsystem: "k8s" Name: "hd_errors_total", Help: "Number of hard-disk errors.", }, []string{"device"}, )) func init() { // Metrics have to be registered to be exposed: prometheus.MustRegister(cpuTemp) prometheus.MustRegister(hdFailures)} func main() { cpuTemp.Set(65.3) hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc() // The Handler function provides a default handler to expose metrics // via an HTTP server. "/metrics" is the usual endpoint for that. http.Handle("/metrics", promhttp.Handler()) log.Fatal(http.ListenAndServe(":8888", nil))其那时候面创建了一个 gauge 和 CounterVec 实例,并分别而无须了 metric name 和 help 电子邮件,其那时候面 CounterVec 是用来管理者相近 metric 下相异 label 的一组 Counter,;也假定 GaugeVec,可以见到上头文档那时候面单方面了一个 lable 的 key 为“device”,运用于的时候也能够而无须一个 lable: hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc()。
将近组假定后来进行申请人,就此便触发一个 http 咨询服务的 8888 TCP就顺利完成了整个服务器端,Prometheus 野外将近据集是通过经常性催促该咨询服务 http TCP来解决关键问题的。
触发服务器端之后可以在 web 插件那时候输入 就可以得到 client 替换成的将近据集,其那时候面有图片解释了为:
# HELP our_idc_k8s_cpu_temperature_celsius Current temperature of the CPU.# TYPE our_idc_k8s_cpu_temperature_celsius gaugeour_idc_k8s_cpu_temperature_celsius 65.3# HELP our_idc_k8s_hd_errors_total Number of hard-disk errors.# TYPE our_idc_k8s_hd_errors_total counterour_idc_k8s_hd_errors_total{device="/dev/sda"} 1图例就是示例服务器端所替换成出来的将近据集,并且可以见到 counterVec 是有 label 的,而只不过的 gauage 实例却无需 lable 标识,这就是基本将近据集子类和相异 Vec 旧版本的差别。此时便查询 就都会发现咨询服务静止状态早就转化成 UP 了。
上头的例子只是一个最简单的 demo,因为在 prometheus.yml 可用文件那时候面我们而无须野外应用服务器端电子邮件的小时小时延迟为 60s,每隔 60s Prometheus 都会通过 http 催促一次自己替换成的将近据集,而在文档那时候面我们只另设了一次 gauge 将近组 cupTemp 的绝对值,如果在 60s 的采样小时延迟那时候将该绝对值另设多次,前面的绝对值就都会被覆盖,只有 Prometheus 野外将近据集那一刻的绝对值能被见到,并且如果不便相反这个绝对值,Prometheus 就依然能见到这个恒定的将近组,除非服务器显式通过 Delete 将近组续除这乘积组。
运用于 Counter,Gauage 等这些结构设计者相对最简单,但是如果不便运用于这些将近组能够我们手动续,我们可以呼叫 resetfunction 来清扫先前的 metrics。
图标 Collector如此一来运用于 Collector,go client Colletor 只都会在每次自发 Prometheus 催促的时候才利用将近据集。
能够每次显式传送将近组的绝对值,否则就不都会便维持该将近组,在 Prometheus 也将看不到这乘积组。Collector 是一个操作系统,所有利用 metrics 将近据集的实例都能够解决关键问题这个操作系统,Counter 和 Gauage 等不例外。它在表面上缺少了两乘积组,Collector 运用于利用服务器将近据集,将利用好的将近据集传送给传入将近绝对值 Channel 就可;Descirbe 将近组运用于描述这个 Collector。
当利用系统设计者利用的将近据集不算多时时,就可以图标 Collector 利用的方法,优转化成系统设计者,并且在某些前提如果早就有了一个萌芽的 metrics,就不能够运用于 Counter,Gauage 等这些将近据集结构设计者,如此一来在 Collector 在表面上解决关键问题一个代理的系统设计者即可。
基本上所有的 export 都是通过图标 Collector 解决关键问题。一个最简单的 Collector 的解决关键问题 export 的文档如下:
package main import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "net/http" "sync") type ClusterManager struct { sync.Mutex Zone string metricMapCounters map[string]string metricMapGauges map[string]string} //Simulate prepare the datafunc (c *ClusterManager) ReallyExpensiveAssessmentOfTheSystemState() ( metrics map[string]float64,) { metrics = map[string]float64{ "oom_crashes_total": 42.00, "ram_usage": 6.023e23, } return}//通过 NewClusterManager 原理创建结构设计者体及相异的举例来说电子邮件,文档如下附注。// NewClusterManager creates the two Descs OOMCountDesc and RAMUsageDesc. Note// that the zone is set as a ConstLabel. (It's different in each instance of the// ClusterManager, but constant over the lifetime of an instance.) Then there is// a variable label "host", since we want to partition the collected metrics by// host. Since all Descs created in this way are consistent across instances,// with a guaranteed distinction by the "zone" label, we can register different// ClusterManager instances with the same registry.func NewClusterManager(zone string) *ClusterManager { return BellClusterManager{ Zone: zone, metricMapGauges: map[string]string{ "ram_usage": "ram_usage_bytes", }, metricMapCounters: map[string]string{ "oom_crashes": "oom_crashes_total", }, }}//首先,野外器不必解决关键问题 prometheus.Collector 操作系统,也不必解决关键问题 Describe 和 Collect 原理。解决关键问题操作系统的文档如下附注。// Describe simply sends the two Descs in the struct to the channel.// Prometheus 的申请人器呼叫 Collect 来抓取将近绝对值 // 将利用的将近据集传送到 Channel 那时候面并来到 // 利用的举例来说电子邮件来自 Describe,可以并发地执行抓取工作,但是不必要保证线程的安全 func (c *ClusterManager) Describe(ch chan<- *prometheus.Desc) { // prometheus.NewDesc(prometheus.BuildFQName(namespace, "", metricName), docString, labels, nil) for _, v := range c.metricMapGauges { ch <- prometheus.NewDesc(prometheus.BuildFQName(c.Zone, "", v), v, nil, nil) } for _, v := range c.metricMapCounters { ch <- prometheus.NewDesc(prometheus.BuildFQName(c.Zone, "", v), v, nil, nil) }} //Collect 原理是一个中心,它都会抓取你能够的所有将近据集,根据能够对其来进行比对,然后将举例来说送达回IP库。// 运用于传送所有可能举例来说的假定描述符 // 可以在服务器端检修期间添加新近的描述,利用新近的举例来说电子邮件 // 移位的描述符将被忽略。两个相异的 Collector 不必另设相近的描述符 func (c *ClusterManager) Collect(ch chan<- prometheus.Metric) { c.Lock() defer c.Unlock() m := c.ReallyExpensiveAssessmentOfTheSystemState() for k, v := range m { t := prometheus.GaugeValue if c.metricMapCounters[k] != "" { t = prometheus.CounterValue } c.registerConstMetric(ch, k, v, t) }}// 运用于传送所有可能举例来说的假定描述符给举例来说func (c *ClusterManager) registerConstMetric(ch chan<- prometheus.Metric, metric string, val float64, valType prometheus.ValueType, labelValues ...string) { descr := prometheus.NewDesc(prometheus.BuildFQName(c.Zone, "", metric), metric, nil, nil) if m, err := prometheus.NewConstMetric(descr, valType, val, labelValues...); err == nil { ch <- m }} func main() { workerCA := NewClusterManager("xiaodian") reg := prometheus.NewPedanticRegistry() reg.MustRegister(workerCA) //当 promhttp.Handler()被执行时,所有 metric 被序列转化成输出。题外话,其实输出的音频既可以是 plain text,也可以是 protocol Buffers。 http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{})) http.ListenAndServe(":8888", nil)}此时就可以去 见到传送只不过的将近据集了。
除此以外 Exporter 的改写出应当与原理主要原理参阅元将近据:_exporters/。
在到访 Exporter 的主页(即 这样的根同方向)时,它都会来到一个最简单的该网站,这就是 Exporter 的放开页(Landing Page)。放开页那时候面可以放将近据库和希望电子邮件,除此以外跟踪举例来说项的解释。放开页上还除此以外不不算可能执行的安全检查列表、列表的静止状态以及检修电子邮件,这对故障排查十分有希望。一台应用服务器端或者桶内上可能都会有许多 Exporter 和 Prometheus 组件,它们都有自己的TCP号。因此,在写出 Exporter 和发布 Exporter 先前,能够安全检查新近添加的TCP是否是早就被运用于[1],建言运用于意味着TCP相应范围外的TCP。我们某种程度根据业务子类设计者好举例来说的#HELP#TYPE 的音频。这些举例来说往往是可可用的,除此以外意味着触发的举例来说和意味着封闭的举例来说。这是因为大部分举例来说并不都会真正被中用,设计者过多的举例来说不仅都会消耗能避免的资源,还都会受到影响整体的效率。其他原理对于如何写出除此以外 Exporter,除了充分相应TCP号、设计者放开页、分门别类举例来说这 3 个全面性外,还有一些其他的应当。
历史纪录 Exporter 本身的检修静止状态举例来说。可可用转化成来进行系统设计者的开业和封闭。推荐运用于 YAML 作为可用音频。遵循等价准则英文名称的最佳方法论[2],除此以外是_count、_sum、_total、_bucket 和 info 等关键问题。为等价缺少正确的单位。标签的唯一性、可读性及必要的举例来说电子邮件设计者。通过 Docker 等方法一键可用 Exporter。尽力运用于 Collectors 方法利用举例来说,如 Go 词汇那时候面的 MustNewConstMetric。缺少 scrapes 刮擦失败的缺失设计者,这有助于效率检修。尽力不必移位缺少仅有的举例来说,如 Node Exporter 早就缺少的 CPU、磁盘等电子邮件。向 Prometheus 公开独有的等价将近据集,不建言自行推算,Exporter 的一个中心是野外独有举例来说。Redis Exporter CVS解析在本章那时候面,大众可以发现源文档领域有着不计其将近的 Exporter,阿那时候巴巴源文档的 Exporter 就有 RocketMQ Exporter、Sentinel Exporter、Sentry Exporter、Alibaba Cloud Exporter 等多种。
改写出 Exporter 和改写出 Spring Boot Starter 一样,可以多参阅其他出众的源文档应用程序的文档。
本节就来最简单比对一下运维工作那时候面中用的 Redis Exporter CVS。
在运用于 Redis Exporter 时,可以通过 redis_exporter---help 擅自查询完整的将近绝对值列表。意味着前提,它在TCP 9192 上检修,并在同方向/metrics 上替换成举例来说。可以通过---web.listen-addres 和---web.telemetry-path 擅自来另设TCP和同方向,文档如下附注。
redis_exporter -web.listen-address=":8888" -web.telemetry-path="/node_metrics"上述文档将修正 redis Exporter 加载到TCP 8888 并在同方向/node_metrics 上替换成举例来说。
这个逻辑是在CVS redis_exporter.go 那时候面解决关键问题的.Redis Exporter[3]主要通过 Redis 原生的擅自获取 Redis 所有的电子邮件,它全力支持 2.x、3.x、4.x、5.x 和 6.x 旧版本。
在CVS那时候面,可以见到两处运用于了 doRedisCmd 原理送达擅自以获取效率举例来说,文档如下附注。主要是通过原生的 INFO 擅自获取所有效率电子邮件。该擅自的来到结果详情请参阅[4]。
infoAll, err := redis.String(doRedisCmd(c, "INFO", "ALL"))作用于的 infoAll 电子邮件通过 func (e *Exporter) extractInfoMetrics(ch chanfunc (e *Exporter) extractInfoMetrics(ch chan<- prometheus.Metric, info string, dbCount int) { keyValues := map[string]string{} handledDBs := map[string]bool{} fieldClass := "" //以换行符来进行分割 lines := strings.Split(info, "") masterHost := "" masterPort := "" //遍历查询到的结果,根据举例来说作用于一个 hash 绝对值 for _, line := range lines { line = strings.TrimSpace(line) log.Debugf("info: %s", line) //替换成带#的评注文件 if len(line)> 0 BellBell strings.HasPrefix(line, "# ") { fieldClass = line[2:] log.Debugf("set fieldClass: %s", fieldClass) continue } //替换成不带:的或者字符高于 2 的 if (len(line) < 2) || (!strings.Contains(line, ":")) { continue } //以冒号来进行分割 split := strings.SplitN(line, ":", 2) fieldKey := split[0] fieldValue := split[1] //将举例来说英文名称与绝对值存到 hash 那时候面 keyValues[fieldKey] = fieldValue if fieldKey == "master_host" { masterHost = fieldValue } if fieldKey == "master_port" { masterPort = fieldValue } //按照集群和副本和哨兵模式来进行处理 switch fieldClass { case "Replication": if ok := e.handleMetricsReplication(ch, masterHost, masterPort, fieldKey, fieldValue); ok { continue } case "Server": e.handleMetricsServer(ch, fieldKey, fieldValue) case "Commandstats": e.handleMetricsCommandStats(ch, fieldKey, fieldValue) continue case "Keyspace": if keysTotal, keysEx, avgTTL, ok := parseDBKeyspaceString(fieldKey, fieldValue); ok { dbName := fieldKey e.registerConstMetricGauge(ch, "db_keys", keysTotal, dbName) e.registerConstMetricGauge(ch, "db_keys_expiring", keysEx, dbName) if avgTTL> -1 { e.registerConstMetricGauge(ch, "db_avg_ttl_seconds", avgTTL, dbName) } handledDBs[dbName] = true continue } case "Sentinel": e.handleMetricsSentinel(ch, fieldKey, fieldValue) } if !e.includeMetric(fieldKey) { continue } //将利中用电子邮件来进行按照一定法则来进行处理 e.parseAndRegisterConstMetric(ch, fieldKey, fieldValue) } for dbIndex := 0; dbIndex < dbCount; dbIndex++ { dbName := "db" + strconv.Itoa(dbIndex) if _, exists := handledDBs[dbName]; !exists { e.registerConstMetricGauge(ch, "db_keys", 0, dbName) e.registerConstMetricGauge(ch, "db_keys_expiring", 0, dbName) } } e.registerConstMetricGauge(ch, "instance_info", 1, keyValues["role"], keyValues["redis_version"], keyValues["redis_build_id"], keyValues["redis_mode"], keyValues["os"], keyValues["maxmemory_policy"], keyValues["tcp_port"], keyValues["run_id"], keyValues["process_id"], ) if keyValues["role"] == "slave" { e.registerConstMetricGauge(ch, "slave_info", 1, keyValues["master_host"], keyValues["master_port"], keyValues["slave_read_only"]) }}
然后通过 e.parseAndRegisterConstMetric(ch, fieldKey, fieldValue)原理,将利中用 hash 那时候面的电子邮件,按照一定的法则作用于 prometheus.Metric。一个中心文档如下:
func (e *Exporter) parseAndRegisterConstMetric(ch chan<- prometheus.Metric, fieldKey, fieldValue string) { orgMetricName := sanitizeMetricName(fieldKey) metricName := orgMetricName if newName, ok := e.metricMapGauges[metricName]; ok { metricName = newName } else { if newName, ok := e.metricMapCounters[metricName]; ok { metricName = newName } } var err error var val float64 switch fieldValue { case "ok", "true": val = 1 case "err", "fail", "false": val = 0 default: val, err = strconv.ParseFloat(fieldValue, 64) } if err != nil { log.Debugf("couldn't parse %s, err: %s", fieldValue, err) } //根据 key 判断 prometheus.ValueType t := prometheus.GaugeValue if e.metricMapCounters[orgMetricName] != "" { t = prometheus.CounterValue } switch metricName { case "latest_fork_usec": metricName = "latest_fork_seconds" val = val / 1e6 } //根据 prometheus.ValueType 作用于作用于 prometheus.Metric,将其放到一个 chanal 那时候面 e.registerConstMetric(ch, metricName, val, t)}e.parseAndRegisterConstMetric(ch, fieldKey, fieldValue)然后通过 func (e *Exporter) registerConstMetric(ch chanfunc (e *Exporter) registerConstMetric(ch chan<- prometheus.Metric, metric string, val float64, valType prometheus.ValueType, labelValues ...string) { descr := e.metricDescriptions[metric] if descr == nil { descr = newMetricDescr(e.options.Namespace, metric, metric+" metric", labelValues) } if m, err := prometheus.NewConstMetric(descr, valType, val, labelValues...); err == nil { ch <- m }}
就此*Exporter.Collect 的原理呼叫 registerConstMetric 原理,就顺利完成了 redis 的 info 举例来说的利用。其他举例来说的利用慢慢地也是相近的,有兴趣的大众可以自行读者。
概述本文概述了 Exporter 的术语。Exporter 的来源主要有两个:一个是社区缺少的,一个是服务器图标的。在实际生产那时候面,其网站缺少的 Exporter 主要涵盖将近据集库、操作系统、关键问题跟踪及持续构建、立即系统设计者、存储器、HTTP、API、副本、其他跟踪系统设计者等,这些仅有的 Exporter 可以受限制绝大多将近开发管理人员及运维管理人员的能够。
对于系统设计者、应用程序未 Exporter 的可能,本章也从将近据集规约、将近据集野外方法、文档案例撰写出等全面性带领大众尽情了 Exporter 的设计者与方法论,一步步指导大众打造出定制转化成 Exporter。
为了希望大众形成良好的文档表现手法并能够真正改写出除此以外 Exporter,本章还解释了了改写出除此以外 Exporter 的建言,并相结合 Redis Exporter 的原理来进行了战术上解析。通过对本章的求学,大众可以把握运用于和定制 Exporter 的并能。
[1] Exporter TCP列表:。
[2] 准则英文名称最佳方法论:。
[3] Redis Exporter 邮箱:_Exporter。
[4] Redis INFO 擅自邮箱:。
。兰州白癜风哪家医院好广州医院白癜风治疗哪家好
银川白癜风医院哪家医院好
饮食禁忌
眉整形
口腔溃疡怎么办
康复医学科
减肥茶
-
美国纽约市新冠肺炎传染病再度激增
资讯 2025-10-04据《独立报》当地时间段5月初2日美联社,因为新冠大肠杆菌奥密克戎反转株BA.2分支引发的新一轮患者剧增亦然影响着新泽西州,新泽西州以外据统计新增患者平均2500亦然,相比3月初初平均600亦然的日增患
-
女子备孕12年多次试管终于流产,孕32周时竟遭遇罕见情况…
视频 2025-10-04p她声称,为了能避免分娩期间胎盘断裂现象的遭遇,准阿姨们孕前一定要花钱好备孕准备,个人经历过剖宫产切除术或与胎盘相关的切除术的分娩一定要询问医师,并在医师的个人兴趣下分娩,定期花钱好产检。用到胎心因
-
美国纽约市新冠肺炎病例再度暴增
图片 2025-10-04据《纽约时报》当地时间5同月2日媒体报道,因为新冠流感病毒奥密克戎变异株BA.2分支引来的新一轮病症激增恰巧严重影响着费城,费城迄今为止日均新增病症约2500实有,相比3同月初约600实有的日增病症大
-
简单介绍下产妇腰疼。
资讯 2025-10-04简单的说: 1、麻醉药后遗症,剖宫产时的麻醉药是硬膜外麻醉药,麻醉药时无需眉外套。肌肉和韧带受到一定持续性的挫伤,加剧产妇溃疡,很少有另行奶奶在分娩后也才会注意到神经根挫伤和硬膜外病变
-
美国制造业指标意外事故跌至2020年以来最低
影视 2025-10-04英美两国一个制造业活动基准在4年初底车祸跌至2020年以来最低水平,因交货、生产和医疗保健上涨减缓。供应管理学会周一发表的图表看出,4年初底制造业活动指数从57.1降至55.4。倍数极低50代