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 在整体架构中的位置与数据流向:

Loki HTTP API 整体架构与数据流向 Loki HTTP API 整体架构与数据流向 变更门禁系统 (日志生产者) Push API 调用方 Loki 服务 (日志存储与查询) HTTP 端口 3100 日志平台 (Grafana / 自定义) Query API 调用方 Push API POST /loki/api/v1/push Query API GET /loki/api/v1/query 说明 Push API 用于写入日志流,Query API 用于检索日志;两者共用同一 HTTP 端口,但认证策略可独立配置。 认证层(Basic Auth / X-Scope-OrgID) 多租户隔离与访问控制

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 接口调用流程示例

以下是一个完整的变更门禁日志写入与查询的调用流程:

Push API 与 Query API 调用流程 Push API 与 Query API 调用流程 ① 门禁系统 生成变更日志事件 POST /push ② Loki 服务 存储日志流 200 OK ③ 日志平台 收到写入确认 ④ 日志平台 发起查询请求 GET /query ⑤ Loki 服务 执行 LogQL 查询 返回结果 ⑥ 门禁系统 根据日志结果决策 流程说明 ①→②→③:日志写入链路;④→⑤→⑥:日志查询与决策链路。 两条链路独立运行,通过 Loki 的存储层关联。

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 的查询范围应尽量精确,避免全表扫描影响性能。