Prometheus Exporter基础知识

Prometheus Exporter的概念、工作原理

 Prometheus Exporter是一个用来收集和暴露指标数据的工具,通过与Prometheus监控系统一起使用。它的结构包括两个组件:Collector和Exporter:
  • Collector:用于从目标应用程序或系统收集指标并将其转化为Prometheus可识别的格式。收集器可以使用Prometheus客户端库来生成指标,并公开HTTP/metrics以便Prometheus Server进行定期调用和拉取指标。

  • Exporter:它会从Collector获取指标数据,并将其转成为Prometheus可读格式。

Prometheus Server:它是一个用于存储和查询指标数据的中心化实践序列数据库服务器。Prometheus Server使用scrape_configs的YAML配置文件,其中指定了每个Exporter的配置信息,包括URL、抓取间隔等。

Prometheus 指标格式及其应用

Prometheus使用一种简单的文本格式来表示指标数据,即“度量名称{标签名="标签值", ...} 值 时间戳”这样的格式。例如:

http_request_duration_seconds_bucket{le="0.2"} 150
http_request_duration_seconds_bucket{le="0.5"} 200

其中,”http_request_duration_seconds_bucket”是度量名称,”le”是标签名,”0.2”、”0.5”是标签值, 150、200是相应的值,时间戳则通常省略不写。

Prometheus指标格式的应用包括:

1.收集指标数据:在Prometheus Exporter中,我们通过Collector来收集指标数据,并将其转换为合适的指标格式。

2.暴露指标数据:Prometheus Exporter会把采集到的指标数据暴露给Prometheus,使得Prometheus能够对其进行监控和分析。

3.查询指标数据:在Prometheus中,我们可以使用PromQL查询语言对指标数据查询和分析,比如计算指标的平均值、最大值、最小值等等。

4.可视化指标:通过Grafana等可视化工具,我们可以将Prometheus收集到的指标数据进行图表展示和监控报警等操作。

总之,Prometheus指标格式是Prometheus监控系统中非常重要的一个概念,它是实现收集、查询、暴露、查询和可视化数据的基础。

Prometheus四种指标类型

Prometheus定义了四种主要的指标类型:

  • Counter(计数器):用于表示单调递增的指标,例如请求数等。Counter在每次观测时会增加它所代表的值(通常是一个整数),但不会减少或者重置。

  • Gauge(仪表盘):用于表示可变化的度量值,例如CPU利用率、内存用量等。Gauge可以增加、减少或重置,代表着当前的状态。

  • Histogram(直方图):用于表示数据样本的分布情况,例如请求延迟等。Histogram将数据按照桶(bucket)进行划分,并对每个桶内的样本计算出一些统计信息,如样本数量、总和、平均值等。

  • Summary(摘要):类似于Histogram,也用于表示数据样本的分布情况,但同时展示更多的统计信息,如样本数量、总和、平均值、上分位数、下分位数等。

这些指标类型可以组合使用,以便更好的描述系统运行状态和性能指标。例如使用Counter来记录某个API的请求数,使用Gauge来记录内存使用量,使用Histogram来记录请求延迟分布情况。使用Summary来记录响应时间分布情况。在实际应用中应根据需要选择合适的指标类型来表示监控数据。

Exporter Counter 示例

import (
"net/http" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
) func main() {
// 创建一个Counter指标
counterMetric := prometheus.NewCounter(prometheus.CounterOpts{
Name: "example_counter", // 指标名称
Help: "An example counter metric.", // 指标帮助信息
}) // 注册指标
prometheus.MustRegister(counterMetric) // 增加指标值
counterMetric.Inc() // 创建一个HTTP处理器来暴露指标
http.Handle("/metrics", promhttp.Handler()) // 启动Web服务器
http.ListenAndServe(":8080", nil)
}

Exporter Gauge示例

import (
"net/http" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
) func main() {
// 创建一个Gauge指标
guageMetric := prometheus.NewGauge(prometheus.GaugeOpts{
Name: "example_gauge", // 指标名称
Help: "An example gauge metric.", // 指标帮助信息
}) // 注册指标
prometheus.MustRegister(guageMetric) // 设置指标值
guageMetric.Set(100) // 创建一个HTTP处理器来暴露指标
http.Handle("/metrics", promhttp.Handler()) // 启动Web服务器
http.ListenAndServe(":8080", nil)
}

Exporter Histogram示例

import (
"math/rand"
"net/http"
"time" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
) func main() {
// 创建一个Histogram指标
histogramMetric := prometheus.NewHistogram(prometheus.HistogramOpts{
Name: "example_histogram", // 指标名称
Help: "An example histogram metric.", // 指标帮助信息
Buckets: prometheus.LinearBuckets(0, 10, 10), // 设置桶宽度
}) // 注册指标
prometheus.MustRegister(histogramMetric) // 定期更新指标值
go func() {
for {
time.Sleep(time.Second)
histogramMetric.Observe(rand.Float64() * 100)
}
}() // 创建一个HTTP处理器来暴露指标
http.Handle("/metrics", promhttp.Handler()) // 启动Web服务器
http.ListenAndServe(":8080", nil)
}

Exporter Summary示例

import (
"math/rand"
"net/http"
"time" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
) func main() {
// 创建一个Summary指标
summaryMetric := prometheus.NewSummary(prometheus.SummaryOpts{
Name: "example_summary", // 指标名称
Help: "An example summary metric.", // 指标帮助信息
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, // 设置分位数和偏差
}) // 注册指标
prometheus.MustRegister(summaryMetric) // 定期更新指标值
go func() {
for {
time.Sleep(time.Second)
summaryMetric.Observe(rand.Float64() * 100)
}
}() // 创建一个HTTP处理器来暴露指标
http.Handle("/metrics", promhttp.Handler()) // 启动Web服务器
http.ListenAndServe(":8080", nil)
}

配置Exporter 开发环境

在kubernetes中安装Prometheus

  • 创建一个prometheus-configmap.yaml文件,用于定义Prometheus配置

apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'pushgateway'
static_configs:
- targets: ['pushgateway:9091']

该配置为Prometheus提供了一些基本选项,并定义了pushgateway的作业。pushgateway用于从pushgateway实例中收集指标数据。

  • 使用kubectl apply命令创建Prometheus ConfigMap

kubectl apply -f prometheus-configmap.yaml
  • 创建一个prometheus-deployment.yaml文件,用于定义Prometheus Deployment的配置

apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
spec:
selector:
matchLabels:
app: prometheus
replicas: 1
template:
metadata:
labels:
app: prometheus
spec:
containers:
- name: prometheus
image: prom/prometheus:v2.32.0
args:
- "--config.file=/etc/prometheus/prometheus.yml"
ports:
- containerPort: 9090
volumeMounts: # 挂载ConfigMap中的prometheus.yml配置文件
- name: config-volume
mountPath: /etc/prometheus
volumes:
- name: config-volume
configMap:
name: prometheus-config #引用第一步创建的prometheus-config ConfigMap
  • 创建一个Service对象,在kubernetes集群内部和外部暴露Prometheus服务的访问端点

apiVersion: v1
kind: Service
metadata:
name: prometheus
spec:
type: NodePort
ports:
- port: 9090
targetPort: 9090
selector:
app: prometheus
  • 访问Prometheus UI

kubectl apply get svc

http://nodeIP:端口/graph

安装PushGateway

  • 创建一个pushgateway-deployment.yaml文件,用于定义PushGateway Deployment的配置

apiVersion: apps/v1
kind: Deployment
metadata:
name: pushgateway
spec:
selector:
matchLabels:
app: pushgateway
replicas: 1
template:
metadata:
labels:
app: pushgateway
spec:
containers:
- name: pushgateway
image: prom/pushgateway:v1.5.1
ports:
- containerPort: 9091
args:
- "--web.listen-address=:9091"
  • 使用kubectl apply命令创建PushGateway Deployment

kubectl apply -f pushgateway-deployment.yaml
  • 创建一个pushgateway-service.yaml文件,用于定义pushgateway service配置

apiVersion: v1
kind: Service
metadata:
name: pushgateway
spec:
type: NodePort
ports:
- port: 9091
targetPort: 9091
selector:
app: pushgateway
  • 使用kubectl apply命令创建PushGateway Service

kubectl apply -f pushgateway-service.yaml
  • 在Prometheus配置文件中添加Pushgateway作为目录,以便Promethazine可以获取Pushgateway中的指标数据(在第一步prometheus-configmap.yaml中已加过如下配置、此步跳过)。

scrape_configs:
- job_name: 'pushgateway'
static_configs:
- targets: ['pushgateway:9091']
  • 访问PushGateway

  • Prometheus UI中查看pushgateway

安装Grafana并连接Prometheus

  • 创建grafana.yaml用于定于grafana的配置

kind: Deployment
metadata:
name: grafana-dp
spec:
selector:
matchLabels:
app: grafana-dp
replicas: 1
template:
metadata:
labels:
app: grafana-dp
spec:
containers:
- name: grafana
image: grafana/grafana
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000 ---
apiVersion: v1
kind: Service
metadata:
name: grafana-svc
spec:
type: NodePort
ports:
- port: 3000
targetPort: 3000
selector:
app: grafana-dp
  • 创建grafana deployment和service

kubectl apply -f grafana.yaml
kubectl get svc

用户名admin密码admin

  • 添加Prometheus数据源

监测Go/Python编写的HTTP Server

https://github.com/prometheus/client_golang

https://prometheus.io/docs/instrumenting/clientlibs/

https://prometheus.io/docs/tutorials/instrumenting_http_server_in_go/

使用client_golang库监测HTTP server

package main

import (
"fmt"
"net/http" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
) var pingCounter = prometheus.NewCounter(
prometheus.CounterOpts{
Name: "ping_request_count",
Help: "No of request handled by Ping handler",
},
) func ping(w http.ResponseWriter, req *http.Request) {
pingCounter.Inc()
fmt.Fprintf(w, "pong")
} func main() {
prometheus.MustRegister(pingCounter) http.HandleFunc("/ping", ping)
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":8090", nil)
}
  • 访问metrics接口

使用client_python库监测HTTP server

https://github.com/prometheus/client_python

from flask import Flask
from werkzeug.serving import run_simple
from werkzeug.middleware.dispatcher import DispatcherMiddleware
from prometheus_client import make_wsgi_app app = Flask(__name__)
app.debug = True
app.wsgi_app = DispatcherMiddleware(app.wsgi_app, {
'/metrics': make_wsgi_app()
}) @app.route('/')
def hello_world():
return 'Hello World!' if __name__ == '__main__':
run_simple('localhost', 5000, app, use_reloader=True, use_debugger=True, use_evalex=True)
  • requirements.txt

Flask==2.3.2
uWSGI==2.0.21
prometheus-client==0.17.0
  • 启动Web应用程序

pip install uwsgi
uwsgi --http 127.0.0.1:8000 --wsgi-file main.py --callable app
  • 访问metrics接口

Nginx Exporter开发

Nginx status简介

http_stub_status_module时nginx一个模块,它提供了一些简单的指标和状态信息,这些信息可用于监控nginx服务器的监控状态和性能。要启用该模块,需要在nginx配置文件中添加以下内容:

location /nginx_status {
stub_status on;
allow 127.0.0.1;
deny all;
}

此配置将使用nginx在nginx_status上公开stub_status信息。这些信息只允许本地主机(即127.0.0.1)上访问,并拒绝来自其他主机上的访问请求。然后,您可以使用curl等工具向nginx服务器发送HTTP GET请求,以获取当前的状态信息。例如,以下命令将获取位于localhost上的nginx服务器的状态信息:

curl http://localhost/nginx_status

此命令将返回像这样的响应:

Active connections: 1
server accepts handled requests
10 10 10
Reading: 0 Writing: 1 Waiting: 0
  • Active connectons:当前活跃的连接数。

  • Server Accepts handled requests: 表示从启动到现在一共处理过的连接数,其中accepts表示接收的连接数,handled表示已经处理完成的连接数(可能包括已经关闭的连接数),requests表示已经处理完成的请求数;

  • Reading: 正在读取客户端的请求的连接数;

  • Writing:正在向客户端发送响应的连接数;

  • Waiting:正在等待请求处理的连接数。

除了以上信息,可以通过第三方模块来扩展stub_status模块的功能,例如:ngx_http_substitutions_filter_module、lua-nginx-module。

Nginx Exporter开发

项目源码:https://gitee.com/KubeSec/nginx-exporter

  • /metrics

Exporter部署和测试

cd nginx-exporter
docker build -t nginx-exporter:latest .
kubectl apply -f manifests/install.yaml
  • 访问/metrics

http://nodeIP:nodePort/metrics

  • 在Prometheus中配置我们的nginx-exporter

    scrape_configs:
- job_name: 'nginx-exporter'
static_configs:
- targets: ['nginx-exporter-svc:2113']
  • 在Prometheus UI中查看我的 exporter

  • 补充: memcached_exporter_example项目源码https://gitee.com/KubeSec/memcached_exporter

使用Grafana可视化指标

Grafana图表类型

  • Time Series:时序数据,用于显示时间序列数据。可以使用折线图、面截图、柱状图等形式来呈现。

  • Stat: 可以用于显示数据的统计信息,例如平均值、总和、最大值、最小值等。

  • Table: 用以表格形式显示数据。可以将数据按行或列进行排序,并支持筛选和聚合操作。

 PromQL 查询和分析指标数据

PromQL(Prometheus Query Language)是由Prometheus开发的一种灵活的查询语言,用于收集的时间序列中提取、聚合和分析Metric。

up: 返回当前所有Exporter的状态, 1表示健康正在运行,0表示不可访问或异常。sum(nginx_status_requests{job="nginx-exporter", instance="nginx-exporter-svc:2113"})要检索Nginx服务器中当前链接的数量。

创建Nginx Exporter Dashboard

Grafana导入manifests/nginx-exporter-dashboard.json

开发自己的Prometheus Exporter、实现自定义指标的更多相关文章

  1. 简单4步,利用Prometheus Operator实现自定义指标监控

    本文来自Rancher Labs 在过去的文章中,我们花了相当大的篇幅来聊关于监控的话题.这是因为当你正在管理Kubernetes集群时,一切都会以极快的速度发生变化.因此有一个工具来监控集群的健康状 ...

  2. Kubernetes 监控:Prometheus Adpater =》自定义指标扩缩容

    使用 Kubernetes 进行容器编排的主要优点之一是,它可以非常轻松地对我们的应用程序进行水平扩展.Pod 水平自动缩放(HPA)可以根据 CPU 和内存使用量来扩展应用,前面讲解的 HPA 章节 ...

  3. k8s之自定义指标API部署prometheus

    1.自定义指标-prometheus node_exporter是agent;PromQL相当于sql语句来查询数据; k8s-prometheus-adapter:prometheus是不能直接解析 ...

  4. Prometheus自定义指标

    1.  自定义指标 为了注册自定义指标,请将MeterRegistry注入到组件中,例如: public class Dictionary { private final List<String ...

  5. Kubernetes 学习23 kubernetes资源指标API及自定义指标API

    一.概述 1.上集中我们说到,官方文档提示说从k8s 1.11版本开始,将监控体系指标数据获取机制移向新一代的监控模型.也就意味着对于我们的k8s来讲现在应该有这样两种资源指标被使用.一种是资源指标, ...

  6. 实现一个Prometheus exporter

    Prometheus 官方和社区提供了非常多的exporter,涵盖数据库.中间件.OS.存储.硬件设备等,具体可查看exporters.exporterhub.io,通过这些 exporter 基本 ...

  7. kubernetes学习笔记之十二:资源指标API及自定义指标API

    第一章.前言 以前是用heapster来收集资源指标才能看,现在heapster要废弃了从1.8以后引入了资源api指标监视 资源指标:metrics-server(核心指标) 自定义指标:prome ...

  8. k8s-资源指标API及自定义指标API-二十三

    一. 原先版本是用heapster来收集资源指标才能看,但是现在heapster要废弃了. 从k8s v1.8开始后,引入了新的功能,即把资源指标引入api: 在使用heapster时,获取资源指标是 ...

  9. k8s系列---资源指标API及自定义指标API

    不得不说千万不要随意更改版本,我用的1.13的版本,然后学到这一步时,还因yaml文件不同,卡住了很久,然后各种google才找到解决办法  https://www.linuxea.com/2112. ...

  10. 基于 prometheus 的微服务指标监控

    基于prometheus的微服务指标监控 服务上线后我们往往需要对服务进行监控,以便能及早发现问题并做针对性的优化,监控又可分为多种形式,比如日志监控,调用链监控,指标监控等等.而通过指标监控能清晰的 ...

随机推荐

  1. devops-5:从0开始构建一条完成的CI CD流水线

    从0开始构建一条完成的CI CD流水线 前文中已经讲述了静态.动态增加agent节点,以动态的k8s cloud为例,下面就以Maven构建Java程序为例,开始构建出一条完整的CI CD流水线. 实 ...

  2. Node.js入门学习笔记

    NodeJs是js的运行时,意味着可以在浏览器外运行js.可以使用nodejs来构建服务器端应用.CLI应用.Web API,甚至用electron构建桌面端应用. 使用nvm来管理node版本. 在 ...

  3. .NET Web入门到高级路线(新版本)

    .NET Web入门到高级路线 C# 基础语法 .NET Core 基础知识 ASP.NET Core基础知识概述 Blazor ASP.NET Core 官方文档 ORM FreeSql Entit ...

  4. 《HelloGitHub》第 85 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  5. 数据结构(DataStructure)-03

    数据结构-03 **数据结构-03笔记** **递归** **二叉树** **广度遍历 - 二叉树** **深度遍历 - 二叉树** **二叉树练习一** **二叉树练习二** **二叉排序树练习一* ...

  6. [C++项目] 职工管理系统

    文章目录 职工管理系统 1.管理系统需求 2.创建项目 2.1 创建项目 2.2 添加文件 3.创建管理类 3.1创建文件 3.2 头文件实现 3.3 源文件实现 4.菜单功能 4.1 添加成员函数 ...

  7. 希望所有计算机学生能看到这篇c语言教程

    大部分程序员走入编程世界第一个学习的语言就是C语言. 作为一门古老的编程语言,c语言拥有48年的发展历程. 为什么要学习 C语言? C语言是学习计算机程序设计语言的入门语言.最全面的编程面试网站 C语 ...

  8. 基于YOLOv5的目标检测系统详解(附MATLAB GUI版代码)

    摘要:本文重点介绍了基于YOLOv5目标检测系统的MATLAB实现,用于智能检测物体种类并记录和保存结果,对各种物体检测结果可视化,提高目标识别的便捷性和准确性.本文详细阐述了目标检测系统的原理,并给 ...

  9. HTAP for MySQL 在腾讯云数据库的演进

    摘要:MySQL在充分利用多核计算资源方面比较欠缺,无法同时满足在线业务和分析型业务的客户需求,而单独部署一套专用的分析型数据库意味着额外的成本和复杂的数据链路.本次主题将介绍腾讯云数据库为满足此类场 ...

  10. ubuntu18.04.4修改静态ip

    ubuntu18.04.4修改静态ip 修改interfaces文件 sudo vim /etc/network/interfaces