Argo Workflows Java SDK 中 StreamResultOfSensorLogEntry 详解:Sensor 日志流式响应的数据模型与实战解析
云原生容器编排工作流自动化任务调度后端【免费下载链接】argo-workflowsWorkflow Engine for Kubernetes项目地址https://gitcode.com/gh_mirrors/ar/argo-workflows点击查看免费下载导读StreamResultOfSensorLogEntry是 Argo Workflows Java SDKio.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 中该模型被定义为仅含两个可选属性的简单容器NameTypeDescriptionNoteserrorGrpcGatewayRuntimeStreamError[optional]resultSensorLogEntry[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.mdNameTypeDescriptionNotesdependencyNameString[optional]eventContextString[optional]levelString[optional]msgString[optional]namespaceString[optional]sensorNameString[optional]timejava.time.Instant[optional]triggerNameString[optional]结合 pkg/apiclient/sensor/sensor.proto 中LogEntry的字段注释可以还原各字段的真实语义namespaceSensor 对象所在的 Kubernetes 命名空间sensorName产生该日志条目的 Sensor 名称triggerName可选的触发器名称用于标识这条日志与哪个 trigger 相关level日志级别如 info、warn、error 等time日志产生时间proto 中使用k8s.io/apimachinery.pkg.apis.meta.v1.TimeJava 侧映射为java.time.Instantmsg日志正文内容也是服务端grep过滤所作用的核心字段dependencyName可选的触发器依赖event dependency名称eventContext可选的 CloudEvent 上下文信息用于关联触发该 Sensor 的原始事件。2.2error流中断时的错误载体error的类型是GrpcGatewayRuntimeStreamError其结构见 sdks/java/client/docs/GrpcGatewayRuntimeStreamError.md为NameTypeDescriptionNotesdetailsListGoogleProtobufAny[optional]grpcCodeInteger[optional]httpCodeInteger[optional]httpStatusString[optional]messageString[optional]该结构是对 gRPC 运行时错误的标准建模grpcCode对应 gRPC 状态码如 13 表示INTERNAL14 表示UNAVAILABLEhttpCode与httpStatus是对应的 HTTP 状态码与文本描述message是错误详情details可携带任意 protobuf 结构化错误扩展。当服务端在流式推送过程中检测到错误例如 Sensor Pod 日志读取失败、命名空间不存在或权限不足时流会以携带error字段的最后一个消息收尾。三、在 Java 中消费日志流完整调用链3.1 定位到触发接口SensorService#sensorServiceSensorsLogsStreamResultOfSensorLogEntry唯一出现的业务场景是SensorService的sensorServiceSensorsLogs方法对应 HTTP 接口GET /api/v1/stream/sensors/{namespace}/logs见 sdks/java/client/docs/SensorServiceApi.md。该方法的所有参数均定义在底层请求消息SensorsLogsRequest中见 pkg/apiclient/sensor/sensor.proto参数类型说明namespaceString必填Sensor 所在命名空间nameString可选只返回指定 Sensor 名称的日志triggerNameString可选只返回指定触发器相关的日志grepString可选只返回msg匹配该正则表达式的日志条目podLogOptionsContainerString可选指定流式读取日志的容器名Pod 只有一个容器时默认为该容器podLogOptionsFollowBoolean可选是否持续跟随followPod 日志流默认 falsepodLogOptionsPreviousBoolean可选是否返回已终止容器的历史日志默认 falsepodLogOptionsSinceSecondsString可选相对当前时间回溯的秒数与 sinceTime 二选一podLogOptionsSinceTimeSecondsString可选Unix 纪元以来的 UTC 秒数绝对起始时间podLogOptionsSinceTimeNanosInteger可选起始时间的纳秒部分0999,999,999podLogOptionsTimestampsBoolean可选为每行日志附加 RFC3339/RFC3339Nano 时间戳默认 falsepodLogOptionsTailLinesString可选仅显示末尾 N 行设置后stream只能为 nil 或 AllpodLogOptionsLimitBytesString可选读取到该字节数后终止日志输出podLogOptionsInsecureSkipTLSVerifyBackendBoolean可选是否跳过对 apiserver 后端证书的校验慎用podLogOptionsStreamString可选取值 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:2746Argo 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 日志流的一层“信封”模型resultSensorLogEntry承载结构化日志字段namespace、sensorName、triggerName、dependencyName、level、time、msg、eventContexterrorGrpcGatewayRuntimeStreamError承载流中断错误grpcCode、httpCode、httpStatus、message、details它与底层 pkg/apiclient/sensor/sensor.proto 中SensorsLogs流式 RPC 及LogEntry消息一一对应实际使用时通过SensorService#sensorServiceSensorsLogs传入命名空间、Sensor 名、触发器名、grep正则以及一组podLogOptions*过滤参数并对返回对象按result/error分支处理即可完成日志流的可靠消费。赞分享云原生容器编排工作流自动化任务调度后端【免费下载链接】argo-workflowsWorkflow Engine for Kubernetes项目地址https://gitcode.com/gh_mirrors/ar/argo-workflows点击查看免费下载相关推荐如何高效掌握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云原生容器编排工作流自动化任务调度后端上一篇如何用SillyTavern角色卡片系统打造你的专属AI伙伴完整入门指南下一篇Qwen迁移学习终极指南3种微调方案完整实战教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考