SigNoz查询语言:PromQL与自定义查询语法详解

SigNoz查询语言:PromQL与自定义查询语法详解

【免费下载链接】signoz SigNoz/signoz: SigNoz 是一款开源的可观测性平台,专为微服务架构设计,提供分布式追踪、日志管理和度量指标等功能,以帮助开发者监控和调试应用程序。 【免费下载链接】signoz 项目地址: https://gitcode.com/GitHub_Trending/si/signoz

引言

在现代微服务架构中,可观测性已成为系统稳定运行的基石。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的主要特性:

特性PromQLFilterQuery
主要用途指标数据查询和聚合日志和追踪数据过滤
语法风格函数式、声明式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. 复杂查询分解

mermaid

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语法则擅长处理复杂的过滤和搜索场景。通过合理运用这两种查询语言,开发者可以:

  1. 快速定位问题:利用FilterQuery的精确过滤能力快速找到相关日志和追踪数据
  2. 深度分析趋势:使用PromQL进行时间序列分析和聚合计算
  3. 跨数据源关联:在同一个查询中组合指标、日志和追踪数据
  4. 构建监控仪表板:创建丰富的可视化图表和告警规则

掌握SigNoz的查询语言将极大提升分布式系统的监控和调试效率,帮助团队更快地发现和解决生产环境中的问题。

【免费下载链接】signoz SigNoz/signoz: SigNoz 是一款开源的可观测性平台,专为微服务架构设计,提供分布式追踪、日志管理和度量指标等功能,以帮助开发者监控和调试应用程序。 【免费下载链接】signoz 项目地址: https://gitcode.com/GitHub_Trending/si/signoz

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值