1.Prometheus整体架构图
2.配置文件
# 全局配置 global:scrape_interval: 15s # 多久 收集 一次数据evaluation_interval: 30s # 多久评估一次 规则scrape_timeout: 10s # 每次 收集数据的 超时时间# 当Prometheus和外部系统(联邦, 远程存储, Alertmanager)通信的时候,添加标签到任意的时间序列或者报警external_labels:monitor: codelabfoo: bar# 规则文件, 可以使用通配符 rule_files: - "first.rules" - "my/*.rules"# 远程写入功能相关的设置 remote_write:- url: http://remote1/pushwrite_relabel_configs:- source_labels: [__name__]regex: expensive.*action: drop- url: http://remote2/push# 远程读取相关功能的设置 remote_read:- url: http://remote1/readread_recent: true- url: http://remote3/readread_recent: falserequired_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.ymlrefresh_interval: 10m # 刷新文件的 时间间隔- files:- bar/*.yaml# 使用job名作为label的 静态配置目录 的 列表static_configs:- targets: ['localhost:9090', 'localhost:9191']labels:my: labelyour: 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: statictarget_label: abc- regex:replacement: statictarget_label: abcbearer_token_file: valid_token_file # 可选的, bearer token 文件的信息- job_name: service-x# HTTP basic 认证信息basic_auth:username: admin_namepassword: "multiline\nmysecret\ntest"scrape_interval: 50s # 对于该job, 多久收集一次数据scrape_timeout: 5ssample_limit: 1000 # 每次 收集 样本数据的限制. 0 为不限制metrics_path: /my_path # 从目标 获取数据的 HTTP 路径scheme: https # 配置用于请求的协议方案# DNS 服务发现 配置列表dns_sd_configs:- refresh_interval: 15snames: # 要查询的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: 8target_label: __tmp_hashaction: hashmod- source_labels: [__tmp_hash]regex: 1action: keep- action: labelmapregex: 1- action: labeldropregex: d- action: labelkeepregex: 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: mysecretservices: ['nginx', 'cache', 'mysql'] # 被检索目标的 服务 列表. 如果不定义那么 所有 服务 都会被 收集scheme: httpstls_config:ca_file: valid_ca_filecert_file: valid_cert_filekey_file: valid_key_fileinsecure_skip_verify: falserelabel_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_filekey_file: valid_key_filebearer_token: mysecret- job_name: service-kubernetes# kubernetes 服务 发现 列表kubernetes_sd_configs:- role: endpoints # 必须写, 必须是endpoints, service, pod, node, 或者 ingressapi_server: 'https://localhost:1234'basic_auth: # HTTP basic 认证信息username: 'myusername'password: 'mysecret'- job_name: service-kubernetes-namespaceskubernetes_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_filekey_file: valid_key_file- job_name: service-ec2ec2_sd_configs:- region: us-east-1access_key: accesssecret_key: mysecretprofile: profile- job_name: service-azureazure_sd_configs:- subscription_id: 11AAAA11-A11A-111A-A111-1111A1111A11tenant_id: BBBB222B-B2B2-2B22-B222-2BB2222BB2B2client_id: 333333CC-3C33-3333-CCC3-33C3CCCCC33Cclient_secret: mysecretport: 9100- job_name: service-nervenerve_sd_configs:- servers:- localhostpaths:- /monitoring- job_name: 0123service-xxxmetrics_path: /metricsstatic_configs:- targets:- localhost:9090- job_name: 測試metrics_path: /metricsstatic_configs:- targets:- localhost:9090- job_name: service-tritontriton_sd_configs:- account: 'testAccount'dns_suffix: 'triton.example.com'endpoint: 'triton.example.com'port: 9163refresh_interval: 1mversion: 1tls_config:cert_file: testdata/valid_cert_filekey_file: testdata/valid_key_file# Alertmanager相关的配置 alerting:alertmanagers:- scheme: httpsstatic_configs:- targets:- "1.2.3.4:9093"- "1.2.3.5:9093"- "1.2.3.6:9093"
3.基于consul的服务发现
注意: Prometheus的consul_sd_config
使用的是catalog的API。
使用http接口注册consul
# 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} }
4.prometheus配置详解
当查询的时候存在十分复杂的表达式,这样会降低prometheus的性能可以使用 Recording rules
允许您预先计算经常需要的或计算上昂贵的表达式,并将其结果保存为新的 time series。这对于仪表板尤其有用,每次刷新时它都需要重复查询相同的表达式。 将复杂的计算后台计算 放到一个新的时序里
二元算术运算符 应用于 应用于 即时向量/即时向量 时
运算符将应用于左侧向量中的元素及其在右侧向量中的匹配到的元素.
运算结果被传播到结果向量中,并且度量名称被丢弃.
那些在右侧向量中没有匹配条目的条目 不是结果的一部分。
例如:
employee_age_bucket_bucket{le=~"20|30|40"} + employee_age_bucket_bucket{le=~"30|40|50"}
返回的结果是:
{instance="10.0.86.71:8080",job="prometheus",le="30"} 6000 {instance="10.0.86.71:8080",job="prometheus",le="40"} 8000