在 Data Flow 中调试流

如果流无法部署

  • 确保使用的是特定发行版本的最新 GA 版本
  • 确保您选择平台至少满足最低支持版本
  • 在 SCDF 中部署流应用程序之前,请确保该应用程序已作为独立应用程序成功运行。在继续之前,请参阅调试流应用程序

Skipper 负责部署流。流部署失败消息通常可以在 Skipper 应用程序日志中找到。

本指南的其余部分分为每个平台的部分

  • 本地
  • Cloud Foundry
  • Kubernetes

本地

本节介绍如何在本地环境中调试常见的部署问题。

下图显示了本地环境中部署问题的典型调试过程。

No
Yes
Yes
No
Yes
No
Start Locally?
Exceptions in SCDF or Skipper logs?
Resolve exceptions
Exceptions in app logs?
Resolve exceptions
Raise log levels
Enable debug

您可以逐个应用程序地检查应用程序日志文件。要将所有应用程序的日志聚合到一个文件中,您可以设置 inheritLogging=true 部署器属性。有关更多信息,请参阅“是否可以将本地部署聚合到单个日志中?”,有关如何启用更多日志输出的信息,请参阅“如何为平台部署启用 DEBUG 日志?”

您可以通过设置 debugPort 部署器属性来使用 JDWP 调试应用程序。有关更多信息,请参阅“如何远程调试已部署的应用程序?”

Docker Compose - 启动

下图显示了本地环境中 Docker Compose 启动问题的典型调试过程。

No
Yes
No
DATAFLOW_VERSION defined?
SKIPPER_VERSION defined?

DATAFLOW_VERSIONSKIPPER_VERSION 环境变量必须通过 export 或在 docker-compose 命令前添加前缀的方式在当前终端环境中可用。有关更多信息,请参阅启动 Docker Compose

Docker Compose - 运行时

下图显示了本地环境中 Docker Compose 运行时问题的典型调试过程。

Yes
No
Yes
Low Resources?
Increase Docker Resources
Exceptions in app logs?
Resolve exceptions

默认情况下,分配给 Docker 的内存量可能过低。建议分配的内存量为 8GB。docker stats 命令可以提供有关资源使用情况的有用信息。如果应用程序由于资源限制而无法部署,请增加资源分配。请参阅您平台的Docker 文档

由于流是通过 Skipper 部署的,因此作为该流一部分的应用程序将作为 Java 进程在 Skipper 容器上启动。对于流的每个部分,都会部署一个应用程序。提供给 Docker 的总体资源分配(内存、CPU 等)应考虑已部署应用程序的数量。有关查看日志文件的更多信息,请参阅查看流日志

Cloud Foundry

本节介绍如何调试 Cloud Foundry 上常见的部署问题。

启动失败

下图显示了 Cloud Foundry 上启动失败的典型调试过程

No
Yes
No
Verify Manifest
Verify environment variables
Service instances running?
SCDF and Skipper Running?
View logs and resolve errors

应用程序失败

下图显示了 Cloud Foundry 上应用程序失败的典型调试过程

No
No
No
Applications Started?
Errors in SCDF logs?
Errors in Skipper logs?
Errors in app logs?
Resolve

调试部署问题时,提高部署程序和 Cloud Foundry 相关的日志级别可能会有所帮助。有关更多信息,请参阅“如何为平台部署启用 DEBUG 日志?”

Kubernetes

本节介绍如何调试 Kubernetes 上常见的部署问题。

分布式部署文件

下图显示了 Kubernetes 上分布式部署文件的典型调试过程

No
Yes
No
Yes
Yes
Yes
Yes
Yes
Yes
All files applied including RBAC?
External Services Running
Exceptions in SCDF pod logs?
Exceptions in Skipper pod logs?
Exceptions in app pod logs?
Resolve

Helm 图表

下图显示了 Kubernetes 上 Helm 图表的典型调试过程

No
Yes
No
Yes
Yes
Yes
Yes
Chart found?
helm repo update
Expected Services Running?
Exceptions in SCDF pod logs?
Exceptions in Skipper pod logs?
Resolve

常规

下图展示了 Kubernetes 上常见问题的一般调试流程

Yes
Yes
Errors in pod events table?
Resolve
Exceptions in app pod logs?

在描述 Pod 时,“events”表部分提供了调试时的有用信息,可以通过以下命令调用

kubectl describe po/pod_name

例如,成功部署的 time 应用程序的事件类似于以下内容

Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  2m    default-scheduler  Successfully assigned default/ticktock-time-v16-869947b6b9-brfc4 to minikube
  Normal  Pulled     2m    kubelet, minikube  Container image "springcloudstream/time-source-rabbit:3.2.1" already present on machine
  Normal  Created    2m    kubelet, minikube  Created container
  Normal  Started    2m    kubelet, minikube  Started container

可以使用以下命令实时查看应用程序日志(其中 pod_name 是您的 Pod 的名称)

kubectl logs -f po/pod_name

故障排除帮助

如果这些故障排除技术都没有帮助,并且您仍然需要帮助,请在 StackOverflow 上联系我们,并提供相关详细信息(请参阅:Wiki)。我们会积极关注论坛帖子。