Loki API完全参考:RESTful接口详解与示例
Loki是一个开源、高扩展性和多租户的日志聚合系统,由Grafana Labs开发。作为日志聚合的核心组件,其RESTful API(应用程序编程接口)提供了与日志数据交互的关键通道。本文将详细解析Loki的核心API端点,包括日志推送、查询、标签管理等功能,并提供实用示例帮助用户快速上手。
API概述与基础规范
Loki的API设计遵循RESTful原则,主要使用HTTP/HTTPS协议进行通信,支持JSON和Protocol Buffers两种数据格式。所有API端点均以/loki/api/v1/为基础路径,要求正确的Content-Type头信息,并通过标签(Label)机制实现高效的日志索引与检索。
核心API端点概览
| 端点 | 方法 | 功能描述 | 权限要求 |
|---|---|---|---|
/loki/api/v1/push | POST | 推送日志数据到Loki | 写入权限 |
/loki/api/v1/query | GET/POST | 执行LogQL即时查询 | 读取权限 |
/loki/api/v1/query_range | GET/POST | 执行LogQL范围查询 | 读取权限 |
/loki/api/v1/labels | GET | 获取所有标签名称 | 读取权限 |
/loki/api/v1/label/<name>/values | GET | 获取指定标签的所有值 | 读取权限 |
数据格式与编码
Loki API支持以下内容类型(Content-Type):
application/json:默认格式,适用于大多数场景application/x-protobuf:Protocol Buffers格式,适用于高性能数据传输- 压缩编码:支持
gzip、deflate和snappy压缩,需通过Content-Encoding头指定
日志推送API:/loki/api/v1/push
/loki/api/v1/push是Loki最核心的API端点,用于将日志数据推送到Loki集群。该端点支持批量日志写入,并通过标签对日志流进行分类。
请求格式
JSON格式示例:
{
"streams": [
{
"stream": {
"job": "api-server",
"environment": "production"
},
"values": [
["1623456789000000000", "ERROR: Failed to connect to database"],
["1623456790000000000", "WARN: High memory usage detected"]
]
}
]
}
参数说明:
streams:日志流数组,每个流包含一组标签和日志条目stream:键值对形式的标签集合,用于标识日志来源values:日志条目数组,每个条目为[时间戳, 日志内容],时间戳精确到纳秒
示例代码:使用curl推送日志
curl -X POST http://localhost:3100/loki/api/v1/push \
-H "Content-Type: application/json" \
-d '{
"streams": [
{
"stream": {
"job": "demo",
"host": "server-01"
},
"values": [
["'$(date +%s%N)'", "Hello from Loki API"]
]
}
]
}'
实现原理与源码参考
推送API的核心实现位于pkg/loghttp/push/push_test.go文件中,该文件包含了对不同数据格式、压缩方式和错误场景的测试用例。关键处理流程包括:
- 请求解析与验证(
ParseRequest函数) - 数据解压缩(支持gzip、deflate等格式)
- 标签验证与规范化
- 日志条目格式化与存储
日志查询API:/loki/api/v1/query与/loki/api/v1/query_range
Loki提供两类查询API:即时查询(/loki/api/v1/query)和范围查询(/loki/api/v1/query_range),均使用LogQL(Loki Query Language)作为查询语言。
即时查询:/loki/api/v1/query
用于查询特定时间点的日志数据,返回该时间点附近的日志条目。
请求参数:
query:LogQL查询语句time:查询时间戳(Unix时间,秒或纳秒)limit:最大返回条目数(默认100)
示例:
# 查询最近的10条error日志
curl "http://localhost:3100/loki/api/v1/query?query={job=%22api-server%22}%20|~%20%22error%22&limit=10&time=$(date +%s)"
范围查询:/loki/api/v1/query_range
用于查询指定时间范围内的日志数据,支持日志聚合和统计。
请求参数:
query:LogQL查询语句start:起始时间戳end:结束时间戳step:查询精度(如10s、1m)
示例:
# 查询过去1小时的error日志数量趋势
curl "http://localhost:3100/loki/api/v1/query_range?query=sum(count_over_time({job=%22api-server%22}%20|~%20%22error%22%5B1m%5D))&start=$(date -d '1 hour ago' +%s)&end=$(date +%s)&step=1m"
查询响应格式
JSON响应示例:
{
"status": "success",
"data": {
"resultType": "streams",
"result": [
{
"stream": {
"job": "api-server",
"environment": "production"
},
"values": [
["1623456789000000000", "ERROR: Failed to connect to database"]
]
}
]
}
}
标签管理API
Loki通过标签实现高效的日志索引,提供两类API用于标签管理:获取标签名称和获取标签值。
获取所有标签名称:/loki/api/v1/labels
请求示例:
curl http://localhost:3100/loki/api/v1/labels
响应示例:
{
"status": "success",
"data": [
"job",
"environment",
"host",
"level"
]
}
获取标签值:/loki/api/v1/label/<name>/values
请求示例:
curl http://localhost:3100/loki/api/v1/label/job/values
响应示例:
{
"status": "success",
"data": [
"api-server",
"frontend",
"database",
"monitoring"
]
}
错误处理与最佳实践
常见错误码
| 状态码 | 含义 | 解决方法 |
|---|---|---|
| 400 Bad Request | 请求格式错误 | 检查JSON格式和字段合法性 |
| 401 Unauthorized | 认证失败 | 提供正确的API密钥或令牌 |
| 429 Too Many Requests | 请求频率超限 | 减少请求频率或联系管理员调整限制 |
| 500 Internal Server Error | 服务器内部错误 | 查看Loki日志获取详细信息 |
性能优化建议
- 批量推送:减少API调用次数,建议每次推送不超过1MB数据
- 合理设置标签:标签数量控制在5-10个以内,避免高基数标签
- 使用压缩:通过gzip压缩减少网络传输量
- 异步处理:对于非关键日志,采用异步推送方式
总结与进阶阅读
Loki的RESTful API为日志聚合提供了灵活高效的接口,涵盖了从数据采集到查询分析的完整流程。核心端点包括:
/loki/api/v1/push:日志数据写入/loki/api/v1/query&/loki/api/v1/query_range:日志数据查询- 标签API:标签管理与元数据查询
官方文档与资源
- 完整API文档:docs/sources/api/_index.md
- LogQL语法指南:docs/sources/query/logql/_index.md
- 客户端库:clients/pkg/promtail/client/
通过合理使用这些API,用户可以构建定制化的日志采集管道、实现实时监控告警,并与Grafana等可视化工具无缝集成,充分发挥Loki在日志管理方面的优势。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



