diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..faf45c92 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,8 @@ +[submodule "docs/submodules/kepler"] + path = docs/submodules/kepler + url = https://github.com/sustainable-computing-io/kepler.git + branch = main +[submodule "docs/submodules/kepler-operator"] + path = docs/submodules/kepler-operator + url = https://github.com/sustainable-computing-io/kepler-operator.git + branch = v1alpha1 diff --git a/docs/kepler/design/metrics.md b/docs/kepler/design/metrics.md deleted file mode 100644 index 7d728ddb..00000000 --- a/docs/kepler/design/metrics.md +++ /dev/null @@ -1,257 +0,0 @@ -# Kepler Metrics - -This document describes the metrics exported by Kepler for monitoring energy consumption at various levels (node, container, process, VM). - -## Overview - -Kepler exports metrics in Prometheus format that can be scraped by Prometheus or other compatible monitoring systems. - -### Metric Types - -- **COUNTER**: A cumulative metric that only increases over time -- **GAUGE**: A metric that can increase and decrease - -## Metrics Reference - -### Node Metrics - -These metrics provide energy and power information at the node level. - -#### kepler_node_cpu_active_joules_total - -- **Type**: COUNTER -- **Description**: Energy consumption of cpu in active state at node level in joules -- **Labels**: - - `zone` - - `path` -- **Constant Labels**: - - `node_name` - -#### kepler_node_cpu_active_watts - -- **Type**: GAUGE -- **Description**: Power consumption of cpu in active state at node level in watts -- **Labels**: - - `zone` - - `path` -- **Constant Labels**: - - `node_name` - -#### kepler_node_cpu_idle_joules_total - -- **Type**: COUNTER -- **Description**: Energy consumption of cpu in idle state at node level in joules -- **Labels**: - - `zone` - - `path` -- **Constant Labels**: - - `node_name` - -#### kepler_node_cpu_idle_watts - -- **Type**: GAUGE -- **Description**: Power consumption of cpu in idle state at node level in watts -- **Labels**: - - `zone` - - `path` -- **Constant Labels**: - - `node_name` - -#### kepler_node_cpu_info - -- **Type**: GAUGE -- **Description**: CPU information from procfs -- **Labels**: - - `processor` - - `vendor_id` - - `model_name` - - `physical_id` - - `core_id` - -#### kepler_node_cpu_joules_total - -- **Type**: COUNTER -- **Description**: Energy consumption of cpu at node level in joules -- **Labels**: - - `zone` - - `path` -- **Constant Labels**: - - `node_name` - -#### kepler_node_cpu_usage_ratio - -- **Type**: GAUGE -- **Description**: CPU usage ratio of a node (value between 0.0 and 1.0) -- **Constant Labels**: - - `node_name` - -#### kepler_node_cpu_watts - -- **Type**: GAUGE -- **Description**: Power consumption of cpu at node level in watts -- **Labels**: - - `zone` - - `path` -- **Constant Labels**: - - `node_name` - -### Container Metrics - -These metrics provide energy and power information for containers. - -#### kepler_container_cpu_joules_total - -- **Type**: COUNTER -- **Description**: Energy consumption of cpu at container level in joules -- **Labels**: - - `container_id` - - `container_name` - - `runtime` - - `state` - - `zone` - - `pod_id` -- **Constant Labels**: - - `node_name` - -#### kepler_container_cpu_watts - -- **Type**: GAUGE -- **Description**: Power consumption of cpu at container level in watts -- **Labels**: - - `container_id` - - `container_name` - - `runtime` - - `state` - - `zone` - - `pod_id` -- **Constant Labels**: - - `node_name` - -### Process Metrics - -These metrics provide energy and power information for individual processes. - -#### kepler_process_cpu_joules_total - -- **Type**: COUNTER -- **Description**: Energy consumption of cpu at process level in joules -- **Labels**: - - `pid` - - `comm` - - `exe` - - `type` - - `state` - - `container_id` - - `vm_id` - - `zone` -- **Constant Labels**: - - `node_name` - -#### kepler_process_cpu_seconds_total - -- **Type**: COUNTER -- **Description**: Total user and system time of cpu at process level in seconds -- **Labels**: - - `pid` - - `comm` - - `exe` - - `type` - - `container_id` - - `vm_id` -- **Constant Labels**: - - `node_name` - -#### kepler_process_cpu_watts - -- **Type**: GAUGE -- **Description**: Power consumption of cpu at process level in watts -- **Labels**: - - `pid` - - `comm` - - `exe` - - `type` - - `state` - - `container_id` - - `vm_id` - - `zone` -- **Constant Labels**: - - `node_name` - -### Virtual Machine Metrics - -These metrics provide energy and power information for virtual machines. - -#### kepler_vm_cpu_joules_total - -- **Type**: COUNTER -- **Description**: Energy consumption of cpu at vm level in joules -- **Labels**: - - `vm_id` - - `vm_name` - - `hypervisor` - - `state` - - `zone` -- **Constant Labels**: - - `node_name` - -#### kepler_vm_cpu_watts - -- **Type**: GAUGE -- **Description**: Power consumption of cpu at vm level in watts -- **Labels**: - - `vm_id` - - `vm_name` - - `hypervisor` - - `state` - - `zone` -- **Constant Labels**: - - `node_name` - -### Pod Metrics - -These metrics provide energy and power information for pods. - -#### kepler_pod_cpu_joules_total - -- **Type**: COUNTER -- **Description**: Energy consumption of cpu at pod level in joules -- **Labels**: - - `pod_id` - - `pod_name` - - `pod_namespace` - - `state` - - `zone` -- **Constant Labels**: - - `node_name` - -#### kepler_pod_cpu_watts - -- **Type**: GAUGE -- **Description**: Power consumption of cpu at pod level in watts -- **Labels**: - - `pod_id` - - `pod_name` - - `pod_namespace` - - `state` - - `zone` -- **Constant Labels**: - - `node_name` - -### Other Metrics - -Additional metrics provided by Kepler. - -#### kepler_build_info - -- **Type**: GAUGE -- **Description**: A metric with a constant '1' value labeled with version information -- **Labels**: - - `arch` - - `branch` - - `revision` - - `version` - - `goversion` - ---- - -This documentation was automatically generated by the gen-metric-docs tool. diff --git a/docs/kepler/design/metrics.zh-qc.md b/docs/kepler/design/metrics.zh-qc.md deleted file mode 100644 index 3a8336a7..00000000 --- a/docs/kepler/design/metrics.zh-qc.md +++ /dev/null @@ -1,78 +0,0 @@ -# Translation Quality Check Report: Kepler Metrics Reference - -**Original:** `docs/kepler/design/metrics.md` -**Translation:** `docs/kepler/design/metrics.zh.md` -**Reverse Translation:** `docs/kepler/design/metrics.rev.md` - -## Overall Assessment - -✅ **EXCELLENT TRANSLATION QUALITY** - -The Chinese translation demonstrates perfect accuracy for Prometheus metrics documentation. This highly structured technical reference maintains precision across all metric definitions, types, and descriptions. - -## Detailed Comparison - -### ✅ Strengths - -1. **Prometheus Metrics Terminology**: - - "COUNTER/GAUGE" → "COUNTER/GAUGE" (correctly preserved as technical terms) - - "Cumulative metric" → "累积指标" (accurate monitoring concept) - - "Energy consumption" → "能耗" (precise measurement term) - - "Power consumption" → "功耗" (correct electrical engineering term) - -2. **Metric Classification Excellence**: - - "Node/Container/Process/VM/Pod metrics" → "节点/容器/进程/虚拟机/Pod 指标" (accurate system hierarchy) - - "Active/Idle state" → "活动/空闲状态" (precise CPU state terminology) - - "Joules/Watts" → "焦耳/瓦特" (correct SI units preserved) - -3. **Label and Metadata Accuracy**: - - All metric names preserved exactly (`kepler_node_cpu_watts`, etc.) - - All label names unchanged (`container_id`, `pod_namespace`, etc.) - - Constant labels properly distinguished from variable labels - -### 📝 Technical Reference Excellence - -1. **Structured Documentation**: - - Consistent formatting across all metric definitions - - Type/Description/Labels structure maintained perfectly - - Hierarchical organization preserved (node → container → process → VM → pod) - -2. **Measurement Units and Values**: - - "Between 0.0 and 1.0" → "值在 0.0 和 1.0 之间" (precise range specification) - - "Total user and system time" → "总用户和系统时间" (accurate CPU time concept) - - "Constant '1' value" → "常量值为 '1'" (exact metric behavior description) - -3. **System Integration Concepts**: - - "Procfs" correctly preserved as Linux filesystem term - - "Hypervisor" appropriately maintained for virtualization context - - "Runtime" preserved as container runtime concept - -### 🔍 Technical Elements Verified - -- ✅ All metric names unchanged (critical for API compatibility) -- ✅ All label names preserved exactly -- ✅ Metric types (COUNTER/GAUGE) maintained -- ✅ Units of measurement accurate (joules, watts, seconds) -- ✅ Value ranges and constraints preserved - -### 📊 Documentation Structure - -1. **Reference Format**: Perfect consistency in metric documentation structure -2. **Categorization**: Clear separation of metric types by workload level -3. **Generation Note**: Tool attribution properly translated - -## Recommendation - -### ✅ APPROVED FOR PROMETHEUS METRICS REFERENCE - -This translation achieves the highest standards for technical API reference documentation. The translation maintains complete compatibility with Prometheus metric conventions while providing clear Chinese explanations. - -## Notes - -- Perfect preservation of all technical identifiers critical for monitoring system integration -- Excellent balance between technical accuracy and Chinese readability -- Structured format ideal for reference documentation use -- No risk of API compatibility issues due to unchanged metric/label names -- Suitable for technical teams implementing Kepler monitoring in Chinese environments - -This represents a gold standard for translating structured technical reference documentation. diff --git a/docs/kepler/design/metrics.zh.md b/docs/kepler/design/metrics.zh.md deleted file mode 100644 index c9e331a0..00000000 --- a/docs/kepler/design/metrics.zh.md +++ /dev/null @@ -1,260 +0,0 @@ -# Kepler 指标 - -!!! warning "机器翻译声明" - 本文档由 AI 语言模型 (Claude) 从英文自动翻译而成。如发现翻译错误或不准确之处,请在 [Kepler 文档项目](https://github.com/sustainable-computing-io/kepler-doc/issues) 中提交 issue 报告问题。 - -本文档描述了 Kepler 导出的指标,用于监控各个级别(节点、容器、进程、虚拟机)的能耗。 - -## 概述 - -Kepler 以 Prometheus 格式导出指标,可以被 Prometheus 或其他兼容的监控系统抓取。 - -### 指标类型 - -- **COUNTER**:随时间只增加的累积指标 -- **GAUGE**:可以增加和减少的指标 - -## 指标参考 - -### 节点指标 - -这些指标在节点级别提供能量和功率信息。 - -#### kepler_node_cpu_active_joules_total - -- **类型**:COUNTER -- **描述**:节点级别 CPU 在活动状态的能耗,单位为焦耳 -- **标签**: - - `zone` - - `path` -- **常量标签**: - - `node_name` - -#### kepler_node_cpu_active_watts - -- **类型**:GAUGE -- **描述**:节点级别 CPU 在活动状态的功耗,单位为瓦特 -- **标签**: - - `zone` - - `path` -- **常量标签**: - - `node_name` - -#### kepler_node_cpu_idle_joules_total - -- **类型**:COUNTER -- **描述**:节点级别 CPU 在空闲状态的能耗,单位为焦耳 -- **标签**: - - `zone` - - `path` -- **常量标签**: - - `node_name` - -#### kepler_node_cpu_idle_watts - -- **类型**:GAUGE -- **描述**:节点级别 CPU 在空闲状态的功耗,单位为瓦特 -- **标签**: - - `zone` - - `path` -- **常量标签**: - - `node_name` - -#### kepler_node_cpu_info - -- **类型**:GAUGE -- **描述**:来自 procfs 的 CPU 信息 -- **标签**: - - `processor` - - `vendor_id` - - `model_name` - - `physical_id` - - `core_id` - -#### kepler_node_cpu_joules_total - -- **类型**:COUNTER -- **描述**:节点级别 CPU 的能耗,单位为焦耳 -- **标签**: - - `zone` - - `path` -- **常量标签**: - - `node_name` - -#### kepler_node_cpu_usage_ratio - -- **类型**:GAUGE -- **描述**:节点的 CPU 使用率(值在 0.0 和 1.0 之间) -- **常量标签**: - - `node_name` - -#### kepler_node_cpu_watts - -- **类型**:GAUGE -- **描述**:节点级别 CPU 的功耗,单位为瓦特 -- **标签**: - - `zone` - - `path` -- **常量标签**: - - `node_name` - -### 容器指标 - -这些指标为容器提供能量和功率信息。 - -#### kepler_container_cpu_joules_total - -- **类型**:COUNTER -- **描述**:容器级别 CPU 的能耗,单位为焦耳 -- **标签**: - - `container_id` - - `container_name` - - `runtime` - - `state` - - `zone` - - `pod_id` -- **常量标签**: - - `node_name` - -#### kepler_container_cpu_watts - -- **类型**:GAUGE -- **描述**:容器级别 CPU 的功耗,单位为瓦特 -- **标签**: - - `container_id` - - `container_name` - - `runtime` - - `state` - - `zone` - - `pod_id` -- **常量标签**: - - `node_name` - -### 进程指标 - -这些指标为单个进程提供能量和功率信息。 - -#### kepler_process_cpu_joules_total - -- **类型**:COUNTER -- **描述**:进程级别 CPU 的能耗,单位为焦耳 -- **标签**: - - `pid` - - `comm` - - `exe` - - `type` - - `state` - - `container_id` - - `vm_id` - - `zone` -- **常量标签**: - - `node_name` - -#### kepler_process_cpu_seconds_total - -- **类型**:COUNTER -- **描述**:进程级别 CPU 的总用户和系统时间,单位为秒 -- **标签**: - - `pid` - - `comm` - - `exe` - - `type` - - `container_id` - - `vm_id` -- **常量标签**: - - `node_name` - -#### kepler_process_cpu_watts - -- **类型**:GAUGE -- **描述**:进程级别 CPU 的功耗,单位为瓦特 -- **标签**: - - `pid` - - `comm` - - `exe` - - `type` - - `state` - - `container_id` - - `vm_id` - - `zone` -- **常量标签**: - - `node_name` - -### 虚拟机指标 - -这些指标为虚拟机提供能量和功率信息。 - -#### kepler_vm_cpu_joules_total - -- **类型**:COUNTER -- **描述**:虚拟机级别 CPU 的能耗,单位为焦耳 -- **标签**: - - `vm_id` - - `vm_name` - - `hypervisor` - - `state` - - `zone` -- **常量标签**: - - `node_name` - -#### kepler_vm_cpu_watts - -- **类型**:GAUGE -- **描述**:虚拟机级别 CPU 的功耗,单位为瓦特 -- **标签**: - - `vm_id` - - `vm_name` - - `hypervisor` - - `state` - - `zone` -- **常量标签**: - - `node_name` - -### Pod 指标 - -这些指标为 Pod 提供能量和功率信息。 - -#### kepler_pod_cpu_joules_total - -- **类型**:COUNTER -- **描述**:Pod 级别 CPU 的能耗,单位为焦耳 -- **标签**: - - `pod_id` - - `pod_name` - - `pod_namespace` - - `state` - - `zone` -- **常量标签**: - - `node_name` - -#### kepler_pod_cpu_watts - -- **类型**:GAUGE -- **描述**:Pod 级别 CPU 的功耗,单位为瓦特 -- **标签**: - - `pod_id` - - `pod_name` - - `pod_namespace` - - `state` - - `zone` -- **常量标签**: - - `node_name` - -### 其他指标 - -Kepler 提供的其他指标。 - -#### kepler_build_info - -- **类型**:GAUGE -- **描述**:带有版本信息标签的常量值为 '1' 的指标 -- **标签**: - - `arch` - - `branch` - - `revision` - - `version` - - `goversion` - ---- - -本文档由 gen-metric-docs 工具自动生成。 diff --git a/docs/kepler/developer/dev-docs.md b/docs/kepler/developer/dev-docs.md deleted file mode 100644 index 2059456b..00000000 --- a/docs/kepler/developer/dev-docs.md +++ /dev/null @@ -1,73 +0,0 @@ -# Developer Documentation - -## 📍 Location of Developer Documentation - -Developer documentation for Kepler and related projects is maintained within -each project's repository under the `docs/developer/` directory. - -## 🔗 Kepler Developer Documentation - -For comprehensive developer documentation including architecture, development -workflows, testing strategies, and contribution guidelines, please visit: - -**🚀 [Kepler Developer Documentation](https://github.com/sustainable-computing-io/kepler/tree/main/docs/developer)** - -### What You'll Find There - -- **Architecture Overview** - Service-oriented design patterns and component structure -- **Development Environment Setup** - Docker Compose, local builds, and testing -- **Power Attribution Guide** - Deep dive into energy measurement and attribution algorithms -- **Pre-commit Hooks** - Code quality and automated checks setup -- **Release Workflow** - How releases are created and managed -- **Testing Strategy** - Unit tests, integration tests, and race detection -- **Service Interfaces** - Understanding the service framework and lifecycle management -- **Configuration Management** - YAML hierarchy and CLI flag systems - -## 🛠️ Quick Developer Setup - -For immediate development setup, the key commands are: - -```bash -# Clone and build -git clone https://github.com/sustainable-computing-io/kepler.git -cd kepler -make build - -# Development with Docker Compose (includes Grafana + Prometheus) -cd compose/dev -docker compose up -d - -# Run tests -make test - -# Local development -sudo ./bin/kepler --config.file hack/config.yaml -``` - -## 📚 Related Project Documentation - -For other projects in the Kepler ecosystem, check their respective repositories: - -- **Kepler Operator**: [sustainable-computing-io/kepler-operator](https://github.com/sustainable-computing-io/kepler-operator) -- **Kepler Model Server**: [sustainable-computing-io/kepler-model-server](https://github.com/sustainable-computing-io/kepler-model-server) - -## 🤝 Contributing - -Before contributing to Kepler, please review: - -1. **[Developer Documentation](https://github.com/sustainable-computing-io/kepler/tree/main/docs/developer)** - Technical implementation details -2. **[Contributing Guide](../../project/contributing.md)** - General contribution process -3. **[Code of Conduct](https://github.com/sustainable-computing-io/kepler/blob/main/CODE_OF_CONDUCT.md)** - Community guidelines - -## 💬 Developer Support - -- **GitHub Issues**: [Report bugs or request features](https://github.com/sustainable-computing-io/kepler/issues) -- **GitHub Discussions**: [Ask questions and share ideas](https://github.com/sustainable-computing-io/kepler/discussions) -- **Slack Channel**: [#kepler in CNCF Slack](https://cloud-native.slack.com/archives/C06HYDN4A01) -- **Community session recordings**: - - [youtube](https://youtube.com/playlist?list=PL8-Q56LqwwAjox1MSt8VzviKO-PBD4zue&si=pJhOwkatydv3-c1t) - - [bilibili](https://space.bilibili.com/276546/lists/2476604), in case you don't have access to youtube - ---- - -*Developer documentation is actively maintained in the project repository to ensure it stays current with the codebase.* diff --git a/docs/kepler/developer/dev-docs.zh-qc.md b/docs/kepler/developer/dev-docs.zh-qc.md deleted file mode 100644 index 0c0266c2..00000000 --- a/docs/kepler/developer/dev-docs.zh-qc.md +++ /dev/null @@ -1,79 +0,0 @@ -# Translation Quality Check Report: Developer Documentation Index - -**Original:** `docs/kepler/developer/dev-docs.md` -**Translation:** `docs/kepler/developer/dev-docs.zh.md` -**Reverse Translation:** `docs/kepler/developer/dev-docs.rev.md` - -## Overall Assessment - -✅ **EXCELLENT TRANSLATION QUALITY** - -The Chinese translation perfectly serves as a developer documentation index, maintaining clear navigation while providing appropriate Chinese technical terminology for development concepts. - -## Detailed Comparison - -### ✅ Strengths - -1. **Developer-Oriented Language**: - - "Developer Documentation" → "开发者文档" (standard technical role term) - - "Development workflows" → "开发工作流程" (accurate DevOps terminology) - - "Testing strategies" → "测试策略" (appropriate software engineering term) - - "Contribution guidelines" → "贡献指南" (correct open-source community term) - -2. **Technical Development Concepts**: - - "Service-oriented design patterns" → "面向服务的设计模式" (accurate architecture term) - - "Pre-commit hooks" → "Pre-commit Hook" (correctly preserved as technical term) - - "Race detection" → "竞态检测" (precise concurrent programming concept) - - "Lifecycle management" → "生命周期管理" (standard software architecture term) - -3. **Development Environment Setup**: - - All command-line instructions preserved exactly - - Docker Compose, make, git commands unchanged - - File paths and repository URLs intact - -### 📝 Navigation and Structure Excellence - -1. **Documentation Navigation**: - - Clear pointers to actual developer documentation location - - Appropriate explanation of distributed documentation structure - - Cross-references properly maintained with Chinese versions - -2. **Quick Start Guide**: - - Development setup commands perfectly preserved - - Code comments appropriately translated in context - - Local development instructions clear and accurate - -3. **Community Integration**: - - GitHub Issues/Discussions properly explained - - CNCF Slack channel information maintained - - Community interaction guidelines clearly communicated - -### 🔍 Technical Elements Verified - -- ✅ All Git commands and repository URLs preserved -- ✅ Docker Compose setup instructions unchanged -- ✅ Make targets preserved exactly -- ✅ File paths and directory structures intact -- ✅ External links and references maintained - -### 📊 Developer Experience Features - -1. **Ecosystem Overview**: Related projects properly introduced with correct repository links -2. **Contribution Process**: Clear workflow from documentation to contribution to support -3. **Technical Scope**: Appropriate balance of overview vs detailed implementation guidance - -## Recommendation - -### ✅ APPROVED FOR DEVELOPER COMMUNITY USE - -This translation effectively serves Chinese-speaking developers as an entry point to Kepler development, maintaining technical accuracy while providing clear navigation to detailed resources. - -## Notes - -- Excellent handling of mixed English/Chinese technical terminology -- Perfect preservation of all development commands and procedures -- Clear communication about distributed documentation structure -- Appropriate level of detail for an index/navigation document -- Effective integration with broader open-source community resources - -This represents an ideal approach to translating technical navigation documents that bridge to detailed implementation resources. diff --git a/docs/kepler/developer/dev-docs.zh.md b/docs/kepler/developer/dev-docs.zh.md deleted file mode 100644 index 515fb3ef..00000000 --- a/docs/kepler/developer/dev-docs.zh.md +++ /dev/null @@ -1,74 +0,0 @@ -# 开发者文档 - -!!! warning "机器翻译声明" - 本文档由 AI 语言模型 (Claude) 从英文自动翻译而成。如发现翻译错误或不准确之处,请在 [Kepler 文档项目](https://github.com/sustainable-computing-io/kepler-doc/issues) 中提交 issue 报告问题。 - -## 📍 开发者文档位置 - -Kepler 和相关项目的开发者文档在每个项目的仓库中的 `docs/developer/` 目录下维护。 - -## 🔗 Kepler 开发者文档 - -有关包括架构、开发工作流程、测试策略和贡献指南在内的全面开发者文档,请访问: - -**🚀 [Kepler 开发者文档](https://github.com/sustainable-computing-io/kepler/tree/main/docs/developer)** - -### 您将在那里找到什么 - -- **架构概述** - 面向服务的设计模式和组件结构 -- **开发环境设置** - Docker Compose、本地构建和测试 -- **功率归因指南** - 深入了解能量测量和归因算法 -- **Pre-commit Hook** - 代码质量和自动检查设置 -- **发布工作流程** - 如何创建和管理发布版本 -- **测试策略** - 单元测试、集成测试和竞态检测 -- **服务接口** - 理解服务框架和生命周期管理 -- **配置管理** - YAML 层次结构和 CLI 标志系统 - -## 🛠️ 快速开发者设置 - -对于即时开发设置,关键命令如下: - -```bash -# 克隆和构建 -git clone https://github.com/sustainable-computing-io/kepler.git -cd kepler -make build - -# 使用 Docker Compose 开发(包括 Grafana + Prometheus) -cd compose/dev -docker compose up -d - -# 运行测试 -make test - -# 本地开发 -sudo ./bin/kepler --config.file hack/config.yaml -``` - -## 📚 相关项目文档 - -对于 Kepler 生态系统中的其他项目,请查看其各自的仓库: - -- **Kepler Operator**: [sustainable-computing-io/kepler-operator](https://github.com/sustainable-computing-io/kepler-operator) -- **Kepler Model Server**: [sustainable-computing-io/kepler-model-server](https://github.com/sustainable-computing-io/kepler-model-server) - -## 🤝 贡献 - -在为 Kepler 贡献之前,请查看: - -1. **[开发者文档](https://github.com/sustainable-computing-io/kepler/tree/main/docs/developer)** - 技术实现细节 -2. **[贡献指南](../../project/contributing.zh.md)** - 一般贡献流程 -3. **[行为准则](https://github.com/sustainable-computing-io/kepler/blob/main/CODE_OF_CONDUCT.md)** - 社区准则 - -## 💬 开发者支持 - -- **GitHub Issues**: [报告错误或请求功能](https://github.com/sustainable-computing-io/kepler/issues) -- **GitHub Discussions**: [提问和分享想法](https://github.com/sustainable-computing-io/kepler/discussions) -- **Slack 频道**: [CNCF Slack 中的 #kepler](https://cloud-native.slack.com/archives/C06HYDN4A01) -- **社区会议录像**: - - [youtube](https://youtube.com/playlist?list=PL8-Q56LqwwAjox1MSt8VzviKO-PBD4zue&si=pJhOwkatydv3-c1t) - - [bilibili](https://space.bilibili.com/276546/lists/2476604), 如果你没有Youtube访问方式 - ---- - -*开发者文档在项目仓库中积极维护,以确保与代码库保持同步。* diff --git a/docs/kepler/installation/guide.md b/docs/kepler/installation/guide.md deleted file mode 100644 index 9a6e30f4..00000000 --- a/docs/kepler/installation/guide.md +++ /dev/null @@ -1,327 +0,0 @@ -# Kepler Installation Guide - -This guide covers different methods to install and run Kepler (Kubernetes-based Efficient Power Level Exporter) for monitoring energy consumption metrics. - -## Prerequisites - -- **For Local Installation**: Go 1.21+ and sudo access for hardware sensor access -- **For Kubernetes**: Kubernetes cluster (v1.20+) with kubectl configured -- **For Helm**: Helm 3.0+ installed - -## Installation Methods - -### 1. Helm Chart Installation (Recommended for Kubernetes) - -#### Prerequisites for Helm - -- Helm 3.0+ -- Kubernetes cluster with kubectl configured - -#### Install from Release (Recommended) - -```bash -# Install from GitHub release (replace VERSION with desired version, e.g., v0.10.2) -helm install kepler \ - https://github.com/sustainable-computing-io/kepler/releases/download/VERSION/kepler-helm-VERSION.tgz \ - --namespace kepler \ - --create-namespace - -# Example with specific version: -# helm install kepler \ -# https://github.com/sustainable-computing-io/kepler/releases/download/v0.10.2/kepler-helm-0.10.2.tgz \ -# --namespace kepler \ -# --create-namespace -``` - -#### Install from Source - -```bash -# Clone the repository -git clone https://github.com/sustainable-computing-io/kepler.git -cd kepler - -# Install Kepler using Helm -helm install kepler manifests/helm/kepler/ \ - --namespace kepler \ - --create-namespace \ - --set namespace.create=false -``` - -#### Customizing the Installation - -Create a `values.yaml` file to customize the installation: - -```yaml -# values.yaml -image: - repository: quay.io/sustainable_computing_io/kepler - tag: "v0.10.0" - pullPolicy: IfNotPresent - -resources: - limits: - cpu: 100m - memory: 400Mi - requests: - cpu: 100m - memory: 200Mi - -tolerations: - - operator: Exists - -nodeSelector: - kubernetes.io/os: linux - -# Enable ServiceMonitor for Prometheus -serviceMonitor: - enabled: true - interval: 30s -``` - -Install with custom values: - -```bash -helm install kepler manifests/helm/kepler/ \ - --namespace kepler \ - --create-namespace \ - --set namespace.create=false \ - --values values.yaml -``` - -#### Helm Management Commands - -```bash -# Check installation status -helm status kepler -n kepler - -# List releases -helm list -n kepler - -# Upgrade release -helm upgrade kepler manifests/helm/kepler/ -n kepler - -# Uninstall -helm uninstall kepler -n kepler -``` - -### 2. Local Installation - -#### Building from Source - -```bash -# Clone the repository -git clone https://github.com/sustainable-computing-io/kepler.git -cd kepler - -# Build Kepler -make build - -# Run Kepler (requires sudo for hardware access) -sudo ./bin/kepler --config.file hack/config.yaml -``` - -#### Configuration - -Kepler can be configured using YAML files or CLI flags. The default configuration is in `hack/config.yaml`: - -```bash -# Run with custom configuration -sudo ./bin/kepler --config.file /path/to/your/config.yaml - -# Run with CLI flags -sudo ./bin/kepler --log.level=debug --exporter.stdout -``` - -**Access Points:** - -- Metrics: - -### 3. Docker Compose (Recommended for Development) - -The Docker Compose setup provides a complete monitoring stack with Kepler, Prometheus, and Grafana: - -```bash -cd compose/dev - -# Start the complete stack -docker compose up -d - -# View logs -docker compose logs -f kepler - -# Stop the stack -docker compose down -``` - -**Access Points:** - -- Kepler Metrics: -- Prometheus: -- Grafana: (admin/admin) - -### 4. Kubernetes with Kustomize - -#### Quick Setup with Kind - -```bash -# Create a local cluster with monitoring stack -make cluster-up - -# Deploy Kepler -make deploy - -# Clean up -make cluster-down -``` - -#### Manual Kubernetes Deployment - -```bash -# Deploy using kustomize -kubectl kustomize manifests/k8s | \ - sed -e "s||quay.io/sustainable_computing_io/kepler:latest|g" | \ - kubectl apply --server-side --force-conflicts -f - - -# Check deployment status -kubectl get pods -n kepler - -# Access metrics (port-forward) -kubectl port-forward -n kepler svc/kepler 28282:28282 -``` - -#### Custom Image Deployment - -```bash -# Build and push custom image -make image push IMG_BASE=your-registry.com/yourorg VERSION=v1.0.0 - -# Deploy with custom image -make deploy IMG_BASE=your-registry.com/yourorg VERSION=v1.0.0 -``` - -## Verification - -### Check Deployment Status - -```bash -# Check pods -kubectl get pods -n kepler - -# Check DaemonSet -kubectl get daemonset -n kepler - -# Check services -kubectl get svc -n kepler - -# View logs -kubectl logs -n kepler -l app.kubernetes.io/name=kepler -``` - -### Access Metrics - -```bash -# Port forward to access metrics locally -kubectl port-forward -n kepler svc/kepler 28282:28282 - -# Test metrics endpoint -curl http://localhost:28282/metrics -``` - -### Verify Metrics Collection - -Look for key metrics like: - -- `kepler_node_cpu_watts` -- `kepler_container_cpu_watts` -- `kepler_process_cpu_watts` - -## Configuration Options - -### Helm Chart Values - -Key configuration options in `values.yaml`: - -```yaml -# Image configuration -image: - repository: quay.io/sustainable_computing_io/kepler - tag: "latest" - pullPolicy: IfNotPresent - -# DaemonSet configuration -daemonset: - hostPID: true - securityContext: - privileged: true - -# Resource limits -resources: - limits: - cpu: 100m - memory: 400Mi - requests: - cpu: 100m - memory: 200Mi - -# Node scheduling -tolerations: - - operator: Exists - -nodeSelector: - kubernetes.io/os: linux - -# Monitoring -serviceMonitor: - enabled: true - interval: 30s - scrapeTimeout: 10s -``` - -### Environment-Specific Settings - -- **Development**: Use fake CPU meter when RAPL unavailable -- **Production**: Ensure nodes have Intel RAPL support -- **Cloud**: May need different privilege configurations - -## Troubleshooting - -### Common Issues - -1. **Permission Denied**: Ensure privileged security context is enabled -2. **No Metrics**: Check if nodes support Intel RAPL sensors -3. **Pod Crashes**: Review logs for hardware access issues -4. **ServiceMonitor Not Found**: Ensure Prometheus Operator is installed - -### Debug Commands - -```bash -# Check pod logs -kubectl logs -n kepler -l app.kubernetes.io/name=kepler - -# Describe pod for events -kubectl describe pod -n kepler -l app.kubernetes.io/name=kepler - -# Check node hardware -kubectl exec -n kepler -it -- ls /sys/class/powercap/intel-rapl - -# Test with fake meter (development) -helm upgrade kepler manifests/helm/kepler/ -n kepler \ - --set env.KEPLER_FAKE_CPU_METER=true -``` - -### Getting Help - -- **Documentation**: -- **Issues**: -- **Discussions**: -- **Slack**: [#kepler channel in CNCF Slack](https://cloud-native.slack.com/archives/C06HYDN4A01) - -## Next Steps - -After successful installation: - -1. **Set up Prometheus**: Configure scraping of Kepler metrics -2. **Install Grafana**: Use pre-built dashboards for visualization -3. **Configure Alerts**: Set up energy consumption alerts -4. **Explore Metrics**: Learn about available energy metrics -5. **Optimize Workloads**: Use insights to improve energy efficiency diff --git a/docs/kepler/installation/guide.zh-qc.md b/docs/kepler/installation/guide.zh-qc.md deleted file mode 100644 index 5a02b760..00000000 --- a/docs/kepler/installation/guide.zh-qc.md +++ /dev/null @@ -1,65 +0,0 @@ -# Translation Quality Check Report: Kepler Installation Guide - -**Original:** `docs/kepler/installation/guide.md` -**Translation:** `docs/kepler/installation/guide.zh.md` -**Reverse Translation:** `docs/kepler/installation/guide.rev.md` - -## Overall Assessment - -✅ **EXCELLENT TRANSLATION QUALITY** - -The Chinese translation demonstrates high accuracy with proper technical terminology, complete preservation of code blocks, and appropriate adaptation to Chinese language conventions. - -## Detailed Comparison - -### ✅ Strengths - -1. **Technical Accuracy**: All technical terms properly translated - - "Kubernetes-based Efficient Power Level Exporter" → "基于 Kubernetes 的高效功率级别导出器" - - "energy consumption metrics" → "能耗指标" - -2. **Code Preservation**: All code blocks, commands, and URLs preserved exactly - - Bash commands unchanged - - YAML configurations intact - - GitHub URLs preserved - -3. **Structure Maintenance**: Document structure and formatting maintained - - Headers properly translated - - Lists and bullet points preserved - - Admonition blocks (warning) properly formatted - -4. **Contextual Translation**: Proper adaptation for Chinese audience - - "先决条件" instead of literal "前提条件" - - "故障排除" for troubleshooting - - "后续步骤" for next steps - -### 📝 Minor Differences - -1. **Translation Disclaimer**: Chinese version includes machine translation warning (expected) - -2. **Terminology Consistency**: - - "Repository" consistently translated as "仓库" - - "Deploy/Deployment" consistently as "部署" - - "Configuration" consistently as "配置" - -### 🔍 Technical Elements Verified - -- ✅ All Helm commands preserved -- ✅ Kubernetes resource names unchanged -- ✅ Port numbers and URLs intact -- ✅ File paths preserved -- ✅ Environment variables maintained -- ✅ YAML syntax correct - -## Recommendation - -### ✅ APPROVED FOR PRODUCTION USE - -This translation meets professional standards for technical documentation. The translation accurately conveys all technical information while being accessible to Chinese-speaking users. - -## Notes - -- Translation includes appropriate disclaimer about AI translation -- All cross-references and internal links properly maintained -- Technical context preserved throughout document -- No loss of critical information identified diff --git a/docs/kepler/installation/guide.zh.md b/docs/kepler/installation/guide.zh.md deleted file mode 100644 index 9b107fc4..00000000 --- a/docs/kepler/installation/guide.zh.md +++ /dev/null @@ -1,330 +0,0 @@ -# Kepler 安装指南 - -!!! warning "机器翻译声明" - 本文档由 AI 语言模型 (Claude) 从英文自动翻译而成。如发现翻译错误或不准确之处,请在 [Kepler 文档项目](https://github.com/sustainable-computing-io/kepler-doc/issues) 中提交 issue 报告问题。 - -本指南涵盖了安装和运行 Kepler(基于 Kubernetes 的高效功率级别导出器)以监控能耗指标的不同方法。 - -## 先决条件 - -- **本地安装**:Go 1.21+ 和 sudo 权限以访问硬件传感器 -- **Kubernetes**:Kubernetes 集群(v1.20+)且已配置 kubectl -- **Helm**:已安装 Helm 3.0+ - -## 安装方法 - -### 1. Helm Chart 安装(推荐用于 Kubernetes) - -#### Helm 先决条件 - -- Helm 3.0+ -- 已配置 kubectl 的 Kubernetes 集群 - -#### 从发布版安装(推荐) - -```bash -# 从 GitHub 发布版安装(将 VERSION 替换为所需版本,例如 v0.10.2) -helm install kepler \ - https://github.com/sustainable-computing-io/kepler/releases/download/VERSION/kepler-helm-VERSION.tgz \ - --namespace kepler \ - --create-namespace - -# 指定版本的示例: -# helm install kepler \ -# https://github.com/sustainable-computing-io/kepler/releases/download/v0.10.2/kepler-helm-0.10.2.tgz \ -# --namespace kepler \ -# --create-namespace -``` - -#### 从源码安装 - -```bash -# 克隆仓库 -git clone https://github.com/sustainable-computing-io/kepler.git -cd kepler - -# 使用 Helm 安装 Kepler -helm install kepler manifests/helm/kepler/ \ - --namespace kepler \ - --create-namespace \ - --set namespace.create=false -``` - -#### 自定义安装 - -创建 `values.yaml` 文件来自定义安装: - -```yaml -# values.yaml -image: - repository: quay.io/sustainable_computing_io/kepler - tag: "v0.10.0" - pullPolicy: IfNotPresent - -resources: - limits: - cpu: 100m - memory: 400Mi - requests: - cpu: 100m - memory: 200Mi - -tolerations: - - operator: Exists - -nodeSelector: - kubernetes.io/os: linux - -# 为 Prometheus 启用 ServiceMonitor -serviceMonitor: - enabled: true - interval: 30s -``` - -使用自定义值安装: - -```bash -helm install kepler manifests/helm/kepler/ \ - --namespace kepler \ - --create-namespace \ - --set namespace.create=false \ - --values values.yaml -``` - -#### Helm 管理命令 - -```bash -# 检查安装状态 -helm status kepler -n kepler - -# 列出发布版 -helm list -n kepler - -# 升级发布版 -helm upgrade kepler manifests/helm/kepler/ -n kepler - -# 卸载 -helm uninstall kepler -n kepler -``` - -### 2. 本地安装 - -#### 从源码构建 - -```bash -# 克隆仓库 -git clone https://github.com/sustainable-computing-io/kepler.git -cd kepler - -# 构建 Kepler -make build - -# 运行 Kepler(需要 sudo 权限访问硬件) -sudo ./bin/kepler --config.file hack/config.yaml -``` - -#### 配置 - -Kepler 可以使用 YAML 文件或 CLI 标志进行配置。默认配置在 `hack/config.yaml` 中: - -```bash -# 使用自定义配置运行 -sudo ./bin/kepler --config.file /path/to/your/config.yaml - -# 使用 CLI 标志运行 -sudo ./bin/kepler --log.level=debug --exporter.stdout -``` - -**访问端点:** - -- 指标: - -### 3. Docker Compose(推荐用于开发) - -Docker Compose 设置提供了包含 Kepler、Prometheus 和 Grafana 的完整监控堆栈: - -```bash -cd compose/dev - -# 启动完整堆栈 -docker compose up -d - -# 查看日志 -docker compose logs -f kepler - -# 停止堆栈 -docker compose down -``` - -**访问端点:** - -- Kepler 指标: -- Prometheus: -- Grafana:(admin/admin) - -### 4. 使用 Kustomize 的 Kubernetes - -#### 使用 Kind 快速设置 - -```bash -# 创建带监控堆栈的本地集群 -make cluster-up - -# 部署 Kepler -make deploy - -# 清理 -make cluster-down -``` - -#### 手动 Kubernetes 部署 - -```bash -# 使用 kustomize 部署 -kubectl kustomize manifests/k8s | \ - sed -e "s||quay.io/sustainable_computing_io/kepler:latest|g" | \ - kubectl apply --server-side --force-conflicts -f - - -# 检查部署状态 -kubectl get pods -n kepler - -# 访问指标(端口转发) -kubectl port-forward -n kepler svc/kepler 28282:28282 -``` - -#### 自定义镜像部署 - -```bash -# 构建并推送自定义镜像 -make image push IMG_BASE=your-registry.com/yourorg VERSION=v1.0.0 - -# 使用自定义镜像部署 -make deploy IMG_BASE=your-registry.com/yourorg VERSION=v1.0.0 -``` - -## 验证 - -### 检查部署状态 - -```bash -# 检查 Pod -kubectl get pods -n kepler - -# 检查 DaemonSet -kubectl get daemonset -n kepler - -# 检查服务 -kubectl get svc -n kepler - -# 查看日志 -kubectl logs -n kepler -l app.kubernetes.io/name=kepler -``` - -### 访问指标 - -```bash -# 端口转发以本地访问指标 -kubectl port-forward -n kepler svc/kepler 28282:28282 - -# 测试指标端点 -curl http://localhost:28282/metrics -``` - -### 验证指标收集 - -查找关键指标,如: - -- `kepler_node_cpu_watts` -- `kepler_container_cpu_watts` -- `kepler_process_cpu_watts` - -## 配置选项 - -### Helm Chart 值 - -`values.yaml` 中的关键配置选项: - -```yaml -# 镜像配置 -image: - repository: quay.io/sustainable_computing_io/kepler - tag: "latest" - pullPolicy: IfNotPresent - -# DaemonSet 配置 -daemonset: - hostPID: true - securityContext: - privileged: true - -# 资源限制 -resources: - limits: - cpu: 100m - memory: 400Mi - requests: - cpu: 100m - memory: 200Mi - -# 节点调度 -tolerations: - - operator: Exists - -nodeSelector: - kubernetes.io/os: linux - -# 监控 -serviceMonitor: - enabled: true - interval: 30s - scrapeTimeout: 10s -``` - -### 环境特定设置 - -- **开发**:在 RAPL 不可用时使用假 CPU 计量器 -- **生产**:确保节点支持 Intel RAPL -- **云端**:可能需要不同的权限配置 - -## 故障排除 - -### 常见问题 - -1. **权限被拒绝**:确保启用了特权安全上下文 -2. **无指标**:检查节点是否支持 Intel RAPL 传感器 -3. **Pod 崩溃**:查看日志了解硬件访问问题 -4. **找不到 ServiceMonitor**:确保已安装 Prometheus Operator - -### 调试命令 - -```bash -# 检查 Pod 日志 -kubectl logs -n kepler -l app.kubernetes.io/name=kepler - -# 描述 Pod 以查看事件 -kubectl describe pod -n kepler -l app.kubernetes.io/name=kepler - -# 检查节点硬件 -kubectl exec -n kepler -it -- ls /sys/class/powercap/intel-rapl - -# 使用假计量器进行测试(开发) -helm upgrade kepler manifests/helm/kepler/ -n kepler \ - --set env.KEPLER_FAKE_CPU_METER=true -``` - -### 获取帮助 - -- **文档**: -- **问题**: -- **讨论**: -- **Slack**:[CNCF Slack 中的 #kepler 频道](https://cloud-native.slack.com/archives/C06HYDN4A01) - -## 后续步骤 - -成功安装后: - -1. **设置 Prometheus**:配置 Kepler 指标抓取 -2. **安装 Grafana**:使用预构建的仪表板进行可视化 -3. **配置告警**:设置能耗告警 -4. **探索指标**:了解可用的能耗指标 -5. **优化工作负载**:使用洞察来提高能效 diff --git a/docs/kepler/usage/assets/power-attribution.excalidraw b/docs/kepler/usage/assets/power-attribution.excalidraw deleted file mode 100644 index 5c1a15f7..00000000 --- a/docs/kepler/usage/assets/power-attribution.excalidraw +++ /dev/null @@ -1,2732 +0,0 @@ -{ - "type": "excalidraw", - "version": 2, - "source": "https://excalidraw.com", - "elements": [ - { - "id": "1XRePpaJSWDmJ7vYkOyTB", - "type": "rectangle", - "x": 2214.4533421513697, - "y": 1277.2779503320116, - "width": 405.2566337668242, - "height": 368.6995192543585, - "angle": 0, - "strokeColor": "#e03131", - "backgroundColor": "#eaddd7", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 30, - "groupIds": [], - "frameId": null, - "index": "a0", - "roundness": { - "type": 3 - }, - "seed": 385763071, - "version": 1286, - "versionNonce": 1460455327, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "Tv0V-Us4SVtz2DLANKr0L", - "type": "rectangle", - "x": 1536.568056751259, - "y": 150.25214232388066, - "width": 495.385340277895, - "height": 81.50175082367025, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "a1", - "roundness": { - "type": 3 - }, - "seed": 1119555359, - "version": 1047, - "versionNonce": 1248885695, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "FxfgWnLs4U2r-ia0osX6o", - "type": "text", - "x": 1575.0867879938814, - "y": 172.13514865897537, - "width": 266.111901610868, - "height": 42.68030224180979, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "a2", - "roundness": null, - "seed": 1206506303, - "version": 1242, - "versionNonce": 1535683551, - "isDeleted": false, - "boundElements": [ - { - "id": "gCGIKL1hQWrdXqSCbCoKV", - "type": "arrow" - } - ], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "75% cpu ", - "fontSize": 34.14424179344783, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "top", - "containerId": null, - "originalText": "75% cpu ", - "autoResize": false, - "lineHeight": 1.25 - }, - { - "id": "NMriYEooml-cqsEIImkH6", - "type": "line", - "x": 1868.5620519295007, - "y": 147.60278916372704, - "width": 0.808462407634579, - "height": 87.69632089297602, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "a3", - "roundness": { - "type": 2 - }, - "seed": 518722399, - "version": 1061, - "versionNonce": 822640671, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -0.808462407634579, - 87.69632089297602 - ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": null, - "polygon": false - }, - { - "id": "FOlbdasWmsOxUQHi42jXw", - "type": "rectangle", - "x": 1473.4997950800353, - "y": 325.13906463094304, - "width": 610.1651518266211, - "height": 79.0053500109077, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "a4", - "roundness": { - "type": 3 - }, - "seed": 1611616127, - "version": 1189, - "versionNonce": 1298211903, - "isDeleted": false, - "boundElements": [ - { - "id": "LWLxieSNDefwBPpy5e7g9", - "type": "arrow" - }, - { - "id": "z5c4HX9aKN7ejhrd1kpnN", - "type": "arrow" - }, - { - "id": "gCGIKL1hQWrdXqSCbCoKV", - "type": "arrow" - } - ], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "5ShAhIgiFVnOBsVNM3ivq", - "type": "text", - "x": 1568.6907809951335, - "y": 354.905746472047, - "width": 66.135986328125, - "height": 35, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "a5", - "roundness": null, - "seed": 1167525791, - "version": 1120, - "versionNonce": 679054527, - "isDeleted": false, - "boundElements": [ - { - "id": "gCGIKL1hQWrdXqSCbCoKV", - "type": "arrow" - } - ], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "75 W", - "fontSize": 28, - "fontFamily": 5, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "75 W", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "2OVMT-44zDGuZfbc-Eqn0", - "type": "line", - "x": 1868.302579197325, - "y": 321.7577252368508, - "width": 0.808462407634579, - "height": 87.69632089297602, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "a6", - "roundness": { - "type": 2 - }, - "seed": 1840430015, - "version": 1188, - "versionNonce": 407346399, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -0.808462407634579, - 87.69632089297602 - ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": null, - "polygon": false - }, - { - "id": "B4DZmLHA1k1xP7QIlUcxL", - "type": "text", - "x": 1892.348707618763, - "y": 351.1878261240065, - "width": 185.4159393310547, - "height": 35, - "angle": 0, - "strokeColor": "#228be6", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "a7", - "roundness": null, - "seed": 1552083935, - "version": 1059, - "versionNonce": 1612622079, - "isDeleted": false, - "boundElements": [ - { - "id": "LWLxieSNDefwBPpy5e7g9", - "type": "arrow" - }, - { - "id": "W2cPSvqfPy05o2NhrLAjB", - "type": "arrow" - } - ], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "25W - unused", - "fontSize": 28, - "fontFamily": 5, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "25W - unused", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "6nV4RlJiK2dZmIE5Jm7TX", - "type": "text", - "x": 1445.0086414897796, - "y": 44.02503884363091, - "width": 636.4339065995038, - "height": 90.46427052485654, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "a8", - "roundness": null, - "seed": 1041766399, - "version": 1156, - "versionNonce": 702133567, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "Power Attribution", - "fontSize": 72.37141641988524, - "fontFamily": 5, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Power Attribution", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "AgzW0cLTSTnKL7Aoua8Gx", - "type": "text", - "x": 1893.068745875029, - "y": 171.74939027453252, - "width": 119.19593811035156, - "height": 35, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 70, - "groupIds": [], - "frameId": null, - "index": "a9", - "roundness": null, - "seed": 1752350751, - "version": 1069, - "versionNonce": 1015985503, - "isDeleted": false, - "boundElements": [ - { - "id": "LWLxieSNDefwBPpy5e7g9", - "type": "arrow" - } - ], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "25% idle", - "fontSize": 28, - "fontFamily": 5, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "25% idle", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "LWLxieSNDefwBPpy5e7g9", - "type": "arrow", - "x": 1934.1922274310725, - "y": 211.74939027453263, - "width": 93.78432219348201, - "height": 108.38967435640996, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 70, - "groupIds": [], - "frameId": null, - "index": "aA", - "roundness": null, - "seed": 495150143, - "version": 3135, - "versionNonce": 607791519, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - 0, - 54.19483717820515 - ], - [ - 93.78432219348201, - 54.19483717820515 - ], - [ - 93.78432219348201, - 108.38967435640996 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "AgzW0cLTSTnKL7Aoua8Gx", - "focus": 0.3099851856030595, - "gap": 5.000000000000114, - "fixedPoint": [ - 0.34500740719848555, - 1.1428571428571461 - ] - }, - "endBinding": { - "elementId": "FOlbdasWmsOxUQHi42jXw", - "focus": 0.8174645106643993, - "gap": 5.000000000000455, - "fixedPoint": [ - 0.9087322553321994, - -0.06328685334993314 - ] - }, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": true, - "fixedSegments": null, - "startIsSpecial": null, - "endIsSpecial": null - }, - { - "id": "gCGIKL1hQWrdXqSCbCoKV", - "type": "arrow", - "x": 1707.9271308332027, - "y": 219.81545090078515, - "width": 60.66653238870413, - "height": 100.32361373015743, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 70, - "groupIds": [], - "frameId": null, - "index": "aB", - "roundness": null, - "seed": 220890207, - "version": 3281, - "versionNonce": 262249919, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - 0, - 50.161806865078944 - ], - [ - -60.66653238870413, - 50.161806865078944 - ], - [ - -60.66653238870413, - 100.32361373015743 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "FxfgWnLs4U2r-ia0osX6o", - "focus": 0.0016204308398678523, - "gap": 5, - "fixedPoint": [ - 0.4991897845800656, - 1.1428571428571428 - ] - }, - "endBinding": { - "elementId": "FOlbdasWmsOxUQHi42jXw", - "focus": -0.43044664925787895, - "gap": 5.000000000000455, - "fixedPoint": [ - 0.2847766753710601, - -0.06328685334993314 - ] - }, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": true, - "fixedSegments": null, - "startIsSpecial": null, - "endIsSpecial": null - }, - { - "id": "f4BNoJJCNH-nYXjN3Qnms", - "type": "text", - "x": 1756.6844941203963, - "y": 265.52584617616435, - "width": 181.51875029291955, - "height": 89.29496359273668, - "angle": 0, - "strokeColor": "#c2255c", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 70, - "groupIds": [], - "frameId": null, - "index": "aC", - "roundness": null, - "seed": 389587071, - "version": 1332, - "versionNonce": 1648725471, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "100W", - "fontSize": 71.43597087418925, - "fontFamily": 5, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "100W", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "TQRyz2Veo3RgL2By6_w89", - "type": "text", - "x": 2260.667907288207, - "y": 388.8564164955462, - "width": 488.01776123046875, - "height": 41.047682162285106, - "angle": 0, - "strokeColor": "#228be6", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 90, - "groupIds": [], - "frameId": null, - "index": "aD", - "roundness": null, - "seed": 1299069087, - "version": 1169, - "versionNonce": 2000058879, - "isDeleted": false, - "boundElements": [ - { - "id": "W2cPSvqfPy05o2NhrLAjB", - "type": "arrow" - } - ], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "kepler_node_cpu_idle_watts{}", - "fontSize": 32.838145729828085, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "top", - "containerId": null, - "originalText": "kepler_node_cpu_idle_watts{}", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "W2cPSvqfPy05o2NhrLAjB", - "type": "arrow", - "x": 2082.7646469498177, - "y": 385.0372347781779, - "width": 172.90326033838937, - "height": 30.69979256548777, - "angle": 0, - "strokeColor": "#228be6", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "aE", - "roundness": null, - "seed": 897305791, - "version": 2903, - "versionNonce": 133252671, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - 86.45163016919469, - 0 - ], - [ - 86.45163016919469, - 30.69979256548777 - ], - [ - 172.90326033838937, - 30.69979256548777 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "B4DZmLHA1k1xP7QIlUcxL", - "focus": 0.9342519230954992, - "gap": 5, - "fixedPoint": [ - 1.026780367721713, - 0.9671259615477571 - ] - }, - "endBinding": { - "elementId": "TQRyz2Veo3RgL2By6_w89", - "focus": -0.3097261249414697, - "gap": 5.000000000003638, - "fixedPoint": [ - -0.009980522629977314, - 0.6548630624707406 - ] - }, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": true, - "fixedSegments": null, - "startIsSpecial": null, - "endIsSpecial": null - }, - { - "id": "39ECs3AUE5tfHkhJBjdc5", - "type": "text", - "x": 592.6205931898603, - "y": 342.83688344816187, - "width": 651.444091796875, - "height": 50.290725803173046, - "angle": 0, - "strokeColor": "#e64980", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "aF", - "roundness": null, - "seed": 1258413279, - "version": 1516, - "versionNonce": 1938564703, - "isDeleted": false, - "boundElements": [ - { - "id": "z5c4HX9aKN7ejhrd1kpnN", - "type": "arrow" - } - ], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "kepler_node_cpu_active_watts{}", - "fontSize": 40.23258064253844, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "top", - "containerId": null, - "originalText": "kepler_node_cpu_active_watts{}", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "z5c4HX9aKN7ejhrd1kpnN", - "type": "arrow", - "x": 1468.4997950800353, - "y": 371.41089209109646, - "width": 510.69812598313456, - "height": 68.57400864293459, - "angle": 0, - "strokeColor": "#c2255c", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "aG", - "roundness": null, - "seed": 1100015871, - "version": 3202, - "versionNonce": 1565481631, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -109.71755504664998, - 0 - ], - [ - -109.71755504664998, - -68.57400864293459 - ], - [ - -510.69812598313456, - -68.57400864293459 - ], - [ - -510.69812598313456, - -33.57400864293504 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "FOlbdasWmsOxUQHi42jXw", - "focus": -0.1713593434815469, - "gap": 5, - "fixedPoint": [ - -0.00819450272607629, - 0.5856796717407745 - ] - }, - "endBinding": { - "elementId": "39ECs3AUE5tfHkhJBjdc5", - "focus": 0.1211432585097617, - "gap": 5.000000000000455, - "fixedPoint": [ - 0.5605716292548809, - -0.09942190970894646 - ] - }, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": true, - "fixedSegments": null, - "startIsSpecial": null, - "endIsSpecial": null - }, - { - "id": "HLcOmanNarkONVcVKe0Gb", - "type": "text", - "x": 1006.2082651903802, - "y": 1212.905725711187, - "width": 1106.2251078858426, - "height": 426.9850764635573, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "aH", - "roundness": null, - "seed": 111767839, - "version": 2078, - "versionNonce": 820555455, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "16 Core Machine \n* 4 core allocated to VM\n* VM uses 100% CPU\n* VM use 4/16 of CPU -> Cpu usage is 25% and idle is 75%\n\n* Node power consumption is 40W\n* 25% of 40W is 10W\n* 100% of cpu usage is VM -> 10W \n", - "fontSize": 37.954229018982865, - "fontFamily": 5, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "16 Core Machine \n* 4 core allocated to VM\n* VM uses 100% CPU\n* VM use 4/16 of CPU -> Cpu usage is 25% and idle is 75%\n\n* Node power consumption is 40W\n* 25% of 40W is 10W\n* 100% of cpu usage is VM -> 10W \n", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "qiZ6nwQumsqI26j4CQY8e", - "type": "rectangle", - "x": 2248.212648485711, - "y": 1306.5553034789004, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#fa5252", - "backgroundColor": "#ff8787", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "SxeJ8ddw9xkqIS2JCB6qE" - ], - "frameId": null, - "index": "aI", - "roundness": { - "type": 3 - }, - "seed": 62649663, - "version": 1270, - "versionNonce": 1250066143, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "IdXfxtRS5h3FchBIKWKfH", - "type": "rectangle", - "x": 2339.3180341368534, - "y": 1306.5553034789, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#fa5252", - "backgroundColor": "#ff8787", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "SxeJ8ddw9xkqIS2JCB6qE" - ], - "frameId": null, - "index": "aJ", - "roundness": { - "type": 3 - }, - "seed": 539555167, - "version": 1345, - "versionNonce": 212683519, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "F_afMtRL9VLMmpzylnxLG", - "type": "rectangle", - "x": 2430.423419787996, - "y": 1306.5553034789004, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#fa5252", - "backgroundColor": "#ff8787", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "SxeJ8ddw9xkqIS2JCB6qE" - ], - "frameId": null, - "index": "aK", - "roundness": { - "type": 3 - }, - "seed": 54587775, - "version": 1325, - "versionNonce": 870945567, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "wLzWm4OFMOIxX99jOD2Iz", - "type": "rectangle", - "x": 2521.5288054391385, - "y": 1306.5553034789, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#fa5252", - "backgroundColor": "#ff8787", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "SxeJ8ddw9xkqIS2JCB6qE" - ], - "frameId": null, - "index": "aL", - "roundness": { - "type": 3 - }, - "seed": 373582239, - "version": 1399, - "versionNonce": 413652799, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "HfWPHx7G5_rR5a0iGz8wm", - "type": "rectangle", - "x": 2248.623626657225, - "y": 1403.3258606906288, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#a5d8ff", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "Wx0Mxn__kUoXSQweHa9Ke" - ], - "frameId": null, - "index": "aM", - "roundness": { - "type": 3 - }, - "seed": 1180949951, - "version": 1427, - "versionNonce": 826840927, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "kgcnuifdhPf1DWGt7nDH8", - "type": "rectangle", - "x": 2339.7290123083676, - "y": 1403.325860690628, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#a5d8ff", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "Wx0Mxn__kUoXSQweHa9Ke" - ], - "frameId": null, - "index": "aN", - "roundness": { - "type": 3 - }, - "seed": 113233375, - "version": 1502, - "versionNonce": 1411142527, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "cCXdUVSJY_tTNebsJamAs", - "type": "rectangle", - "x": 2430.83439795951, - "y": 1403.3258606906288, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#a5d8ff", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "Wx0Mxn__kUoXSQweHa9Ke" - ], - "frameId": null, - "index": "aO", - "roundness": { - "type": 3 - }, - "seed": 308853247, - "version": 1482, - "versionNonce": 962825119, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "0Y_M-LY41cpLqijSk8RRW", - "type": "rectangle", - "x": 2521.9397836106527, - "y": 1403.325860690628, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#a5d8ff", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "Wx0Mxn__kUoXSQweHa9Ke" - ], - "frameId": null, - "index": "aP", - "roundness": { - "type": 3 - }, - "seed": 1851728415, - "version": 1556, - "versionNonce": 1028571071, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "j3IBKe7qcxM2UUZx3Gmq7", - "type": "rectangle", - "x": 2249.3201998292825, - "y": 1474.4969184709826, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#a5d8ff", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "GJ0eJt4M8hd9Jg6rr7siw" - ], - "frameId": null, - "index": "aQ", - "roundness": { - "type": 3 - }, - "seed": 731088447, - "version": 1437, - "versionNonce": 1644064735, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "FLZ-81BbctWYqvWxJV4Pw", - "type": "rectangle", - "x": 2340.425585480425, - "y": 1474.4969184709817, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#a5d8ff", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "GJ0eJt4M8hd9Jg6rr7siw" - ], - "frameId": null, - "index": "aR", - "roundness": { - "type": 3 - }, - "seed": 1759929951, - "version": 1512, - "versionNonce": 293805055, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "8whuSnXYPkrvIOGZRRO8c", - "type": "rectangle", - "x": 2431.5309711315676, - "y": 1474.4969184709826, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#a5d8ff", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "GJ0eJt4M8hd9Jg6rr7siw" - ], - "frameId": null, - "index": "aS", - "roundness": { - "type": 3 - }, - "seed": 354959999, - "version": 1492, - "versionNonce": 534594591, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "gF5xWfKSxzyD3FZcg6EAf", - "type": "rectangle", - "x": 2522.63635678271, - "y": 1474.4969184709817, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#a5d8ff", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "GJ0eJt4M8hd9Jg6rr7siw" - ], - "frameId": null, - "index": "aT", - "roundness": { - "type": 3 - }, - "seed": 1897503391, - "version": 1566, - "versionNonce": 217933887, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "S124uFEAqu0wEY4J0oigU", - "type": "rectangle", - "x": 2249.675452147032, - "y": 1551.275825644639, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#a5d8ff", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "OOfCIgyTIk6yY116k-m80" - ], - "frameId": null, - "index": "aU", - "roundness": { - "type": 3 - }, - "seed": 1365962431, - "version": 1515, - "versionNonce": 113510495, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "5rWdOARqsDoP_-5H4kH82", - "type": "rectangle", - "x": 2340.7808377981746, - "y": 1551.2758256446382, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#a5d8ff", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "OOfCIgyTIk6yY116k-m80" - ], - "frameId": null, - "index": "aV", - "roundness": { - "type": 3 - }, - "seed": 549240543, - "version": 1590, - "versionNonce": 721527935, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "CqSEiVof839m49idua1kM", - "type": "rectangle", - "x": 2431.886223449317, - "y": 1551.275825644639, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#a5d8ff", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "OOfCIgyTIk6yY116k-m80" - ], - "frameId": null, - "index": "aW", - "roundness": { - "type": 3 - }, - "seed": 564103935, - "version": 1570, - "versionNonce": 158776479, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "n04j9lyCqVe-NOaT-8qVF", - "type": "rectangle", - "x": 2522.9916091004598, - "y": 1551.2758256446382, - "width": 53.36447071138309, - "height": 47.7361594811523, - "angle": 0, - "strokeColor": "#a5d8ff", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 100, - "groupIds": [ - "OOfCIgyTIk6yY116k-m80" - ], - "frameId": null, - "index": "aX", - "roundness": { - "type": 3 - }, - "seed": 1888736031, - "version": 1644, - "versionNonce": 1708380351, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "QuM7CIPFogZ4a7ejWDPep", - "type": "text", - "x": 2241.7489186637613, - "y": 1125.9349025874815, - "width": 364.9867317016462, - "height": 187.370002375284, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#ff8787", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 30, - "groupIds": [], - "frameId": null, - "index": "aY", - "roundness": null, - "seed": 1175066431, - "version": 1946, - "versionNonce": 968450271, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "40 W", - "fontSize": 149.89600190022716, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "top", - "containerId": null, - "originalText": "40 W", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "s3hdJJg41KSfZ4Dx181VB", - "type": "text", - "x": 2629.4327310571553, - "y": 1447.2944716429765, - "width": 248.28256225585938, - "height": 126.26587459076185, - "angle": 0, - "strokeColor": "#4dabf7", - "backgroundColor": "#ff8787", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 30, - "groupIds": [], - "frameId": null, - "index": "aZ", - "roundness": null, - "seed": 2019743583, - "version": 2099, - "versionNonce": 1991765247, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "30 W", - "fontSize": 101.01269967260949, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "top", - "containerId": null, - "originalText": "30 W", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "_jLbQKLQHdCLjLCqFIPmE", - "type": "text", - "x": 2635.154475937501, - "y": 1288.464466690256, - "width": 229.999755859375, - "height": 126.26587459076185, - "angle": 0, - "strokeColor": "#e03131", - "backgroundColor": "#ff8787", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 0, - "opacity": 30, - "groupIds": [], - "frameId": null, - "index": "aa", - "roundness": null, - "seed": 1039045503, - "version": 2109, - "versionNonce": 139457823, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "10 W", - "fontSize": 101.01269967260949, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "top", - "containerId": null, - "originalText": "10 W", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "pTUCz5hl69eR_63dEpwZ8", - "type": "rectangle", - "x": 1440.6131149742614, - "y": 646.9338727645634, - "width": 552.5778055837405, - "height": 328.6578350603985, - "angle": 0, - "strokeColor": "#ff8787", - "backgroundColor": "#fcc2d7", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "dashed", - "roughness": 2, - "opacity": 10, - "groupIds": [ - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "ab", - "roundness": { - "type": 3 - }, - "seed": 787336095, - "version": 1104, - "versionNonce": 368179519, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "QMHuIbjSSAz-FoCKyFd2V", - "type": "rectangle", - "x": 1427.446881898628, - "y": 638.4669606683167, - "width": 728.319954516287, - "height": 342.2608173240607, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 4, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [ - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "ac", - "roundness": { - "type": 3 - }, - "seed": 126943167, - "version": 1761, - "versionNonce": 83786079, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "lFtQ0ya1ZiLlpqM0jh9pa", - "type": "text", - "x": 1469.343559260742, - "y": 644.6667629272627, - "width": 166.29792515435784, - "height": 71.53191338063563, - "angle": 0, - "strokeColor": "#ff8787", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [ - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "ad", - "roundness": null, - "seed": 704163807, - "version": 1783, - "versionNonce": 986051967, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "75 W", - "fontSize": 57.22553070450849, - "fontFamily": 5, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "75 W", - "autoResize": false, - "lineHeight": 1.25 - }, - { - "id": "Led4U0PtAdCzQTNfqE-GZ", - "type": "line", - "x": 2003.0808475706435, - "y": 640.7530285730365, - "width": 0.37652929350177494, - "height": 341.48897236709263, - "angle": 0, - "strokeColor": "#868e96", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 4, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 100, - "groupIds": [ - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "ae", - "roundness": { - "type": 2 - }, - "seed": 1614109695, - "version": 1840, - "versionNonce": 512290207, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -0.37652929350177494, - 75.9055609538994 - ], - [ - -0.05671814868856018, - 341.48897236709263 - ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": null, - "polygon": false - }, - { - "id": "vnxQNnO-YKZ3pHSuIpN_m", - "type": "text", - "x": 2020.4752271143407, - "y": 771.9007024788141, - "width": 117.81849482998724, - "height": 58.81931755229357, - "angle": 0, - "strokeColor": "#228be6", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 50, - "groupIds": [ - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "af", - "roundness": null, - "seed": 1581745183, - "version": 1739, - "versionNonce": 1534583231, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "25 W", - "fontSize": 47.05545404183486, - "fontFamily": 5, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "25 W", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "j3y_T96kHNLBIKQ2FNfxg", - "type": "rectangle", - "x": 1453.1124143414236, - "y": 739.6695553138272, - "width": 212.20122296663072, - "height": 79.1127135862744, - "angle": 0, - "strokeColor": "#e03131", - "backgroundColor": "#fff5f5", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 70, - "groupIds": [ - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "ag", - "roundness": { - "type": 3 - }, - "seed": 69183551, - "version": 1825, - "versionNonce": 1655919071, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "joPJITqVMw2dqDAb7lA8o" - }, - { - "id": "mtzyRybxr_3MVEA6Qgbcf", - "type": "arrow" - } - ], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "joPJITqVMw2dqDAb7lA8o", - "type": "text", - "x": 1537.9060113594069, - "y": 759.6120288019355, - "width": 42.61402893066406, - "height": 39.227766610057905, - "angle": 0, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 70, - "groupIds": [ - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "ah", - "roundness": null, - "seed": 1604208735, - "version": 1770, - "versionNonce": 759938559, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "VM", - "fontSize": 31.382213288046326, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "j3y_T96kHNLBIKQ2FNfxg", - "originalText": "VM", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "tquEJc_mkpENxUfWSBuDH", - "type": "rectangle", - "x": 1492.3081216803148, - "y": 864.132098744745, - "width": 192.10603968362835, - "height": 57.40342340491839, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 70, - "groupIds": [ - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "ai", - "roundness": { - "type": 3 - }, - "seed": 1855186047, - "version": 1926, - "versionNonce": 1686473279, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "sCQju54yb3slYyrdoDoFt" - } - ], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "sCQju54yb3slYyrdoDoFt", - "type": "text", - "x": 1528.158634503086, - "y": 873.2199271421753, - "width": 120.40501403808594, - "height": 39.227766610057905, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 70, - "groupIds": [ - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "aj", - "roundness": null, - "seed": 549518495, - "version": 1883, - "versionNonce": 1022880351, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "Process", - "fontSize": 31.382213288046326, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "tquEJc_mkpENxUfWSBuDH", - "originalText": "Process", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "Dq-MuW8sparwF_aKsyI9C", - "type": "rectangle", - "x": 1768.9452149150857, - "y": 859.9110652531538, - "width": 180.3648707441082, - "height": 66.28611655707364, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 70, - "groupIds": [ - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "ak", - "roundness": { - "type": 3 - }, - "seed": 433459391, - "version": 2311, - "versionNonce": 1953056383, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "B4KGDGfHF4u5x1IaKqZcJ" - } - ], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "B4KGDGfHF4u5x1IaKqZcJ", - "type": "text", - "x": 1798.9251432680967, - "y": 873.4402402266616, - "width": 120.40501403808594, - "height": 39.227766610057905, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 70, - "groupIds": [ - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "al", - "roundness": null, - "seed": 863215839, - "version": 2269, - "versionNonce": 1234837151, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "Process", - "fontSize": 31.382213288046326, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "Dq-MuW8sparwF_aKsyI9C", - "originalText": "Process", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "GOewdipiUrl7HcdoB0oMd", - "type": "rectangle", - "x": 1518.5783034525302, - "y": 906.9837618323738, - "width": 211.1721467308623, - "height": 59.04875243186069, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 70, - "groupIds": [ - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "am", - "roundness": { - "type": 3 - }, - "seed": 1059728639, - "version": 1982, - "versionNonce": 1329263295, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "bVWmqq7uwozf7Y0gppSYL" - }, - { - "id": "YFiAF9cmbbmDiSzpPfpOq", - "type": "arrow" - } - ], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "bVWmqq7uwozf7Y0gppSYL", - "type": "text", - "x": 1563.9618697989183, - "y": 916.8942547432752, - "width": 120.40501403808594, - "height": 39.227766610057905, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 70, - "groupIds": [ - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "an", - "roundness": null, - "seed": 142226719, - "version": 1937, - "versionNonce": 1844200159, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": "Process", - "fontSize": 31.382213288046326, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "GOewdipiUrl7HcdoB0oMd", - "originalText": "Process", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "ifiGllEGg33QNLcbH196b", - "type": "rectangle", - "x": 1688.2671747029726, - "y": 710.2321360140029, - "width": 291.24801743545476, - "height": 124.16306763334786, - "angle": 0, - "strokeColor": "#2f9e44", - "backgroundColor": "#ebfbee", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [ - "4e42pS648cxqd28tS0Psj", - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "ao", - "roundness": { - "type": 3 - }, - "seed": 383007039, - "version": 2123, - "versionNonce": 313677599, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "YA7kfv2528PlWhOGMWvAW" - }, - { - "id": "RfgfZm_hxBLuZjg-g2aCY", - "type": "arrow" - } - ], - "updated": 1753862125633, - "link": null, - "locked": false - }, - { - "id": "YA7kfv2528PlWhOGMWvAW", - "type": "text", - "x": 1693.2671747029726, - "y": 751.8942991355419, - "width": 176.51593017578125, - "height": 40.83874139026978, - "angle": 0, - "strokeColor": "#2f9e44", - "backgroundColor": "#ffc9c9", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [ - "4e42pS648cxqd28tS0Psj", - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "ap", - "roundness": null, - "seed": 798538079, - "version": 2203, - "versionNonce": 699931455, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125633, - "link": null, - "locked": false, - "text": " Container", - "fontSize": 32.670993112215825, - "fontFamily": 5, - "textAlign": "left", - "verticalAlign": "middle", - "containerId": "ifiGllEGg33QNLcbH196b", - "originalText": " Container", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "fFOvafBQ_Y_kouZCvelRl", - "type": "rectangle", - "x": 1930.1611291785248, - "y": 727.5646953734515, - "width": 24.147130439278637, - "height": 22.732811343948423, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 70, - "groupIds": [ - "4e42pS648cxqd28tS0Psj", - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "aq", - "roundness": { - "type": 3 - }, - "seed": 404239743, - "version": 2516, - "versionNonce": 1223399295, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125634, - "link": null, - "locked": false - }, - { - "id": "FxfvbNYMnp7jalOuQe1BC", - "type": "rectangle", - "x": 1930.7732733015237, - "y": 793.9530279469625, - "width": 24.147130439278637, - "height": 22.732811343948423, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 70, - "groupIds": [ - "4e42pS648cxqd28tS0Psj", - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "ar", - "roundness": { - "type": 3 - }, - "seed": 395521439, - "version": 2522, - "versionNonce": 1537888159, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125634, - "link": null, - "locked": false - }, - { - "id": "aUeeDxZCZIqprQGm8AQWY", - "type": "rectangle", - "x": 1928.787060987539, - "y": 757.8104760039566, - "width": 24.147130439278637, - "height": 22.732811343948423, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 70, - "groupIds": [ - "4e42pS648cxqd28tS0Psj", - "PzM6vxolgtgSXDp3wfSXj" - ], - "frameId": null, - "index": "as", - "roundness": { - "type": 3 - }, - "seed": 960111039, - "version": 2519, - "versionNonce": 1914504127, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125634, - "link": null, - "locked": false - }, - { - "id": "gNM2ran1Ke6iaosKIlxMD", - "type": "rectangle", - "x": 1543.9845356758415, - "y": 154.46307846077593, - "width": 320.42256375072014, - "height": 71.25597594550482, - "angle": 0, - "strokeColor": "#ff8787", - "backgroundColor": "#fcc2d7", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "dashed", - "roughness": 2, - "opacity": 30, - "groupIds": [], - "frameId": null, - "index": "at", - "roundness": { - "type": 3 - }, - "seed": 1311609311, - "version": 608, - "versionNonce": 1818506207, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125634, - "link": null, - "locked": false - }, - { - "id": "WRvQsDssvMJmPESGe2gBX", - "type": "rectangle", - "x": 1479.1463210377533, - "y": 331.966376402843, - "width": 377.37121048822195, - "height": 66.14914934781564, - "angle": 0, - "strokeColor": "#ff8787", - "backgroundColor": "#fcc2d7", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "dashed", - "roughness": 2, - "opacity": 30, - "groupIds": [], - "frameId": null, - "index": "au", - "roundness": { - "type": 3 - }, - "seed": 796786175, - "version": 718, - "versionNonce": 1385193471, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125634, - "link": null, - "locked": false - }, - { - "id": "GN9kfgDPm-zJHHrMoc05u", - "type": "arrow", - "x": 1538.9845356758415, - "y": 189.9910664335282, - "width": 371.194660244431, - "height": 52.31385272522448, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "av", - "roundness": null, - "seed": 1076618783, - "version": 2861, - "versionNonce": 505924703, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125634, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -371.194660244431, - 0 - ], - [ - -371.194660244431, - 52.31385272522448 - ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": { - "elementId": "lC7v09A9ZieFjknR78TcZ", - "focus": 0.48345503676042223, - "gap": 4.999999999999545, - "fixedPoint": [ - 0.741727518380211, - -0.09942190970892838 - ] - }, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": true, - "fixedSegments": null, - "startIsSpecial": null, - "endIsSpecial": null - }, - { - "id": "lC7v09A9ZieFjknR78TcZ", - "type": "text", - "x": 792.2872634282176, - "y": 247.30491915875223, - "width": 506.2541198730469, - "height": 50.290725803173046, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "aw", - "roundness": null, - "seed": 791136831, - "version": 1571, - "versionNonce": 378121279, - "isDeleted": false, - "boundElements": [ - { - "id": "GN9kfgDPm-zJHHrMoc05u", - "type": "arrow" - } - ], - "updated": 1753862125634, - "link": null, - "locked": false, - "text": "kepler_node_cpu_watts{}", - "fontSize": 40.23258064253844, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "top", - "containerId": null, - "originalText": "kepler_node_cpu_watts{}", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "b2HR8DZ40_6i95J3ltBFZ", - "type": "text", - "x": 757.8726335035026, - "y": 666.0779411517199, - "width": 462.80572509765625, - "height": 50.290725803173046, - "angle": 0, - "strokeColor": "#e8590c", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "ax", - "roundness": null, - "seed": 2035427935, - "version": 1765, - "versionNonce": 692906111, - "isDeleted": false, - "boundElements": [ - { - "id": "mtzyRybxr_3MVEA6Qgbcf", - "type": "arrow" - } - ], - "updated": 1753862125634, - "link": null, - "locked": false, - "text": "kepler_vm_cpu_watts{}", - "fontSize": 40.23258064253844, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "top", - "containerId": null, - "originalText": "kepler_vm_cpu_watts{}", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "mtzyRybxr_3MVEA6Qgbcf", - "type": "arrow", - "x": 1448.1124143414236, - "y": 769.1314949319101, - "width": 222.43405574026474, - "height": 78.00819087860373, - "angle": 0, - "strokeColor": "#e8590c", - "backgroundColor": "#fcc2d7", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 2, - "opacity": 90, - "groupIds": [], - "frameId": null, - "index": "ay", - "roundness": null, - "seed": 729515647, - "version": 1897, - "versionNonce": 1964905663, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125634, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -111.21702787013237, - 0 - ], - [ - -111.21702787013237, - -78.00819087860373 - ], - [ - -222.43405574026474, - -78.00819087860373 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "j3y_T96kHNLBIKQ2FNfxg", - "focus": 0.2551907706729307, - "gap": 5, - "fixedPoint": [ - -0.02356254092270837, - 0.37240461466353153 - ] - }, - "endBinding": { - "elementId": "b2HR8DZ40_6i95J3ltBFZ", - "focus": -0.00397687638835201, - "gap": 5, - "fixedPoint": [ - 1.010803669291137, - 0.4980115618058205 - ] - }, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": true, - "fixedSegments": null, - "startIsSpecial": null, - "endIsSpecial": null - }, - { - "id": "8vp_IgoPaUwBVclobYRHJ", - "type": "text", - "x": 729.3505855494113, - "y": 922.4495238059465, - "width": 562.89794921875, - "height": 50.290725803173046, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "az", - "roundness": null, - "seed": 1684299423, - "version": 1931, - "versionNonce": 1864049887, - "isDeleted": false, - "boundElements": [ - { - "id": "YFiAF9cmbbmDiSzpPfpOq", - "type": "arrow" - } - ], - "updated": 1753862125634, - "link": null, - "locked": false, - "text": "kepler_process_cpu_watts{}", - "fontSize": 40.23258064253844, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "top", - "containerId": null, - "originalText": "kepler_process_cpu_watts{}", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "LQ7X2UMInsvvGlcmggleL", - "type": "text", - "x": 689.1489734525858, - "y": 821.3031980348676, - "width": 595.162353515625, - "height": 50.290725803173046, - "angle": 0, - "strokeColor": "#12b886", - "backgroundColor": "#e7f5ff", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b00", - "roundness": null, - "seed": 381498047, - "version": 1796, - "versionNonce": 1527822623, - "isDeleted": false, - "boundElements": [ - { - "id": "RfgfZm_hxBLuZjg-g2aCY", - "type": "arrow" - } - ], - "updated": 1753862125634, - "link": null, - "locked": false, - "text": "kepler_container_cpu_watts{}", - "fontSize": 40.23258064253844, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "top", - "containerId": null, - "originalText": "kepler_container_cpu_watts{}", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "YFiAF9cmbbmDiSzpPfpOq", - "type": "arrow", - "x": 1513.5783034525307, - "y": 943.93236265069, - "width": 216.32976868436936, - "height": 3.5625240568429035, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "#fcc2d7", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 2, - "opacity": 90, - "groupIds": [], - "frameId": null, - "index": "b01", - "roundness": null, - "seed": 187073247, - "version": 1983, - "versionNonce": 1767783775, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125634, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -108.1648843421849, - 0 - ], - [ - -108.1648843421849, - 3.5625240568429035 - ], - [ - -216.32976868436936, - 3.5625240568429035 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "GOewdipiUrl7HcdoB0oMd", - "focus": -0.2514608453735838, - "gap": 4.999999999999545, - "fixedPoint": [ - -0.02367736501903358, - 0.6257304226867968 - ] - }, - "endBinding": { - "elementId": "8vp_IgoPaUwBVclobYRHJ", - "focus": -0.003976876388343583, - "gap": 5, - "fixedPoint": [ - 1.0088826047544488, - 0.4980115618058205 - ] - }, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": true, - "fixedSegments": null, - "startIsSpecial": null, - "endIsSpecial": null - }, - { - "id": "RfgfZm_hxBLuZjg-g2aCY", - "type": "arrow", - "x": 1683.267174702973, - "y": 803.1171019736892, - "width": 393.9558477347623, - "height": 37.49309417107406, - "angle": 0, - "strokeColor": "#12b886", - "backgroundColor": "#fcc2d7", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 2, - "opacity": 90, - "groupIds": [], - "frameId": null, - "index": "b02", - "roundness": null, - "seed": 573624063, - "version": 2024, - "versionNonce": 109918591, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125634, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -3.2673760177813165, - 0 - ], - [ - -3.2673760177813165, - 35.61500659003514 - ], - [ - -202.1116118762725, - 35.61500659003514 - ], - [ - -202.1116118762725, - 37.49309417107406 - ], - [ - -393.9558477347623, - 37.49309417107406 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "ifiGllEGg33QNLcbH196b", - "focus": -0.4961770473322147, - "gap": 4.999999999999545, - "fixedPoint": [ - -0.017167498834932415, - 0.7480885236661076 - ] - }, - "endBinding": { - "elementId": "LQ7X2UMInsvvGlcmggleL", - "focus": -0.2321845508669285, - "gap": 5, - "fixedPoint": [ - 1.008401069003214, - 0.38390772456653377 - ] - }, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": true, - "fixedSegments": [ - { - "index": 2, - "start": [ - -3.2673760177813165, - 0 - ], - "end": [ - -3.2673760177813165, - 35.61500659003514 - ] - } - ], - "startIsSpecial": false, - "endIsSpecial": false - }, - { - "id": "qxIWMtx6UK9e_vXRsyP4n", - "type": "text", - "x": 1658.1150791740365, - "y": 539.3016476403734, - "width": 377.6168585135299, - "height": 136.6260705925365, - "angle": 0, - "strokeColor": "#c2255c", - "backgroundColor": "#e3fafc", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 40, - "groupIds": [], - "frameId": null, - "index": "b03", - "roundness": null, - "seed": 1448908575, - "version": 1572, - "versionNonce": 2026353055, - "isDeleted": false, - "boundElements": [], - "updated": 1753862125634, - "link": null, - "locked": false, - "text": "100 W", - "fontSize": 109.3008564740292, - "fontFamily": 5, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "100 W", - "autoResize": false, - "lineHeight": 1.25 - } - ], - "appState": { - "gridSize": 20, - "gridStep": 5, - "gridModeEnabled": false, - "viewBackgroundColor": "#fdf8f6", - "lockedMultiSelections": {} - }, - "files": {} -} diff --git a/docs/kepler/usage/assets/power-attribution.png b/docs/kepler/usage/assets/power-attribution.png deleted file mode 100644 index 0246d034..00000000 Binary files a/docs/kepler/usage/assets/power-attribution.png and /dev/null differ diff --git a/docs/kepler/usage/configuration.md b/docs/kepler/usage/configuration.md deleted file mode 100644 index 9c53af8f..00000000 --- a/docs/kepler/usage/configuration.md +++ /dev/null @@ -1,306 +0,0 @@ -# ⚙️ Kepler Configuration Guide - -Kepler supports configuration through both command-line flags and a configuration file. This guide outlines all available configuration options for configuring Kepler. - -## 🛠️ Configuration Methods - -Kepler supports two primary methods for configuration: - -1. **Command-line flags**: For quick adjustments and one-time settings -2. **Configuration file**: For persistent and comprehensive configuration - -> ⚡ **Tip:** Command-line flags take precedence over configuration file settings when both are specified. - -## 🖥️ Command-line Flags - -You can configure Kepler by passing flags when starting the service. The following flags are available: - -| Flag | Description | Default | Values | -|------|-------------|---------|--------| -| `--config.file` | Path to YAML configuration file | | Any valid file path | -| `--log.level` | Logging level | `info` | `debug`, `info`, `warn`, `error` | -| `--log.format` | Output format for logs | `text` | `text`, `json` | -| `--host.sysfs` | Path to sysfs filesystem | `/sys` | Any valid directory path | -| `--host.procfs` | Path to procfs filesystem | `/proc` | Any valid directory path | -| `--monitor.interval` | Monitor refresh interval | `5s` | Any valid duration | -| `--monitor.max-terminated` | Maximum number of terminated workloads to keep in memory until exported | `500` | Negative number indicates `unlimited` and `0` disables the feature | -| `--web.config-file` | Path to TLS server config file | `""` | Any valid file path | -| `--web.listen-address` | Web server listen addresses (can be specified multiple times) | `:28282` | Any valid host:port or :port format | -| `--debug.pprof` | Enable pprof debugging endpoints | `false` | `true`, `false` | -| `--exporter.stdout` | Enable stdout exporter | `false` | `true`, `false` | -| `--exporter.prometheus` | Enable Prometheus exporter | `true` | `true`, `false` | -| `--metrics` | Metrics levels to export (can be specified multiple times) | `node,process,container,vm,pod` | `node`, `process`, `container`, `vm`, `pod` | -| `--kube.enable` | Monitor kubernetes | `false` | `true`, `false` | -| `--kube.config` | Path to a kubeconfig file | `""` | Any valid file path | -| `--kube.node-name` | Name of kubernetes node on which kepler is running | `""` | Any valid node name | - -### 💡 Examples - -```bash -# Run with debug logging -kepler --log.level=debug - -# Use a different procfs path and JSON logging -kepler --host.procfs=/custom/proc --log.format=json - -# Load configuration from file -kepler --config.file=/path/to/config.yaml - -# Use custom listen addresses -kepler --web.listen-address=:8080 --web.listen-address=localhost:9090 - -# Enable stdout exporter and disable Prometheus exporter -kepler --exporter.stdout=true --exporter.prometheus=false - -# Enable Kubernetes monitoring with specific kubeconfig and node name -kepler --kube.enable=true --kube.config=/path/to/kubeconfig --kube.node-name=my-node - -# Export only node and container level metrics -kepler --metrics=node --metrics=container - -# Export only process level metrics -kepler --metrics=process - -# Set maximum terminated workloads to 1000 -kepler --monitor.max-terminated=1000 - -# Disable terminated workload tracking -kepler --monitor.max-terminated=0 - -# Unlimited terminated workload tracking -kepler --monitor.max-terminated=-1 -``` - -## 🗂️ Configuration File - -Kepler can load configuration from a YAML file. The configuration file offers more extensive options than command-line flags. - -### 🧾 Sample Configuration File - -```yaml -log: - level: debug # debug, info, warn, error (default: info) - format: text # text or json (default: text) - -monitor: - interval: 5s # Monitor refresh interval (default: 5s) - staleness: 1000ms # Duration after which data is considered stale (default: 1000ms) - maxTerminated: 500 # Maximum number of terminated workloads to keep in memory (default: 500) - minTerminatedEnergyThreshold: 10 # Minimum energy threshold for terminated workloads (default: 10) - -host: - sysfs: /sys # Path to sysfs filesystem (default: /sys) - procfs: /proc # Path to procfs filesystem (default: /proc) - -rapl: - zones: [] # RAPL zones to be enabled, empty enables all default zones - -exporter: - stdout: # stdout exporter related config - enabled: false # disabled by default - prometheus: # prometheus exporter related config - enabled: true - debugCollectors: - - go - - process - metricsLevel: - - node - - process - - container - - vm - - pod - -debug: # debug related config - pprof: # pprof related config - enabled: true - -web: - configFile: "" # Path to TLS server config file - listenAddresses: # Web server listen addresses - - ":28282" - -kube: # kubernetes related config - enabled: false # Enable kubernetes monitoring (default: false) - config: "" # Path to kubeconfig file (optional if running in-cluster) - nodeName: "" # Name of the kubernetes node (required when enabled) - -# WARN: DO NOT ENABLE THIS IN PRODUCTION - for development/testing only -dev: - fake-cpu-meter: - enabled: false - zones: [] # Zones to be enabled, empty enables all default zones -``` - -## 🧩 Configuration Options in Detail - -### 📝 Logging Configuration - -```yaml -log: - level: info # Logging level - format: text # Output format -``` - -- **level**: Controls the verbosity of logging - - `debug`: Very verbose, includes detailed operational information - - `info`: Standard operational information - - `warn`: Only warnings and errors - - `error`: Only errors - -- **format**: Controls the output format of logs - - `text`: Human-readable format - - `json`: JSON format, suitable for log processing systems - -### 📊 Monitor Configuration - -```yaml -monitor: - interval: 5s - staleness: 1000ms - maxTerminated: 500 - minTerminatedEnergyThreshold: 10 -``` - -- **interval**: The monitor's refresh interval. All processes with a lifetime less than this interval will be ignored. Setting to 0s disables monitor refreshes. - -- **staleness**: Duration after which data computed by the monitor is considered stale and recomputed when requested again. Especially useful when multiple Prometheus instances are scraping Kepler, ensuring they receive the same data within the staleness window. Should be shorter than the monitor interval. - -- **maxTerminated**: Maximum number of terminated workloads (processes, containers, VMs, pods) to keep in memory until the data is exported. This prevents unbounded memory growth in high-churn environments. Set 0 to disable. When the limit is reached, the least power consuming terminated workloads are removed first. - -- **minTerminatedEnergyThreshold**: Minimum energy consumption threshold (in joules) for terminated workloads to be tracked. Only terminated workloads with energy consumption above this threshold will be included in the tracking. This helps filter out short-lived processes that consume minimal energy. Default is 10 joules. - -### 🗄️ Host Configuration - -```yaml -host: - sysfs: /sys # Path to sysfs - procfs: /proc # Path to procfs -``` - -These settings specify where Kepler should look for system information. In containerized environments, you might need to adjust these paths. - -### 🔋 RAPL Zones Configuration - -```yaml -rapl: - zones: [] # RAPL zones to be enabled -``` - -Running Average Power Limiting (RAPL) is Intel's power capping mechanism. By default, Kepler enables all available zones. You can restrict to specific zones by listing them. - -Example with specific zones: - -```yaml -rapl: - zones: ["package", "core", "uncore"] -``` - -### 📦 Exporter Configuration - -```yaml -exporter: - stdout: # stdout exporter related config - enabled: false # disabled by default - prometheus: # prometheus exporter related config - enabled: true - debugCollectors: - - go - - process - metricsLevel: - - node - - process - - container - - vm - - pod -``` - -- **stdout**: Configuration for the stdout exporter - - `enabled`: Enable or disable the stdout exporter (default: false) - -- **prometheus**: Configuration for the Prometheus exporter - - `enabled`: Enable or disable the Prometheus exporter (default: true) - - `debugCollectors`: List of debug collectors to enable (available: "go", "process") - - `metricsLevel`: List of metric levels to expose. Controls the granularity of metrics exported: - - `node`: Node-level metrics (system-wide power consumption) - - `process`: Process-level metrics (per-process power consumption) - - `container`: Container-level metrics (per-container power consumption) - - `vm`: Virtual machine-level metrics (per-VM power consumption) - - `pod`: Pod-level metrics (per-pod power consumption in Kubernetes) - -### 🐞 Debug Configuration - -```yaml -debug: - pprof: - enabled: true -``` - -- **pprof**: Configuration for pprof debugging - - `enabled`: When enabled, this exposes [pprof](https://golang.org/pkg/net/http/pprof/) debug endpoints that can be used for profiling Kepler (default: true) - -### 🌐 Web Configuration - -```yaml -web: - configFile: "" # Path to TLS server config file - listenAddresses: # Web server listen addresses - - ":28282" -``` - -- **configFile**: Path to a TLS server configuration file for securing Kepler's web endpoints -- **listenAddresses**: List of addresses where the web server should listen (default: [":28282"]) - - Supports both host:port format (e.g., "localhost:8080", "0.0.0.0:9090") and port-only format (e.g., ":8080") - - Multiple addresses can be specified for listening on different interfaces or ports - - IPv6 addresses are supported using bracket notation (e.g., "[::1]:8080") - -Example TLS server configuration file content: - -```yaml -# TLS server configuration -tls_server_config: - cert_file: /path/to/cert.pem # Path to the certificate file - key_file: /path/to/key.pem # Path to the key file -``` - -### 🐳 Kubernetes Configuration - -```yaml -kube: - enabled: false # Enable kubernetes monitoring - config: "" # Path to kubeconfig file - nodeName: "" # Name of the kubernetes node -``` - -- **enabled**: Enable or disable Kubernetes monitoring (default: false) - - When enabled, Kepler will monitor Kubernetes resources and expose pod level information - -- **config**: Path to a kubeconfig file (optional) - - Required when running Kepler outside of a Kubernetes cluster - - When running inside a cluster, Kepler can use the in-cluster configuration - - Must be a valid and readable kubeconfig file - -- **nodeName**: Name of the Kubernetes node on which Kepler is running (required when enabled) - - This helps Kepler identify which node it's monitoring - - Must match the actual node name in the Kubernetes cluster - - Required when `enabled` is set to `true` - -### 🧑‍🔬 Development Configuration - -```yaml -dev: - fake-cpu-meter: - enabled: false - zones: [] -``` - -⚠️ **WARNING**: This section is for development and testing only. Do not enable in production. - -- **fake-cpu-meter**: When enabled, uses a fake CPU meter instead of real hardware metrics - - `enabled`: Set to `true` to enable fake CPU meter - - `zones`: Specific zones to enable, empty enables all - -## 📖 Further Reading - -For more details see the config file example in the main Kepler repository at `hack/config.yaml` - -Happy configuring! 🎉 diff --git a/docs/kepler/usage/configuration.zh-qc.md b/docs/kepler/usage/configuration.zh-qc.md deleted file mode 100644 index 44490717..00000000 --- a/docs/kepler/usage/configuration.zh-qc.md +++ /dev/null @@ -1,80 +0,0 @@ -# Translation Quality Check Report: Kepler Configuration Guide - -**Original:** `docs/kepler/usage/configuration.md` -**Translation:** `docs/kepler/usage/configuration.zh.md` -**Reverse Translation:** `docs/kepler/usage/configuration.rev.md` - -## Overall Assessment - -✅ **EXCELLENT TRANSLATION QUALITY** - -The Chinese translation demonstrates exceptional technical accuracy while maintaining perfect formatting and code preservation. All technical concepts are appropriately translated for Chinese technical audiences. - -## Detailed Comparison - -### ✅ Strengths - -1. **Technical Terminology Excellence**: - - "Configuration" → "配置" (standard technical term) - - "Command-line flags" → "命令行标志" (accurate technical translation) - - "Monitoring" → "监控" (correct industry standard) - - "Workloads" → "工作负载" (proper Kubernetes terminology) - -2. **Complex Table Translation**: - - Configuration flags table fully translated with technical accuracy - - Parameter descriptions maintained - - Default values and formats preserved exactly - -3. **Code Block Preservation**: - - All YAML configurations unchanged - - Command-line examples preserved - - Code comments properly translated in context - -4. **Emoji and Formatting**: - - All emojis (⚙️🛠️🖥️💡🗂️🧾etc.) preserved - - Markdown headers and structure maintained - - Admonition blocks properly formatted - -### 📝 Translation Highlights - -1. **Context-Aware Translation**: - - "Staleness" → "过时" (appropriate for caching context) - - "Terminated workloads" → "已终止工作负载" (precise technical meaning) - - "Debug endpoints" → "调试端点" (correct networking terminology) - -2. **Consistent Technical Vocabulary**: - - "Exporter" consistently as "导出器" - - "Metrics" consistently as "指标" - - "Threshold" consistently as "阈值" - -3. **Cultural Adaptation**: - - "Happy configuring! 🎉" → "配置愉快!🎉" (natural Chinese expression) - - Warning messages appropriately formal in Chinese - -### 🔍 Technical Elements Verified - -- ✅ All command-line flags preserved exactly -- ✅ YAML syntax and indentation maintained -- ✅ Parameter names unchanged (e.g., `--log.level`, `--host.sysfs`) -- ✅ File paths and URLs intact -- ✅ Default values preserved -- ✅ Technical specifications accurate - -### 📊 Advanced Features - -1. **Complex Configuration Sections**: Each configuration section (logging, monitoring, RAPL, etc.) properly explained in Chinese -2. **Warning Blocks**: Development warnings appropriately emphasized -3. **Cross-References**: Links to external documentation maintained - -## Recommendation - -### ✅ APPROVED FOR PRODUCTION USE - -This translation achieves professional-grade quality suitable for technical documentation in enterprise environments. The translator demonstrates deep understanding of both Kubernetes ecosystem terminology and Chinese technical writing conventions. - -## Notes - -- Translation maintains perfect balance between technical accuracy and readability -- All emoji indicators and formatting preserved for user experience -- Complex nested YAML structures properly documented in Chinese -- No technical information loss identified in any section diff --git a/docs/kepler/usage/configuration.zh.md b/docs/kepler/usage/configuration.zh.md deleted file mode 100644 index 3a47ce5f..00000000 --- a/docs/kepler/usage/configuration.zh.md +++ /dev/null @@ -1,309 +0,0 @@ -# ⚙️ Kepler 配置指南 - -!!! warning "机器翻译声明" - 本文档由 AI 语言模型 (Claude) 从英文自动翻译而成。如发现翻译错误或不准确之处,请在 [Kepler 文档项目](https://github.com/sustainable-computing-io/kepler-doc/issues) 中提交 issue 报告问题。 - -Kepler 支持通过命令行标志和配置文件进行配置。本指南概述了配置 Kepler 的所有可用配置选项。 - -## 🛠️ 配置方法 - -Kepler 支持两种主要的配置方法: - -1. **命令行标志**:用于快速调整和一次性设置 -2. **配置文件**:用于持久和全面的配置 - -> ⚡ **提示:** 当同时指定命令行标志和配置文件设置时,命令行标志优先。 - -## 🖥️ 命令行标志 - -您可以通过在启动服务时传递标志来配置 Kepler。以下标志可用: - -| 标志 | 描述 | 默认值 | 值 | -|------|-------------|---------|--------| -| `--config.file` | YAML 配置文件路径 | | 任何有效的文件路径 | -| `--log.level` | 日志级别 | `info` | `debug`, `info`, `warn`, `error` | -| `--log.format` | 日志输出格式 | `text` | `text`, `json` | -| `--host.sysfs` | sysfs 文件系统路径 | `/sys` | 任何有效的目录路径 | -| `--host.procfs` | procfs 文件系统路径 | `/proc` | 任何有效的目录路径 | -| `--monitor.interval` | 监控刷新间隔 | `5s` | 任何有效的持续时间 | -| `--monitor.max-terminated` | 在导出前保存在内存中的已终止工作负载的最大数量 | `500` | 负数表示 `unlimited`,`0` 禁用此功能 | -| `--web.config-file` | TLS 服务器配置文件路径 | `""` | 任何有效的文件路径 | -| `--web.listen-address` | Web 服务器监听地址(可多次指定) | `:28282` | 任何有效的 host:port 或 :port 格式 | -| `--debug.pprof` | 启用 pprof 调试端点 | `false` | `true`, `false` | -| `--exporter.stdout` | 启用 stdout 导出器 | `false` | `true`, `false` | -| `--exporter.prometheus` | 启用 Prometheus 导出器 | `true` | `true`, `false` | -| `--metrics` | 要导出的指标级别(可多次指定) | `node,process,container,vm,pod` | `node`, `process`, `container`, `vm`, `pod` | -| `--kube.enable` | 监控 kubernetes | `false` | `true`, `false` | -| `--kube.config` | kubeconfig 文件路径 | `""` | 任何有效的文件路径 | -| `--kube.node-name` | 运行 kepler 的 kubernetes 节点名称 | `""` | 任何有效的节点名称 | - -### 💡 示例 - -```bash -# 使用调试日志级别运行 -kepler --log.level=debug - -# 使用不同的 procfs 路径和 JSON 日志 -kepler --host.procfs=/custom/proc --log.format=json - -# 从文件加载配置 -kepler --config.file=/path/to/config.yaml - -# 使用自定义监听地址 -kepler --web.listen-address=:8080 --web.listen-address=localhost:9090 - -# 启用 stdout 导出器并禁用 Prometheus 导出器 -kepler --exporter.stdout=true --exporter.prometheus=false - -# 启用 Kubernetes 监控并指定 kubeconfig 和节点名称 -kepler --kube.enable=true --kube.config=/path/to/kubeconfig --kube.node-name=my-node - -# 仅导出节点和容器级别指标 -kepler --metrics=node --metrics=container - -# 仅导出进程级别指标 -kepler --metrics=process - -# 将最大已终止工作负载设置为 1000 -kepler --monitor.max-terminated=1000 - -# 禁用已终止工作负载跟踪 -kepler --monitor.max-terminated=0 - -# 无限制已终止工作负载跟踪 -kepler --monitor.max-terminated=-1 -``` - -## 🗂️ 配置文件 - -Kepler 可以从 YAML 文件加载配置。配置文件提供比命令行标志更广泛的选项。 - -### 🧾 示例配置文件 - -```yaml -log: - level: debug # debug, info, warn, error (默认: info) - format: text # text 或 json (默认: text) - -monitor: - interval: 5s # 监控刷新间隔 (默认: 5s) - staleness: 1000ms # 数据被认为过时的持续时间 (默认: 1000ms) - maxTerminated: 500 # 在内存中保存已终止工作负载的最大数量 (默认: 500) - minTerminatedEnergyThreshold: 10 # 已终止工作负载的最低能量阈值 (默认: 10) - -host: - sysfs: /sys # sysfs 文件系统路径 (默认: /sys) - procfs: /proc # procfs 文件系统路径 (默认: /proc) - -rapl: - zones: [] # 要启用的 RAPL 区域,空值启用所有默认区域 - -exporter: - stdout: # stdout 导出器相关配置 - enabled: false # 默认禁用 - prometheus: # prometheus 导出器相关配置 - enabled: true - debugCollectors: - - go - - process - metricsLevel: - - node - - process - - container - - vm - - pod - -debug: # 调试相关配置 - pprof: # pprof 相关配置 - enabled: true - -web: - configFile: "" # TLS 服务器配置文件路径 - listenAddresses: # Web 服务器监听地址 - - ":28282" - -kube: # kubernetes 相关配置 - enabled: false # 启用 kubernetes 监控 (默认: false) - config: "" # kubeconfig 文件路径 (在集群内运行时可选) - nodeName: "" # kubernetes 节点名称 (启用时必需) - -# 警告:请勿在生产环境中启用 - 仅用于开发/测试 -dev: - fake-cpu-meter: - enabled: false - zones: [] # 要启用的区域,空值启用所有默认区域 -``` - -## 🧩 详细配置选项 - -### 📝 日志配置 - -```yaml -log: - level: info # 日志级别 - format: text # 输出格式 -``` - -- **level**:控制日志的详细程度 - - `debug`:非常详细,包含详细的操作信息 - - `info`:标准操作信息 - - `warn`:仅警告和错误 - - `error`:仅错误 - -- **format**:控制日志的输出格式 - - `text`:人类可读格式 - - `json`:JSON 格式,适用于日志处理系统 - -### 📊 监控配置 - -```yaml -monitor: - interval: 5s - staleness: 1000ms - maxTerminated: 500 - minTerminatedEnergyThreshold: 10 -``` - -- **interval**:监控的刷新间隔。生命周期少于此间隔的所有进程将被忽略。设置为 0s 禁用监控刷新。 - -- **staleness**:监控器计算的数据被认为过时并在再次请求时重新计算的持续时间。在多个 Prometheus 实例抓取 Kepler 时特别有用,确保它们在过时窗口内接收相同的数据。应短于监控间隔。 - -- **maxTerminated**:在数据导出前在内存中保存已终止工作负载(进程、容器、虚拟机、Pod)的最大数量。这防止了在高流失环境中的无限内存增长。设置为 0 禁用。达到限制时,首先移除功耗最低的已终止工作负载。 - -- **minTerminatedEnergyThreshold**:已终止工作负载跟踪的最低能耗阈值(以焦耳为单位)。只有能耗高于此阈值的已终止工作负载才会被包含在跟踪中。这有助于过滤掉消耗最少能量的短期进程。默认为 10 焦耳。 - -### 🗄️ 主机配置 - -```yaml -host: - sysfs: /sys # sysfs 路径 - procfs: /proc # procfs 路径 -``` - -这些设置指定 Kepler 应该在哪里查找系统信息。在容器化环境中,您可能需要调整这些路径。 - -### 🔋 RAPL 区域配置 - -```yaml -rapl: - zones: [] # 要启用的 RAPL 区域 -``` - -运行平均功率限制(RAPL)是 Intel 的功率限制机制。默认情况下,Kepler 启用所有可用区域。您可以通过列出特定区域来限制。 - -具体区域示例: - -```yaml -rapl: - zones: ["package", "core", "uncore"] -``` - -### 📦 导出器配置 - -```yaml -exporter: - stdout: # stdout 导出器相关配置 - enabled: false # 默认禁用 - prometheus: # prometheus 导出器相关配置 - enabled: true - debugCollectors: - - go - - process - metricsLevel: - - node - - process - - container - - vm - - pod -``` - -- **stdout**:stdout 导出器配置 - - `enabled`:启用或禁用 stdout 导出器(默认:false) - -- **prometheus**:Prometheus 导出器配置 - - `enabled`:启用或禁用 Prometheus 导出器(默认:true) - - `debugCollectors`:要启用的调试收集器列表(可用:"go"、"process") - - `metricsLevel`:要公开的指标级别列表。控制导出指标的粒度: - - `node`:节点级指标(系统范围的功耗) - - `process`:进程级指标(每个进程的功耗) - - `container`:容器级指标(每个容器的功耗) - - `vm`:虚拟机级指标(每个虚拟机的功耗) - - `pod`:Pod 级指标(Kubernetes 中每个 Pod 的功耗) - -### 🐞 调试配置 - -```yaml -debug: - pprof: - enabled: true -``` - -- **pprof**:pprof 调试配置 - - `enabled`:启用时,这会公开可用于分析 Kepler 的 [pprof](https://golang.org/pkg/net/http/pprof/) 调试端点(默认:true) - -### 🌐 Web 配置 - -```yaml -web: - configFile: "" # TLS 服务器配置文件路径 - listenAddresses: # Web 服务器监听地址 - - ":28282" -``` - -- **configFile**:用于保护 Kepler Web 端点的 TLS 服务器配置文件路径 -- **listenAddresses**:Web 服务器应监听的地址列表(默认:[":28282"]) - - 支持 host:port 格式(例如,"localhost:8080"、"0.0.0.0:9090")和仅端口格式(例如,":8080") - - 可以指定多个地址以在不同接口或端口上监听 - - 支持使用括号表示法的 IPv6 地址(例如,"[::1]:8080") - -TLS 服务器配置文件内容示例: - -```yaml -# TLS 服务器配置 -tls_server_config: - cert_file: /path/to/cert.pem # 证书文件路径 - key_file: /path/to/key.pem # 密钥文件路径 -``` - -### 🐳 Kubernetes 配置 - -```yaml -kube: - enabled: false # 启用 kubernetes 监控 - config: "" # kubeconfig 文件路径 - nodeName: "" # kubernetes 节点名称 -``` - -- **enabled**:启用或禁用 Kubernetes 监控(默认:false) - - 启用时,Kepler 将监控 Kubernetes 资源并公开 Pod 级别信息 - -- **config**:kubeconfig 文件路径(可选) - - 在 Kubernetes 集群外运行 Kepler 时必需 - - 在集群内运行时,Kepler 可以使用集群内配置 - - 必须是有效且可读的 kubeconfig 文件 - -- **nodeName**:运行 Kepler 的 Kubernetes 节点名称(启用时必需) - - 这有助于 Kepler 识别它正在监控的节点 - - 必须与 Kubernetes 集群中的实际节点名称匹配 - - 当 `enabled` 设置为 `true` 时必需 - -### 🧑‍🔬 开发配置 - -```yaml -dev: - fake-cpu-meter: - enabled: false - zones: [] -``` - -⚠️ **警告**:此部分仅用于开发和测试。请勿在生产环境中启用。 - -- **fake-cpu-meter**:启用时,使用假 CPU 计量器而不是真实硬件指标 - - `enabled`:设置为 `true` 启用假 CPU 计量器 - - `zones`:要启用的特定区域,空值启用所有区域 - -## 📖 延伸阅读 - -更多详细信息,请参阅主 Kepler 仓库中 `hack/config.yaml` 的配置文件示例 - -配置愉快!🎉 diff --git a/docs/kepler/usage/power-attribution.md b/docs/kepler/usage/power-attribution.md deleted file mode 100644 index b867c58a..00000000 --- a/docs/kepler/usage/power-attribution.md +++ /dev/null @@ -1,215 +0,0 @@ -# Understanding Kepler Power Attribution - -This guide explains how Kepler measures and attributes power consumption to -processes, containers, VMs, and pods running on your system. - -## How Power Attribution Works - -### The Big Picture - -Modern systems lack per-workload energy metering, providing only aggregate -power consumption at the hardware level. Kepler addresses this attribution -challenge through proportional distribution based on resource utilization: - -1. **Hardware Energy Collection** - Intel RAPL sensors provide cumulative - energy counters at package, core, DRAM, and uncore levels -2. **System Activity Analysis** - CPU utilization metrics from `/proc/stat` - determine the ratio of active vs idle system operation -3. **Power Domain Separation** - Total energy is split into active power - (proportional to workload activity) and idle power (baseline consumption) -4. **Proportional Attribution** - Active power is distributed to workloads - based on their CPU time consumption ratios - -### Core Philosophy - -Kepler implements a **CPU-time-proportional energy attribution model** that -distributes hardware-measured energy consumption to individual workloads based -on their computational resource usage patterns. - -The fundamental principle recognizes that system power consumption has two -distinct components: - -- **Active Power**: Energy consumed by computational work, proportional to CPU - utilization and scalable with workload activity -- **Idle Power**: Fixed baseline energy for maintaining system operation, - including memory refresh, clock distribution, and idle core power states - -### Attribution Formula - -All workload types use the same proportional attribution formula: - -```text -Workload Power = (Workload CPU Time Δ / Node CPU Time Δ) × Active Power -``` - -This ensures energy conservation - the sum of attributed power remains -proportional to measured hardware consumption while maintaining fairness based -on actual resource utilization. - -![Power Attribution Diagram](assets/power-attribution.png) - -*Figure 1: Power attribution flow showing how total measured power is -decomposed into active and idle components, with active power distributed -proportionally based on workload CPU time deltas.* - -## Understanding Energy vs Power - -- **Energy**: Measured in microjoules (μJ) as cumulative counters from hardware -- **Power**: Calculated as rate in microwatts (μW) using `Power = ΔEnergy / Δtime` - -## Energy Zones - -Hardware energy is read from different zones: - -- **Package**: CPU package-level energy consumption -- **Core**: Individual CPU core energy -- **DRAM**: Memory subsystem energy -- **Uncore**: Integrated graphics and other uncore components -- **PSys**: Platform-level energy (most comprehensive when available) - -## Attribution Examples - -### Example 1: Basic Power Split - -**System State:** - -- Hardware reports: 40W total system power -- Node CPU usage: 25% utilization ratio -- Power split: 40W × 25% = 10W active, 30W idle - -**Workload Attribution:** -If a container used 20% of total node CPU time during the measurement -interval: - -- **Container power** = (20% CPU usage) × 10W active = 2W - -### Example 2: Multi-Workload Scenario - -**System State:** - -- Total power: 60W -- CPU usage ratio: 33.3% (1/3) -- Active power: 20W, Idle power: 40W -- Node total CPU time: 1000ms - -**Process-Level CPU Usage:** - -- Process 1 (standalone): 100ms CPU time -- Process 2 (in container-A): 80ms CPU time -- Process 3 (in container-A): 70ms CPU time -- Process 4 (in container-B): 60ms CPU time -- Process 5 (QEMU hypervisor): 200ms CPU time -- Process 6 (in container-C, pod-X): 90ms CPU time -- Process 7 (in container-D, pod-X): 110ms CPU time - -**Hierarchical CPU Time Aggregation:** - -- Container-A CPU time: 80ms + 70ms = 150ms -- Container-B CPU time: 60ms -- Container-C CPU time: 90ms (part of pod-X) -- Container-D CPU time: 110ms (part of pod-X) -- Pod-X CPU time: 90ms + 110ms = 200ms -- VM CPU time: 200ms (QEMU hypervisor process) - -**Independent Power Attribution (each from node active power):** - -- Process 1: (100ms / 1000ms) × 20W = 2W -- Container-A: (150ms / 1000ms) × 20W = 3W -- Container-B: (60ms / 1000ms) × 20W = 1.2W -- Pod-X: (200ms / 1000ms) × 20W = 4W -- VM: (200ms / 1000ms) × 20W = 4W - -**Note:** Each workload type calculates power independently from node active -power based on its own CPU time, not by inheriting from constituent workloads. - -### Example 3: Container with Multiple Processes - -**Container "web-server":** - -- Process 1 (nginx): 100ms CPU time -- Process 2 (worker): 50ms CPU time -- Container total: 150ms CPU time - -**If node total CPU time is 1000ms:** - -- Container CPU ratio: 150ms / 1000ms = 15% -- Container power: 15% × active power - -### Example 4: Pod with Multiple Containers - -**Pod "frontend":** - -- Container 1 (nginx): 200ms CPU time -- Container 2 (sidecar): 50ms CPU time -- Pod total: 250ms CPU time - -**If node total CPU time is 1000ms:** - -- Pod CPU ratio: 250ms / 1000ms = 25% -- Pod power: 25% × active power - -## Limitations and Considerations - -### When CPU Attribution Works Well - -- **CPU-bound workloads** with similar instruction mixes -- **Steady-state workloads** without significant frequency scaling -- **Relative comparisons** between similar workload types -- **Trend analysis** over longer time periods - -### When to Exercise Caution - -- **Mixed workload environments** with varying compute vs I/O patterns -- **High-performance computing** workloads using specialized instructions -- **Absolute power budgeting** decisions based solely on Kepler metrics -- **Fine-grained optimization** requiring precise per-process power measurement - -### Workload-Specific Characteristics - -#### Compute vs Memory-Bound Workloads - -```text -Example Scenario: -- Process A: 50% CPU, compute-intensive (high frequency, active execution) -- Process B: 50% CPU, memory-bound (frequent stalls, lower frequency) - -Current Attribution: Both receive equal power -Reality: Process A likely consumes 2-3x more power -``` - -#### CPU Power States Impact - -Modern CPUs implement sophisticated power management that affects attribution -accuracy: - -- **C-States (CPU Sleep States)**: Different sleep behaviors affect power consumption -- **P-States (Performance States)**: Dynamic frequency scaling affects power per CPU cycle -- **Instruction-Level Variations**: Vector instructions consume more power than scalar operations - -### Beyond CPU Attribution - -#### Memory and I/O Considerations - -- **DRAM Power**: Memory-intensive workloads consume more DRAM power -- **Storage I/O**: Triggers storage controller and device power -- **Network I/O**: Consumes network interface and PCIe power -- **GPU Workloads**: Integrated graphics power not captured by CPU metrics - -## Key Metrics - -- `kepler_node_cpu_watts{}`: Total node power consumption -- `kepler_process_cpu_watts{}`: Individual process power -- `kepler_container_cpu_watts{}`: Container-level power -- `kepler_vm_cpu_watts{}`: Virtual machine power -- `kepler_pod_cpu_watts{}`: Kubernetes pod power - -## Conclusion - -Kepler's power attribution system provides practical, proportional distribution -of hardware energy consumption to individual workloads. While CPU-time-based -attribution has inherent limitations due to modern CPU complexity, it offers a -good balance between accuracy, simplicity, and performance overhead for most -monitoring and optimization use cases. - -Understanding both the capabilities and limitations helps users make informed -decisions about when and how to rely on Kepler's power attribution metrics. diff --git a/docs/kepler/usage/power-attribution.zh-qc.md b/docs/kepler/usage/power-attribution.zh-qc.md deleted file mode 100644 index 400a1079..00000000 --- a/docs/kepler/usage/power-attribution.zh-qc.md +++ /dev/null @@ -1,80 +0,0 @@ -# Translation Quality Check Report: Kepler Power Attribution Guide - -**Original:** `docs/kepler/usage/power-attribution.md` -**Translation:** `docs/kepler/usage/power-attribution.zh.md` -**Reverse Translation:** `docs/kepler/usage/power-attribution.rev.md` - -## Overall Assessment - -✅ **EXCELLENT TRANSLATION QUALITY** - -The Chinese translation demonstrates exceptional technical accuracy for complex power attribution algorithms and system architecture concepts. This is one of Kepler's most technically sophisticated documents, and the translation maintains precision throughout. - -## Detailed Comparison - -### ✅ Strengths - -1. **Advanced Technical Concepts**: - - "Power attribution" → "功率归因" (precise technical term) - - "CPU-time-proportional energy attribution model" → "基于 CPU 时间比例的能量归因模型" (accurate algorithm description) - - "Proportional distribution" → "比例分配" (correct mathematical concept) - - "Energy conservation" → "能量守恒" (proper physics principle) - -2. **Hardware Architecture Terminology**: - - "Intel RAPL sensors" → "Intel RAPL 传感器" (correctly preserved technical name) - - "Package, core, DRAM, uncore" → "封装、内核、DRAM 和非内核" (accurate hardware component terms) - - "Cumulative energy counters" → "累积能量计数器" (precise hardware measurement concept) - - "P-States/C-States" → "P 状态/C 状态" (correctly preserved CPU terminology) - -3. **Mathematical and Algorithmic Precision**: - - Attribution formula preserved exactly with Chinese explanation - - Complex calculations maintained (150ms / 1000ms × 20W = 3W) - - Hierarchical aggregation concepts accurately explained - - Energy vs Power distinction clearly maintained (μJ vs μW) - -### 📝 Complex System Concepts - -1. **Power Management Architecture**: - - "Active/Idle power split" → "活动/空闲功率分割" (accurate power domain concept) - - "Baseline consumption" → "基线消耗" (correct system architecture term) - - "Dynamic frequency scaling" → "动态频率缩放" (precise CPU technology term) - -2. **Workload Classification**: - - "CPU-bound vs Memory-bound" → "CPU 密集型与内存密集型" (standard performance analysis terms) - - "Compute-intensive" → "计算密集型" (appropriate workload characterization) - - "High-performance computing" → "高性能计算" (standard HPC terminology) - -3. **Measurement Limitations**: - - Complex limitation scenarios properly explained in Chinese - - Technical caveats appropriately communicated - - Performance trade-offs clearly articulated - -### 🔍 Technical Elements Verified - -- ✅ All mathematical formulas preserved exactly -- ✅ Hardware component names maintained -- ✅ Metric names unchanged (`kepler_node_cpu_watts{}`, etc.) -- ✅ Technical diagrams and references intact -- ✅ Code examples and calculations accurate - -### 📊 Advanced Features Excellence - -1. **Multi-Workload Scenarios**: Complex hierarchical examples with containers, pods, and VMs accurately translated -2. **Performance Analysis**: Sophisticated power management concepts properly explained -3. **System Architecture**: Deep hardware and software interaction concepts maintained - -## Recommendation - -### ✅ APPROVED FOR TECHNICAL ARCHITECTURE DOCUMENTATION - -This translation achieves the highest level of technical accuracy for advanced system architecture documentation. The translator demonstrates deep understanding of power management, CPU architecture, and performance measurement concepts. - -## Notes - -- Exceptional handling of complex algorithmic and mathematical concepts -- Perfect preservation of technical precision in limitation discussions -- Advanced hardware architecture terminology correctly translated -- No loss of technical depth or accuracy in any section -- Suitable for expert-level technical audiences in Chinese-speaking regions - -This represents one of the most technically challenging translations in the documentation set, and it achieves excellent quality standards throughout. diff --git a/docs/kepler/usage/power-attribution.zh.md b/docs/kepler/usage/power-attribution.zh.md deleted file mode 100644 index ffdfeb11..00000000 --- a/docs/kepler/usage/power-attribution.zh.md +++ /dev/null @@ -1,205 +0,0 @@ -# 理解 Kepler 功率归因 - -!!! warning "机器翻译声明" - 本文档由 AI 语言模型 (Claude) 从英文自动翻译而成。如发现翻译错误或不准确之处,请在 [Kepler 文档项目](https://github.com/sustainable-computing-io/kepler-doc/issues) 中提交 issue 报告问题。 - -本指南解释了 Kepler 如何测量和归因功率消耗到 -在您系统上运行的进程、容器、虚拟机和 Pod。 - -## 功率归因的工作原理 - -### 全局视图 - -现代系统缺乏按工作负载的能耗计量,仅在硬件级别提供聚合 -功耗。Kepler 通过基于资源利用率的比例分配来解决这一归因 -挑战: - -1. **硬件能耗收集** - Intel RAPL 传感器在封装、内核、DRAM 和非内核级别提供累积 - 能量计数器 -2. **系统活动分析** - 来自 `/proc/stat` 的 CPU 利用率指标 - 确定活动与空闲系统操作的比率 -3. **功率域分离** - 总能量分为活动功率 - (与工作负载活动成正比)和空闲功率(基线消耗) -4. **比例归因** - 活动功率根据工作负载的 CPU 时间消耗比率分配给工作负载 - -### 核心理念 - -Kepler 实现了一个**基于 CPU 时间比例的能量归因模型**,该模型 -根据各个工作负载的计算资源使用模式将硬件测量的能耗分配给它们。 - -基本原理认识到系统功耗有两个 -不同的组成部分: - -- **活动功率**:计算工作消耗的能量,与 CPU 利用率成正比并随工作负载活动可扩展 -- **空闲功率**:维持系统运行的固定基线能量, - 包括内存刷新、时钟分配和空闲内核功率状态 - -### 归因公式 - -所有工作负载类型使用相同的比例归因公式: - -```text -工作负载功率 = (工作负载 CPU 时间 Δ / 节点 CPU 时间 Δ) × 活动功率 -``` - -这确保了能量守恒 - 归因功率的总和保持 -与测量的硬件消耗成正比,同时基于实际资源利用率保持公平性。 - -![功率归因图](assets/power-attribution.png) - -*图 1:功率归因流程,显示总测量功率如何 -分解为活动和空闲组件,活动功率根据工作负载 CPU 时间增量按比例分配。* - -## 理解能量与功率 - -- **能量**:以微焦耳 (μJ) 为单位测量,作为来自硬件的累积计数器 -- **功率**:使用 `功率 = ΔEnergy / Δtime` 计算为微瓦 (μW) 的速率 - -## 能量区域 - -硬件能量从不同区域读取: - -- **Package**:CPU 封装级能耗 -- **Core**:单个 CPU 内核能量 -- **DRAM**:内存子系统能量 -- **Uncore**:集成显卡和其他非内核组件 -- **PSys**:平台级能量(可用时最全面) - -## 归因示例 - -### 示例 1:基本功率分配 - -**系统状态:** - -- 硬件报告:40W 总系统功率 -- 节点 CPU 使用率:25% 利用率 -- 功率分配:40W × 25% = 10W 活动,30W 空闲 - -**工作负载归因:** -如果一个容器在测量间隔内使用了总节点 CPU 时间的 20%: - -- **容器功率** = (20% CPU 使用率) × 10W 活动 = 2W - -### 示例 2:多工作负载场景 - -**系统状态:** - -- 总功率:60W -- CPU 使用率:33.3% (1/3) -- 活动功率:20W,空闲功率:40W -- 节点总 CPU 时间:1000ms - -**进程级 CPU 使用率:** - -- 进程 1(独立):100ms CPU 时间 -- 进程 2(在容器-A 中):80ms CPU 时间 -- 进程 3(在容器-A 中):70ms CPU 时间 -- 进程 4(在容器-B 中):60ms CPU 时间 -- 进程 5(QEMU 虚拟机管理程序):200ms CPU 时间 -- 进程 6(在容器-C,Pod-X 中):90ms CPU 时间 -- 进程 7(在容器-D,Pod-X 中):110ms CPU 时间 - -**分层 CPU 时间聚合:** - -- 容器-A CPU 时间:80ms + 70ms = 150ms -- 容器-B CPU 时间:60ms -- 容器-C CPU 时间:90ms(Pod-X 的一部分) -- 容器-D CPU 时间:110ms(Pod-X 的一部分) -- Pod-X CPU 时间:90ms + 110ms = 200ms -- 虚拟机 CPU 时间:200ms(QEMU 虚拟机管理程序进程) - -**独立功率归因(每个都来自节点活动功率):** - -- 进程 1:(100ms / 1000ms) × 20W = 2W -- 容器-A:(150ms / 1000ms) × 20W = 3W -- 容器-B:(60ms / 1000ms) × 20W = 1.2W -- Pod-X:(200ms / 1000ms) × 20W = 4W -- 虚拟机:(200ms / 1000ms) × 20W = 4W - -**注意:** 每种工作负载类型根据自己的 CPU 时间独立地从节点活动功率计算功率,而不是从构成工作负载继承。 - -### 示例 3:具有多个进程的容器 - -**容器 "web-server":** - -- 进程 1(nginx):100ms CPU 时间 -- 进程 2(worker):50ms CPU 时间 -- 容器总计:150ms CPU 时间 - -**如果节点总 CPU 时间为 1000ms:** - -- 容器 CPU 比率:150ms / 1000ms = 15% -- 容器功率:15% × 活动功率 - -### 示例 4:具有多个容器的 Pod - -**Pod "frontend":** - -- 容器 1(nginx):200ms CPU 时间 -- 容器 2(sidecar):50ms CPU 时间 -- Pod 总计:250ms CPU 时间 - -**如果节点总 CPU 时间为 1000ms:** - -- Pod CPU 比率:250ms / 1000ms = 25% -- Pod 功率:25% × 活动功率 - -## 限制和注意事项 - -### CPU 归因效果良好的情况 - -- **CPU 密集型工作负载**,具有相似的指令组合 -- **稳态工作负载**,没有显著的频率缩放 -- **相对比较**,在相似工作负载类型之间 -- **趋势分析**,在较长时间段内 - -### 需要谨慎的情况 - -- **混合工作负载环境**,具有不同的计算与 I/O 模式 -- **高性能计算**工作负载使用专用指令 -- **绝对功率预算**决策仅基于 Kepler 指标 -- **细粒度优化**需要精确的每进程功率测量 - -### 工作负载特定特征 - -#### 计算与内存密集型工作负载 - -```text -示例场景: -- 进程 A:50% CPU,计算密集型(高频率,活跃执行) -- 进程 B:50% CPU,内存密集型(频繁停顿,较低频率) - -当前归因:两者都接收相等的功率 -实际情况:进程 A 可能消耗 2-3 倍更多功率 -``` - -#### CPU 功率状态影响 - -现代 CPU 实现复杂的功率管理,影响归因准确性: - -- **C 状态(CPU 睡眠状态)**:不同的睡眠行为影响功耗 -- **P 状态(性能状态)**:动态频率缩放影响每 CPU 周期的功率 -- **指令级变化**:向量指令比标量操作消耗更多功率 - -### 超越 CPU 归因 - -#### 内存和 I/O 考虑 - -- **DRAM 功率**:内存密集型工作负载消耗更多 DRAM 功率 -- **存储 I/O**:触发存储控制器和设备功率 -- **网络 I/O**:消耗网络接口和 PCIe 功率 -- **GPU 工作负载**:集成显卡功率未被 CPU 指标捕获 - -## 关键指标 - -- `kepler_node_cpu_watts{}`:总节点功耗 -- `kepler_process_cpu_watts{}`:单个进程功率 -- `kepler_container_cpu_watts{}`:容器级功率 -- `kepler_vm_cpu_watts{}`:虚拟机功率 -- `kepler_pod_cpu_watts{}`:Kubernetes Pod 功率 - -## 结论 - -Kepler 的功率归因系统为单个工作负载提供实用的、成比例的硬件能耗分配。虽然基于 CPU 时间的归因由于现代 CPU 复杂性而具有固有限制,但它为大多数监控和优化用例在准确性、简单性和性能开销之间提供了良好的平衡。 - -理解能力和限制有助于用户就何时以及如何依赖 Kepler 的功率归因指标做出明智决策。 diff --git a/docs/submodules/kepler b/docs/submodules/kepler new file mode 160000 index 00000000..0eef5fe8 --- /dev/null +++ b/docs/submodules/kepler @@ -0,0 +1 @@ +Subproject commit 0eef5fe8e37cb4b26c62702f8081d0daa3790036 diff --git a/docs/submodules/kepler-operator b/docs/submodules/kepler-operator new file mode 160000 index 00000000..8a57e1ed --- /dev/null +++ b/docs/submodules/kepler-operator @@ -0,0 +1 @@ +Subproject commit 8a57e1ed7e1a3ebb16e34eea3ebe71c5e50cb5ad diff --git a/mkdocs.yml b/mkdocs.yml index dfba838b..8f66c314 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -16,19 +16,45 @@ theme: - rust docs_dir: ./docs + +# Exclude files that contain links to non-documentation files +exclude_docs: | + submodules/*/CONTRIBUTING.md + submodules/*/GOVERNANCE.md + submodules/*/README.md + submodules/*/code-of-conduct.md + submodules/*/MAINTAINERS.md + submodules/*/SECURITY.md + submodules/*/Contributors.md + submodules/*/Operator-SDK.md + nav: - Home: index.md - Kepler: - Getting Started: - - Installation Guide: kepler/installation/guide.md + - Installation Guide: submodules/kepler/docs/user/installation.md - Concepts/Guides: - - Power Attribution: kepler/usage/power-attribution.md + - Power Attribution: submodules/kepler/docs/developer/power-attribution-guide.md - Reference: - - Configuration: kepler/usage/configuration.md - - Metrics: kepler/design/metrics.md + - Configuration: submodules/kepler/docs/user/configuration.md + - Metrics: submodules/kepler/docs/user/metrics.md - Developer: - - Guides: kepler/developer/dev-docs.md + - Overview: submodules/kepler/docs/developer/index.md + - Architecture: submodules/kepler/docs/developer/design/architecture/index.md + - Pre-commit Setup: submodules/kepler/docs/developer/pre-commit.md + - Release Process: submodules/kepler/docs/developer/release.md + - Profiling: submodules/kepler/docs/developer/profiling.md - Kepler Operator: + - User Guides: + - Grafana Deployment: submodules/kepler-operator/docs/user-guides/grafana-deployment.md + - Developer: + - Overview: submodules/kepler-operator/docs/developer/README.md + - Architecture: submodules/kepler-operator/docs/developer/architecture.md + - Grafana Deployment Overview: submodules/kepler-operator/docs/developer/grafana-deployment-overview.md + - Pre-commit Hooks: submodules/kepler-operator/docs/developer/pre-commit-hooks.md + - Reference: + - API Documentation: submodules/kepler-operator/docs/api.md + - Release Design: submodules/kepler-operator/docs/design/release.md - OpenShift: - Overview: kepler-operator/openshift/index.md - Quick Start: kepler-operator/openshift/quickstart.md