Prometheus配置和基于Consul的服务发现

 2018年3月31日 15:36   Nick王   运维  自动化    0 评论   1834 浏览 

Prometheus版本: 2.2.1
node-exporter版本: 0.15.0

Prometheus配置和基于Consul的服务发现

Prometheus可以通过命令行参数和配置文件进行配置。命令行参数主要配置的是不可变的系统参数,比如存储位置,配置文件等。配置文件定义了与抓取作业及其实例相关的所有内容。

Prometheus可以在运行时重新加载配置。如果新的配置不正确,则更改不会生效。可以通过给Prometheus进程发送SIGHUP信号来触发重新加载配置,或者发送一个HTTP POST请求给/-/reload端点。默认是禁用的,需要在启动的时候指定命令行参数--web.enable-lifecycle

Prometheus架构

AA


启动Prometheus

prometheus --config.file=/root/prometheus/prometheus.yml --storage.tsdb.path=/usr/local/prometheus/data --storage.tsdb.retention=15d --web.listen-address="0.0.0.0:9090" --web.console.templates=/usr/local/prometheus/consoles/ --web.console.libraries=/usr/local/prometheus/console_libraries/ --web.max-connections=2048 --alertmanager.notification-queue-capacity=20000 --query.max-concurrency=256 --log.level=info > prom.log 2>&1 &

启动node_exporter

node_exporter --collector.interrupts --collector.mountstats --collector.systemd --collector.tcpstat --web.listen-address=":9100" --web.telemetry-path="/metrics" --log.level="info" --log.format="logger:syslog?appname=node_exporter&local=6" &

Promethus配置文件

配置文件举例:

# 全局配置
global:
  scrape_interval:     15s   # 多久 收集 一次数据
  evaluation_interval: 30s   # 多久评估一次 规则
  scrape_timeout:      10s   # 每次 收集数据的 超时时间

  # 当Prometheus和外部系统(联邦, 远程存储, Alertmanager)通信的时候,添加标签到任意的时间序列或者报警
  external_labels:
    monitor: codelab
    foo:     bar

# 规则文件, 可以使用通配符
rule_files:
- "first.rules"
- "my/*.rules"

# 远程写入功能相关的设置
remote_write:
  - url: http://remote1/push
    write_relabel_configs:
    - source_labels: [__name__]
      regex:         expensive.*
      action:        drop
  - url: http://remote2/push

# 远程读取相关功能的设置
remote_read:
  - url: http://remote1/read
    read_recent: true
  - url: http://remote3/read
    read_recent: false
    required_matchers:
      job: special

# 收集数据 配置 列表
scrape_configs:
- job_name: prometheus  # 必须配置, 自动附加的job labels, 必须唯一

  honor_labels: true   # 标签冲突, true 为以抓取的数据为准 并 忽略 服务器中的, false 为 通过重命名来解决冲突
  # scrape_interval is defined by the configured global (15s).
  # scrape_timeout is defined by the global default (10s).

  metrics_path:     '/metrics'
  # scheme defaults to 'http'.


  # 文件服务发现配置 列表
  file_sd_configs:
    - files:  # 从这些文件中提取目标
      - foo/*.slow.json
      - foo/*.slow.yml
      - single/file.yml
      refresh_interval: 10m  # 刷新文件的 时间间隔
    - files:
      - bar/*.yaml


  # 使用job名作为label的 静态配置目录 的 列表
  static_configs:
  - targets: ['localhost:9090', 'localhost:9191']
    labels:
      my:   label
      your: label


  # 目标节点 重新打标签 的配置 列表.  重新标记是一个功能强大的工具,可以在抓取目标之前动态重写目标的标签集。 可以配置多个,按照先后顺序应用
  relabel_configs:
  - source_labels: [job, __meta_dns_name]   # 从现有的标签中选择源标签, 最后会被 替换, 保持, 丢弃
    regex:         (.*)some-[regex]  # 正则表达式, 将会提取source_labels中匹配的值
    target_label:  job   # 在替换动作中将结果值写入的标签.
    replacement:   foo-${1}  # 如果正则表达匹配, 那么替换值. 可以使用正则表达中的 捕获组
    # action defaults to 'replace'
  - source_labels: [abc]  # 将abc标签的内容复制到cde标签中
    target_label:  cde
  - replacement:   static
    target_label:  abc
  - regex:
    replacement:   static
    target_label:  abc

  bearer_token_file: valid_token_file  # 可选的, bearer token 文件的信息


- job_name: service-x

  # HTTP basic 认证信息
  basic_auth:
    username: admin_name
    password: "multiline\nmysecret\ntest"

  scrape_interval: 50s  # 对于该job, 多久收集一次数据
  scrape_timeout:  5s

  sample_limit: 1000  # 每次 收集 样本数据的限制. 0 为不限制

  metrics_path: /my_path  # 从目标 获取数据的 HTTP 路径
  scheme: https  # 配置用于请求的协议方案


  # DNS 服务发现 配置列表
  dns_sd_configs:
  - refresh_interval: 15s
    names:  # 要查询的DNS域名列表
    - first.dns.address.domain.com
    - second.dns.address.domain.com
  - names:
    - first.dns.address.domain.com
    # refresh_interval defaults to 30s.


  # 目标节点 重新打标签 的配置 列表
  relabel_configs:
  - source_labels: [job]
    regex:         (.*)some-[regex]
    action:        drop
  - source_labels: [__address__]
    modulus:       8
    target_label:  __tmp_hash
    action:        hashmod
  - source_labels: [__tmp_hash]
    regex:         1
    action:        keep
  - action:        labelmap
    regex:         1
  - action:        labeldrop
    regex:         d
  - action:        labelkeep
    regex:         k


  # metric 重新打标签的 配置列表
  metric_relabel_configs:
  - source_labels: [__name__]
    regex:         expensive_metric.*
    action:        drop


- job_name: service-y

  # consul 服务发现 配置列表
  consul_sd_configs:
  - server: 'localhost:1234'  # consul API 地址
    token: mysecret
    services: ['nginx', 'cache', 'mysql']  # 被检索目标的 服务 列表. 如果不定义那么 所有 服务 都会被 收集
    scheme: https
    tls_config:
      ca_file: valid_ca_file
      cert_file: valid_cert_file
      key_file:  valid_key_file
      insecure_skip_verify: false

  relabel_configs:
  - source_labels: [__meta_sd_consul_tags]
    separator:     ','
    regex:         label:([^=]+)=([^,]+)
    target_label:  ${1}
    replacement:   ${2}

- job_name: service-z

  # 收集 数据的 TLS 设置
  tls_config:
    cert_file: valid_cert_file
    key_file: valid_key_file

  bearer_token: mysecret

- job_name: service-kubernetes

  # kubernetes 服务 发现 列表
  kubernetes_sd_configs:
  - role: endpoints   # 必须写, 必须是endpoints, service, pod, node, 或者 ingress
    api_server: 'https://localhost:1234'

    basic_auth:  # HTTP basic 认证信息
      username: 'myusername'
      password: 'mysecret'

- job_name: service-kubernetes-namespaces

  kubernetes_sd_configs:
  - role: endpoints  # 应该被发现的 kubernetes 对象 实体
    api_server: 'https://localhost:1234'  # API Server的地址
    namespaces:  # 可选的命名空间发现, 如果省略 那么所有的命名空间都会被使用
      names:
        - default

- job_name: service-marathon
  # Marathon 服务发现 列表
  marathon_sd_configs:
  - servers:
    - 'https://marathon.example.com:443'

    tls_config:
      cert_file: valid_cert_file
      key_file: valid_key_file

- job_name: service-ec2
  ec2_sd_configs:
    - region: us-east-1
      access_key: access
      secret_key: mysecret
      profile: profile

- job_name: service-azure
  azure_sd_configs:
    - subscription_id: 11AAAA11-A11A-111A-A111-1111A1111A11
      tenant_id: BBBB222B-B2B2-2B22-B222-2BB2222BB2B2
      client_id: 333333CC-3C33-3333-CCC3-33C3CCCCC33C
      client_secret: mysecret
      port: 9100

- job_name: service-nerve
  nerve_sd_configs:
    - servers:
      - localhost
      paths:
      - /monitoring

- job_name: 0123service-xxx
  metrics_path: /metrics
  static_configs:
    - targets:
      - localhost:9090

- job_name: 測試
  metrics_path: /metrics
  static_configs:
    - targets:
      - localhost:9090

- job_name: service-triton
  triton_sd_configs:
  - account: 'testAccount'
    dns_suffix: 'triton.example.com'
    endpoint: 'triton.example.com'
    port: 9163
    refresh_interval: 1m
    version: 1
    tls_config:
      cert_file: testdata/valid_cert_file
      key_file: testdata/valid_key_file

# Alertmanager相关的配置
alerting:
  alertmanagers:
  - scheme: https
    static_configs:
    - targets:
      - "1.2.3.4:9093"
      - "1.2.3.5:9093"
      - "1.2.3.6:9093"

基于Consul的服务发现

官方链接: https://www.consul.io/api/agent/service.html

官方链接: https://www.consul.io/api/catalog.html

注意: Prometheus的consul_sd_config使用的是catalog的API。

启动Consul

启动命令:

consul agent -server -bootstrap-expect 1 -bind=10.6.28.37 -client=10.6.28.37 -data-dir=/tmp/consul -node=agent-one -config-dir=/root/prometheus/consul.d

服务查询:

# curl -s http://10.6.28.37:8500/v1/catalog/services|jq
{
  "consul": [],
  "node_exporter": [
    "lock"
  ]
}

# curl -s http://10.6.28.37:8500/v1/catalog/service/node_exporter|jq
[
  {
    "ID": "59c2f471-6ffc-dd01-18ec-420f6a869ac5",
    "Node": "agent-one",
    "Address": "10.6.28.37",
    "Datacenter": "dc1",
    "TaggedAddresses": {
      "lan": "10.6.28.37",
      "wan": "10.6.28.37"
    },
    "NodeMeta": {
      "consul-network-segment": ""
    },
    "ServiceID": "node_exporter",
    "ServiceName": "node_exporter",
    "ServiceTags": [
      "lock"
    ],
    "ServiceAddress": "10.6.28.37",
    "ServicePort": 9100,
    "ServiceEnableTagOverride": false,
    "CreateIndex": 73,
    "ModifyIndex": 73
  }
]

使用HTTP接口服务注册:

# curl -X PUT -d '{"ID": "node_exporter", "Name": "node_exporter", "Address": "10.6.28.37", "Port": 9100, "Tags": ["lock"], "EnableTagOverride": false}' http://10.6.28.37:8500/v1/agent/service/register

# curl -s http://10.6.28.37:8500/v1/agent/services|jq
{
  "node_exporter": {
    "ID": "node_exporter",
    "Service": "node_exporter",
    "Tags": [
      "lock"
    ],
    "Address": "10.6.28.37",
    "Port": 9100,
    "EnableTagOverride": false,
    "CreateIndex": 0,
    "ModifyIndex": 0
  }
}

配置Prometheus的自动发现

Prometheus配置自动发现:

scrape_configs:
  - job_name: 'prometheus'
    metrics_path:    /metrics
    honor_labels:    false
    static_configs:
      - targets: ['localhost:9090']
        labels:
          group: 'node'
          service: 'prometheus'
  - job_name: 'prod_discover'
    metrics_path: /metrics
    honor_labels: false
    consul_sd_configs:
    - server: '10.6.28.37:8500'
      services: ['node_exporter']
      tag_separator: ''
    relabel_configs:
    - source_labels: ['__meta_consul_tags']
      target_label: 'product'
    - source_labels: ['__meta_consul_dc']
      target_label: 'idc'
    - source_labels: ['__meta_consul_service']
      target_label: 'service'
    - source_labels: ['job']
      target_label: 'environment'
      regex:        '(.*)_discover'
      replacement:   '${1}'




如无特殊说明,文章均为本站原创,转载请注明出处