# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。