prometheus
监控类型
- 指标监控 prometheus
- 白盒监控(内省) ---当监控需要数据时应用把数据暴露给promethues
- 黑盒监控 (探针)-- 监控默默看看应用,不会对应用有侵扰 blackbox
- 日志监控 elk loki
- 链路追踪 zipkin jaeger skywalking pinpoint
prometheus
-
下载安装
#./prometheus --help ./prometheus \ --web.listen-address=0.0.0.0:9090 \ --config.file=/data/prometheus/prometheus-2.39.1.linux-amd64/prometheus.yml \ --web.read-timeout=5m \ --web.max-connections=10 \ --storage.tsdb.retention=1d \ --storage.tsdb.retention.size=100GB \ --storage.tsdb.path=/data/prometheus/data \ --storage.tsdb.min-block-duration=2h \ --storage.tsdb.max-block-duration=2h \ --query.max-concurrency=20 \ --query.timeout=2m \ --web.enable-lifecy -
配置文件
配置文件修改后执行以下步骤重新加载配置
promtool check config prometheus.yml curl 127.0.0.1:9090/-/reload
global
global: # 1m 抓取一次target scrape_interval: 1m # 10s 抓取不到超时 scrape_timeout: 10s # 1m 评估一次rules evaluation_interval: 1m # 在该promethues实例中每一个时间序列上添加zoon=shanghai 的标签 external_labels: zoon: "shanghai" env: "test" # 记录promql 的查询记录 query_log_file: "/var/log/promql"
scrape_configs
scrape_congfigs: - job_name: prometheus scrape_interval: 5m scrape_timeout: 10s metrics_path: /metrics scheme: http
static_configs: - targets: ['localhost:8080','localhost:8081'] labels: group: 'production'
scrape_configs: - job_name: 'node' static_configs: - targets: - localhost:9100 # 只收集指定的指标 params: collect[]: - cpu - meminfo - diskstats - netdev - filefd - filesystem - xfs - systemd # curl -g -X GET http://127.0.0.1:9100/metrcs?collect[]=cpu
file_sd_configs: - files: - file/*.yml refresh_interval: 5m
cat targets/prometheus*.yaml # prometheus.yaml - targets: - 172.29.1.11:9090 labels: app: prometheus job: primetheus
# 启动一个单实例的[consul](https://www.consul.io/downloads) consul agent -bootstrap \ --client=0.0.0.0 \ -config-dir=/etc/conf.d \ -data-dir=/consul/data/ \ -dev \ -enable-local-script-checks \ -ui
# 在consul 中注册服务 vi /etc/conf.d/node.json { "services": [ { "id": "node_exporter-node01", "name": "node01", "address": "10.4.7.11", "port": 9100, "tags": ["nodes"], "checks": [{ "http": "http://10.4.7.11:9100/metrics", "interval": "5s" }] }, { "id": "node_exporter-node02", "name": "node02", "address": "10.4.7.12", "port": 9100, "tags": ["nodes"], "checks": [{ "http": "http://10.4.7.12:9100/metrics", "interval": "5s" }] } ] }
# 加载配置文件/etc/conf.d/node.json consul reload
scrape_configs: - job_name: "node" consul_sd_configs: - server: "47.113.100.31:8500" tags: - "nodes" refresh_interval: 2m
# 通过测试命令测试服务的注册发现 consul services register -id="node_exporter-node02" consul services deregister -id="node_exporter-node02"
scrape_configs: - job_name: test kubernetes_sd_configs: - role:
role: node __meta_kubernetes_node_name __meta_kubernetes_node_label_<labelname> __meta_kubernete_node_labelpressent_<labelname> __meta_kubernetes_node_label_<labelname> __meta_kubernetes_node_annotationpresent_<annotationname> __meta_kubernetes_node_address_<address_type>
role: service #这通常对于服务的黑盒监视很有用 __meta_kubernetes_namespace __meta_kubernetes_service_name __meta_kubernetes_service_port_name __meta_kubernetes_service_port_protocol __meta_kubernetes_service_type #服务的类型 __meta_kubernetes_service_label_<labelname> __meta_kubernetes_service_labelpresent_<labelname> __meta_kubernetes_service_annotation_<annotationname> __meta_kubernetes_service_annotationpresent_<annotationname> __meta_kubernetes_service_cluster_ip # 服务的群集 IP 地址 __meta_kubernetes_service_external_name #服务的群集 IP 地址
role: pod __meta_kubernetes_namespace:容器对象的命名空间。 __meta_kubernetes_pod_name:容器对象的名称。 __meta_kubernetes_pod_ip:容器对象的容器 IP。 __meta_kubernetes_pod_label_<labelname>:容器对象中的每个标签。 __meta_kubernetes_pod_labelpresent_<labelname>:对于容器对象中的每个标签。true __meta_kubernetes_pod_annotation_<annotationname>:来自容器对象的每个注释。 __meta_kubernetes_pod_annotationpresent_<annotationname>:对于容器对象中的每个注释。true __meta_kubernetes_pod_container_init:如果容器是InitContainertrue __meta_kubernetes_pod_container_name:目标地址指向的容器的名称。 __meta_kubernetes_pod_container_port_name:容器端口的名称。 __meta_kubernetes_pod_container_port_number:容器端口的编号。 __meta_kubernetes_pod_container_port_protocol:容器端口的协议。 __meta_kubernetes_pod_ready:设置为或表示容器的就绪状态。truefalse __meta_kubernetes_pod_phase:在生命周期中设置为 、、 或 。PendingRunningSucceededFailedUnknown __meta_kubernetes_pod_node_name:调度 Pod 所到的节点的名称。 __meta_kubernetes_pod_host_ip:容器对象的当前主机 IP。 __meta_kubernetes_pod_uid:容器对象的 UID。 __meta_kubernetes_pod_controller_kind:容器控制器的对象类型。 __meta_kubernetes_pod_controller_name:容器控制器的名称
role: endpoints __meta_kubernetes_namespace:终结点对象的命名空间。 __meta_kubernetes_endpoints_name:终结点对象的名称。 对于直接从终端节点列表中发现的所有目标(未从底层 Pod 额外推断出的目标),将附加以下标签: __meta_kubernetes_endpoint_hostname:终结点的主机名。 __meta_kubernetes_endpoint_node_name:承载终结点的节点的名称。 __meta_kubernetes_endpoint_ready:设置为终结点的就绪状态或为其设置。truefalse __meta_kubernetes_endpoint_port_name:终结点端口的名称。 __meta_kubernetes_endpoint_port_protocol:端点端口的协议。 __meta_kubernetes_endpoint_address_target_kind:终结点地址目标的类型。 __meta_kubernetes_endpoint_address_target_name:终结点地址目标的名称。 如果终结点属于某个服务,则会附加发现的所有标签。role: service 对于容器支持的所有目标,将附加发现的所有标签。role: pod
role: ingress 该角色为每个入口的每个路径发现一个目标。这通常对于入口的黑盒监视很有用。该地址将设置为入口规范中指定的主机。ingress 可用的元标签: __meta_kubernetes_namespace:入口对象的命名空间。 __meta_kubernetes_ingress_name:入口对象的名称。 __meta_kubernetes_ingress_label_<labelname>:入口对象中的每个标签。 __meta_kubernetes_ingress_labelpresent_<labelname>:对于入口对象中的每个标签。true __meta_kubernetes_ingress_annotation_<annotationname>:来自入口对象的每个批注。 __meta_kubernetes_ingress_annotationpresent_<annotationname>:对于入口对象中的每个批注。true __meta_kubernetes_ingress_class_name:入口规范中的类名(如果存在)。 __meta_kubernetes_ingress_scheme:入口的协议方案(如果设置了 TLS 配置)。缺省值为 。httpshttp __meta_kubernetes_ingress_path:入口规范的路径。缺省值为 。
dns_sd_configs
依赖于A AAAA 或SRV 记录
[relabel_configs](Configuration | Prometheus)
source_labels: []
source_labels 从现有的label中选取标签separator: ";"
这些标签使用指定的separator 串联到一起regex: .*
然后使用配置的regex 进行匹配- 匹配到的内容通过
action: keep drop replace labelmap
labeldrop
labelkeep
进行保留、删除、替换操作 target_label
用在replace 中 。指明匹配到的标签 被哪一个结果标签替换。对于replace动作来说这个标签是必须的replacemet
在replace 动作中,定义替换后 值 应该替换为什么,支持正则向后引用。
prometheus 自带的标签:
__scheme__
指定http 或 https
__address__
抓取的目标地址,instance 默认使用该值
__metrics_path__
抓取的路径 默认为 /metrics
__param__
url 中传递过来的参数
__scrape_interval__
抓取周期
__name__
指标名称
__
开头的标签在重新打标后会被移除
在重新打标阶段会提供以__meta_
开头的标签
如果在打标阶段需要存储临时标签可以使用以__tmp
relabel_configs: - source_labels: ["__address__"] separator: ";" regex: "(^[0-9].*):[0-9]+" action: replace # 新的标签值 replacement: "$1" # 新的标签名称 target_label: "IP"
# 删除匹配的job relabel_configs: - source_labels: ["__address__"] separator: ";" regex: "(^[0-9].*):[0-9]+" action: drop
# 保存匹配的job relabel_configs: - source_labels: ["__address__"] separator: ";" regex: "(^[0-9].*):[0-9]+" action: keep
relabel_configs: - regex: "job" # 删除了job 标签 action: labeldrop
relabel_configs: - regex: ".*" action: labelkeep
# __address__ = "IP:port" 重命名为 ="IP:port" relabel_configs: - regex: "__address__" action: labelmap
# __address__ = "IP:port" 重命名为 address="IP:port" relabel_configs: - regex: "__(address)__" action: labelmap target_label: $1
rule_files
rule_files: # - "first.rules" # - "second.rules"
groups: - name: node_cpu rules: # record: level:metric:operation - record: instance:node_cpu_seconds:avg_rate5m expr: avg by (job,instance,mode) (rate(node_cpu_seconds_total[5m]))
允许修改评估周期 和 给新的指标添加标签
groups: - name: node_cpu interval: 10s rules: # record: level:metric:operation - record: instance:node_cpu_seconds:avg_rate5m expr: avg by (job,instance,mode) (rate(node_cpu_seconds_total[5m])) labels: metric_type: aggration
-
评估规则
groups: - name: example rules: - record: job:http_inprogress_requests:sum expr: sum by (job) (http_inprogress_requests) -
报警规则
groups: - name: example rules: - alert: <string> [ for: <duration> | default = 0s ] expr: <string> labels: [ <labelname>: <tmpl_string> ] annotations: [ <labelname>: <tmpl_string> ] groups: - name: example rules: - alert: InstanceDown expr: up == 0 for: 5m labels: severity: page annotations: summary: "Instance {{$labels.instance}} down" description: "{{$labels.instance}} of job {{$labels.job}} has been down for more than 5 minutes."
alterings
alerting: altermanagers: - static_configs: - targets: - 'localhost: 9093' - 'localhost: 9092'
FQA
-
监控kubelet 时提示x509
Get "https://10.4.7.11:10250/metrics": x509: cannot validate certificate for 10.4.7.11 because it doesn't contain any IP SANs
解决办法本次使用方法2解决 You have three options: 1. Connect by name (either implement DNS, or if your environment is very static, add the hostnames to /etc/hosts on the prometheus server) 2. Set insecure_skip_verify 3. Reissue the certs to include an IP SAN for the host's IP -
前两天遇到一个需求,给已经写好的exporter 指标存储前添加label。当时前想后思似曾相识,着急忙慌翻阅promethues.io ,后来发现这个文章中有写。把前面的内容粘贴过来给自己提个醒
- targets: - 172.29.1.11:9090 labels: app: prometheus job: primetheus -
新项目上线,需要单独部署一套监控系统。领导需要你评估下1T 的空间能不能存放下30天的监控数据
公司测试环境每秒收集率约:15万/s
rate(prometheus_tsdb_head_samples_appended_total[15m]) 按照单个metrics 大小2bytes计算,保留7天数据,预计需要110G磁盘空间。实测promethus 自带的tsdb 空间使用170G, victoraMetrics 空间占用62GB
>>> 150000*2*60*60*24/1024/1024/1024*7 168.97916793823242 -
promethus 自身暴露的常用指标
指标 释义 指标类型 prometheus_config_last_reload_successful
最后重启是否成功 1 表示成功 0表示失败 prometheus_config_last_reload_success_timestamp_seconds
最后成功重启的时间戳 prometheus_notifications_alertmanagers_discovered
发现alertmanager并处于活跃状态 prometheus_notifications_dropped_total
由于发生错误而导致发送到alert 失败的告警数量 prometheus_notifications_sent_total
发送了多少条告警通知 prometheus_notifications_queue_capacity
prometheus 处理告警队列的配额 prometheus_notifications_queue_length
有多少条告警位于当前队列中 irate(process_cpu_seconds_total[15m])
cpu 使用时长 process_open_fds
已打开文件描述符数量 prometheus_engine_query_duration_seconds
prometheus 引擎查询响应时长 summary -
待看operator
Robust Perception | Prometheus Monitoring Experts – Prometheus Monitoring Experts
prometheus-adapter
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏