prometheus

监控类型

  1. 指标监控 prometheus
  2. 白盒监控(内省) ---当监控需要数据时应用把数据暴露给promethues
  3. 黑盒监控 (探针)-- 监控默默看看应用,不会对应用有侵扰 blackbox
  4. 日志监控 elk loki
  5. 链路追踪 zipkin jaeger skywalking pinpoint

prometheus

架构图

  1. 下载安装

    #./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
  2. 配置文件

    配置文件修改后执行以下步骤重新加载配置

    promtool check config prometheus.yml
    curl 127.0.0.1:9090/-/reload

    全局配置

    对接alert

    对接评估规则

    指标抓取

    静态配置

    文件自动发现

    consul自动发现

    kubernetes自动发现

    dns自动发现

    重新打标

    外部存储

    prometheus.yml

    remote_write/remote_read

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

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

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_sd_configs

# 启动一个单实例的[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"

kubernetes_sd_configs

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)

  1. source_labels: []source_labels 从现有的label中选取标签
  2. separator: ";"这些标签使用指定的separator 串联到一起
  3. regex: .* 然后使用配置的regex 进行匹配
  4. 匹配到的内容通过 action: keep drop replace labelmap labeldrop labelkeep进行保留、删除、替换操作
  5. target_label 用在replace 中 。指明匹配到的标签 被哪一个结果标签替换。对于replace动作来说这个标签是必须的
  6. 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
  1. 评估规则

    groups:
    - name: example
    rules:
    - record: job:http_inprogress_requests:sum
    expr: sum by (job) (http_inprogress_requests)
  2. 报警规则

    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

  1. 监控kubelet 时提示x509Get "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
  2. 前两天遇到一个需求,给已经写好的exporter 指标存储前添加label。当时前想后思似曾相识,着急忙慌翻阅promethues.io ,后来发现这个文章中有写。把前面的内容粘贴过来给自己提个醒

    - targets:
    - 172.29.1.11:9090
    labels:
    app: prometheus
    job: primetheus
  3. 新项目上线,需要单独部署一套监控系统。领导需要你评估下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
  4. 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
  5. 待看operator

    Robust Perception | Prometheus Monitoring Experts – Prometheus Monitoring Experts
    prometheus-adapter

posted @   mingtian是吧  阅读(183)  评论(0编辑  收藏  举报
编辑推荐:
· 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的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示