3.6. 配置可观察性
要配置 OpenShift Dev Spaces 可观察功能,请参阅:
3.6.1. Woopra 遥测插件
Woopra Telemetry 插件 构建了一个插件,用于将遥测从 Red Hat OpenShift Dev Spaces 安装发送到 Segment 和 Woopra。此插件 供红帽托管的 Eclipse Che 使用,但任何 Red Hat OpenShift Dev Spaces 部署都可以利用此插件。没有有效的 Woopra 域和 Segment Write 密钥以外的依赖项。插件的 devfile v2 ,plugin.yaml,有四个可传递给插件的环境变量:
-
WOOPRA_DOMAIN
- 将事件发送到的 Woopra 域。 -
SEGMENT_WRITE_KEY
- 将事件发送到 Segment 和 Woopra 的写入密钥。 -
WOOPRA_DOMAIN_ENDPOINT
- 如果您不希望直接传递 Woopra 域,则该插件将从返回 Woopra 域的提供 HTTP 端点中获取。 -
SEGMENT_WRITE_KEY_ENDPOINT
- 如果您不希望直接传递 Segment 写入密钥,则该插件将从返回 Segment 写入密钥的所提供的 HTTP 端点中获取它。
在 Red Hat OpenShift Dev Spaces 安装中启用 Woopra 插件:
流程
将
plugin.yaml
devfile v2 文件部署到 HTTP 服务器,并正确设置环境变量。配置
CheCluster
自定义资源。请参阅 第 3.1.2 节 “使用 CLI 配置 CheCluster 自定义资源”。spec: devEnvironments: defaultPlugins: - editor: eclipse/che-theia/next 1 plugins: 2 - 'https://your-web-server/plugin.yaml'
3.6.2. 创建 telemetry 插件
本节演示了如何创建扩展 AbstractAnalyticsManager
的 AnalyticsManager
类并实现以下方法:
-
isEnabled ()
- 决定遥测后端是否正常工作。这可能意味着始终返回true
,或者有更复杂的检查,例如在缺少连接属性时返回false
。 -
destroy ()
- 在关闭遥测后端前运行的清理方法。此方法发送WORKSPACE_STOPPED
事件。 -
onActivity ()
- 通知给定用户仍发生一些活动。这主要用于发送WORKSPACE_INACTIVE
事件。 -
onEvent ()
- 将遥测事件提交到遥测服务器,如WORKSPACE_USED
或WORKSPACE_STARTED
。 -
increaseDuration ()
- 增加当前事件的持续时间,而不是在小时间段内发送多个事件。
以下部分涵盖了:
- 创建遥测服务器以将事件回显到标准输出.
- 扩展 OpenShift Dev Spaces 遥测客户端并实施用户的自定义后端。
-
创建一个
plugin.yaml
文件,代表自定义后端的 Dev Workspace 插件。 -
通过设置
CheCluster
自定义资源中的workspacesDefaultPlugins
属性,指定自定义插件到 OpenShift Dev Spaces 的位置。
3.6.2.1. 开始使用
本文档描述了扩展 OpenShift Dev Spaces 遥测系统以与自定义后端通信所需的步骤:
- 创建接收事件的服务器进程
- 扩展 OpenShift Dev Spaces 库以创建向服务器发送事件的后端
- 在容器中打包遥测后端并将其部署到镜像 registry
- 为后端添加插件,并指示 OpenShift Dev Spaces 在 Dev Workspaces 中加载插件
此处 提供了遥测后端的完整示例。
创建接收事件的服务器
出于演示目的,本例演示了如何创建从遥测插件接收事件并将其写入标准输出的服务器。
对于生产环境,请考虑与第三方遥测系统(如 Segment、Woopra)集成,而不是创建自己的遥测服务器。在这种情况下,使用您的供应商的 API 将事件从自定义后端发送到其系统。
以下 Go 代码在端口 8080
上启动服务器,并将事件写入标准输出:
例 3.20. main.go
package main import ( "io/ioutil" "net/http" "go.uber.org/zap" ) var logger *zap.SugaredLogger func event(w http.ResponseWriter, req *http.Request) { switch req.Method { case "GET": logger.Info("GET /event") case "POST": logger.Info("POST /event") } body, err := req.GetBody() if err != nil { logger.With("err", err).Info("error getting body") return } responseBody, err := ioutil.ReadAll(body) if err != nil { logger.With("error", err).Info("error reading response body") return } logger.With("body", string(responseBody)).Info("got event") } func activity(w http.ResponseWriter, req *http.Request) { switch req.Method { case "GET": logger.Info("GET /activity, doing nothing") case "POST": logger.Info("POST /activity") body, err := req.GetBody() if err != nil { logger.With("error", err).Info("error getting body") return } responseBody, err := ioutil.ReadAll(body) if err != nil { logger.With("error", err).Info("error reading response body") return } logger.With("body", string(responseBody)).Info("got activity") } } func main() { log, _ := zap.NewProduction() logger = log.Sugar() http.HandleFunc("/event", event) http.HandleFunc("/activity", activity) logger.Info("Added Handlers") logger.Info("Starting to serve") http.ListenAndServe(":8080", nil) }
基于此代码创建容器镜像,并在 openshift-devspaces
项目中将其公开为 OpenShift 中的部署。示例遥测服务器的代码位于 telemetry-server-example 中。要部署遥测服务器,请克隆存储库并构建容器:
$ git clone https://github.com/che-incubator/telemetry-server-example $ cd telemetry-server-example $ podman build -t registry/organization/telemetry-server-example:latest . $ podman push registry/organization/telemetry-server-example:latest
manifest_with_ingress.yaml
和 manifest_with_route
都包含 Deployment 和 Service 的定义。前者还定义了 Kubernetes Ingress,后者则定义了 OpenShift Route。
在清单文件中,替换 image
和 host
字段以匹配您推送的镜像和 OpenShift 集群的公共主机名。然后运行:
$ kubectl apply -f manifest_with_[ingress|route].yaml -n openshift-devspaces
3.6.2.2. 创建后端项目
为了在开发时快速反馈,建议在 Dev Workspace 中进行开发。这样,您可以在集群中运行应用程序,并从前端 telemetry 插件接收事件。
Maven Quarkus 项目构建:
mvn io.quarkus:quarkus-maven-plugin:2.7.1.Final:create \ -DprojectGroupId=mygroup -DprojectArtifactId=devworkspace-telemetry-example-plugin \ -DprojectVersion=1.0.0-SNAPSHOT
-
删除
src/main/java/mygroup
和src/test/java/mygroup
下的文件。 -
如需最新的版本,请参阅 GitHub 软件包,以及
backend-base
的 Maven 协调。 将以下依赖项添加到
pom.xml
中:例 3.21.
pom.xml
<!-- Required --> <dependency> <groupId>org.eclipse.che.incubator.workspace-telemetry</groupId> <artifactId>backend-base</artifactId> <version>LATEST VERSION FROM PREVIOUS STEP</version> </dependency> <!-- Used to make http requests to the telemetry server --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-rest-client</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-rest-client-jackson</artifactId> </dependency>
-
创建一个具有
read:packages
权限的个人访问令牌,以从 GitHub 软件包下载org.eclipse.che.incubator.workspace-telemetry:backend-base
依赖项。 在
~/.m2/settings.xml
文件中添加您的 GitHub 用户名、个人访问令牌和che-incubator
存储库详情:例 3.22.
settings.xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <servers> <server> <id>che-incubator</id> <username>YOUR GITHUB USERNAME</username> <password>YOUR GITHUB TOKEN</password> </server> </servers> <profiles> <profile> <id>github</id> <activation> <activeByDefault>true</activeByDefault> </activation> <repositories> <repository> <id>central</id> <url>https://repo1.maven.org/maven2</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>false</enabled></snapshots> </repository> <repository> <id>che-incubator</id> <url>https://maven.pkg.github.com/che-incubator/che-workspace-telemetry-client</url> </repository> </repositories> </profile> </profiles> </settings>
3.6.2.3. 创建分析管理器的具体实施并添加专用逻辑
在项目的 src/main/java/mygroup
下创建两个文件:
-
MainConfiguration.java
- 包含提供给分析管理器
的配置。 -
AnalyticsManager.java
- 包含特定于遥测系统的逻辑。
例 3.23. MainConfiguration.java
package org.my.group; import java.util.Optional; import javax.enterprise.context.Dependent; import javax.enterprise.inject.Alternative; import org.eclipse.che.incubator.workspace.telemetry.base.BaseConfiguration; import org.eclipse.microprofile.config.inject.ConfigProperty; @Dependent @Alternative public class MainConfiguration extends BaseConfiguration { @ConfigProperty(name = "welcome.message") 1 Optional<String> welcomeMessage; 2 }
- 1
- MicroProfile 配置注释用于注入
welcome.message
配置。
有关如何设置特定于后端的配置属性的详情,请参阅 Quarkus 配置参考指南。
例 3.24. AnalyticsManager.java
package org.my.group; import java.util.HashMap; import java.util.Map; import javax.enterprise.context.Dependent; import javax.enterprise.inject.Alternative; import javax.inject.Inject; import org.eclipse.che.incubator.workspace.telemetry.base.AbstractAnalyticsManager; import org.eclipse.che.incubator.workspace.telemetry.base.AnalyticsEvent; import org.eclipse.che.incubator.workspace.telemetry.finder.DevWorkspaceFinder; import org.eclipse.che.incubator.workspace.telemetry.finder.UsernameFinder; import org.eclipse.microprofile.rest.client.inject.RestClient; import org.slf4j.Logger; import static org.slf4j.LoggerFactory.getLogger; @Dependent @Alternative public class AnalyticsManager extends AbstractAnalyticsManager { private static final Logger LOG = getLogger(AbstractAnalyticsManager.class); public AnalyticsManager(MainConfiguration mainConfiguration, DevWorkspaceFinder devworkspaceFinder, UsernameFinder usernameFinder) { super(mainConfiguration, devworkspaceFinder, usernameFinder); mainConfiguration.welcomeMessage.ifPresentOrElse( 1 (str) -> LOG.info("The welcome message is: {}", str), () -> LOG.info("No welcome message provided") ); } @Override public boolean isEnabled() { return true; } @Override public void destroy() {} @Override public void onEvent(AnalyticsEvent event, String ownerId, String ip, String userAgent, String resolution, Map<String, Object> properties) { LOG.info("The received event is: {}", event); 2 } @Override public void increaseDuration(AnalyticsEvent event, Map<String, Object> properties) { } @Override public void onActivity() {} }
由于 org.my.group.AnalyticsManager
和 org.my.group.MainConfiguration
是替代 Bean,使用 src/main/resources/application.properties
中的 quarkus.arc.selected-alternatives
属性来指定它们。
例 3.25. application.properties
quarkus.arc.selected-alternatives=MainConfiguration,AnalyticsManager
3.6.2.4. 在 Dev Workspace 中运行应用程序
在 Dev Workspace 中设置
DEVWORKSPACE_TELEMETRY_BACKEND_PORT
环境变量。在这里,值设为4167
。spec: template: attributes: workspaceEnv: - name: DEVWORKSPACE_TELEMETRY_BACKEND_PORT value: '4167'
- 从 Red Hat OpenShift Dev Spaces 仪表板中重启 Dev Workspace。
在 Dev Workspace 的终端窗口中运行以下命令以启动应用程序。使用
--settings
标志指定包含 GitHub 访问令牌的settings.xml
文件的位置路径。$ mvn --settings=settings.xml quarkus:dev -Dquarkus.http.port=${DEVWORKSPACE_TELEMETRY_BACKEND_PORT}
现在,应用程序通过前端插件的端口
4167
接收遥测事件。
验证步骤
验证是否记录以下输出:
INFO [org.ecl.che.inc.AnalyticsManager] (Quarkus Main Thread) No welcome message provided INFO [io.quarkus] (Quarkus Main Thread) devworkspace-telemetry-example-plugin 1.0.0-SNAPSHOT on JVM (powered by Quarkus 2.7.2.Final) started in 0.323s. Listening on: http://localhost:4167 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated. INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, kubernetes-client, rest-client, rest-client-jackson, resteasy, resteasy-jsonb, smallrye-context-propagation, smallrye-openapi, swagger-ui, vertx]
要验证
AnalyticsManager
的onEvent ()
方法是否从前端插件接收事件,请按 l 键来禁用 Quarkus 实时编码并编辑 IDE 中的任何文件。应记录以下输出:INFO [io.qua.dep.dev.RuntimeUpdatesProcessor] (Aesh InputStream Reader) Live reload disabled INFO [org.ecl.che.inc.AnalyticsManager] (executor-thread-2) The received event is: Edit Workspace File in Che
3.6.2.5. 实施 isEnabled ()
在示例中,此方法始终会在调用时返回 true
。
例 3.26. AnalyticsManager.java
@Override public boolean isEnabled() { return true; }
可以在 isEnabled ()
中放置更复杂的逻辑。例如,托管的 OpenShift Dev Spaces Woopra 后端 在确定是否启用了后端前检查配置属性是否存在。
3.6.2.6. 实施 onEvent ()
onEvent ()
将后端接收的事件发送到遥测系统。对于 example 应用,它将 HTTP POST 有效负载发送到遥测服务器的 /event
端点。
3.6.2.6.1. 向示例 telemetry 服务器发送 POST 请求
在以下示例中,遥测服务器应用通过以下 URL 部署到 OpenShift:其中 apps-crc.testing
是 OpenShift 集群的入口域名。
通过创建
TelemetryService.java
来设置 RESTEasy REST 客户端例 3.27.
TelemetryService.java
package org.my.group; import java.util.Map; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; @RegisterRestClient public interface TelemetryService { @POST @Path("/event") 1 @Consumes(MediaType.APPLICATION_JSON) Response sendEvent(Map<String, Object> payload); }
- 1
- 将
POST
请求发送到的端点。
在
src/main/resources/application.properties
文件中指定TelemetryService
的基本 URL:例 3.28.
application.properties
org.my.group.TelemetryService/mp-rest/url=http://little-telemetry-server-che.apps-crc.testing
将
TelemetryService
注入AnalyticsManager
,并在onEvent ()
中发送POST
请求例 3.29.
AnalyticsManager.java
@Dependent @Alternative public class AnalyticsManager extends AbstractAnalyticsManager { @Inject @RestClient TelemetryService telemetryService; ... @Override public void onEvent(AnalyticsEvent event, String ownerId, String ip, String userAgent, String resolution, Map<String, Object> properties) { Map<String, Object> payload = new HashMap<String, Object>(properties); payload.put("event", event); telemetryService.sendEvent(payload); }
这会将 HTTP 请求发送到遥测服务器,并在少量时间内自动延迟相同的事件。默认持续时间为 1500 毫秒。
3.6.2.7. 实施 increaseDuration ()
许多遥测系统都识别事件持续时间。AbstractAnalyticsManager
将相同时间段内发生的类似事件合并到一个事件中。这个 increaseDuration ()
的实现是一个 no-op。此方法使用用户遥测供应商的 API 更改事件或事件属性,以反映事件的持续时间增加。
例 3.30. AnalyticsManager.java
@Override public void increaseDuration(AnalyticsEvent event, Map<String, Object> properties) {}
3.6.2.8. 实施 onActivity ()
设置不活跃超时限制,并使用 onActivity ()
发送 WORKSPACE_INACTIVE
事件(如果最后一次事件时间超过超时)。
例 3.31. AnalyticsManager.java
public class AnalyticsManager extends AbstractAnalyticsManager { ... private long inactiveTimeLimit = 60000 * 3; ... @Override public void onActivity() { if (System.currentTimeMillis() - lastEventTime >= inactiveTimeLimit) { onEvent(WORKSPACE_INACTIVE, lastOwnerId, lastIp, lastUserAgent, lastResolution, commonProperties); } }
3.6.2.9. 实施 destroy ()
当调用 destroy ()
时,发送 WORKSPACE_STOPPED
事件并关闭连接池等任何资源。
例 3.32. AnalyticsManager.java
@Override public void destroy() { onEvent(WORKSPACE_STOPPED, lastOwnerId, lastIp, lastUserAgent, lastResolution, commonProperties); }
运行 mvn quarkus:dev
,如 第 3.6.2.4 节 “在 Dev Workspace 中运行应用程序” 所述,并使用 Ctrl+C 终止应用程序向服务器发送 WORKSPACE_STOPPED
事件。
3.6.2.10. 打包 Quarkus 应用程序
有关在容器中打包应用程序的最佳说明,请参阅 Quarkus 文档。构建容器并将其推送到您选择的容器注册中心。
3.6.2.10.1. 用于构建使用 JVM 运行的 Quarkus 镜像的 Dockerfile 示例
例 3.33. Dockerfile.jvm
FROM registry.access.redhat.com/ubi8/openjdk-11:1.11 ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/ COPY --chown=185 target/quarkus-app/*.jar /deployments/ COPY --chown=185 target/quarkus-app/app/ /deployments/app/ COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/ EXPOSE 8080 USER 185 ENTRYPOINT ["java", "-Dquarkus.http.host=0.0.0.0", "-Djava.util.logging.manager=org.jboss.logmanager.LogManager", "-Dquarkus.http.port=${DEVWORKSPACE_TELEMETRY_BACKEND_PORT}", "-jar", "/deployments/quarkus-run.jar"]
要构建镜像,请运行:
mvn package && \ podman build -f src/main/docker/Dockerfile.jvm -t image:tag .
3.6.2.10.2. 用于构建 Quarkus 原生镜像的 Dockerfile 示例
例 3.34. Dockerfile.native
FROM registry.access.redhat.com/ubi8/ubi-minimal:8.5 WORKDIR /work/ RUN chown 1001 /work \ && chmod "g+rwX" /work \ && chown 1001:root /work COPY --chown=1001:root target/*-runner /work/application EXPOSE 8080 USER 1001 CMD ["./application", "-Dquarkus.http.host=0.0.0.0", "-Dquarkus.http.port=$DEVWORKSPACE_TELEMETRY_BACKEND_PORT}"]
要构建镜像,请运行:
mvn package -Pnative -Dquarkus.native.container-build=true && \ podman build -f src/main/docker/Dockerfile.native -t image:tag .
3.6.2.11. 为插件创建 plugin.yaml
创建一个 plugin.yaml
devfile v2 文件,该文件代表 Dev Workspace 插件,该文件在 Dev Workspace Pod 中运行自定义后端。有关 devfile v2 的更多信息,请参阅 Devfile v2 文档
例 3.35. plugin.yaml
schemaVersion: 2.1.0 metadata: name: devworkspace-telemetry-backend-plugin version: 0.0.1 description: A Demo telemetry backend displayName: Devworkspace Telemetry Backend components: - name: devworkspace-telemetry-backend-plugin attributes: workspaceEnv: - name: DEVWORKSPACE_TELEMETRY_BACKEND_PORT value: '4167' container: image: YOUR IMAGE 1 env: - name: WELCOME_MESSAGE 2 value: 'hello world!'
- 1
- 指定从 第 3.6.2.10 节 “打包 Quarkus 应用程序” 构建的容器镜像。
- 2
- 为 Example 4 中的
welcome.message
可选配置属性设置值。
通常,用户将此文件部署到企业 Web 服务器。本指南演示了如何在 OpenShift 上创建 Apache Web 服务器,并在其中托管插件。
创建引用新 plugin.yaml
文件的 ConfigMap
对象。
$ oc create configmap --from-file=plugin.yaml -n openshift-devspaces telemetry-plugin-yaml
创建部署、服务和路由,以公开 Web 服务器。部署引用此 ConfigMap
对象并将其放在 /var/www/html
目录中。
例 3.36. manifest.yaml
kind: Deployment apiVersion: apps/v1 metadata: name: apache spec: replicas: 1 selector: matchLabels: app: apache template: metadata: labels: app: apache spec: volumes: - name: plugin-yaml configMap: name: telemetry-plugin-yaml defaultMode: 420 containers: - name: apache image: 'registry.redhat.io/rhscl/httpd-24-rhel7:latest' ports: - containerPort: 8080 protocol: TCP resources: {} volumeMounts: - name: plugin-yaml mountPath: /var/www/html strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% maxSurge: 25% revisionHistoryLimit: 10 progressDeadlineSeconds: 600 --- kind: Service apiVersion: v1 metadata: name: apache spec: ports: - protocol: TCP port: 8080 targetPort: 8080 selector: app: apache type: ClusterIP --- kind: Route apiVersion: route.openshift.io/v1 metadata: name: apache spec: host: apache-che.apps-crc.testing to: kind: Service name: apache weight: 100 port: targetPort: 8080 wildcardPolicy: None
$ oc apply -f manifest.yaml
验证步骤
部署启动后,确认 web 服务器中的
plugin.yaml
可用:$ curl apache-che.apps-crc.testing/plugin.yaml
3.6.2.12. 在 Dev Workspace 中指定 telemetry 插件
将以下内容添加到现有 Dev Workspace 的
components
字段中:components: ... - name: telemetry-plugin plugin: uri: http://apache-che.apps-crc.testing/plugin.yaml
- 从 OpenShift Dev Spaces 仪表板启动 Dev Workspace。
验证步骤
验证 telemetry 插件容器是否在 Dev Workspace pod 中运行。在这里,这可以通过检查编辑器中的 Workspace 视图进行验证。
- 在编辑器中编辑文件,并在示例遥测服务器日志中观察其事件。
3.6.2.13. 为所有 Dev Workspaces 应用 telemetry 插件
将 telemetry 插件设置为默认插件。默认插件应用于新的和现有的 Dev Workspaces 的 Dev Workspace 启动。
配置
CheCluster
自定义资源。请参阅 第 3.1.2 节 “使用 CLI 配置 CheCluster 自定义资源”。spec: devEnvironments: defaultPlugins: - editor: eclipse/che-theia/next 1 plugins: 2 - 'http://apache-che.apps-crc.testing/plugin.yaml'
验证步骤
- 从 Red Hat OpenShift Dev Spaces 仪表板中启动新的或现有的 Dev Workspace。
- 按照 第 3.6.2.12 节 “在 Dev Workspace 中指定 telemetry 插件” 的验证步骤,验证 telemetry 插件是否正常工作。
3.6.2.14. 配置服务器日志记录
可以在 OpenShift Dev Spaces 服务器中微调各个日志记录器的日志级别。
整个 OpenShift Dev Spaces 服务器的日志级别使用 Operator 的 cheLogLevel
配置属性进行全局配置。请参阅 第 3.1.3 节 “CheCluster
自定义资源字段参考”。要在不由 Operator 管理的安装中设置全局日志级别,请在 che
ConfigMap 中指定 CHE_LOG_LEVEL
环境变量。
可以使用 CHE_LOGGER_CONFIG
环境变量在 OpenShift Dev Spaces 服务器中配置各个日志记录器的日志级别。
3.6.2.14.1. 配置日志级别
流程
配置
CheCluster
自定义资源。请参阅 第 3.1.2 节 “使用 CLI 配置 CheCluster 自定义资源”。spec: components: cheServer: extraProperties: CHE_LOGGER_CONFIG: "<key1=value1,key2=value2>" 1
- 1
- 以逗号分隔的键值对列表,其中键是 OpenShift Dev Spaces 服务器日志输出中所示的日志记录器名称,值是所需的日志级别。
例 3.37. 为
WorkspaceManager
配置调试模式spec: components: cheServer: extraProperties: CHE_LOGGER_CONFIG: "org.eclipse.che.api.workspace.server.WorkspaceManager=DEBUG"
3.6.2.14.2. 日志记录器命名
日志记录器的名称遵循使用这些日志记录器的内部服务器类的类名称。
3.6.2.14.3. 日志记录 HTTP 流量
流程
要在 OpenShift Dev Spaces 服务器和 Kubernetes 或 OpenShift 集群的 API 服务器之间记录 HTTP 流量,请配置
CheCluster
自定义资源。请参阅 第 3.1.2 节 “使用 CLI 配置 CheCluster 自定义资源”。spec: components: cheServer: extraProperties: CHE_LOGGER_CONFIG: "che.infra.request-logging=TRACE"
3.6.2.15. 使用 dsc 收集日志
Red Hat OpenShift Dev Spaces 安装由 OpenShift 集群中运行的几个容器组成。虽然可以从每个正在运行的容器中手动收集日志,但 dsc
提供了可自动化进程的命令。
以下命令可以使用 dsc
工具从 OpenShift 集群收集 Red Hat OpenShift Dev Spaces 日志:
DSC 服务器:logs
收集现有的 Red Hat OpenShift Dev Spaces 服务器日志,并将其存储在本地计算机上的目录中。默认情况下,日志下载到机器上的临时目录中。但是,这可以通过指定
-d
参数来覆盖。例如,要将 OpenShift Dev Spaces 日志下载到/home/user/che-logs/
目录中,请使用 命令dsc server:logs -d /home/user/che-logs/
运行时,
dsc server:logs
在控制台中打印一条消息,指定将存储日志文件的目录:Red Hat OpenShift Dev Spaces logs will be available in '/tmp/chectl-logs/1648575098344'
如果在非默认项目中安装了 Red Hat OpenShift Dev Spaces,则
dsc server:logs
需要-n <NAMESPACE>
; paremeter,其中 <NAMESPACE
> 是安装 Red Hat OpenShift Dev Spaces 的 OpenShift 项目。例如,若要从my-namespace
项目中的 OpenShift Dev Spaces 获取日志,请使用 命令dsc server:logs -n my-namespace
dsc server:deploy
-
使用
dsc
安装时,会在 OpenShift Dev Spaces 安装过程中自动收集日志。与dsc server:logs
一样,可以使用-d
参数指定目录日志存储在 中。
其他资源
- "DDS 参考文档"
3.6.3. 监控 Dev Workspace Operator
您可以配置 OpenShift in-cluster 监控堆栈来提取 Dev Workspace Operator 公开的指标。
3.6.3.1. 收集 Dev Workspace Operator 指标
使用 in-cluster Prometheus 实例来收集、存储和查询 Dev Workspace Operator 的指标:
先决条件
- 您的机构 OpenShift Dev Spaces 实例已安装并在 Red Hat OpenShift 中运行。
-
具有对目标 OpenShift 集群的管理权限的活跃
oc
会话。请参阅 CLI 入门。 -
devworkspace-controller-metrics
服务在端口8443
上公开指标。默认情况下,这是预配置的。
流程
创建用于检测 Dev Workspace Operator 指标服务的 ServiceMonitor。
例 3.38. ServiceMonitor
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: devworkspace-controller namespace: openshift-devspaces 1 spec: endpoints: - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token interval: 10s 2 port: metrics scheme: https tlsConfig: insecureSkipVerify: true namespaceSelector: matchNames: - openshift-operators selector: matchLabels: app.kubernetes.io/name: devworkspace-controller
允许 in-cluster Prometheus 实例检测 OpenShift Dev Spaces 命名空间中的 ServiceMonitor。默认的 OpenShift Dev Spaces 命名空间为
openshift-devspaces
。$ oc label namespace openshift-devspaces openshift.io/cluster-monitoring=true
验证
- 对于 OpenShift Dev Spaces 的新安装,请通过从 Dashboard 创建 OpenShift Dev Spaces 工作区来生成指标。
-
在 OpenShift Web 控制台的 Administrator 视图中,进入 Observe
Metrics。 运行 PromQL 查询以确认指标可用。例如,输入
devworkspace_started_total
并点 Run query。如需了解更多指标,请参阅 第 3.6.3.2 节 “dev Workspace 特定指标”。
要排除缺少的指标,请查看 Prometheus 容器日志以了解与 RBAC 相关的错误:
获取 Prometheus pod 的名称:
$ oc get pods -l app.kubernetes.io/name=prometheus -n openshift-monitoring -o=jsonpath='{.items[*].metadata.name}'
从上一步中的 Prometheus pod 输出 Prometheus 容器日志的最后 20 行:
$ oc logs --tail=20 <prometheus_pod_name> -c prometheus -n openshift-monitoring
3.6.3.2. dev Workspace 特定指标
下表描述了 devworkspace-controller-metrics
服务公开的 Dev Workspace 特定指标。
Name | 类型 | 描述 | 标签 |
---|---|---|---|
| 计数 | Dev Workspace 启动事件的数量。 |
|
| 计数 |
Dev Workspaces 的数量成功进入 |
|
| 计数 | 失败的 Dev Workspaces 数量。 |
|
| Histogram | 启动 Dev Workspace 的总时间(以秒为单位)。 |
|
Name | 描述 | 值 |
---|---|---|
|
Dev Workspace 的 |
|
|
Dev Workspace 的 |
|
| 工作区启动失败原因。 |
|
Name | 描述 |
---|---|
| 由于用于创建 Dev Workspace 的无效 devfile 而启动失败。 |
|
由于以下错误导致启动失败: |
| 未知失败原因。 |
3.6.3.3. 从 OpenShift Web 控制台仪表板查看 Dev Workspace Operator 指标
配置 in-cluster Prometheus 实例来收集 Dev Workspace Operator 指标后,您可以在 OpenShift Web 控制台的 Administrator 视角中在自定义仪表板上查看指标。
先决条件
- 您的机构 OpenShift Dev Spaces 实例已安装并在 Red Hat OpenShift 中运行。
-
具有对目标 OpenShift 集群的管理权限的活跃
oc
会话。请参阅 CLI 入门。 - in-cluster Prometheus 实例正在收集指标。请参阅 第 3.6.3.1 节 “收集 Dev Workspace Operator 指标”。
流程
在
openshift-config-managed
项目中为仪表板定义创建 ConfigMap,并应用所需的标签。$ oc create configmap grafana-dashboard-dwo \ --from-literal=dwo-dashboard.json="$(curl https://raw.githubusercontent.com/devfile/devworkspace-operator/main/docs/grafana/openshift-console-dashboard.json)" \ -n openshift-config-managed
注意上一命令包含来自上游社区的材料的链接。本材料代表了最新可用内容和最新的最佳实践。这些提示尚未被红帽的 QE 部门审查,它们尚未被广泛的用户组验证。请谨慎使用此信息。
$ oc label configmap grafana-dashboard-dwo console.openshift.io/dashboard=true -n openshift-config-managed
注意仪表板定义基于 Grafana 6.x 仪表板。OpenShift Web 控制台不支持所有 Grafana 6.x 仪表板功能。
验证步骤
-
在 OpenShift Web 控制台的 Administrator 视图中,进入 Observe
Dashboards。 -
前往 Dashboard
Che Server JVM,再验证仪表板面板是否包含数据。
3.6.3.4. Dev Workspace Operator 的仪表板
OpenShift Web 控制台自定义仪表板基于 Grafana 6.x,显示 Dev Workspace Operator 中的以下指标。
不是 Grafana 6.x 仪表板的所有功能都作为 OpenShift Web 控制台仪表板支持。
3.6.3.4.1. dev Workspace 指标
Dev Workspace 特定的指标显示在 Dev Workspace Metrics 面板中。
图 3.1. Dev Workspace Metrics 面板
- 平均工作区启动时间
- 平均工作区启动持续时间。
- 工作区启动
- 成功和失败的工作区启动数量。
- dev Workspace 成功和失败
- 成功和失败的 Dev Workspace 启动之间的比较。
- dev Workspace 失败率
- 失败工作区启动数量和工作空间启动总数之间的比率。
- dev Workspace 启动失败原因
显示工作区启动故障分布的 pie chart:
-
BadRequest
-
InfrastructureFailure
-
Unknown
-
3.6.3.4.2. Operator 指标
Operator 特定指标显示在 Operator Metrics 面板中。
图 3.2. Operator 指标面板
- flight 中的 Webhook
- 不同 Webhook 请求数量之间的比较。
- 工作队列深度
- 工作队列中的协调请求数。
- memory
- Dev Workspace 控制器和 Dev Workspace Webhook 服务器的内存用量。
- 平均每秒协调数(DWO)
- Dev Workspace 控制器的平均每秒协调数。
3.6.4. 监控 Dev Spaces Server
您可以配置 OpenShift Dev Spaces 以公开 JVM 指标,如 JVM 内存和 OpenShift Dev Spaces 服务器的类加载。
3.6.4.1. 启用和公开 OpenShift Dev Spaces 服务器指标
OpenShift Dev Spaces 在 che-host
Service 的端口 8087
上公开 JVM 指标。您可以配置此行为。
流程
配置
CheCluster
自定义资源。请参阅 第 3.1.2 节 “使用 CLI 配置 CheCluster 自定义资源”。spec: components: metrics: enable: <boolean> 1
- 1
true
来启用,false
会禁用。
3.6.4.2. 使用 Prometheus 收集 OpenShift Dev Spaces Server 指标
使用 in-cluster Prometheus 实例为 OpenShift Dev Spaces Server 收集、存储和查询 JVM 指标:
先决条件
- 您的机构 OpenShift Dev Spaces 实例已安装并在 Red Hat OpenShift 中运行。
-
具有对目标 OpenShift 集群的管理权限的活跃
oc
会话。请参阅 CLI 入门。 -
OpenShift Dev Spaces 在端口
8087
上公开指标。请参阅启用和公开 OpenShift Dev Spaces 服务器 JVM 指标。
流程
创建用于检测 OpenShift Dev Spaces JVM 指标服务的 ServiceMonitor。
例 3.39. ServiceMonitor
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: che-host namespace: openshift-devspaces 1 spec: endpoints: - interval: 10s 2 port: metrics scheme: http namespaceSelector: matchNames: - openshift-devspaces 3 selector: matchLabels: app.kubernetes.io/name: devspaces
创建 Role 和 RoleBinding,以允许 Prometheus 查看指标。
例 3.40. 角色
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: prometheus-k8s namespace: openshift-devspaces 1 rules: - verbs: - get - list - watch apiGroups: - '' resources: - services - endpoints - pods
- 1
- OpenShift Dev Spaces 命名空间。默认值为
openshift-devspaces
。
例 3.41. RoleBinding
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: view-devspaces-openshift-monitoring-prometheus-k8s namespace: openshift-devspaces 1 subjects: - kind: ServiceAccount name: prometheus-k8s namespace: openshift-monitoring roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: prometheus-k8s
- 1
- OpenShift Dev Spaces 命名空间。默认值为
openshift-devspaces
。
允许 in-cluster Prometheus 实例检测 OpenShift Dev Spaces 命名空间中的 ServiceMonitor。默认的 OpenShift Dev Spaces 命名空间为
openshift-devspaces
。$ oc label namespace openshift-devspaces openshift.io/cluster-monitoring=true
验证
-
在 OpenShift Web 控制台的 Administrator 视图中,进入 Observe
Metrics。 -
运行 PromQL 查询以确认指标可用。例如,输入
process_uptime_seconds{job="che-host"}
,然后点 Run query。
要排除缺少的指标,请查看 Prometheus 容器日志以了解与 RBAC 相关的错误:
获取 Prometheus pod 的名称:
$ oc get pods -l app.kubernetes.io/name=prometheus -n openshift-monitoring -o=jsonpath='{.items[*].metadata.name}'
从上一步中的 Prometheus pod 输出 Prometheus 容器日志的最后 20 行:
$ oc logs --tail=20 <prometheus_pod_name> -c prometheus -n openshift-monitoring
3.6.4.3. 从 OpenShift Web 控制台仪表板查看 OpenShift Dev Spaces Server
配置 in-cluster Prometheus 实例来收集 OpenShift Dev Spaces Server JVM 指标后,您可以在 OpenShift Web 控制台的 Administrator 视角中在自定义仪表板上查看指标。
先决条件
- 您的机构 OpenShift Dev Spaces 实例已安装并在 Red Hat OpenShift 中运行。
-
具有对目标 OpenShift 集群的管理权限的活跃
oc
会话。请参阅 CLI 入门。 - in-cluster Prometheus 实例正在收集指标。请参阅 第 3.6.4.2 节 “使用 Prometheus 收集 OpenShift Dev Spaces Server 指标”。
流程
在
openshift-config-managed
项目中为仪表板定义创建 ConfigMap,并应用所需的标签。$ oc create configmap grafana-dashboard-devspaces-server \ --from-literal=devspaces-server-dashboard.json="$(curl https://raw.githubusercontent.com/eclipse-che/che-server/main/docs/grafana/openshift-console-dashboard.json)" \ -n openshift-config-managed
注意上一命令包含来自上游社区的材料的链接。本材料代表了最新可用内容和最新的最佳实践。这些提示尚未被红帽的 QE 部门审查,它们尚未被广泛的用户组验证。请谨慎使用此信息。
$ oc label configmap grafana-dashboard-devspaces-server console.openshift.io/dashboard=true -n openshift-config-managed
注意仪表板定义基于 Grafana 6.x 仪表板。OpenShift Web 控制台不支持所有 Grafana 6.x 仪表板功能。
验证步骤
-
在 OpenShift Web 控制台的 Administrator 视图中,进入 Observe
Dashboards。 进入 Dashboard
Dev Workspace Operator,验证仪表板面板是否包含数据。 图 3.3. 快速事实
图 3.4. JVM 内存
图 3.5. JVM Misc
图 3.6. JVM 内存池(heap)
图 3.7. JVM 内存池(Non-Heap)
图 3.8. 垃圾回收
图 3.9. 类加载
图 3.10. 缓冲池