SigNoz查询语言:PromQL与自定义查询语法详解
引言
在现代微服务架构中,可观测性已成为系统稳定运行的基石。SigNoz作为一款开源的可观测性平台,提供了强大的查询语言支持,包括标准的PromQL(Prometheus Query Language)和自定义查询语法。本文将深入解析SigNoz的查询语言体系,帮助开发者充分利用这些工具来监控和调试分布式系统。
PromQL在SigNoz中的实现
PromQL基础语法
SigNoz完全兼容Prometheus的查询语言PromQL,支持所有标准的PromQL表达式和函数。以下是一些核心语法特性:
# 基础指标查询
http_requests_total
http_requests_total{status="200"}
http_requests_total{status=~"2.*"}
# 聚合操作
sum(http_requests_total) by (service)
rate(http_requests_total[5m])
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
# 数学运算
node_memory_available_bytes / node_memory_total_bytes * 100
# 时间范围查询
http_requests_total offset 1h
SigNoz对PromQL的扩展
SigNoz在标准PromQL基础上进行了扩展,提供了更丰富的功能:
# 服务间调用关系追踪
trace_span_duration{service="user-service", operation="GET /users"}
# 日志指标集成
log_volume{level="error", service="api-gateway"}[1h]
# 分布式追踪指标
trace_error_rate{service="payment-service"}
自定义查询语法(FilterQuery)
SigNoz开发了一套强大的自定义查询语法FilterQuery,专门用于处理复杂的过滤和搜索场景。
语法结构概览
FilterQuery语法基于ANTLR 4.13.2生成,支持丰富的表达式和操作符:
query
: expression EOF
;
expression
: orExpression
;
orExpression
: andExpression ( OR andExpression )*
;
andExpression
: unaryExpression ( AND unaryExpression | unaryExpression )*
;
核心操作符详解
比较操作符
-- 等于和不等于
service.name = "user-service"
http.status_code != 200
http.status_code <> 500
-- 数值比较
response_time_ms > 1000
response_time_ms <= 500
-- 模糊匹配
error.message LIKE "%timeout%"
error.message ILIKE "%Timeout%" -- 不区分大小写
集合操作符
-- IN操作
service.name IN ("user-service", "auth-service", "payment-service")
environment IN ["production", "staging"]
-- NOT IN操作
level NOT IN ["debug", "info"]
status_code NOT IN (404, 500)
-- 范围查询
timestamp BETWEEN "2024-01-01T00:00:00Z" AND "2024-01-01T23:59:59Z"
高级匹配操作符
-- 正则表达式匹配
request_path REGEXP "^/api/v1/.*"
error_message NOT REGEXP ".*test.*"
-- 包含查询
tags CONTAINS "high-priority"
metadata NOT CONTAINS "deprecated"
-- 存在性检查
trace_id EXISTS
parent_span_id NOT EXISTS
函数调用支持
FilterQuery支持多种内置函数:
-- 数组操作函数
has(tags, "production")
hasAny(services, ["web", "api"])
hasAll(required_fields, ["id", "name", "email"])
-- 复杂条件组合
(service.name = "api-gateway" AND http.status_code = 500)
OR (service.name = "user-service" AND response_time_ms > 1000)
完整查询示例
-- 复杂的多条件查询
(
service.name IN ("user-service", "order-service")
AND http.status_code >= 400
AND timestamp BETWEEN "2024-01-15T00:00:00Z" AND "2024-01-15T23:59:59Z"
)
OR
(
service.name = "payment-service"
AND error_message LIKE "%connection%timeout%"
AND trace_duration_ms > 5000
)
查询类型对比分析
下表详细比较了PromQL和自定义FilterQuery的主要特性:
| 特性 | PromQL | FilterQuery |
|---|---|---|
| 主要用途 | 指标数据查询和聚合 | 日志和追踪数据过滤 |
| 语法风格 | 函数式、声明式 | SQL-like、过程式 |
| 数据类型 | 数值、时间序列 | 字符串、数值、布尔、数组 |
| 聚合能力 | 强大(sum, avg, rate等) | 有限(主要过滤) |
| 模式匹配 | 正则表达式 | LIKE、ILIKE、REGEXP |
| 集合操作 | 有限 | 强大(IN、NOT IN等) |
| 函数支持 | 丰富的数学和统计函数 | 数组和存在性检查函数 |
| 性能优化 | 时序数据库优化 | 全文搜索和索引优化 |
实际应用场景
场景1:错误日志分析
-- 查找特定时间范围内的错误日志
level = "error"
AND service.name = "api-gateway"
AND timestamp BETWEEN "2024-01-15T10:00:00Z" AND "2024-01-15T11:00:00Z"
AND (error_message LIKE "%timeout%" OR error_message LIKE "%connection%")
场景2:性能问题排查
-- 识别慢查询
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) by (service, endpoint)
> 1
-- 结合自定义过滤
service.name = "database-service" AND operation = "SELECT" AND duration_ms > 1000
场景3:分布式追踪分析
-- 查找跨服务的错误传播
trace_id EXISTS
AND span_kind = "server"
AND http.status_code >= 500
AND service.name IN ("frontend", "backend", "database")
最佳实践
1. 查询性能优化
-- 使用索引字段优先过滤
timestamp >= "2024-01-15T00:00:00Z" -- 时间范围首先
AND service.name = "target-service" -- 然后服务过滤
AND level = "error" -- 最后级别过滤
2. 复杂查询分解
3. 混合查询策略
-- PromQL用于指标聚合
sum(rate(http_requests_total{status=~"5.*"}[5m])) by (service)
-- FilterQuery用于详细日志筛选
service.name = "problem-service" AND http.status_code >= 500 AND timestamp > now() - 1h
高级特性
1. 查询语法组合
SigNoz允许在同一个查询中组合使用PromQL和FilterQuery:
{
"promql": [
{
"query": "rate(http_requests_total{status='500'}[5m])",
"name": "error_rate"
}
],
"filter": "service.name='user-service' AND environment='production'"
}
2. 动态参数支持
支持在查询中使用变量和参数:
-- 使用时间变量
timestamp BETWEEN ${start_time} AND ${end_time}
-- 使用服务列表变量
service.name IN ${target_services}
-- 使用阈值参数
response_time_ms > ${slow_threshold}
总结
SigNoz的查询语言体系提供了强大的灵活性和表达能力。PromQL专注于指标数据的聚合和分析,而自定义FilterQuery语法则擅长处理复杂的过滤和搜索场景。通过合理运用这两种查询语言,开发者可以:
- 快速定位问题:利用FilterQuery的精确过滤能力快速找到相关日志和追踪数据
- 深度分析趋势:使用PromQL进行时间序列分析和聚合计算
- 跨数据源关联:在同一个查询中组合指标、日志和追踪数据
- 构建监控仪表板:创建丰富的可视化图表和告警规则
掌握SigNoz的查询语言将极大提升分布式系统的监控和调试效率,帮助团队更快地发现和解决生产环境中的问题。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



