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
    
    graph LR A[prometheus.yml] --> |全局配置|B(<a href=#global>global</a>) A --> |对接alert|C(<a href='#alterings'>alterings</a>) A --> |对接评估规则|D(<a href='#rule_files'>rule_files</a>) A --> |指标抓取|E(<a href='#scrape_configs'>scrape_configs</a>) E --> |静态配置|E1(<a href=#static_configs>static_configs</a>) E --> |文件自动发现|E2(<a href=#file_sd_configs>file_sd_configs</a>) E --> |consul自动发现|E3(<a href=#consul_sd_configs>consul_sd_configs</a>) E --> |kubernetes自动发现|E4(<a href='#kubernetes_sd_configs'>kubernetes_sd_configs</a>) E --> |dns自动发现|E5(<a href='#dns_sd_configs'>dns_sd_configs</a>) E --> |重新打标|E6(<a href='#relabel_configs'>relabel_configs</a>) A --> |外部存储|F(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 @ 2022-03-21 22:16  mingtian是吧  阅读(216)  评论(0)    收藏  举报