从技术角度来看,监控是度量和管理技术系统的工具和过程,但监控也提供从系统和应用程序生成的指标到业务价值的转换。这些指标转换为用户体验的度量,为业务提供反馈,同样还向技术提供反馈,指示业务的工作状态以及持续改进
监控不应该:
良好的监控应该提供:
应用程序监控有两种方法:
执行监控有两种方法:
监测数据的类型主要由两种:
Metrics(度量)
度量是对软件或硬件组件属性的度量。为了使度量有用,我们跟踪它的状态,通常随时间记录数据点。这些数据点成为观测值。观测由值、时间戳以及有时描述观测的一系列数据(如源或标记)组成。观测的集合称为时间序列
类型:
度量总结:
Logs
良好的通知系统,要考虑
普罗米修斯的主要特点是:
Metric名字
标签
Metric保留时长
安全模型
# 下载二进制包
wget https://github.com/prometheus/prometheus/releases/download/v2.45.1/prometheus-2.45.1.linux-amd64.tar.gz
# 将命令复制到bin目录下
cp prometheus promtool /usr/local/bin
# 启动服务
mkdir /etc/prometheus
cp prometheus.yml /etc/prometheus/
promtool check config /etc/prometheus/prometheus.yml
prometheus --config.file /etc/prometheus/prometheus.yml --web.enable-lifecycle
# 热配置,默认是关闭的,需要--web.enable-lifecycle参数开启
curl -X POST http://localdns:9090/-/reload
kill -HUP pid
# 安装Node-exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
# 复制命令
cp node_exporter /usr/local/bin
# 配置文本文件收集器
mkdir -p /var/lib/node_exporter/textfile_colletor
echo 'metadata{role="docker_server",datacenter="N"}1'|sudo tee /var/lib/node_exporter/textfile_colletor/metadata.prom
# 运行节点导出器
node_exporter --collector.textfile.directory /var/lib/node_exporter/textfile_colletor/ --collector.systemd --collector.systemd.unit-whitelist="(docker|ssh|rsyslog).service" --web.listen-address=":9600" --web.telemetry-path="/node_metrics"
#--collector.textfile.directory /var/lib/node_exporter/textfile_colletor/:这个选项告诉 node_exporter 从 /var/lib/node_exporter/textfile_colletor/ 目录中读取 textfile collector 的数据。
#--collector.systemd:这个选项启用了 systemd collector,它可以收集有关 systemd 的信息。
#--collector.systemd.unit-whitelist="(docker|ssh|rsyslog).service":这个选项配置了 systemd collector,使其只收集特定的 systemd 单元的信息,即 docker、ssh 和 rsyslog。
#--web.listen-address=":9600":这个选项设置了 node_exporter 的监听地址,使其在 9600 端口上接收请求。默认监听9100
#--web.telemetry-path="/node_metrics":这个选项设置了暴露指标的 HTTP 路径为 /node_metrics
params
参数对获取指标进行过滤- job_name: 'node'
metrics_path: '/node_metrics'
static_configs:
- targets: ["192.168.19.133:9600"]
params:
collect[]:
- cpu
- meminfo
在一个几种、复杂的监视环境中,有时无法控制正在监视的所有资源以及他们公开的监视数据。重新标记允许在环境中控制、管理和潜在的标准化度量。一些最常见的用例是:
有两个阶段可以重新命名。第一阶段是重新标记来自服务发现的目标。这对于将来自服务发现的元数据标签的信息应用到度量上的标签非常有用。这是由作业内部的relabel_configs块中完成
第二个阶段是在scape之后,但在保存到存储系统之前。这使我们能够确定我们保存了那些指标,删除了那些指标,以及这些指标将是什么样子。这在metric_relabel_configs中完成
- job_name: 'node'
metrics_path: '/node_metrics'
static_configs:
- targets: ["192.168.19.133:9600"]
metric_relabel_configs:
- source_labels: [__name__] # 匹配的标签
separator: ";" # 分隔符
regex: "(memory|node_memory_MemTotal_bytes)" # 匹配的正则,如果指定了多个源标签,那么需要用分隔符分开正则
action: drop # 执行的动作,默认为覆盖
- job_name: 'node'
metrics_path: '/node_metrics'
static_configs:
- targets: ["192.168.19.133:9600"]
metric_relabel_configs:
- source_labels: [id]
regex: '/kubepods/([a-z0-9]);'
replacement: '$1' # 将正则匹配的第一个括号中的内容保存到这,并将结果存储到新标签中
target_label: container_id
- job_name: 'node'
metrics_path: '/node_metrics'
static_configs:
- targets: ["192.168.19.133:9600"]
metric_relabel_configs:
- source_labels: [id]
regex: '/kubepods/([a-z0-9]);'
action: labeldrop
# 在/etc/prometheus下创建rules目录
mkdir rules
# 在配置文件中修改
rule_files:
- rules/node_rules.yml
# 添加记录预聚合规则
# 命名规则:level:metric:operations
instance:node_cpu:avg_rate5m
手动配置监控目标显然不适合我们大批量监控节点,特别是kubernetes
Prometheus通过服务发现解决这个问题,自动机制来检测、分类和识别新的和变更的目标。可以通过以下三种方式:
基于文件的发现只是比静态配置更高级的一小步,但是它对于配置管理工具的配置非常有用。通过基于文件的发型,普罗米修斯使用文件中指定的目标。这些文件通常由另一个系统生成,例如配置管理系统,如Puppet、Ansible,或者从另一个源(如CMDB)查询。定期运行脚本或查询,或触发他们(重新)填充这些文件。然后,普罗米修斯按照指定的时间表从这些文件中重新加载目标
这些文件可以是YAML格式或JSON格式,并包含定义的目标列表
- job_name: 'node'
metrics_path: '/node_metrics'
file_sd_configs:
- files:
- targets/nodes/*.json
refresh_interval: 1m
metric_relabel_configs:
- regex: node
# 文件
[
{
"targets": [":9100" ],
"labels": {
"datacenter": "dc1",
"role": "database"
}
},
{
"targets": [":9100" ],
"labels": {
"datacenter": "dc2",
"role": "webserver"
}
}
]
DNS服务发现依赖于A、AAAA或SRV DNS记录
dns_sd_configs:
- names: ['_prometheus_tcp.xiaodi.cn'] # 基于SRV
# _prometheus为服务名称
# _tcp为协议名
# xiaodi.cn为域名
dns_sd_configs:
- names: ['cc.xiaodi.cn']
type: A
port: 9100
普罗米修斯是一个划分的平台,度量的收集和存储与报警时分开的。警报由Alertmanager工具提供,这是监视环境的独立部分。警报规则是在Prometheus服务器上定义的。这些规则可以触发事件,然后将其传播到Alertmanager。Alertmanager随后决定如何处理各自的警报,处理复制之类的问题,并决定在发送警报时使用什么机制:实时消息、电子邮件或其他工具
# 下载Alertmanager
wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
mkdir -pv /etc/alertmanager
# 配置
global:
smtp_smarthost: 'smtp.qq.com:25'
smtp_from: '2609320892@qq.com'
smtp_auth_username: '2609320892@qq.com'
smtp_auth_password: 'bhqhzqawgqcueafj'
smtp_require_tls: false
route: # 设定路由,接受者是mail
receiver: mail
receivers: # 定义接收者详细信息,发送给谁
- name: 'mail'
email_configs:
- to: '2609324564@qq.com,xxxx@qq.com' # 可以写多个邮箱,用逗号隔开
# 启动服务
alertmanager --config.file /etc/alertmanager/alertmanager.yml
# 在Prometheus上添加Alertmanager
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.19.133:9093
# 对Alertmanager进行监控
- job_name: alertmanager
static_configs:
- targets: ['192.168.19.133:9093']
# 设置报警触发规则
groups:
- name: node_alerts
rules:
- alert: HighNodeCPU # 警报名称
expr: instance:node_cpu:avg_rate5m > 4 # 触发表达式
for: 1m # 持续这么长时间才报警
labels: # 标签
severity: warning
annotations: # 注解
summary: High Node CPU for 1 hour
console: Thank you Tese
# 浏览器进入192.168.19.133:9093能对Alertmanager进行查看
Prometheus也能使用模板语言
route:
group_by: ['instance'] # 以什么分组
group_wait: 30s # 等待该组的报警,有报警后等待30s再发出
group_interval: 5m # 下一次报警时间
repeat_interval: 3h # 重复报警时间,下一次实际报警实践为 group_interval+repeat_interval
receiver: email
routes:
- match:
severity: critical
receiver: pager
- match_re:
severity: ^(warning|critical)$
receiver: support_team
receivers:
- name: 'email'
email_configs:
- to: ''
- name: 'support_team'
rmail_configs:
- to: ''
- name: 'pager'
rmail_configs:
- to: ''
静默设置在Alertmanager中进行设置,如果要使用正则需要再前面加上~,如alertname=~“High.*”
Prometheus作为一个单一的服务器,只有一个Alertmanager。这适用于很多监控场景,但通常不会扩展到多个团队上,当Prometheus或Alertmanager超载或出现故障,监控就会失效
这些问题分为:
Prometheus侧重于实时监控,通常只有有限的数据保留,而配置则被认为是由配置管理工具管理的。从可用性的角度来看,一个单独的Prometheus服务器通常被认为是一次性的。普罗米修斯体系结构认为,实现这个集群所需的投资,以及该集群节点之间数据的一致性,都高于数据本身的价值
不过,普罗米修斯并没有忽视解决容错问题的必要性。实际上,Prometheus推荐的容错解决方案是并行运行两个相同配置的Prometheus服务器,他们都处于活动状态。此配置生成的重复警报在Alertmanager中使用其分组(及其抑制功能)在上游处理。建议的方法不是关注Prometheus服务器的容错能力,而是让下游的Alertmanager容错
这是通过创建Alertmanager集群实现的。所有的Prometheus服务器会向所有的Alertmanager发送警报。Alertmanager负责重复数据删除,并通过集群共享警报状态
这种方法的缺点是,首先,两个Prometheus服务器将收集指标,它们产生的潜在负载将增加一倍。其次,如果一个单独的Prometheus服务器出现故障,那么一个服务器上的数据就会出现缺口。这意味着在查询服务器上的数据时要注意这个差距。PromQL中有一些方法可以弥补这一点。例如。当从两个源请求单个度量值时,可以使用两个度量值的最大值。或者,当从一个具有可能得间隙的单个工作碎片发出警报时,可能会增加for子句,确保有多个度量
在Prometheus的Alertmanager中,使用集群模式有以下几个好处:
高可用性:如果一个Alertmanager实例发生故障,其他实例可以继续处理警报。这对于需要24/7监控的关键系统来说非常重要。
负载均衡:在高负载情况下,警报可以在多个Alertmanager实例之间进行分配,从而提高处理能力。
冗余:每个Alertmanager实例都会存储所有的警报和静默状态,即使某个实例发生故障,也不会丢失数据。
灵活性:你可以根据需要增加或减少Alertmanager实例,以适应你的监控需求的变化。
# 所有节点配置必须一样
alertmanager --config.file /etc/alertmanager/alertmanager.yml --cluster.listen-address 192.168.20.174:8001
alertmanager --config.file /etc/alertmanager/alertmanager.yml --cluster.listen-address 192.168.20.173:8001 --cluster.peer 192.168.20.174:8001
探测监视探测应用程序的外部。可以查询应用程序的外部特征:它是否响应开放端口上的轮询并返回正确的数据或响应代码?探测监视的一个示例是执行ICMP或echo检查并确认收到了响应。这种类型的探测也被成为黑盒监控。
Prometheus探测工作时通过运行一个blackbox exporter–来探测远程目标,并公开在本地端点上收集的任何时间序列,然后,普罗米修斯的工作从端点中提取任何指标
探测有三个限制:
通常将探测定位在组织网络之外的位置,以确保最大限度的覆盖故障检测和收集相关应用程序用户体验的数据
由于在外部部署探测的复杂性,如果需要广泛分布探测,通常将这些探测外包给第三方服务。
blackbox导出器是一个在Apache 2.0许可下许可的二进制GO应用程序。导出器允许通过HTTP、HTTPS、DNS、TCP和ICMP探测端点。它的结构与其他导出器不同。在导出器中,定义了一些列执行特定检车的模块,例如:检查正在运行的web服务器,或者DNS记录解析。当导出程序运行时,它会在URL上公开这些模块和API。普罗米修斯将运行在这些目标上的目标和特定模块作为参数传递给URL。导出器执行检查并将结果返回给普罗米修斯
# 下载
wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.24.0/blackbox_exporter-0.24.0.linux-amd64.tar.gz
# 创建目录
mkdir /etc/prober
# 复制配置文件
cp blackbox_exporter/blackbox.yml /etc/prober/
# 配置
modules:
mysql_check:
prober: tcp
timeout: 5s
tcp:
query_response:
- send: "SELECT 1"
expect: "1"
# 配置Prometheus
- job_name: 'http_probe'
metrics_path: '/probe' # 默认为/probe
params:
module: [mysql_check]
static_configs:
- targets:
- 192.168.19.133:3306 # 目标地址为要探测的地址
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.19.133:9115
# 启动
blackbox_exporter --config.file /etc/prober/blackbox.yml
Prometheus的设计理念是基于拉取模式,而不是推送模式。这意味着Prometheus服务器会定期从被监控的服务中拉取指标。这种设计有几个优点:
在某些Prometheus不能拉取到指标的场景,原因有:
以上无法拉取到指标的场景可以使用Pushgateway解决
Pushgateway是一个独立的服务,Pushgateway位于应用程序发送指标和Prometheus服务器之间。Pushgateway接收指标,然后将其作为目标被Prometheus服务器拉取。可以看做是一个代理服务器
Pushgateway本质上是一个监控资源的工作区,由于特殊原因有一些资源无法被Prometheus服务器scape。网关并不是一个完美的解决方案,应该只作为有限的解决方案使用,特别是用于监控否则无法访问的资源
过度使用Pushgateway可能会带来一些问题,例如:
当通过单个Pushgateway监视多个实例时,Pushgateway可能会成为单点故障和潜在的瓶颈。
你会失去Prometheus通过up指标(在每次抓取时生成)自动进行实例健康监控的能力。
Pushgateway永远不会忘记推送到它的指标,并将永远向Prometheus公开这些指标,除非这些指标通过Pushgateway的API手动删除。
应该将网关集中于监控短生命周期资源
# 下载
wget https://github.com/prometheus/pushgateway/releases/download/v1.6.2/pushgateway-1.6.2.linux-amd64.tar.gz
# 启动,并指定持久化文件
Pushgateway --web.listen-address="0.0.0.0:9091" --persistence.file='/tmp/push.data'
# 可以访问web端
PromQL是Prometheus提供的一种查询语言,查询与聚合汇总指标数据,用于数据图标展示,并且通过HTTP API暴露给外部系统查询
一种嵌套的函数式语言,里层表达式的值用作外部表达式的参数或操作数
查询类型:
from prometheus_client import start_http_server, Metric, REGISTRY
import time
import random
class CustomCollector(object):
def collect(self):
metric = Metric('my_custom_metric', 'This is my custom metric.', 'gauge')
metric.add_sample('my_custom_metric', value=random.random(), labels={})
yield metric
if __name__ == '__main__':
# 注册自定义收集器
REGISTRY.register(CustomCollector())
# 启动http服务器,端口为8000
start_http_server(8000)
# 模拟请求处理
while True:
time.sleep(1)