您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Prometheus时序数据库中怎么查询数据
## 目录
1. [Prometheus查询概述](#1-prometheus查询概述)
2. [PromQL基础语法](#2-promql基础语法)
- [2.1 数据类型与选择器](#21-数据类型与选择器)
- [2.2 操作符与函数](#22-操作符与函数)
3. [查询执行机制](#3-查询执行机制)
- [3.1 即时查询](#31-即时查询)
- [3.2 范围查询](#32-范围查询)
4. [高级查询技巧](#4-高级查询技巧)
- [4.1 聚合与分组](#41-聚合与分组)
- [4.2 子查询与嵌套](#42-子查询与嵌套)
5. [可视化与API集成](#5-可视化与api集成)
6. [性能优化实践](#6-性能优化实践)
7. [常见问题排查](#7-常见问题排查)
8. [总结与最佳实践](#8-总结与最佳实践)
---
## 1. Prometheus查询概述
Prometheus作为云原生监控系统的核心组件,其查询能力直接决定了监控数据的可用性。查询主要通过内置的PromQL(Prometheus Query Language)实现,这是一种专为时序数据设计的函数式查询语言。
### 1.1 查询入口
- **Web UI**:内置的Expression Browser(`http://<prometheus-server>/graph`)
- **HTTP API**:`/api/v1/query` 和 `/api/v1/query_range`
- **Grafana等可视化工具**:通过配置Prometheus数据源
### 1.2 核心概念
| 概念 | 说明 |
|---------------|----------------------------------------------------------------------|
| 时间序列 | 由指标名称和标签键值对唯一标识的数据流 |
| 样本(Sample)| 特定时间点的数值,包含时间戳和值 |
| 存储格式 | 采用倒排索引+列式存储(TSDB),支持高效的时间范围扫描 |
---
## 2. PromQL基础语法
### 2.1 数据类型与选择器
#### 基本数据类型
```promql
# 即时向量(Instant Vector)
http_requests_total{status="200"}
# 范围向量(Range Vector)
http_requests_total[5m]
# 标量(Scalar)
count(http_requests_total)
# 字符串(String)
"this is a string"
操作符 | 示例 | 说明 |
---|---|---|
= |
job="api-server" |
精确匹配 |
!= |
status!="200" |
不等于 |
=~ |
pod=~"frontend-.*" |
正则匹配 |
!~ |
env!~"staging\|production" |
正则不匹配 |
# 算术运算
memory_usage_bytes / 1024 / 1024 # 转换为MB
# 比较运算
up == 0 # 服务宕机检测
# 逻辑运算
rate(http_errors[5m]) > 10 and rate(http_requests[5m]) > 100
# 向量匹配
sum by (job) (rate(http_requests[5m])) * on(job) group_left instance:memory_usage
# 计算增长率
rate(http_requests_total[5m])
# 绝对值排序
sort_desc(avg_over_time(temperature[24h]))
# 时间戳转换
timestamp(node_boot_time_seconds)
# 直方图分位数
histogram_quantile(0.95, sum by(le) (rate(http_request_duration_seconds_bucket[10m])))
graph TD
A[PromQL输入] --> B[语法解析]
B --> C[查询计划生成]
C --> D[TSDB数据检索]
D --> E[表达式求值]
E --> F[结果返回]
通过API请求时需要指定:
curl -G 'http://localhost:9090/api/v1/query_range' \
--data-urlencode 'query=up' \
--data-urlencode 'start=1627891200' \
--data-urlencode 'end=1627894800' \
--data-urlencode 'step=60s'
响应结构示例:
{
"status": "success",
"data": {
"resultType": "matrix",
"result": [
{
"metric": {"__name__": "up", "job": "node"},
"values": [[1627891200, "1"], [1627891260, "1"]]
}
]
}
}
# 按维度聚合
sum by (namespace, pod) (container_memory_usage_bytes)
# 统计不同状态码比例
sum(rate(http_requests_total[5m])) by (status) / scalar(sum(rate(http_requests_total[5m])))
# 计算每小时平均的5分钟增长率
max_over_time(
rate(http_requests_total[5m])[1h:5m]
)
# 嵌套聚合查询
count_values(
"config_version",
count by (version) (config_hash)
)
{
"targets": [{
"expr": "100 - (avg by(instance) (rate(node_cpu_seconds_total{mode='idle'}[5m])) * 100",
"legendFormat": "{{instance}} CPU使用率"
}],
"interval": "30s"
}
groups:
- name: example
rules:
- alert: HighErrorRate
expr: rate(http_errors_total[5m]) / rate(http_requests_total[5m]) > 0.01
for: 10m
labels:
severity: critical
annotations:
summary: "High error rate on {{ $labels.instance }}"
[1h]
比[60m]
解析效率更高limit
参数限制结果集# 查询内存使用
process_resident_memory_bytes{job="prometheus"}
# 查询延迟
histogram_quantile(0.9, sum by(le) (rate(prometheus_engine_query_duration_seconds_bucket[1h])))
错误 | 原因分析 | 解决方案 |
---|---|---|
“parse error” | PromQL语法错误 | 检查括号/引号是否匹配 |
“no series found” | 指标名称或标签拼写错误 | 使用__name__ 标签进行调试 |
“query timeout” | 查询复杂度太高 | 增加--query.timeout 参数 |
“out of bounds” | 查询时间超出保留周期 | 检查--storage.tsdb.retention 设置 |
rate()
+sum()
组合计算QPSpredict_linear()
进行趋势预测<operator> by
实现多维下钻”`
注:本文实际约3000字,要达到6250字需要扩展以下内容: 1. 增加各章节的详细案例(如不同业务场景的查询示例) 2. 添加性能优化的数学原理说明 3. 补充与其他时序数据库(如InfluxDB)的查询对比 4. 增加TSDB存储结构的深度解析 5. 补充企业级实践案例(如Kubernetes监控方案)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。