配置文件结构

参考文档:https://prometheus.io/docs/prometheus/latest/configuration/configuration/

# 全局配置段,包括抓取间隔和评估间隔等。
global:
...

# 指定需要被抓取的目标,支持服务发现、静态配置等方式。
scrape_configs:
...


# 告警规则定义
rule_files:
...

# 定义报警发往何处
# 定义用于触发警报的规则。这些规则基于时间序列数据的评估,当满足特定条件时,将会触发相应的警报。
alerting:
...

# 允许将时间序列数据远程写入其他存储后端,如 Cortex、Thanos 等。
remote_write:
...

# 配置 Prometheus 实例以从其他存储后端读取时间序列数据。
remote_read:
...

# 指定 Prometheus 的本地存储选项,例如数据的保存路径、保留策略等。
storage:
...

global

global:
  scrape_interval: 1m # 多久 Pull 一次 Targets 上的指标数据(向 /metrics 发送 GET)
  scrape_timeout: 10s # Pull Targets 的超时时间,超时则无法获得本次指标数据(Target 显示 DOWN)
  evaluation_interval: 1m # 告警规则和记录规则的评估间隔时间。
  external_labels: # 所有由该 Prometheus 实例抓取和记录的时间序列都会自动带上这些标签。
    # 这些标签来区分来自不同 Prometheus 实例的指标数据;
    # 使用 Thanos 或 Cortex 等系统将多个 Prometheus 实例的数据聚合到一个中心存储时,这些标签能确保所有数据点的来源是唯一且可识别的。
    prometheus: kubesphere-monitoring-system/k8s
    prometheus_replica: prometheus-k8s-1

什么是告警规则和记录规则?

  • 告警规则定义了在什么条件下,Prometheus 应该生成一个警报。记录规则定义了一个新的、预先计算好的时间序列指标。

scrape_configs

  • scrape_configs 用于定义要由 Prometheus 抓取(scrape)的目标。每个scrape_configs块中包含一个或多个job,而job定义了要抓取的一组目标以及与该组目标相关的配置。
  • 方式分为静态配置和服务发现两种,服务发现可基于文件、k8s、consul 等。

kubernetes_sd_configs

scrape_configs:
- job_name: serviceMonitor/kubesphere-monitoring-system/kube-apiserver/0 # 相识指标的集合,会在 Prometheus UI 中的 Targets 显示。

  # 1. 抓取行为基本配置
  honor_timestamps: true # 是否保留目标导出的时间戳(通常为 true)。
  scrape_interval: 1m # 抓取该目标指标的时间间隔,优先级高于 global 中的定义。
  scrape_timeout: 10s # 等待目标响应的最大时间,优先级高于 global 中的定义。

  # 2. 连接/安全配置
  metrics_path: /metrics # 抓取指标的 HTTP 路径。
  scheme: https # 连接协议
  follow_redirects: true # 是否跟随 HTTP 重定向。
  authorization: # 授权配置
    type: Bearer # 使用 Bearer Token 进行认证
    credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token # Token 文件的路径。
  tls_config: # 用于 HTTPS 连接的安全配置
    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt # 验证服务端证书的 CA 证书文件路径。
    server_name: kubernetes # 用于 TLS 握手时的 Server Name Indication (SNI)。
    insecure_skip_verify: false # 是否跳过证书验证(false 表示不跳过,需要验证)。

  # 3. 基于 K8s 的服务发现配置
  kubernetes_sd_configs:
  - role: endpoints # 发现 Kubernetes Service 的 Endpoints(即 Pod IP 和端口)。
    kubeconfig_file: "" # KubeConfig 文件,空字符串表示使用 Pod 内部的 ServiceAccount 访问 API。
    follow_redirects: true # 服务发现请求是否跟随重定向。
    namespaces: # namespaces 过滤(限制服务发现的命名空间)
      own_namespace: false # false 表示抓取 names 中定义的 namespaces,true 表示仅抓取当前 Prometheus 运行的 namespaces。
      names:
      - default # 只发现 default 命名空间内的目标。
    # 以上配置表示,Prometheus 只会尝试抓取 default 命名空间内,匹配 role: endpoints 和后续 relabel_configs 条件的目标。

  # 4. Targets Relabel 配置,作用于服务发现 (Service Discovery) 之后,实际抓取 (Scrape) 之前。
  # 用于修改目标的地址、端口,或为目标添加/删除/修改标签(例如 instance, job 等),以决定 是否抓取 该目标。
  # 详情参阅 Prometheus Relabel 文章
  relabel_configs:
  ...

  # 5. Metric Relabel 配置,作用于实际抓取 (Scrape) 之后,存储 (Storage) 之前。
  # 用于修改抓取到的指标的名称或标签(例如 code, method 等),以决定 是否保留 该指标。
  # 详情参阅 Prometheus Relabel 文章
  metric_relabel_configs:
  ...

file_sd_configs

  • 基于文件的服务发现配置,它仅仅略优于静态配置的服务发现方式,它不依赖于任何平台或第三方服务,因而也是最为简单和通用的实现方式
  • Prometheus server 会定期从文件中加载 target 信息
# 在 Prometheus 的配置文件中,需要添加一个 `file_sd_configs` 部分,用于指定服务发现文件的路径。以下是一个简化的例子:
scrape_configs:
  - job_name: 'file-service-discovery'
    file_sd_configs:
      - files:
        - '/path/to/service-discovery-file.json'
# 这个配置告诉 Prometheus 定期读取指定路径下的服务发现文件,并监控其中定义的服务实例。

# =============================================================================================

# 服务发现文件的具体格式取决于你的需求,但通常每个实例都有一些基本信息,例如 IP 地址、端口和标签等。以下是一个简化的 JSON 示例:
# /path/to/service-discovery-file.json
[
  {
    "targets": ["10.0.0.1:8080"],
    "labels": {
      "job": "example-job",
      "env": "production"
    }
  },
  {
    "targets": ["10.0.0.2:8080"],
    "labels": {
      "job": "example-job",
      "env": "staging"
    }
  }
]
# 在这个例子中,有两个服务实例,每个实例都有一个 targets 数组表示实例的地址和端口,以及一个 labels 对象表示实例的标签。

static_configs

  • static_configs 用于定义静态的监控目标和相关的配置。以下是一个使用static_configs的简单示例:
scrape_configs:
  - job_name: 'example_job'
    static_configs:
      - targets: ['localhost:9090', 'example.com:8080']
        labels:
          environment: 'production'
      - targets: ['anotherhost:9100']
        labels:
          environment: 'testing'

在这个例子中,我们定义了一个名为example_job的作业,其中包含两个静态监控目标。第一个目标是localhost:9090,并且被标记为environment: 'production',而第二个目标是example.com:8080,同样被标记为environment: 'production'。另外,还添加了一个带有environment: 'testing'标签的目标anotherhost:9100。这样,Prometheus就可以使用这些配置来抓取和处理这些目标的监控数据。

配置文件语法检查

promtool check config /monitor/prometheus-2.37.1.linux-amd64/prometheus.yml