4. 接口调用基础:Loki HTTP API 概览,Push API 与 Query API 的端点与认证方式
在变更门禁场景中,Loki 的 HTTP API 是日志平台与门禁系统之间的通信桥梁。门禁系统通过 Push API 写入日志,通过 Query API 检索日志。理解这两类 API 的端点、数据格式与认证方式,是后续实现联动调试的前提。
4.1 Loki HTTP API 整体架构
Loki 对外暴露统一的 HTTP 服务端口(默认 3100),所有 API 均基于 RESTful 风格。下图展示了 Push API 与 Query API 在整体架构中的位置与数据流向:
4.2 Push API:日志写入端点
Push API 是门禁系统向 Loki 写入日志的唯一入口。变更事件、审批记录、执行结果等日志数据均通过此接口发送。
4.2.1 端点与请求方式
| 属性 | 值 |
|---|---|
| 端点 | POST /loki/api/v1/push |
| Content-Type | application/json 或 application/x-protobuf |
| 请求体格式 | JSON 格式:{"streams": [{"stream": {...}, "values": [[ts, line]]}]} |
| 压缩 | 支持 gzip / snappy 压缩(推荐) |
4.2.2 请求体结构详解
每个 Push 请求包含一个或多个 streams,每个 stream 由标签(labels)和日志条目(values)组成:
{
"streams": [
{
"stream": {
"job": "change-gate",
"environment": "production",
"change_id": "CHG-20250321-001"
},
"values": [
["1711000000000000000", "{\"level\":\"info\",\"msg\":\"变更审批通过\",\"user\":\"admin\"}"],
["1711000001000000000", "{\"level\":\"info\",\"msg\":\"变更开始执行\",\"user\":\"admin\"}"]
]
}
]
}
关键点:时间戳必须为纳秒级整数(Unix 纳秒),日志内容建议使用 JSON 结构化格式,便于后续查询时提取字段。
4.3 Query API:日志查询端点
Query API 用于从 Loki 中检索日志数据。在变更门禁场景中,日志平台通过此接口查询变更事件、执行状态和异常信息。
4.3.1 端点与请求方式
| 属性 | 值 |
|---|---|
| 即时查询端点 | GET /loki/api/v1/query |
| 范围查询端点 | GET /loki/api/v1/query_range |
| 查询参数 | query(LogQL 表达式)、start、end、limit、direction |
| 响应格式 | JSON:{"status":"success","data":{"resultType":"streams","result":[...]}} |
4.3.2 两种查询模式对比
| 特性 | 即时查询(query) | 范围查询(query_range) |
|---|---|---|
| 用途 | 获取当前时间点的最新日志 | 获取指定时间范围内的日志 |
| 时间参数 | 仅 time(可选,默认当前) |
start + end(必填) |
| 适用场景 | 实时查看变更执行状态 | 历史变更审计、问题回溯 |
| 示例 URL | /loki/api/v1/query?query={job="change-gate"} |
/loki/api/v1/query_range?query={job="change-gate"}&start=1711000000&end=1711003600 |
4.4 认证方式
Loki 支持多种认证机制,在变更门禁场景中,推荐使用以下两种方式:
4.4.1 Basic Auth(基础认证)
通过 HTTP Header 传递用户名和密码(Base64 编码):
# Push API 请求示例(带 Basic Auth)
curl -X POST "http://loki.example.com:3100/loki/api/v1/push" \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:password123' | base64)" \
-d '{"streams":[{"stream":{"job":"change-gate"},"values":[["1711000000000000000","test log"]]}]}'
4.4.2 X-Scope-OrgID(多租户认证)
Loki 的多租户模式通过 X-Scope-OrgID 头标识租户。门禁系统可为不同环境(生产、预发、测试)分配独立 OrgID:
# 带租户标识的 Push 请求
curl -X POST "http://loki.example.com:3100/loki/api/v1/push" \
-H "Content-Type: application/json" \
-H "X-Scope-OrgID: production" \
-d '{"streams":[{"stream":{"job":"change-gate"},"values":[["1711000000000000000","test log"]]}]}'
注意:如果 Loki 启用了多租户模式(
auth_enabled: true),所有 API 请求必须携带 X-Scope-OrgID 头,否则返回 401 错误。Basic Auth 与 OrgID 可以组合使用,实现用户认证 + 租户隔离的双重安全控制。
4.5 Push API 与 Query API 认证方式对比
| 认证方式 | 适用 API | 配置方式 | 安全等级 | 变更门禁推荐场景 |
|---|---|---|---|---|
| Basic Auth | Push / Query | HTTP Header Authorization |
中(需配合 HTTPS) | 内部网络、开发测试环境 |
| X-Scope-OrgID | Push / Query | HTTP Header X-Scope-OrgID |
高(租户隔离) | 多环境隔离、生产环境 |
| Bearer | Push / Query | HTTP Header Authorization: Bearer <> |
高 | 与 OAuth2 集成时使用 |
| 无认证 | Push / Query | 无 | 低 | 仅限本地调试,禁止生产使用 |
4.6 接口调用流程示例
以下是一个完整的变更门禁日志写入与查询的调用流程:
4.7 常见错误与排查
| HTTP 状态码 | 错误原因 | 排查方向 |
|---|---|---|
| 400 | 请求体格式错误(如时间戳非纳秒) | 检查 JSON 结构、时间戳精度 |
| 401 | 认证失败或缺少 OrgID | 检查 Authorization 头或 X-Scope-OrgID |
| 404 | API 路径错误 | 确认端点路径是否为 /loki/api/v1/push |
| 413 | 请求体过大(超过 max_body_size) | 分批发送或启用压缩 |
| 429 | 请求频率过高(限流) | 降低发送频率或调整限流配置 |
最佳实践:在变更门禁系统中,建议为 Push API 启用 gzip 压缩,将单次请求的日志条目数控制在 1000 条以内,并设置合理的重试机制(指数退避)。Query API 的查询范围应尽量精确,避免全表扫描影响性能。