- 云原生
- 容器编排
- 工作流自动化
- 任务调度
- 后端
【免费下载链接】argo-workflows
Workflow Engine for Kubernetes
导读
StreamResultOfSensorLogEntry是 Argo Workflows Java SDK(io.argoproj.workflow.models包)中用于承载Sensor 日志流式响应的模型类。在调用SensorService的日志流接口(GET /api/v1/stream/sensors/{namespace}/logs)时,服务端会持续推送多条日志记录,而每一条推送内容都会被封装为一个StreamResultOfSensorLogEntry对象。读完本文,你将掌握该类的两个核心字段(error与result)的语义与取值时机、与之关联的SensorLogEntry与GrpcGatewayRuntimeStreamError子模型结构,以及如何在 Java 中正确消费这条日志流并区分正常日志与流中断错误。
一、从 API 文档看类的定位:流式响应的“信封”包装
在 sdks/java/client/docs/StreamResultOfSensorLogEntry.md 中,该模型被定义为仅含两个可选属性的简单容器:
| Name | Type | Description | Notes |
|---|---|---|---|
| error | GrpcGatewayRuntimeStreamError | [optional] | |
| result | SensorLogEntry | [optional] |
这种“一信封、两选一”的结构是 gRPC-Gateway 生成流式响应的典型模式:当流正常推送数据时result被填充;当流中途发生错误时error被填充,二者不会同时出现。从实现上讲,该模型对应底层 gRPC 服务SensorService.SensorsLogs的每个流消息,由 HTTP/JSON 网关转换为 JSON 后落在 Java SDK 的models包中。
二、字段深度解析:result 与 error 各自的内部结构
2.1result:一条结构化的 Sensor 日志
result的类型是SensorLogEntry,对应底层 proto 定义中的LogEntry消息(见 pkg/apiclient/sensor/sensor.proto 中注释为 “structured log entry” 的LogEntry)。Java SDK 为规避与其他包中同名模型冲突,将其命名为SensorLogEntry。其字段如下(见 sdks/java/client/docs/SensorLogEntry.md):
| Name | Type | Description | Notes |
|---|---|---|---|
| dependencyName | String | [optional] | |
| eventContext | String | [optional] | |
| level | String | [optional] | |
| msg | String | [optional] | |
| namespace | String | [optional] | |
| sensorName | String | [optional] | |
| time | java.time.Instant | [optional] | |
| triggerName | String | [optional] |
结合 pkg/apiclient/sensor/sensor.proto 中LogEntry的字段注释,可以还原各字段的真实语义:
- namespace:Sensor 对象所在的 Kubernetes 命名空间;
- sensorName:产生该日志条目的 Sensor 名称;
- triggerName:可选的触发器名称,用于标识这条日志与哪个 trigger 相关;
- level:日志级别(如 info、warn、error 等);
- time:日志产生时间,proto 中使用
k8s.io/apimachinery.pkg.apis.meta.v1.Time,Java 侧映射为java.time.Instant; - msg:日志正文内容,也是服务端
grep过滤所作用的核心字段; - dependencyName:可选的触发器依赖(event dependency)名称;
- eventContext:可选的 CloudEvent 上下文信息,用于关联触发该 Sensor 的原始事件。
2.2error:流中断时的错误载体
error的类型是GrpcGatewayRuntimeStreamError,其结构(见 sdks/java/client/docs/GrpcGatewayRuntimeStreamError.md)为:
| Name | Type | Description | Notes |
|---|---|---|---|
| details | List<GoogleProtobufAny> | [optional] | |
| grpcCode | Integer | [optional] | |
| httpCode | Integer | [optional] | |
| httpStatus | String | [optional] | |
| message | String | [optional] |
该结构是对 gRPC 运行时错误的标准建模:grpcCode对应 gRPC 状态码(如 13 表示INTERNAL,14 表示UNAVAILABLE),httpCode与httpStatus是对应的 HTTP 状态码与文本描述,message是错误详情,details可携带任意 protobuf 结构化错误扩展。当服务端在流式推送过程中检测到错误(例如 Sensor Pod 日志读取失败、命名空间不存在或权限不足)时,流会以携带error字段的最后一个消息收尾。
三、在 Java 中消费日志流:完整调用链
3.1 定位到触发接口:SensorService#sensorServiceSensorsLogs
StreamResultOfSensorLogEntry唯一出现的业务场景是SensorService的sensorServiceSensorsLogs方法,对应 HTTP 接口GET /api/v1/stream/sensors/{namespace}/logs(见 sdks/java/client/docs/SensorServiceApi.md)。该方法的所有参数均定义在底层请求消息SensorsLogsRequest中(见 pkg/apiclient/sensor/sensor.proto):
| 参数 | 类型 | 说明 |
|---|---|---|
| namespace | String | 必填,Sensor 所在命名空间 |
| name | String | 可选,只返回指定 Sensor 名称的日志 |
| triggerName | String | 可选,只返回指定触发器相关的日志 |
| grep | String | 可选,只返回msg匹配该正则表达式的日志条目 |
| podLogOptionsContainer | String | 可选,指定流式读取日志的容器名,Pod 只有一个容器时默认为该容器 |
| podLogOptionsFollow | Boolean | 可选,是否持续跟随(follow)Pod 日志流,默认 false |
| podLogOptionsPrevious | Boolean | 可选,是否返回已终止容器的历史日志,默认 false |
| podLogOptionsSinceSeconds | String | 可选,相对当前时间回溯的秒数;与 sinceTime 二选一 |
| podLogOptionsSinceTimeSeconds | String | 可选,Unix 纪元以来的 UTC 秒数(绝对起始时间) |
| podLogOptionsSinceTimeNanos | Integer | 可选,起始时间的纳秒部分(0~999,999,999) |
| podLogOptionsTimestamps | Boolean | 可选,为每行日志附加 RFC3339/RFC3339Nano 时间戳,默认 false |
| podLogOptionsTailLines | String | 可选,仅显示末尾 N 行;设置后stream只能为 nil 或 "All" |
| podLogOptionsLimitBytes | String | 可选,读取到该字节数后终止日志输出 |
| podLogOptionsInsecureSkipTLSVerifyBackend | Boolean | 可选,是否跳过对 apiserver 后端证书的校验(慎用) |
| podLogOptionsStream | String | 可选,取值 "All"/"Stdout"/"Stderr",默认 "All" 交错输出 |
这些podLogOptions*参数直接映射自 Kubernetes 的PodLogOptions(见 pkg/apiclient/sensor/sensor.proto 中对k8s.io/api/core/v1.PodLogOptions的引用),因此语义与kubectl logs的对应选项完全一致。
3.2 可运行的 Java 调用示例
以下示例基于 sdks/java/client/docs/SensorServiceApi.md 中sensorServiceSensorsLogs的调用范式,展示如何发起请求并逐条解析流式响应:
// 导入所需类 import io.argoproj.workflow.ApiClient; import io.argoproj.workflow.ApiException; import io.argoproj.workflow.Configuration; import io.argoproj.workflow.auth.*; import io.argoproj.workflow.models.*; import io.argoproj.workflow.apis.SensorServiceApi; public class SensorLogsExample { public static void main(String[] args) { ApiClient defaultClient = Configuration.getDefaultApiClient(); defaultClient.setBasePath("http://localhost:2746"); // 配置 API Key 鉴权:BearerToken ApiKeyAuth bearerToken = (ApiKeyAuth) defaultClient.getAuthentication("BearerToken"); bearerToken.setApiKey("YOUR API KEY"); // 如需前缀可取消注释:bearerToken.setApiKeyPrefix("Token"); SensorServiceApi apiInstance = new SensorServiceApi(defaultClient); String namespace = "argo"; // 必填:命名空间 String name = "my-sensor"; // 可选:按 Sensor 名过滤 String triggerName = "my-trigger"; // 可选:按触发器过滤 String grep = "ERROR|WARN"; // 可选:对 msg 做正则过滤 String podLogOptionsContainer = null; // 可选 Boolean podLogOptionsFollow = true; // 可选:持续跟随 Boolean podLogOptionsPrevious = null; // 可选 String podLogOptionsSinceSeconds = null; // 可选 String podLogOptionsSinceTimeSeconds = null; // 可选 Integer podLogOptionsSinceTimeNanos = null; // 可选 Boolean podLogOptionsTimestamps = true; // 可选:附加时间戳 String podLogOptionsTailLines = null; // 可选 String podLogOptionsLimitBytes = null; // 可选 Boolean podLogOptionsInsecureSkipTLSVerifyBackend = null; // 可选 String podLogOptionsStream = "All"; // 可选:All/Stdout/Stderr try { // 返回类型即 StreamResultOfSensorLogEntry StreamResultOfSensorLogEntry result = apiInstance.sensorServiceSensorsLogs( namespace, name, triggerName, grep, podLogOptionsContainer, podLogOptionsFollow, podLogOptionsPrevious, podLogOptionsSinceSeconds, podLogOptionsSinceTimeSeconds, podLogOptionsSinceTimeNanos, podLogOptionsTimestamps, podLogOptionsTailLines, podLogOptionsLimitBytes, podLogOptionsInsecureSkipTLSVerifyBackend, podLogOptionsStream); // 在流式调用中,对每个返回对象做 result / error 分支处理 if (result.getResult() != null) { SensorLogEntry entry = result.getResult(); System.out.println(entry.getTime() + " [" + entry.getLevel() + "] " + entry.getSensorName() + "/" + entry.getTriggerName() + ": " + entry.getMsg()); } else if (result.getError() != null) { GrpcGatewayRuntimeStreamError err = result.getError(); System.err.println("Stream error: grpcCode=" + err.getGrpcCode() + ", httpCode=" + err.getHttpCode() + ", message=" + err.getMessage()); } } catch (ApiException e) { System.err.println("Exception when calling SensorServiceApi#sensorServiceSensorsLogs"); System.err.println("Status code: " + e.getCode()); System.err.println("Reason: " + e.getResponseBody()); System.err.println("Response headers: " + e.getResponseHeaders()); e.printStackTrace(); } } }3.3 调用注意事项
- Base URL:默认地址为
http://localhost:2746(Argo Server 的默认端口),可按部署环境通过setBasePath调整; - 鉴权:需要
BearerToken类型的 API Key,见 sdks/java/client/docs/SensorServiceApi.md 中的 Authorization 说明; - HTTP 响应状态:
200表示成功的流式响应(文档标注 “streaming responses”),0表示意外错误响应; - 流式语义:proto 中
rpc SensorsLogs(SensorsLogsRequest) returns (stream LogEntry)(见 pkg/apiclient/sensor/sensor.proto)表明这是一个服务端流,Java SDK 侧每个流消息都被封装为StreamResultOfSensorLogEntry,因此业务代码需要逐条判断error是否为 null,以区分“正常日志”与“流终止错误”。
四、同类流式包装模型与整体定位
StreamResultOfSensorLogEntry并非孤例,Java SDK 中还存在结构一致的兄弟模型,例如StreamResultOfEvent、StreamResultOfEventsourceLogEntry、StreamResultOfSensorSensorWatchEvent、StreamResultOfIoArgoprojWorkflowV1alpha1WorkflowWatchEvent等(见 sdks/java/client/docs 目录)。它们全部遵循相同的 “result / error 二选一” 流式响应规范,分别服务于 EventSource 日志流、Sensor Watch 流、Workflow Watch 流等接口。掌握StreamResultOfSensorLogEntry的消费模式后,即可举一反三地处理 SDK 中所有StreamResultOf*类型。
五、小结
StreamResultOfSensorLogEntry是 Argo Workflows Java SDK 面向 Sensor 日志流的一层“信封”模型:
- result(
SensorLogEntry)承载结构化日志字段:namespace、sensorName、triggerName、dependencyName、level、time、msg、eventContext; - error(
GrpcGatewayRuntimeStreamError)承载流中断错误:grpcCode、httpCode、httpStatus、message、details; - 它与底层 pkg/apiclient/sensor/sensor.proto 中
SensorsLogs流式 RPC 及LogEntry消息一一对应; - 实际使用时,通过
SensorService#sensorServiceSensorsLogs传入命名空间、Sensor 名、触发器名、grep正则以及一组podLogOptions*过滤参数,并对返回对象按result/error分支处理即可完成日志流的可靠消费。
- 云原生
- 容器编排
- 工作流自动化
- 任务调度
- 后端
【免费下载链接】argo-workflows
Workflow Engine for Kubernetes
相关推荐
如何高效掌握vue-element-admin单元测试:从基础到进阶的完整指南
如何高效掌握vue element admin单元测试:从基础到进阶的完整指南 vue element admin是一个基于Vue和Element UI的企业级
云原生容器编排工作流自动化任务调度后端Argo Workflows Java SDK 指南:Sensor 模型与 SensorService API 详解
Argo Workflows Java SDK 指南:Sensor 模型与 SensorService API 详解 Argo Workflows 的 Java
云原生容器编排工作流自动化任务调度后端Argo Workflows Java SDK 事件源日志模型 EventsourceLogEntry 详解:字段语义、流式日志 API 与底层实现
Argo Workflows Java SDK 事件源日志模型 EventsourceLogEntry 详解:字段语义、流式日志 API 与底层实现 Event
云原生容器编排工作流自动化任务调度后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考