一、时序数据库:
时序数据库(Time Series Database, TSDB)是专门为处理和存储时序数据而设计的数据库。时序数据是带有时间戳的数据,通常用于表示随时间变化的测量值。时序数据库在许多应用领域中具有关键作用,包括物联网(IoT)、应用性能监控(APM)、金融市场分析、环境监测、工业自动化等。
当前主流的时序数据库:https://db-engines.com
二、InfluxDB、Prometheus与Graphite:
|
InfluxDB |
Prometheus |
Graphite |
官方文档 |
|||
简介 |
一个开源的时序数据库,专门用于存储和查询时序数据(metrics)。 |
一个开源的系统监控和报警工具,专注于时序数据收集、存储和查询。 |
一个开源的监控系统和图表展示工具,专注于时序数据存储和可视化。 |
主要特点 |
- 高效存储时序数据 - 支持复杂的查询和聚合 - 提供内置的存储引擎(TSI, TSI2) - 支持标签查询和数据索引 - 内置图形化仪表盘工具(Chronograf) |
- 自动发现和抓取目标 - 支持多维度数据模型(标签) - 高效的拉取式数据收集模型 - 提供丰富的报警机制 - 强大的查询语言PromQL |
- 采用推送模式来收集数据 - 数据存储使用时间序列数据库 - 基于Cassandra或其他数据库存储 - 主要使用 Graphite-web 展示数据 |
性能特点 |
高写入吞吐量、低延迟查询,支持高效的数据压缩 |
高效的时间序列数据存储,适合高频率数据收集 |
存储性能较为有限,适合小规模和低频率的数据存储 |
查询语言 |
InfluxQL(类似SQL)或Flux |
PromQL(Prometheus Query Language) |
使用简单的查询语言(通过Graphite-web展示) |
数据存储 |
时序数据专用存储引擎,支持压缩和高效查询 |
存储为 TSDB 格式,支持自定义存储后端 |
使用基于 Whisper 的文件系统存储(或者 Cassandra) |
数据收集方式 |
推送或拉取,支持客户端库以及HTTP API |
主要为拉取方式,支持自定义的抓取方式 |
推送模式,使用Carbon收集数据 |
数据模型 |
时序数据(时间戳、测量、标签、字段、值) |
时序数据(时间戳、指标、标签) |
时序数据(时间戳、指标、值) |
扩展性 |
支持集群扩展(Enterprise版本),单实例有一定限制 |
支持水平扩展和分布式架构,适合大规模数据存储和查询 |
扩展性有限,基于单一节点或分布式的配置方式 |
报警与告警 |
内置告警机制(Kapacitor),支持定义复杂的告警规则 |
强大的告警功能,支持多种告警接收方式 |
通过第三方工具(如 Nagios、Alertmanager)实现告警功能 |
社区与支持 |
活跃的开源社区,有付费版本的支持 |
强大的开源社区,有丰富的文档和支持 |
较为成熟的社区,使用历史较长,但社区活跃度相对较低 |
应用场景 |
- IoT 数据监控 - 企业级时序数据分析 - 日志分析与度量收集 |
- 容器和微服务监控 - 集群和系统资源监控 - 高频数据收集和报警 |
- 基础设施监控 - 网络性能监控 - 存储和服务器状态监控 |
优点 |
- 高效存储与查询 - 丰富的查询语言(InfluxQL 和 Flux) - 内置的可视化和报警支持 |
- 强大的自动发现与抓取机制 - 强大的查询语言 PromQL - 与 Grafana 深度集成 |
- 简单易用,安装配置容易 - 适用于较小规模的监控项目 |
缺点 |
- 大规模集群和高可用性配置相对复杂 - 依赖企业版本的某些高级功能 |
- 存储层无内建高可用特性,主要依赖于外部存储 - 缺少内建的可视化工具,Prometheus Web UI,仅适用基础的查询和展示 |
- 可扩展性差,不适合大规模部署 - 存储性能不足,不能处理非常高频的数据 |
1、InfluxDB 是一个高效的时序数据库,适合于存储大规模时序数据,提供了强大的查询语言和内置的可视化工具。
2、Prometheus 适合于动态环境和微服务架构,提供强大的数据抓取和报警能力,常与 Grafana 配合使用来进行可视化展示。
3、Graphite 是一个较为成熟的监控工具,适合小规模的时序数据存储和展示,通常与 Grafana 配合使用来进行数据可视化。
三、Prometheus相关架构:
Prometheus 通过 Pushgateway 或 Job/exporters 的方式,定期从被监控的服务中拉取指标数据。这些服务通常通过 HTTP 暴露一个 /metrics 端点,Prometheus 通过该端点收集指标数据并存储在本地磁盘中。用户可以通过 PromQL 查询存储在 Prometheus 中的时序数据。Prometheus 还可以根据设定的告警规则,自动检查采集的数据,生成告警并触发相应操作。如果某个指标超出阈值或不符合特定条件,Prometheus 会发送告警到 Alertmanager,进行处理和转发。
1、Prometheus Server:
Prometheus Server 是 Prometheus 的核心组件,负责从被监控的目标(targets)收集(scrape)数据、存储数据、并提供查询和告警功能。
2、Pushgateway:
Pushgateway 是 Prometheus 的一个组件,用于接收从临时任务(如批处理任务)推送过来的指标数据。与 Prometheus 通常的拉取模式不同,Pushgateway 采用推送(push)方式将数据发送给 Prometheus。
由于Prometheus的拉取(pull)模式要求目标服务必须始终在线并持续暴露指标接口。然而,一些服务可能只存在一段很短的时间(例如批处理作业、定时任务或一次性任务),在它们执行完后,服务就会终止并且不再提供 HTTP 服务。这时候,Prometheus就无法拉取到数据。因此,当网络情况无法直接满足时,可以使用 pushgateway 来进行中转,将此类数据主动push到pushgateway里面去,而 prometheus 采用pull方式拉取 pushgateway 中数据。
3、Job/Exporters:
Job,即标签,通常是用来定义一组被监控目标的名称和配置。Job是 Prometheus配置文件(prometheus.yml)中的一个重要概念,每个 Job对应一个或多个监控目标(Exporter),这些目标会定期暴露其性能指标,Prometheus通过拉取这些指标来进行监控。
Exporter是一个暴露 Prometheus可抓取的指标数据的程序或服务。Exporter 通常负责从应用程序或系统收集性能指标,并将这些数据以HTTP服务的形式暴露给 Prometheus。
Exporter |
备注 |
Node_Exporter |
用于暴露系统级别的指标数据(如 CPU、内存、磁盘使用情况) |
MySQL_Exporter |
用于暴露数据库指标 |
4、Metrics:
Metrics,即指标,是 Prometheus 用来描述和衡量系统状态或性能的数字数据载体,通常以时间序列的形式存储。每个指标表示系统的某个度量值,比如请求数、内存使用量、响应时间等。
Metrics类型 |
定义 |
Counter |
计数器类型的指标,值只能递增,用于记录事件发生的次数 |
Gauge |
可以增加也可以减少的指标,通常用来记录当前值(如内存使用、温度等) |
Histogram |
记录观察值的分布情况,通过将观察值划分为不同的桶进行计数 |
Summary |
与 Histogram 类似,但可以预计算一些分位数,如 50%、95% 等 |
Untyped |
没有明确类型的指标,适用于用户自定义的特殊指标 |
5、PromQL:
PromQL 是 Prometheus 的查询语言,用于从 Prometheus 中存储的时序数据中查询、分析和操作数据。通过PromQL可以根据需求对 Metrics数据进行过滤、聚合、转换等操作。
6、Alertmanager:
Alertmanager 是 Prometheus 的组件之一,负责管理、分发告警。它接收 Prometheus 生成的告警信息,并根据配置将告警通知发送到用户指定的通知渠道(如邮件、Slack、Webhook 等)。
四、Docker-Prometheus安装:
1、Node Exporter:
用于从主机收集硬件和系统级别的指标
# 拉取Node_Exporter镜像: |
docker pull prom/node-exporter |
# 启动容器: |
docker run -d --name node-exporter \ -p 9100:9100 \ -v /proc:/host/proc:ro \ -v /sys:/host/sys:ro \ -v /:/rootfs:ro \ prom/node-exporter |
# 备注: |
1、-p 9100:9100 将宿主机的 9100 端口映射到容器的 9100(node-exporter 默认)端口。node-exporter默认会在该端口上暴露监控指标。 2、-v /proc:/host/proc:ro 挂载宿主机的 /proc 目录到容器中的 /host/proc。/proc 目录包含了操作系统内核和进程的信息,node-exporter 需要访问这些信息来收集系统级别的性能指标。挂载时使用了 ro(只读)权限,确保容器无法修改宿主机的文件。 3、-v /sys:/host/sys:ro 类似地,挂载宿主机的 /sys 目录到容器中的 /host/sys。/sys 目录包含了与系统硬件相关的信息,node-exporter 也需要这些信息来收集指标。 4、-v /:/rootfs:ro 挂载宿主机的根文件系统到容器中的 /rootfs。node-exporter 需要访问宿主机的文件系统以收集一些额外的指标(如磁盘、文件系统的相关信息)。同样使用了只读权限。 |
# Metrics数据访问: |
2、Pushgateway:
允许短期任务将其指标推送到 Prometheus
# 拉取Pushgateway镜像: |
docker pull prom/pushgateway |
# 自定义数据存储文件夹: |
/opt/install/data/pushgateway-data |
# 修改文件夹权限: |
chmod 777 -R /opt/install/data/pushgateway-data |
# 启动容器: |
docker run -d --name=pushgateway \ -p 9091:9091 \ -v /opt/install/data/pushgateway-data:/pushgateway_data \ prom/pushgateway |
# Pushgateway管理访问: |
# PUSH推送自定义测试Metric指标数据(不指定,默认untyped 类型): echo "# TYPE <指标> <Metric类型>\n<指标{标签}> <值>" | curl --data-binary @- http://<ip:port>/metrics/job/<Job名> |
# 案例一 echo "example_metric 1" | curl --data-binary @- http://localhost:9091/metrics/job/test_job # 案例二 echo "example_metric{status=\"success\"} 1" | curl --data-binary @- http://localhost:9091/metrics/job/test2_job # 案例三 echo -e "# TYPE test_metric counter\ntest_metric 2" | curl --data-binary @- http://localhost:9091/metrics/job/test3_job |
# 清理指定Job数据: curl -X DELETE http://ip:port/metrics/job/<Job名> |
curl -X DELETE http://localhost:9091/metrics/job/test_job |
3、Alertmanager:
处理并路由 Prometheus 发出的告警通知
# 拉取Alertmanager镜像: |
docker pull prom/alertmanager |
# 自定义数据存储文件夹: |
/opt/install/data/alertmanager-data/config /opt/install/data/alertmanager-data/template |
# 修改文件夹权限: |
chmod 777 -R /opt/install/data/alertmanager-data/config chmod 777 -R /opt/install/data/alertmanager-data/template |
# 编辑告警配置文件alertmanager.yml: |
cat > /opt/install/data/alertmanager-data/config/alertmanager.yml << \EOF # 全局配置 global: # 设置报警解决超时时间,单位:分钟 resolve_timeout: 5m # 发件人邮箱配置 smtp_from: 'xx@xx.com' # 邮箱服务器的主机配置,smtp.qq.com,端口为 465 或 587 smtp_smarthost: 'smtp.qq.com:465' # 邮箱账户名 smtp_auth_username: 'xx' # 邮箱授权码(不是密码) smtp_auth_password: '授权码' # 是否启用 TLS(此处不启用) smtp_require_tls: false # SMTP 主机的 HELO 域名 smtp_hello: 'qq.com'
# 告警模板配置 templates: - '/opt/install/data/alertmanager-data/template/email.tmpl'
# 抑制规则配置 # 当存在 severity 为 critical 的告警时,抑制 severity 为 warning 的告警 # 源告警和目标告警必须在 alertname、dev 和 instance 标签上相等 inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
# 路由配置 route: # 根据告警名称分组 group_by: ['alertname'] # 等待时间,用于等待同一组内的其他告警 group_wait: 5s # 分组后发送告警的时间间隔 group_interval: 5m # 发送告警间隔时间 s/m/h,如果指定时间内没有修复,则重新发送告警 repeat_interval: 1h # 默认接收器,自定义接收器名default-receiver,用于处理没有匹配到其他路由规则的告警 receiver: 'default-receiver' routes: # 使用正则表达式匹配 alarmClassify 标签为 critical 的告警 - match_re: alarmClassify: '^critical$' # 自定义critical-alerts 接收器名,接收 critical 的告警 receiver: 'critical-alerts' # 使用正则表达式匹配 alarmClassify 标签为 warning 的告警 - match_re: alarmClassify: '^warning$' # 自定义warning-alerts 接收器名,接收 warning 的告警 receiver: 'warning-alerts'
# 接收器配置 receivers: # 默认接收器 - name: 'default-receiver' email_configs: # 默认接收器的收件人,多个人就以 ',' 做分割 - to: 'default-receiver@example.com' # 发送已解决的告警通知 send_resolved: true # 接收邮件的标题 headers: {Subject: "alertmanager默认告警邮件"} # 严重告警接收器 - name: 'critical-alerts' email_configs: - to: 'critical-alerts@example.com' send_resolved: true # 接收邮件的标题 headers: {Subject: "alertmanager严重告警邮件"} # 警告告警接收器 - name: 'warning-alerts' email_configs: - to: 'warning-alerts@example.com' send_resolved: true # 接收邮件的标题 headers: {Subject: "alertmanager警告告警邮件"} EOF |
# 编辑告警模板配置文件email.tmpl: |
cat > /opt/install/data/alertmanager-data/template/email.tmpl << \EOF {{ define "email.html" }} <table border="1"> <tr> <td>报警项</td> <td>实例</td> <td>报警阀值</td> <td>开始时间</td> <td>告警信息</td> </tr> {{ range $i, $alert := .Alerts }} <tr> <td>{{ index $alert.Labels "alertname" }}</td> <td>{{ index $alert.Labels "instance" }}</td> <td>{{ index $alert.Annotations "value" }}</td> <td>{{ $alert.StartsAt }}</td> <td>{{ index $alert.Annotations "description" }}</td> </tr> {{ end }} </table> {{ end }} EOF |
# 启动容器: |
docker run -d --name=alertmanager \ -p 9093:9093 \ -v /etc/localtime:/etc/localtime:ro \ -v /opt/install/data/alertmanager-data/config/alertmanager.yml:/etc/alertmanager/alertmanager.yml \ -v /opt/install/data/alertmanager-data/template:/etc/alertmanager/template \ prom/alertmanager |
# Alertmanager管理访问: |
4、Prometheus Server:
核心组件,负责采集、存储指标数据,并生成告警
# 拉取Prometheus镜像: |
docker pull prom/prometheus |
# 自定义数据存储文件夹: |
/opt/install/data/prometheus-data |
# 修改文件夹权限: |
chmod 777 -R /opt/install/data/prometheus-data |
# 编辑prometheus.yml配置信息: |
cat > /opt/install/data/prometheus-data/prometheus.yml << \EOF # prometheus.yml global: # 设置抓取目标间隔为 60 秒 scrape_interval: 60s # 设置评估规则(如报警规则等)间隔为 60 秒 evaluation_interval: 60s
# job_name: 自定义抓取目标的名称 scrape_configs: # 配置 Prometheus 作为数据源 - job_name: 'prometheus' static_configs: # Prometheus 本身 - targets: ['localhost:9090']
# 配置 Node Exporter - job_name: 'node_exporter' static_configs: # 指定 Node Exporter 的目标(可以是多个节点),修改localhost - targets: ['localhost:9100']
# 配置 Pushgateway - job_name: 'pushgateway' static_configs: # Pushgateway 的目标,修改localhost - targets: ['localhost:9091']
# 配置 Alertmanager - job_name: 'alertmanager' static_configs: # Alertmanager 的目标,修改localhost - targets: ['localhost:9093'] EOF |
# 启动容器: |
docker run -d --name prometheus \ -p 9090:9090 \ -v /opt/install/data/prometheus-data/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus |
# Prometheus管理访问: |
查看启动信息:
查询监控指标数据:
Metric指标{标签}
五、Grafana-Prometheus可视化配置:
1、Prometheus数据源导入:
2、添加新的仪表板:
六、PromQL数据查询:
Prometheus 通过指标名称(metrics name)以及对应的一组标签(labelset)唯一定义一条时间序列。指标名称反映了监控样本的基本标识,而 label 则在这个基本特征上为采集到的数据提供了多种特征维度。用户可以基于这些特征维度过滤,聚合,统计从而产生新的计算后的一条时间序列。
PromQL是 Prometheus内置的数据查询语言,用于从Prometheus中存储的时序数据中查询、分析和操作数据。通过PromQL可以根据需求对 Metrics指标数据进行过滤、聚合、转换等操作。
1、匹配方式:
功能 |
示例 |
说明 |
完全匹配模式 |
label=value |
根据标签匹配满足表达式的时间序列 |
label!=value |
根据标签匹配排除时间序列 |
|
正则匹配模式 |
label=~value1|value2 |
根据标签匹配满足value1或value2的时间序列 |
label!~value1|value2 |
根据标签匹配排除满足value1或value2的时间序列 |
2、基础查询:
功能 |
示例 |
说明 |
查询单个指标 |
up |
表示实例是否在正常运行(1表示正常,0表示异常) |
查询指定实例的指标值 |
up{instance="localhost:9090"} |
表示指定实例是否在正常运行(1表示正常,0表示异常) |
获取时间序列 |
指标名 |
获取指定指标的所有时间序列数据 |
使用标签筛选 |
指标{标签=”值”} |
获取带有指定标签值的时间序列数据 |
3、聚合操作:
功能 |
示例 |
说明 |
求和 |
sum(指标) |
对指定指标进行求和 |
计算平均值 |
avg(指标) |
对指定指标计算平均值 |
计算最大值 |
max(指标) |
获取指定指标的最大值 |
计算最小值 |
min(指标) |
获取指定指标的最小值 |
计数 |
count(指标) |
计算指定指标的时间序列数目 |
按标签聚合 |
sum(指标) by (标签code) |
按照指定code标签进行聚合,计算每个job 的总请求数。 |
排除某些标签 |
sum(指标) without (标签code) |
对指标按标签聚合,但排除指定code标签。 |
4、时间范围操作:
功能 |
示例 |
说明 |
最近值 |
指标[5m] |
获取过去 5 分钟内的时间序列数据 |
过去平均值 |
avg_over_time(指标[1h]) |
计算过去 1 小时的平均值 |
过去最大值 |
max_over_time(指标[1d]) |
计算过去 1 天的最大值 |
过去最小值 |
min_over_time(指标[1d]) |
计算过去 1 天的最小值 |
5、数学和函数操作:
功能 |
示例 |
说明 |
加法 |
指标 + 10 |
对指定指标加上一个常数 |
乘法 |
指标 * 2 |
对指定指标乘以一个常数 |
取对数 |
log2(指标) |
对指定指标取对数 |
6、变化率计算:
功能 |
示例 |
说明 |
增量计算 |
rate(指标[5m]) |
计算过去 5 分钟内指标的增量 |
速率计算 |
irate(指标[5m]) |
计算每秒的增量速率 |
变化率 |
increase(指标[1h]) |
计算过去 1 小时内的指标总变化量 |
7、条件判断:
功能 |
示例 |
说明 |
判断条件 |
指标 > 100 |
过滤出指标值大于 100 的时间序列数据 |
和条件结合 |
指标{标签="值"} > 100 |
过滤出指定指标且值大于 100 的时间序列数据 |
8、排序与限制:
功能 |
示例 |
说明 |
排序 |
topk(5, 指标) |
获取值前 5 名的时间序列 |
排序 |
bottomk(5, 指标) |
获取值后 5 名的时间序列 |
七、SpringBoot-Prometheus监控埋点:
Micrometer 是 Spring Boot 的度量系统,它用于收集应用程序运行时的各种指标数据,并将这些数据发送到外部监控系统(例如 Prometheus、Graphite、Datadog 等)。它为Spring应用提供了统一的API来定义、收集和发送这些指标。
Spring Boot 中的 spring-boot-starter-actuator 依赖已经集成了对 Micrometer 的支持,通过暴露 Prometheus 监控端点(如 /actuator/prometheus),使得Spring Boot应用作为 Prometheus 的客户端,允许 Prometheus(作为服务端)定期抓取该端点提供的 Micrometer 指标数据,并将其存储在时间序列数据库中,最终通过 Grafana 从 Prometheus 获取数据并进行可视化展示。
1、添加依赖:
<!--SpringBoot监控系统--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--用于导出prometheus系统类型的指标数据--> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
2、YML配置:
# actuator服务监控端点配置 management: endpoints.web.exposure.include: "*" # actuator 服务监控 应包含的端点ID或所有的“*”, 默认只开放了info、health endpoint: health.show-details: ALWAYS # 健康信息显示详情. shutdown.enabled: false # 允许应用以优雅的方式关闭(默认情况下不启用) # Actuator端点将通过 http://localhost:18081/actuator/prometheus 访问Metrics信息 server: port: 18081
3、指标配置管理:
import io.prometheus.client.CollectorRegistry; import io.prometheus.client.Counter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; /** * @description: 普罗米修斯监控配置 */ @Component public class PromConfig { /** * CollectorRegistry容器:负责收集和管理所有注册到其中的指标 */ @Autowired private CollectorRegistry collectorRegistry; /** * Metrics类型: Counter * 设置指标名称: http_requests_total * 设置添加两个标签:functionName、status * 设置指标描述性帮助信息:Counter测试监控 * @return */ @Bean(name = "prometheusMetricsCounter") public Counter prometheusMetricsCounter(){ return Counter.build() .name("http_requests_total") .labelNames("functionName","status") .help("Counter测试监控") .register(collectorRegistry); } }
4、监控埋点:
@Resource(name = "prometheusMetricsCounter") private Counter prometheusMetricsCounter; @PostMapping(value = "/demo") public String monitorPointTest() { String status = "success"; if("success".equals(status)) { //监控埋点:inc()方法增加 Counter 指标的值 prometheusMetricsCounter.labels("monitorPointTest", status).inc(); } return status; }
5、Prometheus-Grafana管理:
(1)、查看Actuator端点的Metrics信息:
http://localhost:18081/actuator/prometheus
(2)、配置Prometheus抓取Spring Boot应用的指标:
Prometheus.yml配置文件声明:
scrape_configs: # 配置 SpringBoot监控埋点 - job_name: 'springboot_actuator_to_prometheus_demo' metrics_path: '/actuator/prometheus' static_configs: # springboot监控的目标 - targets: ['localhost:18081']
(3)、Prometheus查看http_requests_total指标信息:
(4)、Grafana可视化管理:
标签:存储,数据,笔记,Grafana,指标,Prometheus,告警,data From: https://www.cnblogs.com/Iven-L/p/18671881