diff --git a/.cursor/rules/api-protocols.mdc b/.cursor/rules/api-protocols.mdc new file mode 100644 index 0000000..d348c83 --- /dev/null +++ b/.cursor/rules/api-protocols.mdc @@ -0,0 +1,140 @@ +--- +description: +globs: +alwaysApply: false +--- +# API协议与规范 + +## 协议概览 + +GoAnalysis使用Protocol Buffers定义API,支持gRPC和HTTP两种协议,实现强类型、高性能的服务间通信。 + +## API服务定义 + +### 分析服务 ([api/analysis/v1/](mdc:goanalysis/api/analysis/v1)) + +#### 核心文件 +- [analysis.proto](mdc:goanalysis/api/analysis/v1/analysis.proto) - 分析服务protobuf定义 +- [analysis.pb.go](mdc:goanalysis/api/analysis/v1/analysis.pb.go) - 生成的Go消息类型 +- [analysis_grpc.pb.go](mdc:goanalysis/api/analysis/v1/analysis_grpc.pb.go) - gRPC服务接口 +- [analysis.pb.gw.go](mdc:goanalysis/api/analysis/v1/analysis.pb.gw.go) - HTTP网关映射 + +#### 错误处理 +- [error_reason.proto](mdc:goanalysis/api/analysis/v1/error_reason.proto) - 错误码定义 +- [error_reason.pb.go](mdc:goanalysis/api/analysis/v1/error_reason.pb.go) - 错误类型 + +### 静态分析服务 ([api/staticanalysis/v1/](mdc:goanalysis/api/staticanalysis/v1)) + +#### 核心文件 +- [staticanalysis.proto](mdc:goanalysis/api/staticanalysis/v1/staticanalysis.proto) - 静态分析API定义 +- [staticanalysis.pb.go](mdc:goanalysis/api/staticanalysis/v1/staticanalysis.pb.go) - 消息类型 +- [staticanalysis_grpc.pb.go](mdc:goanalysis/api/staticanalysis/v1/staticanalysis_grpc.pb.go) - gRPC接口 +- [staticanalysis.pb.gw.go](mdc:goanalysis/api/staticanalysis/v1/staticanalysis.pb.gw.go) - HTTP网关 +- [staticanalysis_http.pb.go](mdc:goanalysis/api/staticanalysis/v1/staticanalysis_http.pb.go) - HTTP处理器 + +### 文件管理服务 ([api/filemanager/v1/](mdc:goanalysis/api/filemanager/v1)) + +#### 核心文件 +- [filemanager.proto](mdc:goanalysis/api/filemanager/v1/filemanager.proto) - 文件管理API定义 +- [filemanager.pb.go](mdc:goanalysis/api/filemanager/v1/filemanager.pb.go) - 消息类型 +- [filemanager_grpc.pb.go](mdc:goanalysis/api/filemanager/v1/filemanager_grpc.pb.go) - gRPC接口 +- [filemanager.pb.gw.go](mdc:goanalysis/api/filemanager/v1/filemanager.pb.gw.go) - HTTP网关 + +## 第三方协议 ([third_party/](mdc:goanalysis/third_party)) + +### Google APIs +- [google/api/annotations.proto](mdc:goanalysis/third_party/google/api/annotations.proto) - HTTP注解 +- [google/api/http.proto](mdc:goanalysis/third_party/google/api/http.proto) - HTTP路由定义 +- [google/api/field_behavior.proto](mdc:goanalysis/third_party/google/api/field_behavior.proto) - 字段行为注解 + +### 标准类型 +- [google/protobuf/empty.proto](mdc:goanalysis/third_party/google/protobuf/empty.proto) - 空消息 +- [google/protobuf/timestamp.proto](mdc:goanalysis/third_party/google/protobuf/timestamp.proto) - 时间戳 +- [google/protobuf/duration.proto](mdc:goanalysis/third_party/google/protobuf/duration.proto) - 时间间隔 +- [google/protobuf/struct.proto](mdc:goanalysis/third_party/google/protobuf/struct.proto) - 动态结构 + +### 验证和错误处理 +- [validate/validate.proto](mdc:goanalysis/third_party/validate/validate.proto) - 字段验证规则 +- [errors/errors.proto](mdc:goanalysis/third_party/errors/errors.proto) - 错误处理 + +### OpenAPI +- [openapi/v3/annotations.proto](mdc:goanalysis/third_party/openapi/v3/annotations.proto) - OpenAPI注解 +- [openapi/v3/openapi.proto](mdc:goanalysis/third_party/openapi/v3/openapi.proto) - OpenAPI规范 + +## API设计原则 + +### 1. 统一的消息格式 +```protobuf +// 标准请求格式 +message XxxRequest { + // 请求参数 +} + +// 标准响应格式 +message XxxResponse { + // 响应数据 +} +``` + +### 2. 错误处理规范 +- 使用标准错误码 +- 提供详细错误信息 +- 支持国际化错误消息 + +### 3. HTTP映射规范 +- RESTful URL设计 +- 标准HTTP方法使用 +- 统一响应格式 + +### 4. 版本管理 +- API版本化(v1, v2等) +- 向后兼容性保证 +- 渐进式废弃策略 + +## 代码生成 + +### protobuf编译 +使用protoc编译器生成代码: +```bash +# 生成Go代码 +protoc --go_out=. --go-grpc_out=. api/analysis/v1/analysis.proto + +# 生成HTTP网关 +protoc --grpc-gateway_out=. api/analysis/v1/analysis.proto +``` + +### 依赖管理 +- 所有.pb.go文件由protoc自动生成 +- 不要手动编辑生成的文件 +- 更新proto文件后重新生成代码 + +## OpenAPI文档 + +项目根目录的 [openapi.yaml](mdc:goanalysis/openapi.yaml) 提供完整的API文档,包括: +- 所有API端点定义 +- 请求/响应schema +- 错误码说明 +- 示例数据 + +## 客户端集成 + +### Go客户端 +直接导入生成的Go包: +```go +import "your-project/api/analysis/v1" +``` + +### 前端集成 +通过HTTP API调用,配置在: +- [goanalysis-web/src/config/api.js](mdc:goanalysis/goanalysis-web/src/config/api.js) +- [goanalysis-web/src/axios.js](mdc:goanalysis/goanalysis-web/src/axios.js) + +## 开发工作流 + +1. **修改proto文件** - 在对应的.proto文件中定义API +2. **生成代码** - 运行protoc生成Go代码 +3. **实现服务** - 在service层实现业务逻辑 +4. **注册服务** - 在server层注册gRPC和HTTP服务 +5. **更新文档** - 更新OpenAPI文档 +6. **前端适配** - 更新前端API调用代码 + diff --git a/.cursor/rules/backend-architecture.mdc b/.cursor/rules/backend-architecture.mdc new file mode 100644 index 0000000..e9056f7 --- /dev/null +++ b/.cursor/rules/backend-architecture.mdc @@ -0,0 +1,85 @@ +--- +description: +globs: +alwaysApply: false +--- +# 后端架构指南 + +## 架构概览 + +GoAnalysis后端采用清洁架构设计,分层明确,职责分离。主要分为以下层次: + +## 核心架构层次 + +### API层 ([api/](mdc:api)) +- **analysis** - [api/analysis/v1/](mdc:api/analysis/v1/) 核心分析服务API +- **filemanager** - [api/filemanager/v1/](mdc:api/filemanager/v1/) 文件管理API +- **staticanalysis** - [api/staticanalysis/v1/](mdc:api/staticanalysis/v1/) 静态分析API + +每个API包含: +- `.proto` - protobuf定义文件 +- `.pb.go` - 生成的Go结构体 +- `_grpc.pb.go` - gRPC服务接口 +- `.pb.gw.go` - HTTP网关代码 + +### 业务逻辑层 ([internal/biz/](mdc:internal/biz)) + +#### 核心业务模块 + +- **analysis** - [internal/biz/analysis/](mdc:internal/biz/analysis/) 分析引擎核心逻辑 +- **callgraph** - [internal/biz/callgraph/](mdc:internal/biz/callgraph/) 调用图构建和分析 + - [program.go](mdc:internal/biz/callgraph/program.go) - 程序分析入口 + - [node_manager.go](mdc:internal/biz/callgraph/node_manager.go) - 节点管理 + - [edge_manager.go](mdc:internal/biz/callgraph/edge_manager.go) - 边关系管理 + - [filter.go](mdc:internal/biz/callgraph/filter.go) - 过滤逻辑 +- **gitanalysis** - [internal/biz/gitanalysis/](mdc:internal/biz/gitanalysis/) Git代码变更分析 + - [gitanalysis.go](mdc:internal/biz/gitanalysis/gitanalysis.go) - Git分析核心 + - [mr_analyzer.go](mdc:internal/biz/gitanalysis/mr_analyzer.go) - MR分析器 + - [llm.go](mdc:internal/biz/gitanalysis/llm.go) - LLM集成 +- **staticanalysis** - [internal/biz/staticanalysis/](mdc:internal/biz/staticanalysis/) 静态代码分析 +- **filemanager** - [internal/biz/filemanager/](mdc:internal/biz/filemanager/) 文件管理 +- **rewrite** - [internal/biz/rewrite/](mdc:internal/biz/rewrite/) 代码重写 + +#### 实体定义 ([internal/biz/entity/](mdc:internal/biz/entity)) +- [analysis.go](mdc:internal/biz/entity/analysis.go) - 分析相关实体 +- [callgraph.go](mdc:internal/biz/entity/callgraph.go) - 调用图实体 +- [file.go](mdc:internal/biz/entity/file.go) - 文件实体 +- [gitlab.go](mdc:internal/biz/entity/gitlab.go) - GitLab集成实体 + +### 服务层 ([internal/service/](mdc:internal/service)) +- [analysis.go](mdc:internal/service/analysis.go) - 分析服务实现 +- [staticanalysis.go](mdc:internal/service/staticanalysis.go) - 静态分析服务 +- [filemanager.go](mdc:internal/service/filemanager.go) - 文件管理服务 + +### 服务器层 ([internal/server/](mdc:internal/server)) +- [http.go](mdc:internal/server/http.go) - HTTP服务器配置 +- [grpc.go](mdc:internal/server/grpc.go) - gRPC服务器配置 +- [handler.go](mdc:internal/server/handler.go) - 处理器注册 + +### 命令行工具 ([cmd/](mdc:cmd)) +- [commands/server.go](mdc:cmd/commands/server.go) - 服务器启动命令 +- [commands/callgraph.go](mdc:cmd/commands/callgraph.go) - 调用图分析命令 +- [commands/git.go](mdc:cmd/commands/git.go) - Git分析命令 +- [commands/rewrite.go](mdc:cmd/commands/rewrite.go) - 代码重写命令 + +## 依赖注入 + +项目使用wire进行依赖注入: +- [cmd/commands/wire.go](mdc:cmd/commands/wire.go) - Wire配置 +- [cmd/commands/wire_gen.go](mdc:cmd/commands/wire_gen.go) - 生成的依赖注入代码 + +## 配置管理 + +- [internal/conf/](mdc:internal/conf/) - 配置相关protobuf定义 +- [configs/config.yaml](mdc:configs/config.yaml) - 应用配置文件 + +## 工具包 + +- [internal/pkg/logger/](mdc:internal/pkg/logger/) - 统一日志包 + +## 关键设计原则 + +1. **分层架构** - API -> Service -> Biz -> Entity,职责清晰 +2. **依赖倒置** - 高层模块不依赖低层模块,都依赖抽象 +3. **protobuf优先** - 所有API使用protobuf定义,支持gRPC和HTTP +4. **命令行友好** - 提供丰富的CLI工具用于分析和操作 diff --git a/.cursor/rules/business-logic.mdc b/.cursor/rules/business-logic.mdc new file mode 100644 index 0000000..6766db3 --- /dev/null +++ b/.cursor/rules/business-logic.mdc @@ -0,0 +1,195 @@ +--- +description: +globs: +alwaysApply: false +--- +# 业务逻辑指南 + +## 核心业务模块 + +GoAnalysis的核心业务逻辑集中在 [internal/biz/](mdc:internal/biz) 目录,实现了代码分析的各种功能。 + +## 调用图分析 ([internal/biz/callgraph/](mdc:internal/biz/callgraph/)) + +### 核心组件 + +#### 程序分析器 ([program.go](mdc:internal/biz/callgraph/program.go)) +- **功能**: Go程序AST解析和调用图构建入口 +- **职责**: + - 解析Go源代码 + - 构建程序结构 + - 初始化调用图分析 + +#### 节点管理器 ([node_manager.go](mdc:internal/biz/callgraph/node_manager.go)) +- **功能**: 管理调用图中的节点(函数、方法等) +- **职责**: + - 节点创建和索引 + - 节点属性管理 + - 节点查询和遍历 + +#### 边管理器 ([edge_manager.go](mdc:internal/biz/callgraph/edge_manager.go)) +- **功能**: 管理调用关系(函数调用边) +- **职责**: + - 调用关系识别 + - 边权重计算 + - 调用链路分析 + +#### 过滤器 ([filter.go](mdc:internal/biz/callgraph/filter.go)) +- **功能**: 调用图过滤和裁剪 +- **职责**: + - 按条件过滤节点和边 + - 调用深度控制 + - 无关代码移除 + +#### 数据对象 ([dos/node.go](mdc:internal/biz/callgraph/dos/node.go)) +- **功能**: 调用图数据结构定义 +- **内容**: 节点和边的数据模型 + +### 使用指南 ([USAGE.md](mdc:internal/biz/callgraph/USAGE.md)) +详细的调用图分析使用说明和示例 + +## Git分析 ([internal/biz/gitanalysis/](mdc:internal/biz/gitanalysis/)) + +### 核心功能 + +#### Git分析引擎 ([gitanalysis.go](mdc:internal/biz/gitanalysis/gitanalysis.go)) +- **功能**: Git仓库代码变更分析 +- **职责**: + - Git历史解析 + - 代码差异分析 + - 变更影响评估 + +#### MR分析器 ([mr_analyzer.go](mdc:internal/biz/gitanalysis/mr_analyzer.go)) +- **功能**: Merge Request代码审查分析 +- **职责**: + - MR变更检测 + - 代码质量评估 + - 风险点识别 + +#### LLM集成 ([llm.go](mdc:internal/biz/gitanalysis/llm.go)) +- **功能**: AI大模型代码分析 +- **职责**: + - 智能代码审查 + - 代码建议生成 + - 问题自动识别 + +#### 数据对象 ([dos/](mdc:internal/biz/gitanalysis/dos/)) +- [llm.go](mdc:internal/biz/gitanalysis/dos/llm.go) - LLM相关数据结构 +- [result.go](mdc:internal/biz/gitanalysis/dos/result.go) - 分析结果数据结构 + +#### 测试 ([gitanalysis_test.go](mdc:internal/biz/gitanalysis/gitanalysis_test.go)) +完整的单元测试覆盖 + +## 静态分析 ([internal/biz/staticanalysis/](mdc:internal/biz/staticanalysis/)) + +### 静态分析引擎 ([staticanalysis.go](mdc:internal/biz/staticanalysis/staticanalysis.go)) +- **功能**: Go代码静态分析 +- **职责**: + - 代码规范检查 + - 潜在问题检测 + - 性能问题识别 + - 安全漏洞扫描 + +## 文件管理 ([internal/biz/filemanager/](mdc:internal/biz/filemanager/)) + +### 文件业务逻辑 ([file_biz.go](mdc:internal/biz/filemanager/file_biz.go)) +- **功能**: 文件系统操作和管理 +- **职责**: + - 源代码文件读取 + - 文件结构分析 + - 批量文件处理 + +## 代码重写 ([internal/biz/rewrite/](mdc:internal/biz/rewrite/)) + +### 重写引擎 ([rewrite.go](mdc:internal/biz/rewrite/rewrite.go)) +- **功能**: 自动化代码重构和重写 +- **职责**: + - AST级别代码修改 + - 代码格式化 + - 重构规则应用 + +## 分析引擎 ([internal/biz/analysis/](mdc:internal/biz/analysis/)) + +### 核心分析器 ([analysis.go](mdc:internal/biz/analysis/analysis.go)) +- **功能**: 统一分析接口和流程控制 +- **职责**: + - 分析任务调度 + - 结果聚合 + - 分析流程编排 + +## 实体定义 ([internal/biz/entity/](mdc:internal/biz/entity/)) + +### 数据实体 + +#### 分析实体 ([analysis.go](mdc:internal/biz/entity/analysis.go)) +- **内容**: 分析任务、结果、配置等数据结构 +- **用途**: 分析流程数据建模 + +#### 调用图实体 ([callgraph.go](mdc:internal/biz/entity/callgraph.go)) +- **内容**: 调用图节点、边、路径等数据结构 +- **用途**: 调用关系数据建模 + +#### 文件实体 ([file.go](mdc:internal/biz/entity/file.go)) +- **内容**: 文件信息、目录结构等数据结构 +- **用途**: 文件系统数据建模 + +#### Git实体 ([gitlab.go](mdc:internal/biz/entity/gitlab.go)) +- **内容**: GitLab集成相关数据结构 +- **用途**: Git平台集成数据建模 + +#### 运行时实体 ([runtime.go](mdc:internal/biz/entity/runtime.go)) +- **内容**: 运行时分析数据结构 +- **用途**: 动态分析数据建模 + +#### 树图实体 ([tree_graph.go](mdc:internal/biz/entity/tree_graph.go)) +- **内容**: 树形结构和图形可视化数据结构 +- **用途**: 可视化数据建模 + +#### 通用定义 ([define.go](mdc:internal/biz/entity/define.go)) +- **内容**: 通用常量、类型定义 +- **用途**: 系统级数据类型 + +## 仓储接口 ([internal/biz/repo/](mdc:internal/biz/repo/)) + +### 调用图仓储 ([callgraph.go](mdc:internal/biz/repo/callgraph.go)) +- **功能**: 调用图数据持久化接口 +- **职责**: 调用图数据的存储和查询 + +### 文件仓储 ([file.go](mdc:internal/biz/repo/file.go)) +- **功能**: 文件数据持久化接口 +- **职责**: 文件元数据的存储和查询 + +## 通道管理 ([internal/biz/chanMgr/](mdc:internal/biz/chanMgr/)) + +### 通道管理器 ([channel.go](mdc:internal/biz/chanMgr/channel.go)) +- **功能**: Go channel管理和消息传递 +- **职责**: + - 异步任务通信 + - 事件发布订阅 + - 数据流控制 + +## 业务设计原则 + +### 1. 清洁架构 +- **实体优先**: 核心业务实体定义清晰 +- **依赖倒置**: 业务逻辑不依赖外层实现 +- **接口抽象**: 通过接口实现松耦合 + +### 2. 领域驱动 +- **业务聚合**: 相关业务逻辑聚合在同一模块 +- **领域模型**: 业务概念直接映射到代码结构 +- **业务语言**: 使用领域专业术语 + +### 3. 可测试性 +- **单元测试**: 每个模块提供完整测试 +- **接口测试**: 通过接口进行业务逻辑测试 +- **集成测试**: 模块间协作测试 + +### 4. 可扩展性 +- **插件架构**: 支持功能模块动态扩展 +- **配置驱动**: 通过配置调整业务行为 +- **组合优于继承**: 通过组合实现功能复用 + +--- + +理解业务逻辑层是系统开发的关键,它承载了系统的核心价值。 diff --git a/.cursor/rules/development-workflow.mdc b/.cursor/rules/development-workflow.mdc new file mode 100644 index 0000000..885c586 --- /dev/null +++ b/.cursor/rules/development-workflow.mdc @@ -0,0 +1,224 @@ +--- +description: +globs: +alwaysApply: false +--- +# 开发工作流指南 + +## 环境配置 + +### 后端开发环境 +- **Go版本**: Go 1.19+ (查看 [go.mod](mdc:goanalysis/go.mod)) +- **依赖管理**: Go Modules +- **protobuf**: 需要安装protoc编译器 +- **Wire**: 依赖注入工具 + +### 前端开发环境 +- **Node.js**: 16+ (查看 [goanalysis-web/package.json](mdc:goanalysis/goanalysis-web/package.json)) +- **包管理器**: npm +- **构建工具**: Vue CLI + +## 构建与启动 + +### 后端构建 +```bash +# 安装依赖 +go mod download + +# 生成Wire依赖注入代码 +go generate ./cmd/commands + +# 构建应用 +go build -o goanalysis main.go + +# 启动服务器 +./goanalysis server +``` + +### 前端构建 +```bash +cd goanalysis-web + +# 安装依赖 +npm install + +# 开发模式启动 +npm run serve + +# 生产构建 +npm run build +``` + +### 使用Makefile ([Makefile](mdc:goanalysis/Makefile)) +项目提供Makefile简化构建流程: +```bash +# 查看可用命令 +make help + +# 构建后端 +make build + +# 运行测试 +make test + +# 生成API代码 +make api + +# Docker构建 +make docker-build +``` + +## 开发流程 + +### 1. 新增API服务 + +#### 步骤: +1. **定义protobuf** - 在 [api/](mdc:goanalysis/api) 对应目录创建.proto文件 +2. **生成代码** - 运行protoc生成Go代码 +3. **实现业务逻辑** - 在 [internal/biz/](mdc:goanalysis/internal/biz) 创建业务逻辑 +4. **实现服务** - 在 [internal/service/](mdc:goanalysis/internal/service) 实现gRPC接口 +5. **注册服务** - 在 [internal/server/](mdc:goanalysis/internal/server) 注册服务 +6. **更新Wire** - 在 [cmd/commands/wire.go](mdc:goanalysis/cmd/commands/wire.go) 添加依赖注入 +7. **前端集成** - 更新前端API调用 + +### 2. 新增命令行工具 + +#### 步骤: +1. **创建命令文件** - 在 [cmd/commands/](mdc:goanalysis/cmd/commands) 创建新命令 +2. **注册命令** - 在 [cmd/commands/root.go](mdc:goanalysis/cmd/commands/root.go) 注册 +3. **实现业务逻辑** - 复用 [internal/biz/](mdc:goanalysis/internal/biz) 中的逻辑 + +### 3. 前端组件开发 + +#### 步骤: +1. **创建组件** - 在 [goanalysis-web/src/components/](mdc:goanalysis/goanalysis-web/src/components) 相应目录 +2. **编写Composables** - 在对应的composables目录封装逻辑 +3. **配置路由** - 在 [goanalysis-web/src/router/index.js](mdc:goanalysis/goanalysis-web/src/router/index.js) 添加路由 +4. **API集成** - 使用统一的API配置 + +## 代码规范 + +### Go代码规范 +- **包命名**: 小写,简洁,描述性强 +- **函数命名**: 驼峰命名,公开函数首字母大写 +- **错误处理**: 显式错误处理,不忽略错误 +- **注释**: 中文注释,解释业务逻辑 +- **日志**: 英文日志消息 + +### Vue代码规范 +- **组件命名**: PascalCase,描述性强 +- **文件命名**: kebab-case或PascalCase +- **API命名**: camelCase +- **样式**: scoped CSS,使用CSS变量 + +## 测试策略 + +### 后端测试 +```bash +# 运行所有测试 +go test ./... + +# 运行特定包测试 +go test ./internal/biz/gitanalysis + +# 查看测试覆盖率 +go test -cover ./... +``` + +### 前端测试 +```bash +cd goanalysis-web + +# 运行单元测试 +npm run test:unit + +# 运行E2E测试 +npm run test:e2e +``` + +## Docker部署 + +### 构建镜像 +使用项目根目录的 [Dockerfile](mdc:goanalysis/Dockerfile): +```bash +# 构建镜像 +docker build -t goanalysis . + +# 运行容器 +docker run -p 8080:8080 goanalysis +``` + +### 配置管理 +- 运行时配置通过 [configs/config.yaml](mdc:goanalysis/configs/config.yaml) +- 环境变量覆盖配置项 +- 容器化部署时挂载配置文件 + +## 调试技巧 + +### 后端调试 +1. **日志级别** - 通过配置文件调整日志级别 +2. **pprof** - 性能分析和内存调试 +3. **单元测试** - 针对性测试特定功能 + +### 前端调试 +1. **Vue DevTools** - 使用浏览器扩展调试 +2. **Network Tab** - 查看API请求响应 +3. **Console** - 查看错误和调试信息 + +## 性能优化 + +### 后端优化 +- **并发处理** - 合理使用goroutine +- **内存管理** - 避免内存泄漏 +- **数据库优化** - 优化查询性能 +- **缓存策略** - 合理使用缓存 + +### 前端优化 +- **代码分割** - 按路由分割代码 +- **懒加载** - 组件和图片懒加载 +- **缓存策略** - API响应缓存 +- **打包优化** - 压缩和树摇 + +## Git工作流 + +### 分支策略 +- **main** - 主分支,稳定版本 +- **develop** - 开发分支,集成新功能 +- **feature/** - 功能分支,新功能开发 +- **hotfix/** - 热修复分支,紧急修复 + +### 提交规范 +``` +type(scope): description + +类型: +- feat: 新功能 +- fix: 修复 +- docs: 文档 +- style: 格式 +- refactor: 重构 +- test: 测试 +- chore: 构建 + +示例: +feat(callgraph): add function filter capability +fix(api): resolve memory leak in analysis service +``` + +## 监控和日志 + +### 日志配置 +日志配置在 [internal/pkg/logger/](mdc:goanalysis/internal/pkg/logger): +- 结构化日志输出 +- 分级别日志记录 +- 日志轮转和归档 + +### 性能监控 +- 内置pprof端点 +- 自定义metrics收集 +- 请求追踪和延迟统计 + +--- + +遵循以上工作流程能确保代码质量和团队协作效率。 + diff --git a/.cursor/rules/project-overview.mdc b/.cursor/rules/project-overview.mdc index 3f74760..a8b49ba 100644 --- a/.cursor/rules/project-overview.mdc +++ b/.cursor/rules/project-overview.mdc @@ -3,63 +3,66 @@ description: globs: alwaysApply: false --- -# 项目结构与导航指南 - -本项目为 Go 语言开发的函数追踪分析与可视化系统,采用 Kratos 微服务架构,前端为 Vue3,后端为 Go。以下为主要目录和文件说明: - -## 目录结构 - -- [api/](mdc:api) - 存放所有 API 定义(protobuf),如静态分析、文件管理、分析等子模块。 -- [cmd/](mdc:cmd) - 主应用程序入口,包含各类命令行工具(如gitanalysis、callgraph、rewrite、server等)。 -- [configs/](mdc:configs) - 配置文件目录。 -- [internal/](mdc:internal) - 私有应用代码,包含: - - [biz/](mdc:internal/biz) 业务逻辑(如gitanalysis、staticanalysis、callgraph等) - - [data/](mdc:internal/data) 数据处理与存储(Ent/SQLite) - - [server/](mdc:internal/server) 服务器实现(HTTP/GRPC等) - - [service/](mdc:internal/service) 服务实现 - - [conf/](mdc:internal/conf) 配置相关(proto及生成文件) - - [pkg/](mdc:internal/pkg) 通用工具包(如logger) -- [third_party/](mdc:third_party) - 第三方依赖和集成内容。 -- [docs/](mdc:docs) - 项目文档及相关图片。 - -## 主要文件 - -- [main.go](mdc:main.go) - Go后端主入口。 -- [go.mod](mdc:go.mod) / [go.sum](mdc:go.sum) - Go依赖管理文件。 -- [openapi.yaml](mdc:openapi.yaml) - OpenAPI 规范定义。 -- [Dockerfile](mdc:Dockerfile) - Docker 容器化配置。 -- [Makefile](mdc:Makefile) - 构建与自动化脚本。 -- [README.md](mdc:README.md) / [README.ZH.md](mdc:README.ZH.md) - 项目中英文说明文档。 -- [LICENSE](mdc:LICENSE) - 许可证。 - -## 入口说明 - -- 主要后端服务通过 [cmd/server.go](mdc:cmd/server.go) 启动。 -- 插桩与分析等命令行工具见 [cmd/](mdc:cmd)。 - -## 其他说明 - -- 配置相关 proto 文件及生成代码位于 [internal/conf/](mdc:internal/conf)。 -- 数据存储与ORM相关代码位于 [internal/data/](mdc:internal/data)。 -- 业务逻辑分散在 [internal/biz/](mdc:internal/biz) 各子目录。 -- 详细的Git分析功能说明见 [docs/git_analysis.md](mdc:docs/git_analysis.md)。 -- 日志, 错误 采用英文。 -- 注释采用中文书写。 +# GoAnalysis 项目结构与导航指南 + +本项目为 Go 语言开发的代码分析系统,包含静态分析、调用图分析、Git分析等功能。项目采用微服务架构,包含Go后端和Vue.js前端两部分。 + +## 项目组成 + +### 后端服务 (goanalysis/) +Go语言开发的微服务后端,提供分析引擎和API服务 + +### 前端界面 (goanalysis-web/) +Vue3开发的Web界面,提供用户交互和数据可视化 + +## 主要目录结构 + +### 后端目录 (goanalysis/) + +- [api/](mdc:goanalysis/api) + gRPC/HTTP API定义(protobuf),包含analysis、filemanager、staticanalysis等服务定义 +- [cmd/](mdc:goanalysis/cmd) + 命令行工具入口,包含server、callgraph、git分析、rewrite等命令 +- [internal/](mdc:goanalysis/internal) + 核心业务代码: + - [biz/](mdc:goanalysis/internal/biz) - 业务逻辑层(analysis、callgraph、gitanalysis等) + - [service/](mdc:goanalysis/internal/service) - 服务实现层 + - [server/](mdc:goanalysis/internal/server) - 服务器配置(HTTP/gRPC) + - [pkg/](mdc:goanalysis/internal/pkg) - 内部工具包 +- [configs/](mdc:goanalysis/configs) - 配置文件 +- [third_party/](mdc:goanalysis/third_party) - 第三方protobuf定义 + +### 前端目录 (goanalysis-web/) + +- [src/components/](mdc:goanalysis/goanalysis-web/src/components) - Vue组件 + - [callgraph/](mdc:goanalysis/goanalysis-web/src/components/callgraph) - 调用图分析组件 + - [runtime/](mdc:goanalysis/goanalysis-web/src/components/runtime) - 运行时分析组件 +- [src/config/](mdc:goanalysis/goanalysis-web/src/config) - 前端配置 +- [src/router/](mdc:goanalysis/goanalysis-web/src/router) - 路由配置 + +## 关键入口文件 + +- [main.go](mdc:goanalysis/main.go) - Go后端主入口 +- [cmd/commands/server.go](mdc:goanalysis/cmd/commands/server.go) - 服务器启动命令 +- [goanalysis-web/src/main.js](mdc:goanalysis/goanalysis-web/src/main.js) - Vue前端入口 +- [go.mod](mdc:goanalysis/go.mod) - Go模块依赖 +- [goanalysis-web/package.json](mdc:goanalysis/goanalysis-web/package.json) - 前端依赖 + +## 开发配置 + +- [Dockerfile](mdc:goanalysis/Dockerfile) - Docker构建配置 +- [Makefile](mdc:goanalysis/Makefile) - 构建脚本 +- [configs/config.yaml](mdc:goanalysis/configs/config.yaml) - 应用配置 +- [openapi.yaml](mdc:goanalysis/openapi.yaml) - API文档 + +## 开发规范 + +- 后端日志和错误信息使用英文 +- 代码注释使用中文 +- API使用protobuf定义,支持gRPC和HTTP +- 前端使用Vue3 + Composition API --- -如需引用文件,请使用 `[文件名](mdc:文件名)` 格式,路径相对于项目根目录。 +引用文件请使用 `[文件名](mdc:goanalysis/文件路径)` 格式,路径相对于workspace根目录。 diff --git a/.github/workflows/build-for-test.yml b/.github/workflows/build-for-test.yml index 239f188..c21d80c 100644 --- a/.github/workflows/build-for-test.yml +++ b/.github/workflows/build-for-test.yml @@ -70,6 +70,14 @@ jobs: echo "version=$FRONTEND_VERSION" >> $GITHUB_OUTPUT echo "Using frontend version: $FRONTEND_VERSION" + - name: install statik + run: | + go install github.com/rakyll/statik + + - name: generate static assets + run: | + statik -src=web + - name: build application run: | make build VERSION=$VERSION diff --git a/.gitignore b/.gitignore index 86006ab..93a370e 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,8 @@ bin/ *.log.* *git_repos/ data +statik/ +web/ +*.db +openapi.yaml \ No newline at end of file diff --git a/Makefile b/Makefile index 8c82f4e..e7ddae1 100644 --- a/Makefile +++ b/Makefile @@ -2,14 +2,20 @@ GOHOSTOS:=$(shell go env GOHOSTOS) GOPATH:=$(shell go env GOPATH) VERSION?=$(shell git describe --tags --always || echo "dev") -ifeq ($(GOHOSTOS), windows) - Git_Bash="$(subst \,/,$(subst cmd\git.exe,bin\bash.exe,$(shell where git)))" - INTERNAL_PROTO_FILES=$(shell $(Git_Bash) -c "find internal -name *.proto") - API_PROTO_FILES=$(shell $(Git_Bash) -c "find api -name *.proto") -else - INTERNAL_PROTO_FILES=$(shell find internal -name *.proto) - API_PROTO_FILES=$(shell find api -name *.proto) -endif +# 定义查找proto文件的函数 +define find_proto_files +$(if $(filter windows,$(GOHOSTOS)),\ + $(if $(filter MINGW64,$(MSYSTEM)),\ + $(shell find $(1) -name *.proto),\ + $(shell $(subst \,/,$(subst cmd\git.exe,bin\bash.exe,$(shell where git))) -c "find $(1) -name *.proto")\ + ),\ + $(shell find $(1) -name *.proto)\ +) +endef + +# 使用函数简化proto文件查找 +INTERNAL_PROTO_FILES := $(call find_proto_files,internal) +API_PROTO_FILES := $(call find_proto_files,api) .PHONY: init # init env @@ -82,14 +88,14 @@ sync-frontend: package-linux: sync-frontend GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "-X main.Version=$(VERSION)" -o goanalysis ./ mkdir -p release - tar -czvf release/goanalysis-linux-$(VERSION).tar.gz ./goanalysis ./configs ./web + mv ./goanalysis ./release/goanalysis-linux-$(VERSION) .PHONY: package-windows # 打包Windows版本 package-windows: sync-frontend GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "-X main.Version=$(VERSION)" -o goanalysis.exe ./ mkdir -p release - tar -czvf release/goanalysis-windows-$(VERSION).tar.gz ./goanalysis.exe ./configs ./web + mv ./goanalysis.exe ./release/goanalysis-windows-$(VERSION).exe .PHONY: docker # 构建Docker镜像 diff --git a/api/analysis/v1/analysis.pb.go b/api/analysis/v1/analysis.pb.go index b8c44ea..9d166ca 100644 --- a/api/analysis/v1/analysis.pb.go +++ b/api/analysis/v1/analysis.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 -// protoc v6.30.0--rc1 +// protoc-gen-go v1.36.6 +// protoc v6.31.1 // source: analysis/v1/analysis.proto package v1 @@ -1292,6 +1292,7 @@ type FunctionNode struct { TimeCost string `protobuf:"bytes,6,opt,name=timeCost,proto3" json:"timeCost,omitempty"` ParamCount int32 `protobuf:"varint,7,opt,name=paramCount,proto3" json:"paramCount,omitempty"` Depth int32 `protobuf:"varint,8,opt,name=depth,proto3" json:"depth,omitempty"` + Seq string `protobuf:"bytes,9,opt,name=seq,proto3" json:"seq,omitempty"` // 序列号 unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1382,6 +1383,13 @@ func (x *FunctionNode) GetDepth() int32 { return 0 } +func (x *FunctionNode) GetSeq() string { + if x != nil { + return x.Seq + } + return "" +} + type GetParentFunctionsReply struct { state protoimpl.MessageState `protogen:"open.v1"` Functions []*FunctionNode `protobuf:"bytes,1,rep,name=functions,proto3" json:"functions,omitempty"` @@ -2176,128 +2184,6 @@ func (x *InstrumentProjectReply) GetMessage() string { return "" } -// GetUnfinishedFunctions 请求 -type GetUnfinishedFunctionsReq struct { - state protoimpl.MessageState `protogen:"open.v1"` - Dbpath string `protobuf:"bytes,1,opt,name=dbpath,proto3" json:"dbpath,omitempty"` // 数据库路径 - Threshold int64 `protobuf:"varint,2,opt,name=threshold,proto3" json:"threshold,omitempty"` // 阻塞时间阈值(毫秒) - Page int32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` // 当前页码 - Limit int32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` // 每页数量 - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetUnfinishedFunctionsReq) Reset() { - *x = GetUnfinishedFunctionsReq{} - mi := &file_analysis_v1_analysis_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetUnfinishedFunctionsReq) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetUnfinishedFunctionsReq) ProtoMessage() {} - -func (x *GetUnfinishedFunctionsReq) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[40] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetUnfinishedFunctionsReq.ProtoReflect.Descriptor instead. -func (*GetUnfinishedFunctionsReq) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{40} -} - -func (x *GetUnfinishedFunctionsReq) GetDbpath() string { - if x != nil { - return x.Dbpath - } - return "" -} - -func (x *GetUnfinishedFunctionsReq) GetThreshold() int64 { - if x != nil { - return x.Threshold - } - return 0 -} - -func (x *GetUnfinishedFunctionsReq) GetPage() int32 { - if x != nil { - return x.Page - } - return 0 -} - -func (x *GetUnfinishedFunctionsReq) GetLimit() int32 { - if x != nil { - return x.Limit - } - return 0 -} - -// GetUnfinishedFunctions 响应 -type GetUnfinishedFunctionsReply struct { - state protoimpl.MessageState `protogen:"open.v1"` - Functions []*GetUnfinishedFunctionsReply_UnfinishedFunction `protobuf:"bytes,1,rep,name=functions,proto3" json:"functions,omitempty"` // 未完成函数列表 - Total int32 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` // 总数 - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetUnfinishedFunctionsReply) Reset() { - *x = GetUnfinishedFunctionsReply{} - mi := &file_analysis_v1_analysis_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetUnfinishedFunctionsReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetUnfinishedFunctionsReply) ProtoMessage() {} - -func (x *GetUnfinishedFunctionsReply) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[41] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetUnfinishedFunctionsReply.ProtoReflect.Descriptor instead. -func (*GetUnfinishedFunctionsReply) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{41} -} - -func (x *GetUnfinishedFunctionsReply) GetFunctions() []*GetUnfinishedFunctionsReply_UnfinishedFunction { - if x != nil { - return x.Functions - } - return nil -} - -func (x *GetUnfinishedFunctionsReply) GetTotal() int32 { - if x != nil { - return x.Total - } - return 0 -} - // 获取树状图请求 type GetTreeGraphReq struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -2311,7 +2197,7 @@ type GetTreeGraphReq struct { func (x *GetTreeGraphReq) Reset() { *x = GetTreeGraphReq{} - mi := &file_analysis_v1_analysis_proto_msgTypes[42] + mi := &file_analysis_v1_analysis_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2323,7 +2209,7 @@ func (x *GetTreeGraphReq) String() string { func (*GetTreeGraphReq) ProtoMessage() {} func (x *GetTreeGraphReq) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[42] + mi := &file_analysis_v1_analysis_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2336,7 +2222,7 @@ func (x *GetTreeGraphReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTreeGraphReq.ProtoReflect.Descriptor instead. func (*GetTreeGraphReq) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{42} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{40} } func (x *GetTreeGraphReq) GetDbPath() string { @@ -2380,7 +2266,7 @@ type TreeNode struct { func (x *TreeNode) Reset() { *x = TreeNode{} - mi := &file_analysis_v1_analysis_proto_msgTypes[43] + mi := &file_analysis_v1_analysis_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2392,7 +2278,7 @@ func (x *TreeNode) String() string { func (*TreeNode) ProtoMessage() {} func (x *TreeNode) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[43] + mi := &file_analysis_v1_analysis_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2405,7 +2291,7 @@ func (x *TreeNode) ProtoReflect() protoreflect.Message { // Deprecated: Use TreeNode.ProtoReflect.Descriptor instead. func (*TreeNode) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{43} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{41} } func (x *TreeNode) GetName() string { @@ -2446,7 +2332,7 @@ type GetTreeGraphReply struct { func (x *GetTreeGraphReply) Reset() { *x = GetTreeGraphReply{} - mi := &file_analysis_v1_analysis_proto_msgTypes[44] + mi := &file_analysis_v1_analysis_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2458,7 +2344,7 @@ func (x *GetTreeGraphReply) String() string { func (*GetTreeGraphReply) ProtoMessage() {} func (x *GetTreeGraphReply) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[44] + mi := &file_analysis_v1_analysis_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2471,7 +2357,7 @@ func (x *GetTreeGraphReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTreeGraphReply.ProtoReflect.Descriptor instead. func (*GetTreeGraphReply) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{44} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{42} } func (x *GetTreeGraphReply) GetTrees() []*TreeNode { @@ -2492,7 +2378,7 @@ type GetTreeGraphByGIDReq struct { func (x *GetTreeGraphByGIDReq) Reset() { *x = GetTreeGraphByGIDReq{} - mi := &file_analysis_v1_analysis_proto_msgTypes[45] + mi := &file_analysis_v1_analysis_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2504,7 +2390,7 @@ func (x *GetTreeGraphByGIDReq) String() string { func (*GetTreeGraphByGIDReq) ProtoMessage() {} func (x *GetTreeGraphByGIDReq) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[45] + mi := &file_analysis_v1_analysis_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2517,7 +2403,7 @@ func (x *GetTreeGraphByGIDReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTreeGraphByGIDReq.ProtoReflect.Descriptor instead. func (*GetTreeGraphByGIDReq) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{45} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{43} } func (x *GetTreeGraphByGIDReq) GetDbPath() string { @@ -2544,7 +2430,7 @@ type GetTreeGraphByGIDReply struct { func (x *GetTreeGraphByGIDReply) Reset() { *x = GetTreeGraphByGIDReply{} - mi := &file_analysis_v1_analysis_proto_msgTypes[46] + mi := &file_analysis_v1_analysis_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2556,7 +2442,7 @@ func (x *GetTreeGraphByGIDReply) String() string { func (*GetTreeGraphByGIDReply) ProtoMessage() {} func (x *GetTreeGraphByGIDReply) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[46] + mi := &file_analysis_v1_analysis_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2569,7 +2455,7 @@ func (x *GetTreeGraphByGIDReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTreeGraphByGIDReply.ProtoReflect.Descriptor instead. func (*GetTreeGraphByGIDReply) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{46} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{44} } func (x *GetTreeGraphByGIDReply) GetTrees() []*TreeNode { @@ -2590,7 +2476,7 @@ type GetFunctionCallStatsReq struct { func (x *GetFunctionCallStatsReq) Reset() { *x = GetFunctionCallStatsReq{} - mi := &file_analysis_v1_analysis_proto_msgTypes[47] + mi := &file_analysis_v1_analysis_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2602,7 +2488,7 @@ func (x *GetFunctionCallStatsReq) String() string { func (*GetFunctionCallStatsReq) ProtoMessage() {} func (x *GetFunctionCallStatsReq) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[47] + mi := &file_analysis_v1_analysis_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2615,7 +2501,7 @@ func (x *GetFunctionCallStatsReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFunctionCallStatsReq.ProtoReflect.Descriptor instead. func (*GetFunctionCallStatsReq) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{47} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{45} } func (x *GetFunctionCallStatsReq) GetDbPath() string { @@ -2650,7 +2536,7 @@ type FunctionCallStats struct { func (x *FunctionCallStats) Reset() { *x = FunctionCallStats{} - mi := &file_analysis_v1_analysis_proto_msgTypes[48] + mi := &file_analysis_v1_analysis_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2662,7 +2548,7 @@ func (x *FunctionCallStats) String() string { func (*FunctionCallStats) ProtoMessage() {} func (x *FunctionCallStats) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[48] + mi := &file_analysis_v1_analysis_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2675,7 +2561,7 @@ func (x *FunctionCallStats) ProtoReflect() protoreflect.Message { // Deprecated: Use FunctionCallStats.ProtoReflect.Descriptor instead. func (*FunctionCallStats) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{48} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{46} } func (x *FunctionCallStats) GetName() string { @@ -2751,7 +2637,7 @@ type GetFunctionCallStatsReply struct { func (x *GetFunctionCallStatsReply) Reset() { *x = GetFunctionCallStatsReply{} - mi := &file_analysis_v1_analysis_proto_msgTypes[49] + mi := &file_analysis_v1_analysis_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2763,7 +2649,7 @@ func (x *GetFunctionCallStatsReply) String() string { func (*GetFunctionCallStatsReply) ProtoMessage() {} func (x *GetFunctionCallStatsReply) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[49] + mi := &file_analysis_v1_analysis_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2776,7 +2662,7 @@ func (x *GetFunctionCallStatsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFunctionCallStatsReply.ProtoReflect.Descriptor instead. func (*GetFunctionCallStatsReply) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{49} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{47} } func (x *GetFunctionCallStatsReply) GetStats() []*FunctionCallStats { @@ -2798,7 +2684,7 @@ type GetPerformanceAnomaliesReq struct { func (x *GetPerformanceAnomaliesReq) Reset() { *x = GetPerformanceAnomaliesReq{} - mi := &file_analysis_v1_analysis_proto_msgTypes[50] + mi := &file_analysis_v1_analysis_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2810,7 +2696,7 @@ func (x *GetPerformanceAnomaliesReq) String() string { func (*GetPerformanceAnomaliesReq) ProtoMessage() {} func (x *GetPerformanceAnomaliesReq) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[50] + mi := &file_analysis_v1_analysis_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2823,7 +2709,7 @@ func (x *GetPerformanceAnomaliesReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPerformanceAnomaliesReq.ProtoReflect.Descriptor instead. func (*GetPerformanceAnomaliesReq) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{50} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{48} } func (x *GetPerformanceAnomaliesReq) GetDbPath() string { @@ -2862,7 +2748,7 @@ type PerformanceAnomaly struct { func (x *PerformanceAnomaly) Reset() { *x = PerformanceAnomaly{} - mi := &file_analysis_v1_analysis_proto_msgTypes[51] + mi := &file_analysis_v1_analysis_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2874,7 +2760,7 @@ func (x *PerformanceAnomaly) String() string { func (*PerformanceAnomaly) ProtoMessage() {} func (x *PerformanceAnomaly) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[51] + mi := &file_analysis_v1_analysis_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2887,7 +2773,7 @@ func (x *PerformanceAnomaly) ProtoReflect() protoreflect.Message { // Deprecated: Use PerformanceAnomaly.ProtoReflect.Descriptor instead. func (*PerformanceAnomaly) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{51} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{49} } func (x *PerformanceAnomaly) GetName() string { @@ -2942,7 +2828,7 @@ type GetPerformanceAnomaliesReply struct { func (x *GetPerformanceAnomaliesReply) Reset() { *x = GetPerformanceAnomaliesReply{} - mi := &file_analysis_v1_analysis_proto_msgTypes[52] + mi := &file_analysis_v1_analysis_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2954,7 +2840,7 @@ func (x *GetPerformanceAnomaliesReply) String() string { func (*GetPerformanceAnomaliesReply) ProtoMessage() {} func (x *GetPerformanceAnomaliesReply) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[52] + mi := &file_analysis_v1_analysis_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2967,7 +2853,7 @@ func (x *GetPerformanceAnomaliesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPerformanceAnomaliesReply.ProtoReflect.Descriptor instead. func (*GetPerformanceAnomaliesReply) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{52} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{50} } func (x *GetPerformanceAnomaliesReply) GetAnomalies() []*PerformanceAnomaly { @@ -2988,7 +2874,7 @@ type GetHotFunctionsReq struct { func (x *GetHotFunctionsReq) Reset() { *x = GetHotFunctionsReq{} - mi := &file_analysis_v1_analysis_proto_msgTypes[53] + mi := &file_analysis_v1_analysis_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3000,7 +2886,7 @@ func (x *GetHotFunctionsReq) String() string { func (*GetHotFunctionsReq) ProtoMessage() {} func (x *GetHotFunctionsReq) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[53] + mi := &file_analysis_v1_analysis_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3013,7 +2899,7 @@ func (x *GetHotFunctionsReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetHotFunctionsReq.ProtoReflect.Descriptor instead. func (*GetHotFunctionsReq) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{53} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{51} } func (x *GetHotFunctionsReq) GetSortBy() string { @@ -3040,7 +2926,7 @@ type GetHotFunctionsReply struct { func (x *GetHotFunctionsReply) Reset() { *x = GetHotFunctionsReply{} - mi := &file_analysis_v1_analysis_proto_msgTypes[54] + mi := &file_analysis_v1_analysis_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3052,7 +2938,7 @@ func (x *GetHotFunctionsReply) String() string { func (*GetHotFunctionsReply) ProtoMessage() {} func (x *GetHotFunctionsReply) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[54] + mi := &file_analysis_v1_analysis_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3065,7 +2951,7 @@ func (x *GetHotFunctionsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetHotFunctionsReply.ProtoReflect.Descriptor instead. func (*GetHotFunctionsReply) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{54} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{52} } func (x *GetHotFunctionsReply) GetFunctions() []*GetHotFunctionsReply_HotFunction { @@ -3087,7 +2973,7 @@ type SearchFunctionsReq struct { func (x *SearchFunctionsReq) Reset() { *x = SearchFunctionsReq{} - mi := &file_analysis_v1_analysis_proto_msgTypes[55] + mi := &file_analysis_v1_analysis_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3099,7 +2985,7 @@ func (x *SearchFunctionsReq) String() string { func (*SearchFunctionsReq) ProtoMessage() {} func (x *SearchFunctionsReq) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[55] + mi := &file_analysis_v1_analysis_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3112,7 +2998,7 @@ func (x *SearchFunctionsReq) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchFunctionsReq.ProtoReflect.Descriptor instead. func (*SearchFunctionsReq) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{55} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{53} } func (x *SearchFunctionsReq) GetDbpath() string { @@ -3147,7 +3033,7 @@ type SearchFunctionsReply struct { func (x *SearchFunctionsReply) Reset() { *x = SearchFunctionsReply{} - mi := &file_analysis_v1_analysis_proto_msgTypes[56] + mi := &file_analysis_v1_analysis_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3159,7 +3045,7 @@ func (x *SearchFunctionsReply) String() string { func (*SearchFunctionsReply) ProtoMessage() {} func (x *SearchFunctionsReply) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[56] + mi := &file_analysis_v1_analysis_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3172,7 +3058,7 @@ func (x *SearchFunctionsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchFunctionsReply.ProtoReflect.Descriptor instead. func (*SearchFunctionsReply) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{56} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{54} } func (x *SearchFunctionsReply) GetFunctions() []*SearchFunctionsReply_FunctionInfo { @@ -3202,7 +3088,7 @@ type GetGidsByFunctionNameReply_Body struct { func (x *GetGidsByFunctionNameReply_Body) Reset() { *x = GetGidsByFunctionNameReply_Body{} - mi := &file_analysis_v1_analysis_proto_msgTypes[57] + mi := &file_analysis_v1_analysis_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3214,7 +3100,7 @@ func (x *GetGidsByFunctionNameReply_Body) String() string { func (*GetGidsByFunctionNameReply_Body) ProtoMessage() {} func (x *GetGidsByFunctionNameReply_Body) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[57] + mi := &file_analysis_v1_analysis_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3275,13 +3161,14 @@ type AnalysisByGIDReply_TraceData struct { ParamCount int32 `protobuf:"varint,6,opt,name=paramCount,proto3" json:"paramCount,omitempty"` TimeCost string `protobuf:"bytes,7,opt,name=timeCost,proto3" json:"timeCost,omitempty"` ParentId int64 `protobuf:"varint,8,opt,name=parentId,proto3" json:"parentId,omitempty"` // 父函数ID + Seq string `protobuf:"bytes,9,opt,name=seq,proto3" json:"seq,omitempty"` // 序列号 unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *AnalysisByGIDReply_TraceData) Reset() { *x = AnalysisByGIDReply_TraceData{} - mi := &file_analysis_v1_analysis_proto_msgTypes[58] + mi := &file_analysis_v1_analysis_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3293,7 +3180,7 @@ func (x *AnalysisByGIDReply_TraceData) String() string { func (*AnalysisByGIDReply_TraceData) ProtoMessage() {} func (x *AnalysisByGIDReply_TraceData) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[58] + mi := &file_analysis_v1_analysis_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3365,6 +3252,13 @@ func (x *AnalysisByGIDReply_TraceData) GetParentId() int64 { return 0 } +func (x *AnalysisByGIDReply_TraceData) GetSeq() string { + if x != nil { + return x.Seq + } + return "" +} + type GetAllGIDsReply_Body struct { state protoimpl.MessageState `protogen:"open.v1"` Gid uint64 `protobuf:"varint,1,opt,name=gid,proto3" json:"gid,omitempty"` @@ -3378,7 +3272,7 @@ type GetAllGIDsReply_Body struct { func (x *GetAllGIDsReply_Body) Reset() { *x = GetAllGIDsReply_Body{} - mi := &file_analysis_v1_analysis_proto_msgTypes[59] + mi := &file_analysis_v1_analysis_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3390,7 +3284,7 @@ func (x *GetAllGIDsReply_Body) String() string { func (*GetAllGIDsReply_Body) ProtoMessage() {} func (x *GetAllGIDsReply_Body) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[59] + mi := &file_analysis_v1_analysis_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3451,13 +3345,14 @@ type GetTracesByParentFuncReply_TraceData struct { ParamCount int32 `protobuf:"varint,6,opt,name=paramCount,proto3" json:"paramCount,omitempty"` TimeCost string `protobuf:"bytes,7,opt,name=timeCost,proto3" json:"timeCost,omitempty"` ParentId int64 `protobuf:"varint,8,opt,name=parentId,proto3" json:"parentId,omitempty"` // 父函数ID + Seq string `protobuf:"bytes,9,opt,name=seq,proto3" json:"seq,omitempty"` // 序列号 unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *GetTracesByParentFuncReply_TraceData) Reset() { *x = GetTracesByParentFuncReply_TraceData{} - mi := &file_analysis_v1_analysis_proto_msgTypes[60] + mi := &file_analysis_v1_analysis_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3469,7 +3364,7 @@ func (x *GetTracesByParentFuncReply_TraceData) String() string { func (*GetTracesByParentFuncReply_TraceData) ProtoMessage() {} func (x *GetTracesByParentFuncReply_TraceData) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[60] + mi := &file_analysis_v1_analysis_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3541,6 +3436,13 @@ func (x *GetTracesByParentFuncReply_TraceData) GetParentId() int64 { return 0 } +func (x *GetTracesByParentFuncReply_TraceData) GetSeq() string { + if x != nil { + return x.Seq + } + return "" +} + type GetFunctionAnalysisReply_FunctionNode struct { state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // 节点ID @@ -3555,7 +3457,7 @@ type GetFunctionAnalysisReply_FunctionNode struct { func (x *GetFunctionAnalysisReply_FunctionNode) Reset() { *x = GetFunctionAnalysisReply_FunctionNode{} - mi := &file_analysis_v1_analysis_proto_msgTypes[61] + mi := &file_analysis_v1_analysis_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3567,7 +3469,7 @@ func (x *GetFunctionAnalysisReply_FunctionNode) String() string { func (*GetFunctionAnalysisReply_FunctionNode) ProtoMessage() {} func (x *GetFunctionAnalysisReply_FunctionNode) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[61] + mi := &file_analysis_v1_analysis_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3625,82 +3527,6 @@ func (x *GetFunctionAnalysisReply_FunctionNode) GetChildren() []*GetFunctionAnal return nil } -type GetUnfinishedFunctionsReply_UnfinishedFunction struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // 函数名称 - Gid uint64 `protobuf:"varint,2,opt,name=gid,proto3" json:"gid,omitempty"` // goroutine ID - RunningTime string `protobuf:"bytes,3,opt,name=runningTime,proto3" json:"runningTime,omitempty"` // 运行时间 - IsBlocking bool `protobuf:"varint,4,opt,name=isBlocking,proto3" json:"isBlocking,omitempty"` // 是否阻塞 - FunctionId int64 `protobuf:"varint,5,opt,name=functionId,proto3" json:"functionId,omitempty"` // 函数ID - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetUnfinishedFunctionsReply_UnfinishedFunction) Reset() { - *x = GetUnfinishedFunctionsReply_UnfinishedFunction{} - mi := &file_analysis_v1_analysis_proto_msgTypes[62] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetUnfinishedFunctionsReply_UnfinishedFunction) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetUnfinishedFunctionsReply_UnfinishedFunction) ProtoMessage() {} - -func (x *GetUnfinishedFunctionsReply_UnfinishedFunction) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[62] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetUnfinishedFunctionsReply_UnfinishedFunction.ProtoReflect.Descriptor instead. -func (*GetUnfinishedFunctionsReply_UnfinishedFunction) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{41, 0} -} - -func (x *GetUnfinishedFunctionsReply_UnfinishedFunction) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *GetUnfinishedFunctionsReply_UnfinishedFunction) GetGid() uint64 { - if x != nil { - return x.Gid - } - return 0 -} - -func (x *GetUnfinishedFunctionsReply_UnfinishedFunction) GetRunningTime() string { - if x != nil { - return x.RunningTime - } - return "" -} - -func (x *GetUnfinishedFunctionsReply_UnfinishedFunction) GetIsBlocking() bool { - if x != nil { - return x.IsBlocking - } - return false -} - -func (x *GetUnfinishedFunctionsReply_UnfinishedFunction) GetFunctionId() int64 { - if x != nil { - return x.FunctionId - } - return 0 -} - type GetHotFunctionsReply_HotFunction struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // 函数名称 @@ -3714,7 +3540,7 @@ type GetHotFunctionsReply_HotFunction struct { func (x *GetHotFunctionsReply_HotFunction) Reset() { *x = GetHotFunctionsReply_HotFunction{} - mi := &file_analysis_v1_analysis_proto_msgTypes[64] + mi := &file_analysis_v1_analysis_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3726,7 +3552,7 @@ func (x *GetHotFunctionsReply_HotFunction) String() string { func (*GetHotFunctionsReply_HotFunction) ProtoMessage() {} func (x *GetHotFunctionsReply_HotFunction) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[64] + mi := &file_analysis_v1_analysis_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3739,7 +3565,7 @@ func (x *GetHotFunctionsReply_HotFunction) ProtoReflect() protoreflect.Message { // Deprecated: Use GetHotFunctionsReply_HotFunction.ProtoReflect.Descriptor instead. func (*GetHotFunctionsReply_HotFunction) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{54, 0} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{52, 0} } func (x *GetHotFunctionsReply_HotFunction) GetName() string { @@ -3789,7 +3615,7 @@ type SearchFunctionsReply_FunctionInfo struct { func (x *SearchFunctionsReply_FunctionInfo) Reset() { *x = SearchFunctionsReply_FunctionInfo{} - mi := &file_analysis_v1_analysis_proto_msgTypes[65] + mi := &file_analysis_v1_analysis_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3801,7 +3627,7 @@ func (x *SearchFunctionsReply_FunctionInfo) String() string { func (*SearchFunctionsReply_FunctionInfo) ProtoMessage() {} func (x *SearchFunctionsReply_FunctionInfo) ProtoReflect() protoreflect.Message { - mi := &file_analysis_v1_analysis_proto_msgTypes[65] + mi := &file_analysis_v1_analysis_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3814,7 +3640,7 @@ func (x *SearchFunctionsReply_FunctionInfo) ProtoReflect() protoreflect.Message // Deprecated: Use SearchFunctionsReply_FunctionInfo.ProtoReflect.Descriptor instead. func (*SearchFunctionsReply_FunctionInfo) Descriptor() ([]byte, []int) { - return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{56, 0} + return file_analysis_v1_analysis_proto_rawDescGZIP(), []int{54, 0} } func (x *SearchFunctionsReply_FunctionInfo) GetName() string { @@ -3847,625 +3673,287 @@ func (x *SearchFunctionsReply_FunctionInfo) GetAvgTime() string { var File_analysis_v1_analysis_proto protoreflect.FileDescriptor -var file_analysis_v1_analysis_proto_rawDesc = string([]byte{ - 0x0a, 0x1a, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x6e, - 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x61, 0x6e, - 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2a, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, - 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, 0x7a, 0x0a, 0x18, 0x47, 0x65, 0x74, - 0x47, 0x69, 0x64, 0x73, 0x42, 0x79, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, - 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x8d, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x47, 0x69, 0x64, - 0x73, 0x42, 0x79, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x40, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x47, 0x69, 0x64, 0x73, 0x42, 0x79, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x42, 0x6f, 0x64, 0x79, - 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x1a, 0x96, 0x01, 0x0a, - 0x04, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x69, 0x74, 0x69, - 0x61, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x70, - 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, 0x70, 0x74, 0x68, 0x12, - 0x24, 0x0a, 0x0d, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x46, 0x69, 0x6e, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x46, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x22, 0x2f, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x16, - 0x0a, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3f, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x3c, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x67, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, - 0x62, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2a, 0x0a, 0x12, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x22, 0x3d, 0x0a, 0x0f, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, - 0x22, 0x29, 0x0a, 0x0d, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x76, 0x0a, 0x14, 0x41, - 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x42, 0x79, 0x47, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, - 0x05, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, - 0x70, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x22, 0x35, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x03, 0x70, 0x6f, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x22, 0xc3, 0x02, 0x0a, 0x12, 0x41, - 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x42, 0x79, 0x47, 0x49, 0x44, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x47, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x42, 0x79, 0x47, 0x49, 0x44, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x09, 0x74, 0x72, 0x61, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x1a, 0xe3, 0x01, 0x0a, 0x09, 0x54, - 0x72, 0x61, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x67, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, - 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, - 0x43, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, - 0x43, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x22, 0x79, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x47, 0x49, 0x44, 0x73, 0x52, 0x65, - 0x71, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x22, 0xf7, 0x01, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x47, 0x49, 0x44, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x35, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, - 0x6c, 0x6c, 0x47, 0x49, 0x44, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x42, 0x6f, 0x64, 0x79, - 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x1a, 0x96, 0x01, 0x0a, - 0x04, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x69, 0x74, 0x69, - 0x61, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x70, - 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, 0x70, 0x74, 0x68, 0x12, - 0x24, 0x0a, 0x0d, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x46, 0x69, 0x6e, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x46, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x22, 0x3a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, - 0x68, 0x22, 0x46, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x79, - 0x49, 0x44, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x30, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, - 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x09, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, - 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, - 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x22, - 0x67, 0x0a, 0x09, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x64, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3c, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, - 0x72, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, - 0x67, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x22, 0x70, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, - 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x6e, - 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x65, 0x64, - 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x64, 0x67, - 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0x4e, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x54, - 0x72, 0x61, 0x63, 0x65, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x46, 0x75, 0x6e, - 0x63, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x22, 0xd3, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, - 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x46, 0x75, - 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4f, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x63, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x63, - 0x65, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x74, - 0x72, 0x61, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x1a, 0xe3, 0x01, 0x0a, 0x09, 0x54, 0x72, 0x61, - 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, 0x6e, - 0x64, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, - 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x53, - 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x12, - 0x22, 0x0a, 0x0c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0xd6, 0x01, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x61, 0x76, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x76, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, - 0x6d, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, - 0x6d, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, 0x70, 0x74, 0x68, 0x22, 0x52, 0x0a, 0x17, - 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x37, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x4a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x22, 0x51, 0x0a, 0x16, - 0x47, 0x65, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x37, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x2e, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x22, - 0x66, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x76, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x76, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, - 0x61, 0x78, 0x44, 0x65, 0x70, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, - 0x61, 0x78, 0x44, 0x65, 0x70, 0x74, 0x68, 0x22, 0x68, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x46, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65, - 0x71, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, - 0x68, 0x22, 0xc1, 0x02, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4e, - 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, - 0x69, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x1a, 0xd4, - 0x01, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x76, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x76, - 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, - 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, - 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, - 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x19, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x68, 0x0a, 0x1a, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, - 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, - 0x22, 0x2e, 0x0a, 0x14, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x44, 0x62, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, - 0x22, 0x59, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x40, 0x0a, 0x0b, 0x48, - 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x95, 0x02, - 0x0a, 0x15, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x44, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x12, - 0x24, 0x0a, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x13, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, - 0x63, 0x79, 0x52, 0x13, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x68, 0x6f, 0x74, 0x46, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x6f, 0x74, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x68, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2a, 0x0a, 0x14, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x22, 0x4c, 0x0a, 0x16, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0x7b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, - 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xad, 0x02, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x46, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x59, 0x0a, 0x09, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3b, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x55, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x55, 0x6e, 0x66, 0x69, 0x6e, 0x69, - 0x73, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x1a, 0x9c, 0x01, - 0x0a, 0x12, 0x55, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, - 0x69, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x69, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x0a, 0x0a, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x81, 0x01, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, - 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, - 0x70, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, 0x70, 0x74, 0x68, - 0x22, 0x85, 0x01, 0x0a, 0x08, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6c, 0x6c, 0x61, - 0x70, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6c, 0x6c, - 0x61, 0x70, 0x73, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, - 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, - 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, - 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x40, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, - 0x72, 0x65, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2b, 0x0a, - 0x05, 0x74, 0x72, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, - 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x05, 0x74, 0x72, 0x65, 0x65, 0x73, 0x22, 0x40, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x54, 0x72, 0x65, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x42, 0x79, 0x47, 0x49, 0x44, 0x52, - 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x67, 0x69, 0x64, 0x22, 0x45, 0x0a, 0x16, - 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x42, 0x79, 0x47, 0x49, - 0x44, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x74, 0x72, 0x65, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x74, 0x72, - 0x65, 0x65, 0x73, 0x22, 0x55, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x16, - 0x0a, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x91, 0x02, 0x0a, 0x11, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0b, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x61, 0x76, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x76, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, - 0x78, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x78, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x22, 0x51, - 0x0a, 0x19, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, - 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x22, 0x76, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x6e, 0x63, 0x65, 0x41, 0x6e, 0x6f, 0x6d, 0x61, 0x6c, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, - 0x16, 0x0a, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, - 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0xa6, 0x02, 0x0a, 0x12, 0x50, 0x65, - 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6e, 0x6f, 0x6d, 0x61, 0x6c, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x61, 0x6e, 0x6f, 0x6d, 0x61, 0x6c, 0x79, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x6e, 0x6f, 0x6d, 0x61, 0x6c, 0x79, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x46, - 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2c, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, - 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6e, 0x6f, 0x6d, 0x61, 0x6c, 0x79, - 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x5d, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6e, 0x6f, 0x6d, 0x61, 0x6c, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x3d, 0x0a, 0x09, 0x61, 0x6e, 0x6f, 0x6d, 0x61, 0x6c, 0x69, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x41, - 0x6e, 0x6f, 0x6d, 0x61, 0x6c, 0x79, 0x52, 0x09, 0x61, 0x6e, 0x6f, 0x6d, 0x61, 0x6c, 0x69, 0x65, - 0x73, 0x22, 0x45, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x6f, 0x72, 0x74, 0x5f, - 0x62, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x72, 0x74, 0x42, 0x79, - 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x22, 0xfa, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x4b, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x94, - 0x01, 0x0a, 0x0b, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x76, - 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x76, - 0x67, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x58, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x64, - 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x70, - 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, - 0xf0, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4c, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x6e, - 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x1a, 0x74, 0x0a, 0x0c, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, - 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, - 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x76, 0x67, 0x54, - 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x76, 0x67, 0x54, 0x69, - 0x6d, 0x65, 0x32, 0xe8, 0x14, 0x0a, 0x08, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x12, - 0x64, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x12, 0x1c, - 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, - 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, - 0x73, 0x69, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x7b, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x7c, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x42, 0x79, 0x47, 0x49, 0x44, 0x12, 0x21, 0x2e, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, - 0x42, 0x79, 0x47, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, - 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, - 0x73, 0x69, 0x73, 0x42, 0x79, 0x47, 0x49, 0x44, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x24, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x67, - 0x69, 0x64, 0x7d, 0x12, 0x64, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x47, 0x49, 0x44, - 0x73, 0x12, 0x1a, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x47, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, - 0x6c, 0x6c, 0x47, 0x49, 0x44, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x67, 0x69, 0x64, 0x73, 0x12, 0x74, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x79, 0x49, 0x44, 0x12, 0x1d, 0x2e, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, - 0x81, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x47, 0x69, 0x64, 0x73, 0x42, - 0x79, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x2e, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, - 0x69, 0x64, 0x73, 0x42, 0x79, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x27, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x69, 0x64, 0x73, 0x42, 0x79, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x25, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x67, 0x69, 0x64, 0x73, 0x2f, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x80, 0x01, 0x0a, 0x11, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x2e, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x99, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x54, - 0x72, 0x61, 0x63, 0x65, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x46, 0x75, 0x6e, - 0x63, 0x12, 0x25, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x46, 0x75, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x1a, 0x27, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, - 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, - 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, - 0x73, 0x2f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x7d, 0x12, 0x89, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x24, - 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, - 0x1e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x87, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, - 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x7c, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x61, - 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x6f, - 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x48, - 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x68, 0x6f, 0x74, 0x2d, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x47, - 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x21, 0x2e, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, - 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x23, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x47, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, - 0x22, 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x67, - 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x8c, - 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, - 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x12, 0x23, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x25, 0x2e, 0x61, 0x6e, - 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x12, 0x7f, 0x0a, - 0x11, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x21, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x98, - 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x66, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x28, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x55, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2c, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x75, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2d, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x70, 0x0a, 0x0c, 0x47, 0x65, 0x74, - 0x54, 0x72, 0x65, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x1c, 0x2e, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x1a, 0x1e, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, - 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, - 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2f, 0x74, 0x72, 0x65, 0x65, 0x2d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x12, 0x83, 0x01, 0x0a, 0x11, - 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x42, 0x79, 0x47, 0x49, - 0x44, 0x12, 0x21, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x42, 0x79, 0x47, 0x49, - 0x44, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x42, - 0x79, 0x47, 0x49, 0x44, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2f, 0x74, 0x72, 0x65, 0x65, 0x2d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x67, 0x69, - 0x64, 0x12, 0x8c, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x26, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, - 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x12, 0x99, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x6e, 0x63, 0x65, 0x41, 0x6e, 0x6f, 0x6d, 0x61, 0x6c, 0x69, 0x65, 0x73, 0x12, 0x27, 0x2e, 0x61, - 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, - 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6e, 0x6f, 0x6d, 0x61, 0x6c, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x29, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, - 0x63, 0x65, 0x41, 0x6e, 0x6f, 0x6d, 0x61, 0x6c, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2f, 0x61, 0x6e, 0x6f, 0x6d, 0x61, 0x6c, 0x69, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x0f, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x1f, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x21, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x32, 0x5a, - 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x68, 0x65, - 0x61, 0x72, 0x74, 0x2f, 0x67, 0x6f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x76, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -}) +const file_analysis_v1_analysis_proto_rawDesc = "" + + "\n" + + "\x1aanalysis/v1/analysis.proto\x12\vanalysis.v1\x1a\x1cgoogle/api/annotations.proto\"*\n" + + "\x14VerifyProjectPathReq\x12\x12\n" + + "\x04path\x18\x01 \x01(\tR\x04path\"4\n" + + "\x16VerifyProjectPathReply\x12\x1a\n" + + "\bverified\x18\x01 \x01(\bR\bverified\"z\n" + + "\x18GetGidsByFunctionNameReq\x12\"\n" + + "\ffunctionName\x18\x01 \x01(\tR\ffunctionName\x12\x12\n" + + "\x04path\x18\x02 \x01(\tR\x04path\x12&\n" + + "\x0eincludeMetrics\x18\x03 \x01(\bR\x0eincludeMetrics\"\x8d\x02\n" + + "\x1aGetGidsByFunctionNameReply\x12@\n" + + "\x04body\x18\x01 \x03(\v2,.analysis.v1.GetGidsByFunctionNameReply.BodyR\x04body\x12\x14\n" + + "\x05total\x18\x02 \x01(\x05R\x05total\x1a\x96\x01\n" + + "\x04Body\x12\x10\n" + + "\x03gid\x18\x01 \x01(\x04R\x03gid\x12 \n" + + "\vinitialFunc\x18\x02 \x01(\tR\vinitialFunc\x12\x14\n" + + "\x05depth\x18\x03 \x01(\x05R\x05depth\x12$\n" + + "\rexecutionTime\x18\x04 \x01(\tR\rexecutionTime\x12\x1e\n" + + "\n" + + "isFinished\x18\x05 \x01(\bR\n" + + "isFinished\"/\n" + + "\x15GetAllFunctionNameReq\x12\x16\n" + + "\x06dbpath\x18\x01 \x01(\tR\x06dbpath\"?\n" + + "\x17GetAllFunctionNameReply\x12$\n" + + "\rfunctionNames\x18\x01 \x03(\tR\rfunctionNames\"<\n" + + "\x10GenerateImageReq\x12\x10\n" + + "\x03gid\x18\x01 \x01(\x04R\x03gid\x12\x16\n" + + "\x06dbpath\x18\x02 \x01(\tR\x06dbpath\"*\n" + + "\x12GenerateImageReply\x12\x14\n" + + "\x05image\x18\x01 \x01(\tR\x05image\"=\n" + + "\x0fAnalysisRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n" + + "\x06dbpath\x18\x02 \x01(\tR\x06dbpath\")\n" + + "\rAnalysisReply\x12\x18\n" + + "\amessage\x18\x01 \x01(\tR\amessage\"v\n" + + "\x14AnalysisByGIDRequest\x12\x10\n" + + "\x03gid\x18\x01 \x01(\x04R\x03gid\x12\x16\n" + + "\x06dbpath\x18\x02 \x01(\tR\x06dbpath\x12\x14\n" + + "\x05depth\x18\x03 \x01(\x05R\x05depth\x12\x1e\n" + + "\n" + + "createTime\x18\x04 \x01(\tR\n" + + "createTime\"5\n" + + "\vTraceParams\x12\x10\n" + + "\x03pos\x18\x01 \x01(\x05R\x03pos\x12\x14\n" + + "\x05param\x18\x02 \x01(\tR\x05param\"\xd5\x02\n" + + "\x12AnalysisByGIDReply\x12G\n" + + "\ttraceData\x18\x01 \x03(\v2).analysis.v1.AnalysisByGIDReply.TraceDataR\ttraceData\x1a\xf5\x01\n" + + "\tTraceData\x12\x0e\n" + + "\x02id\x18\x01 \x01(\x05R\x02id\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x10\n" + + "\x03gid\x18\x03 \x01(\x04R\x03gid\x12\x16\n" + + "\x06indent\x18\x04 \x01(\x05R\x06indent\x120\n" + + "\x06params\x18\x05 \x03(\v2\x18.analysis.v1.TraceParamsR\x06params\x12\x1e\n" + + "\n" + + "paramCount\x18\x06 \x01(\x05R\n" + + "paramCount\x12\x1a\n" + + "\btimeCost\x18\a \x01(\tR\btimeCost\x12\x1a\n" + + "\bparentId\x18\b \x01(\x03R\bparentId\x12\x10\n" + + "\x03seq\x18\t \x01(\tR\x03seq\"y\n" + + "\rGetAllGIDsReq\x12\x12\n" + + "\x04page\x18\x01 \x01(\x05R\x04page\x12\x14\n" + + "\x05limit\x18\x02 \x01(\x05R\x05limit\x12&\n" + + "\x0eincludeMetrics\x18\x03 \x01(\bR\x0eincludeMetrics\x12\x16\n" + + "\x06dbpath\x18\x04 \x01(\tR\x06dbpath\"\xf7\x01\n" + + "\x0fGetAllGIDsReply\x125\n" + + "\x04body\x18\x01 \x03(\v2!.analysis.v1.GetAllGIDsReply.BodyR\x04body\x12\x14\n" + + "\x05total\x18\x02 \x01(\x05R\x05total\x1a\x96\x01\n" + + "\x04Body\x12\x10\n" + + "\x03gid\x18\x01 \x01(\x04R\x03gid\x12 \n" + + "\vinitialFunc\x18\x02 \x01(\tR\vinitialFunc\x12\x14\n" + + "\x05depth\x18\x03 \x01(\x05R\x05depth\x12$\n" + + "\rexecutionTime\x18\x04 \x01(\tR\rexecutionTime\x12\x1e\n" + + "\n" + + "isFinished\x18\x05 \x01(\bR\n" + + "isFinished\":\n" + + "\x10GetParamsByIDReq\x12\x0e\n" + + "\x02id\x18\x01 \x01(\x05R\x02id\x12\x16\n" + + "\x06dbpath\x18\x02 \x01(\tR\x06dbpath\"F\n" + + "\x12GetParamsByIDReply\x120\n" + + "\x06params\x18\x01 \x03(\v2\x18.analysis.v1.TraceParamsR\x06params\"\x83\x01\n" + + "\tGraphNode\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x1c\n" + + "\tcallCount\x18\x03 \x01(\x05R\tcallCount\x12\x18\n" + + "\apackage\x18\x04 \x01(\tR\apackage\x12\x1a\n" + + "\btimeCost\x18\x05 \x01(\tR\btimeCost\"g\n" + + "\tGraphEdge\x12\x16\n" + + "\x06source\x18\x01 \x01(\tR\x06source\x12\x16\n" + + "\x06target\x18\x02 \x01(\tR\x06target\x12\x14\n" + + "\x05label\x18\x03 \x01(\tR\x05label\x12\x14\n" + + "\x05count\x18\x04 \x01(\x05R\x05count\"<\n" + + "\x10GetTraceGraphReq\x12\x10\n" + + "\x03gid\x18\x01 \x01(\x04R\x03gid\x12\x16\n" + + "\x06dbpath\x18\x02 \x01(\tR\x06dbpath\"p\n" + + "\x12GetTraceGraphReply\x12,\n" + + "\x05nodes\x18\x01 \x03(\v2\x16.analysis.v1.GraphNodeR\x05nodes\x12,\n" + + "\x05edges\x18\x02 \x03(\v2\x16.analysis.v1.GraphEdgeR\x05edges\"N\n" + + "\x18GetTracesByParentFuncReq\x12\x1a\n" + + "\bparentId\x18\x01 \x01(\x03R\bparentId\x12\x16\n" + + "\x06dbpath\x18\x02 \x01(\tR\x06dbpath\"\xe5\x02\n" + + "\x1aGetTracesByParentFuncReply\x12O\n" + + "\ttraceData\x18\x01 \x03(\v21.analysis.v1.GetTracesByParentFuncReply.TraceDataR\ttraceData\x1a\xf5\x01\n" + + "\tTraceData\x12\x0e\n" + + "\x02id\x18\x01 \x01(\x05R\x02id\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x10\n" + + "\x03gid\x18\x03 \x01(\x05R\x03gid\x12\x16\n" + + "\x06indent\x18\x04 \x01(\x05R\x06indent\x120\n" + + "\x06params\x18\x05 \x03(\v2\x18.analysis.v1.TraceParamsR\x06params\x12\x1e\n" + + "\n" + + "paramCount\x18\x06 \x01(\x05R\n" + + "paramCount\x12\x1a\n" + + "\btimeCost\x18\a \x01(\tR\btimeCost\x12\x1a\n" + + "\bparentId\x18\b \x01(\x03R\bparentId\x12\x10\n" + + "\x03seq\x18\t \x01(\tR\x03seq\"S\n" + + "\x15GetParentFunctionsReq\x12\x16\n" + + "\x06dbpath\x18\x01 \x01(\tR\x06dbpath\x12\"\n" + + "\ffunctionName\x18\x02 \x01(\tR\ffunctionName\"\xe8\x01\n" + + "\fFunctionNode\x12\x0e\n" + + "\x02id\x18\x01 \x01(\x03R\x02id\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x18\n" + + "\apackage\x18\x03 \x01(\tR\apackage\x12\x1c\n" + + "\tcallCount\x18\x04 \x01(\x05R\tcallCount\x12\x18\n" + + "\aavgTime\x18\x05 \x01(\tR\aavgTime\x12\x1a\n" + + "\btimeCost\x18\x06 \x01(\tR\btimeCost\x12\x1e\n" + + "\n" + + "paramCount\x18\a \x01(\x05R\n" + + "paramCount\x12\x14\n" + + "\x05depth\x18\b \x01(\x05R\x05depth\x12\x10\n" + + "\x03seq\x18\t \x01(\tR\x03seq\"R\n" + + "\x17GetParentFunctionsReply\x127\n" + + "\tfunctions\x18\x01 \x03(\v2\x19.analysis.v1.FunctionNodeR\tfunctions\"J\n" + + "\x14GetChildFunctionsReq\x12\x1a\n" + + "\bparentId\x18\x01 \x01(\x03R\bparentId\x12\x16\n" + + "\x06dbpath\x18\x02 \x01(\tR\x06dbpath\"Q\n" + + "\x16GetChildFunctionsReply\x127\n" + + "\tfunctions\x18\x01 \x03(\v2\x19.analysis.v1.FunctionNodeR\tfunctions\".\n" + + "\x14GetGoroutineStatsReq\x12\x16\n" + + "\x06dbpath\x18\x01 \x01(\tR\x06dbpath\"f\n" + + "\x16GetGoroutineStatsReply\x12\x16\n" + + "\x06active\x18\x01 \x01(\x05R\x06active\x12\x18\n" + + "\aavgTime\x18\x02 \x01(\tR\aavgTime\x12\x1a\n" + + "\bmaxDepth\x18\x03 \x01(\x05R\bmaxDepth\"h\n" + + "\x16GetFunctionAnalysisReq\x12\"\n" + + "\ffunctionName\x18\x01 \x01(\tR\ffunctionName\x12\x12\n" + + "\x04type\x18\x02 \x01(\tR\x04type\x12\x16\n" + + "\x06dbpath\x18\x03 \x01(\tR\x06dbpath\"\xc1\x02\n" + + "\x18GetFunctionAnalysisReply\x12N\n" + + "\bcallData\x18\x01 \x03(\v22.analysis.v1.GetFunctionAnalysisReply.FunctionNodeR\bcallData\x1a\xd4\x01\n" + + "\fFunctionNode\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x18\n" + + "\apackage\x18\x03 \x01(\tR\apackage\x12\x1c\n" + + "\tcallCount\x18\x04 \x01(\x05R\tcallCount\x12\x18\n" + + "\aavgTime\x18\x05 \x01(\tR\aavgTime\x12N\n" + + "\bchildren\x18\x06 \x03(\v22.analysis.v1.GetFunctionAnalysisReply.FunctionNodeR\bchildren\"/\n" + + "\x19AnalyzeProjectPathRequest\x12\x12\n" + + "\x04path\x18\x01 \x01(\tR\x04path\"h\n" + + "\x1aAnalyzeProjectPathResponse\x12\x18\n" + + "\asuccess\x18\x01 \x01(\bR\asuccess\x12\x18\n" + + "\amessage\x18\x02 \x01(\tR\amessage\x12\x16\n" + + "\x06dbPath\x18\x03 \x01(\tR\x06dbPath\".\n" + + "\x14AnalyzeDbFileRequest\x12\x16\n" + + "\x06dbPath\x18\x01 \x01(\tR\x06dbPath\"Y\n" + + "\x11PackageDependency\x12\x16\n" + + "\x06source\x18\x01 \x01(\tR\x06source\x12\x16\n" + + "\x06target\x18\x02 \x01(\tR\x06target\x12\x14\n" + + "\x05count\x18\x03 \x01(\x05R\x05count\"@\n" + + "\vHotFunction\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n" + + "\n" + + "call_count\x18\x02 \x01(\x05R\tcallCount\"\x95\x02\n" + + "\x15AnalyzeDbFileResponse\x12&\n" + + "\x0etotalFunctions\x18\x01 \x01(\x05R\x0etotalFunctions\x12\x1e\n" + + "\n" + + "totalCalls\x18\x02 \x01(\x05R\n" + + "totalCalls\x12$\n" + + "\rtotalPackages\x18\x03 \x01(\x05R\rtotalPackages\x12P\n" + + "\x13packageDependencies\x18\x04 \x03(\v2\x1e.analysis.v1.PackageDependencyR\x13packageDependencies\x12<\n" + + "\fhotFunctions\x18\x05 \x03(\v2\x18.analysis.v1.HotFunctionR\fhotFunctions\"*\n" + + "\x14InstrumentProjectReq\x12\x12\n" + + "\x04path\x18\x01 \x01(\tR\x04path\"L\n" + + "\x16InstrumentProjectReply\x12\x18\n" + + "\asuccess\x18\x01 \x01(\bR\asuccess\x12\x18\n" + + "\amessage\x18\x02 \x01(\tR\amessage\"\x81\x01\n" + + "\x0fGetTreeGraphReq\x12\x16\n" + + "\x06dbPath\x18\x01 \x01(\tR\x06dbPath\x12\"\n" + + "\ffunctionName\x18\x02 \x01(\tR\ffunctionName\x12\x1c\n" + + "\tchainType\x18\x03 \x01(\tR\tchainType\x12\x14\n" + + "\x05depth\x18\x04 \x01(\x05R\x05depth\"\x85\x01\n" + + "\bTreeNode\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x14\n" + + "\x05value\x18\x02 \x01(\x03R\x05value\x12\x1c\n" + + "\tcollapsed\x18\x03 \x01(\bR\tcollapsed\x121\n" + + "\bchildren\x18\x04 \x03(\v2\x15.analysis.v1.TreeNodeR\bchildren\"@\n" + + "\x11GetTreeGraphReply\x12+\n" + + "\x05trees\x18\x01 \x03(\v2\x15.analysis.v1.TreeNodeR\x05trees\"@\n" + + "\x14GetTreeGraphByGIDReq\x12\x16\n" + + "\x06dbPath\x18\x01 \x01(\tR\x06dbPath\x12\x10\n" + + "\x03gid\x18\x02 \x01(\x04R\x03gid\"E\n" + + "\x16GetTreeGraphByGIDReply\x12+\n" + + "\x05trees\x18\x01 \x03(\v2\x15.analysis.v1.TreeNodeR\x05trees\"U\n" + + "\x17GetFunctionCallStatsReq\x12\x16\n" + + "\x06dbPath\x18\x01 \x01(\tR\x06dbPath\x12\"\n" + + "\ffunctionName\x18\x02 \x01(\tR\ffunctionName\"\x91\x02\n" + + "\x11FunctionCallStats\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n" + + "\apackage\x18\x02 \x01(\tR\apackage\x12\x1c\n" + + "\tcallCount\x18\x03 \x01(\x05R\tcallCount\x12 \n" + + "\vcallerCount\x18\x04 \x01(\x05R\vcallerCount\x12 \n" + + "\vcalleeCount\x18\x05 \x01(\x05R\vcalleeCount\x12\x18\n" + + "\aavgTime\x18\x06 \x01(\tR\aavgTime\x12\x18\n" + + "\amaxTime\x18\a \x01(\tR\amaxTime\x12\x18\n" + + "\aminTime\x18\b \x01(\tR\aminTime\x12\x1e\n" + + "\n" + + "timeStdDev\x18\t \x01(\x01R\n" + + "timeStdDev\"Q\n" + + "\x19GetFunctionCallStatsReply\x124\n" + + "\x05stats\x18\x01 \x03(\v2\x1e.analysis.v1.FunctionCallStatsR\x05stats\"v\n" + + "\x1aGetPerformanceAnomaliesReq\x12\x16\n" + + "\x06dbPath\x18\x01 \x01(\tR\x06dbPath\x12\"\n" + + "\ffunctionName\x18\x02 \x01(\tR\ffunctionName\x12\x1c\n" + + "\tthreshold\x18\x03 \x01(\x01R\tthreshold\"\xa6\x02\n" + + "\x12PerformanceAnomaly\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n" + + "\apackage\x18\x02 \x01(\tR\apackage\x12 \n" + + "\vanomalyType\x18\x03 \x01(\tR\vanomalyType\x12 \n" + + "\vdescription\x18\x04 \x01(\tR\vdescription\x12\x1a\n" + + "\bseverity\x18\x05 \x01(\x01R\bseverity\x12F\n" + + "\adetails\x18\x06 \x03(\v2,.analysis.v1.PerformanceAnomaly.DetailsEntryR\adetails\x1a:\n" + + "\fDetailsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"]\n" + + "\x1cGetPerformanceAnomaliesReply\x12=\n" + + "\tanomalies\x18\x01 \x03(\v2\x1f.analysis.v1.PerformanceAnomalyR\tanomalies\"E\n" + + "\x12GetHotFunctionsReq\x12\x17\n" + + "\asort_by\x18\x01 \x01(\tR\x06sortBy\x12\x16\n" + + "\x06dbpath\x18\x02 \x01(\tR\x06dbpath\"\xfa\x01\n" + + "\x14GetHotFunctionsReply\x12K\n" + + "\tfunctions\x18\x01 \x03(\v2-.analysis.v1.GetHotFunctionsReply.HotFunctionR\tfunctions\x1a\x94\x01\n" + + "\vHotFunction\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n" + + "\apackage\x18\x02 \x01(\tR\apackage\x12\x1d\n" + + "\n" + + "call_count\x18\x03 \x01(\x05R\tcallCount\x12\x1d\n" + + "\n" + + "total_time\x18\x04 \x01(\tR\ttotalTime\x12\x19\n" + + "\bavg_time\x18\x05 \x01(\tR\aavgTime\"X\n" + + "\x12SearchFunctionsReq\x12\x16\n" + + "\x06dbpath\x18\x01 \x01(\tR\x06dbpath\x12\x14\n" + + "\x05query\x18\x02 \x01(\tR\x05query\x12\x14\n" + + "\x05limit\x18\x03 \x01(\x05R\x05limit\"\xf0\x01\n" + + "\x14SearchFunctionsReply\x12L\n" + + "\tfunctions\x18\x01 \x03(\v2..analysis.v1.SearchFunctionsReply.FunctionInfoR\tfunctions\x12\x14\n" + + "\x05total\x18\x02 \x01(\x05R\x05total\x1at\n" + + "\fFunctionInfo\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n" + + "\apackage\x18\x02 \x01(\tR\apackage\x12\x1c\n" + + "\tcallCount\x18\x03 \x01(\x05R\tcallCount\x12\x18\n" + + "\aavgTime\x18\x04 \x01(\tR\aavgTime2\xcd\x13\n" + + "\bAnalysis\x12d\n" + + "\vGetAnalysis\x12\x1c.analysis.v1.AnalysisRequest\x1a\x1a.analysis.v1.AnalysisReply\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\"\x10/analysis/{name}\x12|\n" + + "\x10GetAnalysisByGID\x12!.analysis.v1.AnalysisByGIDRequest\x1a\x1f.analysis.v1.AnalysisByGIDReply\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\"\x19/api/runtime/traces/{gid}\x12d\n" + + "\n" + + "GetAllGIDs\x12\x1a.analysis.v1.GetAllGIDsReq\x1a\x1c.analysis.v1.GetAllGIDsReply\"\x1c\x82\xd3\xe4\x93\x02\x16:\x01*\"\x11/api/runtime/gids\x12t\n" + + "\rGetParamsByID\x12\x1d.analysis.v1.GetParamsByIDReq\x1a\x1f.analysis.v1.GetParamsByIDReply\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/api/runtime/params/{id}\x12\x81\x01\n" + + "\x12GetAllFunctionName\x12\".analysis.v1.GetAllFunctionNameReq\x1a$.analysis.v1.GetAllFunctionNameReply\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/api/runtime/functions\x12\x8e\x01\n" + + "\x15GetGidsByFunctionName\x12%.analysis.v1.GetGidsByFunctionNameReq\x1a'.analysis.v1.GetGidsByFunctionNameReply\"%\x82\xd3\xe4\x93\x02\x1f:\x01*\"\x1a/api/runtime/gids/function\x12\x80\x01\n" + + "\x11VerifyProjectPath\x12!.analysis.v1.VerifyProjectPathReq\x1a#.analysis.v1.VerifyProjectPathReply\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/api/runtime/verify/path\x12\x99\x01\n" + + "\x15GetTracesByParentFunc\x12%.analysis.v1.GetTracesByParentFuncReq\x1a'.analysis.v1.GetTracesByParentFuncReply\"0\x82\xd3\xe4\x93\x02*:\x01*\"%/api/runtime/traces/parent/{parentId}\x12\x89\x01\n" + + "\x12GetParentFunctions\x12\".analysis.v1.GetParentFunctionsReq\x1a$.analysis.v1.GetParentFunctionsReply\")\x82\xd3\xe4\x93\x02#:\x01*\"\x1e/api/runtime/functions/parents\x12\x87\x01\n" + + "\x11GetChildFunctions\x12!.analysis.v1.GetChildFunctionsReq\x1a#.analysis.v1.GetChildFunctionsReply\"*\x82\xd3\xe4\x93\x02$:\x01*\"\x1f/api/runtime/functions/children\x12|\n" + + "\x0fGetHotFunctions\x12\x1f.analysis.v1.GetHotFunctionsReq\x1a!.analysis.v1.GetHotFunctionsReply\"%\x82\xd3\xe4\x93\x02\x1f:\x01*\"\x1a/api/runtime/hot-functions\x12\x84\x01\n" + + "\x11GetGoroutineStats\x12!.analysis.v1.GetGoroutineStatsReq\x1a#.analysis.v1.GetGoroutineStatsReply\"'\x82\xd3\xe4\x93\x02!:\x01*\"\x1c/api/runtime/goroutine-stats\x12\x8c\x01\n" + + "\x13GetFunctionAnalysis\x12#.analysis.v1.GetFunctionAnalysisReq\x1a%.analysis.v1.GetFunctionAnalysisReply\")\x82\xd3\xe4\x93\x02#:\x01*\"\x1e/api/runtime/function/analysis\x12\x7f\n" + + "\x11InstrumentProject\x12!.analysis.v1.InstrumentProjectReq\x1a#.analysis.v1.InstrumentProjectReply\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/api/runtime/instrument\x12p\n" + + "\fGetTreeGraph\x12\x1c.analysis.v1.GetTreeGraphReq\x1a\x1e.analysis.v1.GetTreeGraphReply\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/api/runtime/tree-graph\x12\x83\x01\n" + + "\x11GetTreeGraphByGID\x12!.analysis.v1.GetTreeGraphByGIDReq\x1a#.analysis.v1.GetTreeGraphByGIDReply\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/api/runtime/tree-graph/gid\x12\x8c\x01\n" + + "\x14GetFunctionCallStats\x12$.analysis.v1.GetFunctionCallStatsReq\x1a&.analysis.v1.GetFunctionCallStatsReply\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/api/runtime/function/stats\x12\x99\x01\n" + + "\x17GetPerformanceAnomalies\x12'.analysis.v1.GetPerformanceAnomaliesReq\x1a).analysis.v1.GetPerformanceAnomaliesReply\"*\x82\xd3\xe4\x93\x02$:\x01*\"\x1f/api/runtime/function/anomalies\x12\x7f\n" + + "\x0fSearchFunctions\x12\x1f.analysis.v1.SearchFunctionsReq\x1a!.analysis.v1.SearchFunctionsReply\"(\x82\xd3\xe4\x93\x02\":\x01*\"\x1d/api/runtime/functions/searchB2Z0github.com/toheart/goanalysis/api/analysis/v1;v1b\x06proto3" var ( file_analysis_v1_analysis_proto_rawDescOnce sync.Once @@ -4479,145 +3967,139 @@ func file_analysis_v1_analysis_proto_rawDescGZIP() []byte { return file_analysis_v1_analysis_proto_rawDescData } -var file_analysis_v1_analysis_proto_msgTypes = make([]protoimpl.MessageInfo, 66) +var file_analysis_v1_analysis_proto_msgTypes = make([]protoimpl.MessageInfo, 63) var file_analysis_v1_analysis_proto_goTypes = []any{ - (*VerifyProjectPathReq)(nil), // 0: analysis.v1.VerifyProjectPathReq - (*VerifyProjectPathReply)(nil), // 1: analysis.v1.VerifyProjectPathReply - (*GetGidsByFunctionNameReq)(nil), // 2: analysis.v1.GetGidsByFunctionNameReq - (*GetGidsByFunctionNameReply)(nil), // 3: analysis.v1.GetGidsByFunctionNameReply - (*GetAllFunctionNameReq)(nil), // 4: analysis.v1.GetAllFunctionNameReq - (*GetAllFunctionNameReply)(nil), // 5: analysis.v1.GetAllFunctionNameReply - (*GenerateImageReq)(nil), // 6: analysis.v1.GenerateImageReq - (*GenerateImageReply)(nil), // 7: analysis.v1.GenerateImageReply - (*AnalysisRequest)(nil), // 8: analysis.v1.AnalysisRequest - (*AnalysisReply)(nil), // 9: analysis.v1.AnalysisReply - (*AnalysisByGIDRequest)(nil), // 10: analysis.v1.AnalysisByGIDRequest - (*TraceParams)(nil), // 11: analysis.v1.TraceParams - (*AnalysisByGIDReply)(nil), // 12: analysis.v1.AnalysisByGIDReply - (*GetAllGIDsReq)(nil), // 13: analysis.v1.GetAllGIDsReq - (*GetAllGIDsReply)(nil), // 14: analysis.v1.GetAllGIDsReply - (*GetParamsByIDReq)(nil), // 15: analysis.v1.GetParamsByIDReq - (*GetParamsByIDReply)(nil), // 16: analysis.v1.GetParamsByIDReply - (*GraphNode)(nil), // 17: analysis.v1.GraphNode - (*GraphEdge)(nil), // 18: analysis.v1.GraphEdge - (*GetTraceGraphReq)(nil), // 19: analysis.v1.GetTraceGraphReq - (*GetTraceGraphReply)(nil), // 20: analysis.v1.GetTraceGraphReply - (*GetTracesByParentFuncReq)(nil), // 21: analysis.v1.GetTracesByParentFuncReq - (*GetTracesByParentFuncReply)(nil), // 22: analysis.v1.GetTracesByParentFuncReply - (*GetParentFunctionsReq)(nil), // 23: analysis.v1.GetParentFunctionsReq - (*FunctionNode)(nil), // 24: analysis.v1.FunctionNode - (*GetParentFunctionsReply)(nil), // 25: analysis.v1.GetParentFunctionsReply - (*GetChildFunctionsReq)(nil), // 26: analysis.v1.GetChildFunctionsReq - (*GetChildFunctionsReply)(nil), // 27: analysis.v1.GetChildFunctionsReply - (*GetGoroutineStatsReq)(nil), // 28: analysis.v1.GetGoroutineStatsReq - (*GetGoroutineStatsReply)(nil), // 29: analysis.v1.GetGoroutineStatsReply - (*GetFunctionAnalysisReq)(nil), // 30: analysis.v1.GetFunctionAnalysisReq - (*GetFunctionAnalysisReply)(nil), // 31: analysis.v1.GetFunctionAnalysisReply - (*AnalyzeProjectPathRequest)(nil), // 32: analysis.v1.AnalyzeProjectPathRequest - (*AnalyzeProjectPathResponse)(nil), // 33: analysis.v1.AnalyzeProjectPathResponse - (*AnalyzeDbFileRequest)(nil), // 34: analysis.v1.AnalyzeDbFileRequest - (*PackageDependency)(nil), // 35: analysis.v1.PackageDependency - (*HotFunction)(nil), // 36: analysis.v1.HotFunction - (*AnalyzeDbFileResponse)(nil), // 37: analysis.v1.AnalyzeDbFileResponse - (*InstrumentProjectReq)(nil), // 38: analysis.v1.InstrumentProjectReq - (*InstrumentProjectReply)(nil), // 39: analysis.v1.InstrumentProjectReply - (*GetUnfinishedFunctionsReq)(nil), // 40: analysis.v1.GetUnfinishedFunctionsReq - (*GetUnfinishedFunctionsReply)(nil), // 41: analysis.v1.GetUnfinishedFunctionsReply - (*GetTreeGraphReq)(nil), // 42: analysis.v1.GetTreeGraphReq - (*TreeNode)(nil), // 43: analysis.v1.TreeNode - (*GetTreeGraphReply)(nil), // 44: analysis.v1.GetTreeGraphReply - (*GetTreeGraphByGIDReq)(nil), // 45: analysis.v1.GetTreeGraphByGIDReq - (*GetTreeGraphByGIDReply)(nil), // 46: analysis.v1.GetTreeGraphByGIDReply - (*GetFunctionCallStatsReq)(nil), // 47: analysis.v1.GetFunctionCallStatsReq - (*FunctionCallStats)(nil), // 48: analysis.v1.FunctionCallStats - (*GetFunctionCallStatsReply)(nil), // 49: analysis.v1.GetFunctionCallStatsReply - (*GetPerformanceAnomaliesReq)(nil), // 50: analysis.v1.GetPerformanceAnomaliesReq - (*PerformanceAnomaly)(nil), // 51: analysis.v1.PerformanceAnomaly - (*GetPerformanceAnomaliesReply)(nil), // 52: analysis.v1.GetPerformanceAnomaliesReply - (*GetHotFunctionsReq)(nil), // 53: analysis.v1.GetHotFunctionsReq - (*GetHotFunctionsReply)(nil), // 54: analysis.v1.GetHotFunctionsReply - (*SearchFunctionsReq)(nil), // 55: analysis.v1.SearchFunctionsReq - (*SearchFunctionsReply)(nil), // 56: analysis.v1.SearchFunctionsReply - (*GetGidsByFunctionNameReply_Body)(nil), // 57: analysis.v1.GetGidsByFunctionNameReply.Body - (*AnalysisByGIDReply_TraceData)(nil), // 58: analysis.v1.AnalysisByGIDReply.TraceData - (*GetAllGIDsReply_Body)(nil), // 59: analysis.v1.GetAllGIDsReply.Body - (*GetTracesByParentFuncReply_TraceData)(nil), // 60: analysis.v1.GetTracesByParentFuncReply.TraceData - (*GetFunctionAnalysisReply_FunctionNode)(nil), // 61: analysis.v1.GetFunctionAnalysisReply.FunctionNode - (*GetUnfinishedFunctionsReply_UnfinishedFunction)(nil), // 62: analysis.v1.GetUnfinishedFunctionsReply.UnfinishedFunction - nil, // 63: analysis.v1.PerformanceAnomaly.DetailsEntry - (*GetHotFunctionsReply_HotFunction)(nil), // 64: analysis.v1.GetHotFunctionsReply.HotFunction - (*SearchFunctionsReply_FunctionInfo)(nil), // 65: analysis.v1.SearchFunctionsReply.FunctionInfo + (*VerifyProjectPathReq)(nil), // 0: analysis.v1.VerifyProjectPathReq + (*VerifyProjectPathReply)(nil), // 1: analysis.v1.VerifyProjectPathReply + (*GetGidsByFunctionNameReq)(nil), // 2: analysis.v1.GetGidsByFunctionNameReq + (*GetGidsByFunctionNameReply)(nil), // 3: analysis.v1.GetGidsByFunctionNameReply + (*GetAllFunctionNameReq)(nil), // 4: analysis.v1.GetAllFunctionNameReq + (*GetAllFunctionNameReply)(nil), // 5: analysis.v1.GetAllFunctionNameReply + (*GenerateImageReq)(nil), // 6: analysis.v1.GenerateImageReq + (*GenerateImageReply)(nil), // 7: analysis.v1.GenerateImageReply + (*AnalysisRequest)(nil), // 8: analysis.v1.AnalysisRequest + (*AnalysisReply)(nil), // 9: analysis.v1.AnalysisReply + (*AnalysisByGIDRequest)(nil), // 10: analysis.v1.AnalysisByGIDRequest + (*TraceParams)(nil), // 11: analysis.v1.TraceParams + (*AnalysisByGIDReply)(nil), // 12: analysis.v1.AnalysisByGIDReply + (*GetAllGIDsReq)(nil), // 13: analysis.v1.GetAllGIDsReq + (*GetAllGIDsReply)(nil), // 14: analysis.v1.GetAllGIDsReply + (*GetParamsByIDReq)(nil), // 15: analysis.v1.GetParamsByIDReq + (*GetParamsByIDReply)(nil), // 16: analysis.v1.GetParamsByIDReply + (*GraphNode)(nil), // 17: analysis.v1.GraphNode + (*GraphEdge)(nil), // 18: analysis.v1.GraphEdge + (*GetTraceGraphReq)(nil), // 19: analysis.v1.GetTraceGraphReq + (*GetTraceGraphReply)(nil), // 20: analysis.v1.GetTraceGraphReply + (*GetTracesByParentFuncReq)(nil), // 21: analysis.v1.GetTracesByParentFuncReq + (*GetTracesByParentFuncReply)(nil), // 22: analysis.v1.GetTracesByParentFuncReply + (*GetParentFunctionsReq)(nil), // 23: analysis.v1.GetParentFunctionsReq + (*FunctionNode)(nil), // 24: analysis.v1.FunctionNode + (*GetParentFunctionsReply)(nil), // 25: analysis.v1.GetParentFunctionsReply + (*GetChildFunctionsReq)(nil), // 26: analysis.v1.GetChildFunctionsReq + (*GetChildFunctionsReply)(nil), // 27: analysis.v1.GetChildFunctionsReply + (*GetGoroutineStatsReq)(nil), // 28: analysis.v1.GetGoroutineStatsReq + (*GetGoroutineStatsReply)(nil), // 29: analysis.v1.GetGoroutineStatsReply + (*GetFunctionAnalysisReq)(nil), // 30: analysis.v1.GetFunctionAnalysisReq + (*GetFunctionAnalysisReply)(nil), // 31: analysis.v1.GetFunctionAnalysisReply + (*AnalyzeProjectPathRequest)(nil), // 32: analysis.v1.AnalyzeProjectPathRequest + (*AnalyzeProjectPathResponse)(nil), // 33: analysis.v1.AnalyzeProjectPathResponse + (*AnalyzeDbFileRequest)(nil), // 34: analysis.v1.AnalyzeDbFileRequest + (*PackageDependency)(nil), // 35: analysis.v1.PackageDependency + (*HotFunction)(nil), // 36: analysis.v1.HotFunction + (*AnalyzeDbFileResponse)(nil), // 37: analysis.v1.AnalyzeDbFileResponse + (*InstrumentProjectReq)(nil), // 38: analysis.v1.InstrumentProjectReq + (*InstrumentProjectReply)(nil), // 39: analysis.v1.InstrumentProjectReply + (*GetTreeGraphReq)(nil), // 40: analysis.v1.GetTreeGraphReq + (*TreeNode)(nil), // 41: analysis.v1.TreeNode + (*GetTreeGraphReply)(nil), // 42: analysis.v1.GetTreeGraphReply + (*GetTreeGraphByGIDReq)(nil), // 43: analysis.v1.GetTreeGraphByGIDReq + (*GetTreeGraphByGIDReply)(nil), // 44: analysis.v1.GetTreeGraphByGIDReply + (*GetFunctionCallStatsReq)(nil), // 45: analysis.v1.GetFunctionCallStatsReq + (*FunctionCallStats)(nil), // 46: analysis.v1.FunctionCallStats + (*GetFunctionCallStatsReply)(nil), // 47: analysis.v1.GetFunctionCallStatsReply + (*GetPerformanceAnomaliesReq)(nil), // 48: analysis.v1.GetPerformanceAnomaliesReq + (*PerformanceAnomaly)(nil), // 49: analysis.v1.PerformanceAnomaly + (*GetPerformanceAnomaliesReply)(nil), // 50: analysis.v1.GetPerformanceAnomaliesReply + (*GetHotFunctionsReq)(nil), // 51: analysis.v1.GetHotFunctionsReq + (*GetHotFunctionsReply)(nil), // 52: analysis.v1.GetHotFunctionsReply + (*SearchFunctionsReq)(nil), // 53: analysis.v1.SearchFunctionsReq + (*SearchFunctionsReply)(nil), // 54: analysis.v1.SearchFunctionsReply + (*GetGidsByFunctionNameReply_Body)(nil), // 55: analysis.v1.GetGidsByFunctionNameReply.Body + (*AnalysisByGIDReply_TraceData)(nil), // 56: analysis.v1.AnalysisByGIDReply.TraceData + (*GetAllGIDsReply_Body)(nil), // 57: analysis.v1.GetAllGIDsReply.Body + (*GetTracesByParentFuncReply_TraceData)(nil), // 58: analysis.v1.GetTracesByParentFuncReply.TraceData + (*GetFunctionAnalysisReply_FunctionNode)(nil), // 59: analysis.v1.GetFunctionAnalysisReply.FunctionNode + nil, // 60: analysis.v1.PerformanceAnomaly.DetailsEntry + (*GetHotFunctionsReply_HotFunction)(nil), // 61: analysis.v1.GetHotFunctionsReply.HotFunction + (*SearchFunctionsReply_FunctionInfo)(nil), // 62: analysis.v1.SearchFunctionsReply.FunctionInfo } var file_analysis_v1_analysis_proto_depIdxs = []int32{ - 57, // 0: analysis.v1.GetGidsByFunctionNameReply.body:type_name -> analysis.v1.GetGidsByFunctionNameReply.Body - 58, // 1: analysis.v1.AnalysisByGIDReply.traceData:type_name -> analysis.v1.AnalysisByGIDReply.TraceData - 59, // 2: analysis.v1.GetAllGIDsReply.body:type_name -> analysis.v1.GetAllGIDsReply.Body + 55, // 0: analysis.v1.GetGidsByFunctionNameReply.body:type_name -> analysis.v1.GetGidsByFunctionNameReply.Body + 56, // 1: analysis.v1.AnalysisByGIDReply.traceData:type_name -> analysis.v1.AnalysisByGIDReply.TraceData + 57, // 2: analysis.v1.GetAllGIDsReply.body:type_name -> analysis.v1.GetAllGIDsReply.Body 11, // 3: analysis.v1.GetParamsByIDReply.params:type_name -> analysis.v1.TraceParams 17, // 4: analysis.v1.GetTraceGraphReply.nodes:type_name -> analysis.v1.GraphNode 18, // 5: analysis.v1.GetTraceGraphReply.edges:type_name -> analysis.v1.GraphEdge - 60, // 6: analysis.v1.GetTracesByParentFuncReply.traceData:type_name -> analysis.v1.GetTracesByParentFuncReply.TraceData + 58, // 6: analysis.v1.GetTracesByParentFuncReply.traceData:type_name -> analysis.v1.GetTracesByParentFuncReply.TraceData 24, // 7: analysis.v1.GetParentFunctionsReply.functions:type_name -> analysis.v1.FunctionNode 24, // 8: analysis.v1.GetChildFunctionsReply.functions:type_name -> analysis.v1.FunctionNode - 61, // 9: analysis.v1.GetFunctionAnalysisReply.callData:type_name -> analysis.v1.GetFunctionAnalysisReply.FunctionNode + 59, // 9: analysis.v1.GetFunctionAnalysisReply.callData:type_name -> analysis.v1.GetFunctionAnalysisReply.FunctionNode 35, // 10: analysis.v1.AnalyzeDbFileResponse.packageDependencies:type_name -> analysis.v1.PackageDependency 36, // 11: analysis.v1.AnalyzeDbFileResponse.hotFunctions:type_name -> analysis.v1.HotFunction - 62, // 12: analysis.v1.GetUnfinishedFunctionsReply.functions:type_name -> analysis.v1.GetUnfinishedFunctionsReply.UnfinishedFunction - 43, // 13: analysis.v1.TreeNode.children:type_name -> analysis.v1.TreeNode - 43, // 14: analysis.v1.GetTreeGraphReply.trees:type_name -> analysis.v1.TreeNode - 43, // 15: analysis.v1.GetTreeGraphByGIDReply.trees:type_name -> analysis.v1.TreeNode - 48, // 16: analysis.v1.GetFunctionCallStatsReply.stats:type_name -> analysis.v1.FunctionCallStats - 63, // 17: analysis.v1.PerformanceAnomaly.details:type_name -> analysis.v1.PerformanceAnomaly.DetailsEntry - 51, // 18: analysis.v1.GetPerformanceAnomaliesReply.anomalies:type_name -> analysis.v1.PerformanceAnomaly - 64, // 19: analysis.v1.GetHotFunctionsReply.functions:type_name -> analysis.v1.GetHotFunctionsReply.HotFunction - 65, // 20: analysis.v1.SearchFunctionsReply.functions:type_name -> analysis.v1.SearchFunctionsReply.FunctionInfo - 11, // 21: analysis.v1.AnalysisByGIDReply.TraceData.params:type_name -> analysis.v1.TraceParams - 11, // 22: analysis.v1.GetTracesByParentFuncReply.TraceData.params:type_name -> analysis.v1.TraceParams - 61, // 23: analysis.v1.GetFunctionAnalysisReply.FunctionNode.children:type_name -> analysis.v1.GetFunctionAnalysisReply.FunctionNode - 8, // 24: analysis.v1.Analysis.GetAnalysis:input_type -> analysis.v1.AnalysisRequest - 10, // 25: analysis.v1.Analysis.GetAnalysisByGID:input_type -> analysis.v1.AnalysisByGIDRequest - 13, // 26: analysis.v1.Analysis.GetAllGIDs:input_type -> analysis.v1.GetAllGIDsReq - 15, // 27: analysis.v1.Analysis.GetParamsByID:input_type -> analysis.v1.GetParamsByIDReq - 4, // 28: analysis.v1.Analysis.GetAllFunctionName:input_type -> analysis.v1.GetAllFunctionNameReq - 2, // 29: analysis.v1.Analysis.GetGidsByFunctionName:input_type -> analysis.v1.GetGidsByFunctionNameReq - 0, // 30: analysis.v1.Analysis.VerifyProjectPath:input_type -> analysis.v1.VerifyProjectPathReq - 21, // 31: analysis.v1.Analysis.GetTracesByParentFunc:input_type -> analysis.v1.GetTracesByParentFuncReq - 23, // 32: analysis.v1.Analysis.GetParentFunctions:input_type -> analysis.v1.GetParentFunctionsReq - 26, // 33: analysis.v1.Analysis.GetChildFunctions:input_type -> analysis.v1.GetChildFunctionsReq - 53, // 34: analysis.v1.Analysis.GetHotFunctions:input_type -> analysis.v1.GetHotFunctionsReq - 28, // 35: analysis.v1.Analysis.GetGoroutineStats:input_type -> analysis.v1.GetGoroutineStatsReq - 30, // 36: analysis.v1.Analysis.GetFunctionAnalysis:input_type -> analysis.v1.GetFunctionAnalysisReq - 38, // 37: analysis.v1.Analysis.InstrumentProject:input_type -> analysis.v1.InstrumentProjectReq - 40, // 38: analysis.v1.Analysis.GetUnfinishedFunctions:input_type -> analysis.v1.GetUnfinishedFunctionsReq - 42, // 39: analysis.v1.Analysis.GetTreeGraph:input_type -> analysis.v1.GetTreeGraphReq - 45, // 40: analysis.v1.Analysis.GetTreeGraphByGID:input_type -> analysis.v1.GetTreeGraphByGIDReq - 47, // 41: analysis.v1.Analysis.GetFunctionCallStats:input_type -> analysis.v1.GetFunctionCallStatsReq - 50, // 42: analysis.v1.Analysis.GetPerformanceAnomalies:input_type -> analysis.v1.GetPerformanceAnomaliesReq - 55, // 43: analysis.v1.Analysis.SearchFunctions:input_type -> analysis.v1.SearchFunctionsReq - 9, // 44: analysis.v1.Analysis.GetAnalysis:output_type -> analysis.v1.AnalysisReply - 12, // 45: analysis.v1.Analysis.GetAnalysisByGID:output_type -> analysis.v1.AnalysisByGIDReply - 14, // 46: analysis.v1.Analysis.GetAllGIDs:output_type -> analysis.v1.GetAllGIDsReply - 16, // 47: analysis.v1.Analysis.GetParamsByID:output_type -> analysis.v1.GetParamsByIDReply - 5, // 48: analysis.v1.Analysis.GetAllFunctionName:output_type -> analysis.v1.GetAllFunctionNameReply - 3, // 49: analysis.v1.Analysis.GetGidsByFunctionName:output_type -> analysis.v1.GetGidsByFunctionNameReply - 1, // 50: analysis.v1.Analysis.VerifyProjectPath:output_type -> analysis.v1.VerifyProjectPathReply - 22, // 51: analysis.v1.Analysis.GetTracesByParentFunc:output_type -> analysis.v1.GetTracesByParentFuncReply - 25, // 52: analysis.v1.Analysis.GetParentFunctions:output_type -> analysis.v1.GetParentFunctionsReply - 27, // 53: analysis.v1.Analysis.GetChildFunctions:output_type -> analysis.v1.GetChildFunctionsReply - 54, // 54: analysis.v1.Analysis.GetHotFunctions:output_type -> analysis.v1.GetHotFunctionsReply - 29, // 55: analysis.v1.Analysis.GetGoroutineStats:output_type -> analysis.v1.GetGoroutineStatsReply - 31, // 56: analysis.v1.Analysis.GetFunctionAnalysis:output_type -> analysis.v1.GetFunctionAnalysisReply - 39, // 57: analysis.v1.Analysis.InstrumentProject:output_type -> analysis.v1.InstrumentProjectReply - 41, // 58: analysis.v1.Analysis.GetUnfinishedFunctions:output_type -> analysis.v1.GetUnfinishedFunctionsReply - 44, // 59: analysis.v1.Analysis.GetTreeGraph:output_type -> analysis.v1.GetTreeGraphReply - 46, // 60: analysis.v1.Analysis.GetTreeGraphByGID:output_type -> analysis.v1.GetTreeGraphByGIDReply - 49, // 61: analysis.v1.Analysis.GetFunctionCallStats:output_type -> analysis.v1.GetFunctionCallStatsReply - 52, // 62: analysis.v1.Analysis.GetPerformanceAnomalies:output_type -> analysis.v1.GetPerformanceAnomaliesReply - 56, // 63: analysis.v1.Analysis.SearchFunctions:output_type -> analysis.v1.SearchFunctionsReply - 44, // [44:64] is the sub-list for method output_type - 24, // [24:44] is the sub-list for method input_type - 24, // [24:24] is the sub-list for extension type_name - 24, // [24:24] is the sub-list for extension extendee - 0, // [0:24] is the sub-list for field type_name + 41, // 12: analysis.v1.TreeNode.children:type_name -> analysis.v1.TreeNode + 41, // 13: analysis.v1.GetTreeGraphReply.trees:type_name -> analysis.v1.TreeNode + 41, // 14: analysis.v1.GetTreeGraphByGIDReply.trees:type_name -> analysis.v1.TreeNode + 46, // 15: analysis.v1.GetFunctionCallStatsReply.stats:type_name -> analysis.v1.FunctionCallStats + 60, // 16: analysis.v1.PerformanceAnomaly.details:type_name -> analysis.v1.PerformanceAnomaly.DetailsEntry + 49, // 17: analysis.v1.GetPerformanceAnomaliesReply.anomalies:type_name -> analysis.v1.PerformanceAnomaly + 61, // 18: analysis.v1.GetHotFunctionsReply.functions:type_name -> analysis.v1.GetHotFunctionsReply.HotFunction + 62, // 19: analysis.v1.SearchFunctionsReply.functions:type_name -> analysis.v1.SearchFunctionsReply.FunctionInfo + 11, // 20: analysis.v1.AnalysisByGIDReply.TraceData.params:type_name -> analysis.v1.TraceParams + 11, // 21: analysis.v1.GetTracesByParentFuncReply.TraceData.params:type_name -> analysis.v1.TraceParams + 59, // 22: analysis.v1.GetFunctionAnalysisReply.FunctionNode.children:type_name -> analysis.v1.GetFunctionAnalysisReply.FunctionNode + 8, // 23: analysis.v1.Analysis.GetAnalysis:input_type -> analysis.v1.AnalysisRequest + 10, // 24: analysis.v1.Analysis.GetAnalysisByGID:input_type -> analysis.v1.AnalysisByGIDRequest + 13, // 25: analysis.v1.Analysis.GetAllGIDs:input_type -> analysis.v1.GetAllGIDsReq + 15, // 26: analysis.v1.Analysis.GetParamsByID:input_type -> analysis.v1.GetParamsByIDReq + 4, // 27: analysis.v1.Analysis.GetAllFunctionName:input_type -> analysis.v1.GetAllFunctionNameReq + 2, // 28: analysis.v1.Analysis.GetGidsByFunctionName:input_type -> analysis.v1.GetGidsByFunctionNameReq + 0, // 29: analysis.v1.Analysis.VerifyProjectPath:input_type -> analysis.v1.VerifyProjectPathReq + 21, // 30: analysis.v1.Analysis.GetTracesByParentFunc:input_type -> analysis.v1.GetTracesByParentFuncReq + 23, // 31: analysis.v1.Analysis.GetParentFunctions:input_type -> analysis.v1.GetParentFunctionsReq + 26, // 32: analysis.v1.Analysis.GetChildFunctions:input_type -> analysis.v1.GetChildFunctionsReq + 51, // 33: analysis.v1.Analysis.GetHotFunctions:input_type -> analysis.v1.GetHotFunctionsReq + 28, // 34: analysis.v1.Analysis.GetGoroutineStats:input_type -> analysis.v1.GetGoroutineStatsReq + 30, // 35: analysis.v1.Analysis.GetFunctionAnalysis:input_type -> analysis.v1.GetFunctionAnalysisReq + 38, // 36: analysis.v1.Analysis.InstrumentProject:input_type -> analysis.v1.InstrumentProjectReq + 40, // 37: analysis.v1.Analysis.GetTreeGraph:input_type -> analysis.v1.GetTreeGraphReq + 43, // 38: analysis.v1.Analysis.GetTreeGraphByGID:input_type -> analysis.v1.GetTreeGraphByGIDReq + 45, // 39: analysis.v1.Analysis.GetFunctionCallStats:input_type -> analysis.v1.GetFunctionCallStatsReq + 48, // 40: analysis.v1.Analysis.GetPerformanceAnomalies:input_type -> analysis.v1.GetPerformanceAnomaliesReq + 53, // 41: analysis.v1.Analysis.SearchFunctions:input_type -> analysis.v1.SearchFunctionsReq + 9, // 42: analysis.v1.Analysis.GetAnalysis:output_type -> analysis.v1.AnalysisReply + 12, // 43: analysis.v1.Analysis.GetAnalysisByGID:output_type -> analysis.v1.AnalysisByGIDReply + 14, // 44: analysis.v1.Analysis.GetAllGIDs:output_type -> analysis.v1.GetAllGIDsReply + 16, // 45: analysis.v1.Analysis.GetParamsByID:output_type -> analysis.v1.GetParamsByIDReply + 5, // 46: analysis.v1.Analysis.GetAllFunctionName:output_type -> analysis.v1.GetAllFunctionNameReply + 3, // 47: analysis.v1.Analysis.GetGidsByFunctionName:output_type -> analysis.v1.GetGidsByFunctionNameReply + 1, // 48: analysis.v1.Analysis.VerifyProjectPath:output_type -> analysis.v1.VerifyProjectPathReply + 22, // 49: analysis.v1.Analysis.GetTracesByParentFunc:output_type -> analysis.v1.GetTracesByParentFuncReply + 25, // 50: analysis.v1.Analysis.GetParentFunctions:output_type -> analysis.v1.GetParentFunctionsReply + 27, // 51: analysis.v1.Analysis.GetChildFunctions:output_type -> analysis.v1.GetChildFunctionsReply + 52, // 52: analysis.v1.Analysis.GetHotFunctions:output_type -> analysis.v1.GetHotFunctionsReply + 29, // 53: analysis.v1.Analysis.GetGoroutineStats:output_type -> analysis.v1.GetGoroutineStatsReply + 31, // 54: analysis.v1.Analysis.GetFunctionAnalysis:output_type -> analysis.v1.GetFunctionAnalysisReply + 39, // 55: analysis.v1.Analysis.InstrumentProject:output_type -> analysis.v1.InstrumentProjectReply + 42, // 56: analysis.v1.Analysis.GetTreeGraph:output_type -> analysis.v1.GetTreeGraphReply + 44, // 57: analysis.v1.Analysis.GetTreeGraphByGID:output_type -> analysis.v1.GetTreeGraphByGIDReply + 47, // 58: analysis.v1.Analysis.GetFunctionCallStats:output_type -> analysis.v1.GetFunctionCallStatsReply + 50, // 59: analysis.v1.Analysis.GetPerformanceAnomalies:output_type -> analysis.v1.GetPerformanceAnomaliesReply + 54, // 60: analysis.v1.Analysis.SearchFunctions:output_type -> analysis.v1.SearchFunctionsReply + 42, // [42:61] is the sub-list for method output_type + 23, // [23:42] is the sub-list for method input_type + 23, // [23:23] is the sub-list for extension type_name + 23, // [23:23] is the sub-list for extension extendee + 0, // [0:23] is the sub-list for field type_name } func init() { file_analysis_v1_analysis_proto_init() } @@ -4631,7 +4113,7 @@ func file_analysis_v1_analysis_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_analysis_v1_analysis_proto_rawDesc), len(file_analysis_v1_analysis_proto_rawDesc)), NumEnums: 0, - NumMessages: 66, + NumMessages: 63, NumExtensions: 0, NumServices: 1, }, diff --git a/api/analysis/v1/analysis.pb.gw.go b/api/analysis/v1/analysis.pb.gw.go index bcefa0f..253d334 100644 --- a/api/analysis/v1/analysis.pb.gw.go +++ b/api/analysis/v1/analysis.pb.gw.go @@ -443,30 +443,6 @@ func local_request_Analysis_InstrumentProject_0(ctx context.Context, marshaler r return msg, metadata, err } -func request_Analysis_GetUnfinishedFunctions_0(ctx context.Context, marshaler runtime.Marshaler, client AnalysisClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq GetUnfinishedFunctionsReq - metadata runtime.ServerMetadata - ) - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := client.GetUnfinishedFunctions(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err -} - -func local_request_Analysis_GetUnfinishedFunctions_0(ctx context.Context, marshaler runtime.Marshaler, server AnalysisServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq GetUnfinishedFunctionsReq - metadata runtime.ServerMetadata - ) - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := server.GetUnfinishedFunctions(ctx, &protoReq) - return msg, metadata, err -} - func request_Analysis_GetTreeGraph_0(ctx context.Context, marshaler runtime.Marshaler, client AnalysisClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( protoReq GetTreeGraphReq @@ -873,26 +849,6 @@ func RegisterAnalysisHandlerServer(ctx context.Context, mux *runtime.ServeMux, s } forward_Analysis_InstrumentProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle(http.MethodPost, pattern_Analysis_GetUnfinishedFunctions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/analysis.v1.Analysis/GetUnfinishedFunctions", runtime.WithHTTPPathPattern("/api/runtime/unfinished-functions")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Analysis_GetUnfinishedFunctions_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_Analysis_GetUnfinishedFunctions_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle(http.MethodPost, pattern_Analysis_GetTreeGraph_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1271,23 +1227,6 @@ func RegisterAnalysisHandlerClient(ctx context.Context, mux *runtime.ServeMux, c } forward_Analysis_InstrumentProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle(http.MethodPost, pattern_Analysis_GetUnfinishedFunctions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/analysis.v1.Analysis/GetUnfinishedFunctions", runtime.WithHTTPPathPattern("/api/runtime/unfinished-functions")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Analysis_GetUnfinishedFunctions_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_Analysis_GetUnfinishedFunctions_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle(http.MethodPost, pattern_Analysis_GetTreeGraph_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1391,7 +1330,6 @@ var ( pattern_Analysis_GetGoroutineStats_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "runtime", "goroutine-stats"}, "")) pattern_Analysis_GetFunctionAnalysis_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "runtime", "function", "analysis"}, "")) pattern_Analysis_InstrumentProject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "runtime", "instrument"}, "")) - pattern_Analysis_GetUnfinishedFunctions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "runtime", "unfinished-functions"}, "")) pattern_Analysis_GetTreeGraph_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "runtime", "tree-graph"}, "")) pattern_Analysis_GetTreeGraphByGID_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "runtime", "tree-graph", "gid"}, "")) pattern_Analysis_GetFunctionCallStats_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "runtime", "function", "stats"}, "")) @@ -1414,7 +1352,6 @@ var ( forward_Analysis_GetGoroutineStats_0 = runtime.ForwardResponseMessage forward_Analysis_GetFunctionAnalysis_0 = runtime.ForwardResponseMessage forward_Analysis_InstrumentProject_0 = runtime.ForwardResponseMessage - forward_Analysis_GetUnfinishedFunctions_0 = runtime.ForwardResponseMessage forward_Analysis_GetTreeGraph_0 = runtime.ForwardResponseMessage forward_Analysis_GetTreeGraphByGID_0 = runtime.ForwardResponseMessage forward_Analysis_GetFunctionCallStats_0 = runtime.ForwardResponseMessage diff --git a/api/analysis/v1/analysis.proto b/api/analysis/v1/analysis.proto index f2fa784..986a0ac 100644 --- a/api/analysis/v1/analysis.proto +++ b/api/analysis/v1/analysis.proto @@ -113,13 +113,7 @@ service Analysis { }; } - // GetUnfinishedFunctions 获取未完成的函数列表 - rpc GetUnfinishedFunctions(GetUnfinishedFunctionsReq) returns (GetUnfinishedFunctionsReply) { - option (google.api.http) = { - post: "/api/runtime/unfinished-functions" - body: "*" - }; - } + // 获取运行时树状图数据 @@ -241,6 +235,7 @@ message TraceData { int32 paramCount = 6; string timeCost = 7; int64 parentId = 8; // 父函数ID + string seq = 9; // 序列号 } repeated TraceData traceData = 1; } @@ -315,6 +310,7 @@ message GetTracesByParentFuncReply { int32 paramCount = 6; string timeCost = 7; int64 parentId = 8; // 父函数ID + string seq = 9; // 序列号 } repeated TraceData traceData = 1; } @@ -333,6 +329,7 @@ message FunctionNode { string timeCost = 6; int32 paramCount= 7; int32 depth = 8; + string seq = 9; // 序列号 } message GetParentFunctionsReply { @@ -433,26 +430,7 @@ message InstrumentProjectReply { string message = 2; // 消息 } -// GetUnfinishedFunctions 请求 -message GetUnfinishedFunctionsReq { - string dbpath = 1; // 数据库路径 - int64 threshold = 2; // 阻塞时间阈值(毫秒) - int32 page = 3; // 当前页码 - int32 limit = 4; // 每页数量 -} - -// GetUnfinishedFunctions 响应 -message GetUnfinishedFunctionsReply { - message UnfinishedFunction { - string name = 1; // 函数名称 - uint64 gid = 2; // goroutine ID - string runningTime = 3; // 运行时间 - bool isBlocking = 4; // 是否阻塞 - int64 functionId = 5; // 函数ID - } - repeated UnfinishedFunction functions = 1; // 未完成函数列表 - int32 total = 2; // 总数 -} + // 获取树状图请求 message GetTreeGraphReq { diff --git a/api/analysis/v1/analysis_grpc.pb.go b/api/analysis/v1/analysis_grpc.pb.go index 285d007..e17e1f3 100644 --- a/api/analysis/v1/analysis_grpc.pb.go +++ b/api/analysis/v1/analysis_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v6.30.0--rc1 +// - protoc v6.31.1 // source: analysis/v1/analysis.proto package v1 @@ -33,7 +33,6 @@ const ( Analysis_GetGoroutineStats_FullMethodName = "/analysis.v1.Analysis/GetGoroutineStats" Analysis_GetFunctionAnalysis_FullMethodName = "/analysis.v1.Analysis/GetFunctionAnalysis" Analysis_InstrumentProject_FullMethodName = "/analysis.v1.Analysis/InstrumentProject" - Analysis_GetUnfinishedFunctions_FullMethodName = "/analysis.v1.Analysis/GetUnfinishedFunctions" Analysis_GetTreeGraph_FullMethodName = "/analysis.v1.Analysis/GetTreeGraph" Analysis_GetTreeGraphByGID_FullMethodName = "/analysis.v1.Analysis/GetTreeGraphByGID" Analysis_GetFunctionCallStats_FullMethodName = "/analysis.v1.Analysis/GetFunctionCallStats" @@ -70,8 +69,6 @@ type AnalysisClient interface { GetFunctionAnalysis(ctx context.Context, in *GetFunctionAnalysisReq, opts ...grpc.CallOption) (*GetFunctionAnalysisReply, error) // InstrumentProject 对项目进行插桩 InstrumentProject(ctx context.Context, in *InstrumentProjectReq, opts ...grpc.CallOption) (*InstrumentProjectReply, error) - // GetUnfinishedFunctions 获取未完成的函数列表 - GetUnfinishedFunctions(ctx context.Context, in *GetUnfinishedFunctionsReq, opts ...grpc.CallOption) (*GetUnfinishedFunctionsReply, error) // 获取运行时树状图数据 GetTreeGraph(ctx context.Context, in *GetTreeGraphReq, opts ...grpc.CallOption) (*GetTreeGraphReply, error) // 根据GID获取多棵树状图数据 @@ -232,16 +229,6 @@ func (c *analysisClient) InstrumentProject(ctx context.Context, in *InstrumentPr return out, nil } -func (c *analysisClient) GetUnfinishedFunctions(ctx context.Context, in *GetUnfinishedFunctionsReq, opts ...grpc.CallOption) (*GetUnfinishedFunctionsReply, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(GetUnfinishedFunctionsReply) - err := c.cc.Invoke(ctx, Analysis_GetUnfinishedFunctions_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *analysisClient) GetTreeGraph(ctx context.Context, in *GetTreeGraphReq, opts ...grpc.CallOption) (*GetTreeGraphReply, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetTreeGraphReply) @@ -321,8 +308,6 @@ type AnalysisServer interface { GetFunctionAnalysis(context.Context, *GetFunctionAnalysisReq) (*GetFunctionAnalysisReply, error) // InstrumentProject 对项目进行插桩 InstrumentProject(context.Context, *InstrumentProjectReq) (*InstrumentProjectReply, error) - // GetUnfinishedFunctions 获取未完成的函数列表 - GetUnfinishedFunctions(context.Context, *GetUnfinishedFunctionsReq) (*GetUnfinishedFunctionsReply, error) // 获取运行时树状图数据 GetTreeGraph(context.Context, *GetTreeGraphReq) (*GetTreeGraphReply, error) // 根据GID获取多棵树状图数据 @@ -385,9 +370,6 @@ func (UnimplementedAnalysisServer) GetFunctionAnalysis(context.Context, *GetFunc func (UnimplementedAnalysisServer) InstrumentProject(context.Context, *InstrumentProjectReq) (*InstrumentProjectReply, error) { return nil, status.Errorf(codes.Unimplemented, "method InstrumentProject not implemented") } -func (UnimplementedAnalysisServer) GetUnfinishedFunctions(context.Context, *GetUnfinishedFunctionsReq) (*GetUnfinishedFunctionsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetUnfinishedFunctions not implemented") -} func (UnimplementedAnalysisServer) GetTreeGraph(context.Context, *GetTreeGraphReq) (*GetTreeGraphReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTreeGraph not implemented") } @@ -676,24 +658,6 @@ func _Analysis_InstrumentProject_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } -func _Analysis_GetUnfinishedFunctions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetUnfinishedFunctionsReq) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AnalysisServer).GetUnfinishedFunctions(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Analysis_GetUnfinishedFunctions_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AnalysisServer).GetUnfinishedFunctions(ctx, req.(*GetUnfinishedFunctionsReq)) - } - return interceptor(ctx, in, info, handler) -} - func _Analysis_GetTreeGraph_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetTreeGraphReq) if err := dec(in); err != nil { @@ -847,10 +811,6 @@ var Analysis_ServiceDesc = grpc.ServiceDesc{ MethodName: "InstrumentProject", Handler: _Analysis_InstrumentProject_Handler, }, - { - MethodName: "GetUnfinishedFunctions", - Handler: _Analysis_GetUnfinishedFunctions_Handler, - }, { MethodName: "GetTreeGraph", Handler: _Analysis_GetTreeGraph_Handler, diff --git a/api/analysis/v1/error_reason.pb.go b/api/analysis/v1/error_reason.pb.go index ae886a9..fe5cb71 100644 --- a/api/analysis/v1/error_reason.pb.go +++ b/api/analysis/v1/error_reason.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 -// protoc v6.30.0--rc1 +// protoc-gen-go v1.36.6 +// protoc v6.31.1 // source: analysis/v1/error_reason.proto package v1 @@ -69,19 +69,12 @@ func (ErrorReason) EnumDescriptor() ([]byte, []int) { var File_analysis_v1_error_reason_proto protoreflect.FileDescriptor -var file_analysis_v1_error_reason_proto_rawDesc = string([]byte{ - 0x0a, 0x1e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x0b, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2a, 0x3a, 0x0a, - 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, - 0x47, 0x52, 0x45, 0x45, 0x54, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4e, 0x4f, - 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x01, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x2f, - 0x67, 0x6f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, - 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, -}) +const file_analysis_v1_error_reason_proto_rawDesc = "" + + "\n" + + "\x1eanalysis/v1/error_reason.proto\x12\vanalysis.v1*:\n" + + "\vErrorReason\x12\x17\n" + + "\x13GREETER_UNSPECIFIED\x10\x00\x12\x12\n" + + "\x0eUSER_NOT_FOUND\x10\x01B2Z0github.com/toheart/goanalysis/api/analysis/v1;v1b\x06proto3" var ( file_analysis_v1_error_reason_proto_rawDescOnce sync.Once diff --git a/api/filemanager/v1/filemanager.pb.go b/api/filemanager/v1/filemanager.pb.go index 9354987..4f43aad 100644 --- a/api/filemanager/v1/filemanager.pb.go +++ b/api/filemanager/v1/filemanager.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 -// protoc v6.30.0--rc1 +// protoc-gen-go v1.36.6 +// protoc v6.31.1 // source: filemanager/v1/filemanager.proto package v1 @@ -596,103 +596,52 @@ func (x *FileInfo) GetFilePath() string { var File_filemanager_v1_filemanager_proto protoreflect.FileDescriptor -var file_filemanager_v1_filemanager_proto_rawDesc = string([]byte{ - 0x0a, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2f, 0x76, 0x31, - 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x12, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0x24, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x48, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x08, 0x66, 0x69, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x22, 0x76, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x56, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x22, 0x23, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, - 0x69, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x22, 0x25, 0x0a, 0x13, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x73, 0x0a, 0x11, 0x44, 0x6f, 0x77, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, - 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x88, - 0x02, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x75, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, - 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x2a, 0x52, 0x0a, 0x08, 0x46, 0x69, 0x6c, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x15, 0x0a, 0x11, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x55, - 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x49, 0x4c, 0x45, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x49, 0x43, 0x10, 0x02, 0x32, 0xc3, 0x03, - 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x6c, 0x0a, - 0x0b, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x61, 0x0a, 0x09, 0x4c, - 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x69, - 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x21, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x2a, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, - 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x78, 0x0a, 0x0c, 0x44, 0x6f, 0x77, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x74, 0x6f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x2f, 0x67, 0x6f, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, -}) +const file_filemanager_v1_filemanager_proto_rawDesc = "" + + "\n" + + " filemanager/v1/filemanager.proto\x12\x0efilemanager.v1\x1a\x1cgoogle/api/annotations.proto\"$\n" + + "\x12GetFileInfoRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\x03R\x02id\"H\n" + + "\x10GetFileInfoReply\x124\n" + + "\bfileInfo\x18\x01 \x01(\v2\x18.filemanager.v1.FileInfoR\bfileInfo\"v\n" + + "\x10ListFilesRequest\x124\n" + + "\bfileType\x18\x01 \x01(\x0e2\x18.filemanager.v1.FileTypeR\bfileType\x12\x14\n" + + "\x05limit\x18\x02 \x01(\x05R\x05limit\x12\x16\n" + + "\x06offset\x18\x03 \x01(\x05R\x06offset\"V\n" + + "\x0eListFilesReply\x12.\n" + + "\x05files\x18\x01 \x03(\v2\x18.filemanager.v1.FileInfoR\x05files\x12\x14\n" + + "\x05total\x18\x02 \x01(\x03R\x05total\"#\n" + + "\x11DeleteFileRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\x03R\x02id\"+\n" + + "\x0fDeleteFileReply\x12\x18\n" + + "\asuccess\x18\x01 \x01(\bR\asuccess\"%\n" + + "\x13DownloadFileRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\x03R\x02id\"s\n" + + "\x11DownloadFileReply\x12 \n" + + "\vfileContent\x18\x01 \x01(\tR\vfileContent\x12\x1a\n" + + "\bfileName\x18\x02 \x01(\tR\bfileName\x12 \n" + + "\vcontentType\x18\x03 \x01(\tR\vcontentType\"\x88\x02\n" + + "\bFileInfo\x12\x0e\n" + + "\x02id\x18\x01 \x01(\x03R\x02id\x12\x1a\n" + + "\bfileName\x18\x02 \x01(\tR\bfileName\x124\n" + + "\bfileType\x18\x03 \x01(\x0e2\x18.filemanager.v1.FileTypeR\bfileType\x12\x1a\n" + + "\bfileSize\x18\x04 \x01(\x03R\bfileSize\x12 \n" + + "\vcontentType\x18\x05 \x01(\tR\vcontentType\x12\x1e\n" + + "\n" + + "uploadTime\x18\x06 \x01(\tR\n" + + "uploadTime\x12 \n" + + "\vdescription\x18\a \x01(\tR\vdescription\x12\x1a\n" + + "\bfilePath\x18\b \x01(\tR\bfilePath*R\n" + + "\bFileType\x12\x19\n" + + "\x15FILE_TYPE_UNSPECIFIED\x10\x00\x12\x15\n" + + "\x11FILE_TYPE_RUNTIME\x10\x01\x12\x14\n" + + "\x10FILE_TYPE_STATIC\x10\x022\xc3\x03\n" + + "\vFileManager\x12l\n" + + "\vGetFileInfo\x12\".filemanager.v1.GetFileInfoRequest\x1a .filemanager.v1.GetFileInfoReply\"\x17\x82\xd3\xe4\x93\x02\x11\x12\x0f/api/files/{id}\x12a\n" + + "\tListFiles\x12 .filemanager.v1.ListFilesRequest\x1a\x1e.filemanager.v1.ListFilesReply\"\x12\x82\xd3\xe4\x93\x02\f\x12\n" + + "/api/files\x12i\n" + + "\n" + + "DeleteFile\x12!.filemanager.v1.DeleteFileRequest\x1a\x1f.filemanager.v1.DeleteFileReply\"\x17\x82\xd3\xe4\x93\x02\x11*\x0f/api/files/{id}\x12x\n" + + "\fDownloadFile\x12#.filemanager.v1.DownloadFileRequest\x1a!.filemanager.v1.DownloadFileReply\" \x82\xd3\xe4\x93\x02\x1a\x12\x18/api/files/{id}/downloadB5Z3github.com/toheart/goanalysis/api/filemanager/v1;v1b\x06proto3" var ( file_filemanager_v1_filemanager_proto_rawDescOnce sync.Once diff --git a/api/filemanager/v1/filemanager_grpc.pb.go b/api/filemanager/v1/filemanager_grpc.pb.go index b964e73..51d1e1d 100644 --- a/api/filemanager/v1/filemanager_grpc.pb.go +++ b/api/filemanager/v1/filemanager_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v6.30.0--rc1 +// - protoc v6.31.1 // source: filemanager/v1/filemanager.proto package v1 diff --git a/api/staticanalysis/v1/staticanalysis.pb.go b/api/staticanalysis/v1/staticanalysis.pb.go index dec8d20..efbdfd8 100644 --- a/api/staticanalysis/v1/staticanalysis.pb.go +++ b/api/staticanalysis/v1/staticanalysis.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 -// protoc v6.30.0--rc1 +// protoc-gen-go v1.36.6 +// protoc v6.31.1 // source: staticanalysis/v1/staticanalysis.proto package v1 @@ -852,9 +852,9 @@ func (x *GetFunctionAnalysisReply) GetCallData() []*GetFunctionAnalysisReply_Fun // 获取函数调用关系图的请求 type GetFunctionCallGraphReq struct { state protoimpl.MessageState `protogen:"open.v1"` - FunctionName string `protobuf:"bytes,1,opt,name=function_name,json=functionName,proto3" json:"function_name,omitempty"` // 函数名称 - Depth int32 `protobuf:"varint,2,opt,name=depth,proto3" json:"depth,omitempty"` // 调用深度,默认为2 - Direction string `protobuf:"bytes,3,opt,name=direction,proto3" json:"direction,omitempty"` // 方向: "caller"(调用者), "callee"(被调用), "both"(双向) + FunctionKey string `protobuf:"bytes,1,opt,name=function_key,json=functionKey,proto3" json:"function_key,omitempty"` // 函数唯一标识符(短格式key) + Depth int32 `protobuf:"varint,2,opt,name=depth,proto3" json:"depth,omitempty"` // 调用深度,默认为2 + Direction string `protobuf:"bytes,3,opt,name=direction,proto3" json:"direction,omitempty"` // 方向: "caller"(调用者), "callee"(被调用), "both"(双向) unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -889,9 +889,9 @@ func (*GetFunctionCallGraphReq) Descriptor() ([]byte, []int) { return file_staticanalysis_v1_staticanalysis_proto_rawDescGZIP(), []int{15} } -func (x *GetFunctionCallGraphReq) GetFunctionName() string { +func (x *GetFunctionCallGraphReq) GetFunctionKey() string { if x != nil { - return x.FunctionName + return x.FunctionKey } return "" } @@ -1721,11 +1721,13 @@ func (x *SearchFunctionsResponse) GetFunctions() []*FunctionInfo { // 获取函数上游调用关系请求 type GetFunctionUpstreamRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - DbPath string `protobuf:"bytes,1,opt,name=db_path,json=dbPath,proto3" json:"db_path,omitempty"` // 数据库路径 - FunctionKey string `protobuf:"bytes,2,opt,name=function_key,json=functionKey,proto3" json:"function_key,omitempty"` // 函数唯一标识 - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + DbPath string `protobuf:"bytes,1,opt,name=db_path,json=dbPath,proto3" json:"db_path,omitempty"` // 数据库路径 + FunctionKey string `protobuf:"bytes,2,opt,name=function_key,json=functionKey,proto3" json:"function_key,omitempty"` // 函数唯一标识符(短格式key) + FunctionPackage string `protobuf:"bytes,3,opt,name=function_package,json=functionPackage,proto3" json:"function_package,omitempty"` // 函数包名 + Depth int32 `protobuf:"varint,4,opt,name=depth,proto3" json:"depth,omitempty"` // 查询深度,默认为2 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetFunctionUpstreamRequest) Reset() { @@ -1772,10 +1774,24 @@ func (x *GetFunctionUpstreamRequest) GetFunctionKey() string { return "" } +func (x *GetFunctionUpstreamRequest) GetFunctionPackage() string { + if x != nil { + return x.FunctionPackage + } + return "" +} + +func (x *GetFunctionUpstreamRequest) GetDepth() int32 { + if x != nil { + return x.Depth + } + return 0 +} + // 图节点 type GraphNode struct { state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // 节点ID + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // 函数唯一标识符(短格式key) Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // 函数名称 Package string `protobuf:"bytes,3,opt,name=package,proto3" json:"package,omitempty"` // 包名 CallCount int32 `protobuf:"varint,4,opt,name=call_count,json=callCount,proto3" json:"call_count,omitempty"` // 调用次数 @@ -1813,9 +1829,9 @@ func (*GraphNode) Descriptor() ([]byte, []int) { return file_staticanalysis_v1_staticanalysis_proto_rawDescGZIP(), []int{30} } -func (x *GraphNode) GetId() string { +func (x *GraphNode) GetKey() string { if x != nil { - return x.Id + return x.Key } return "" } @@ -1844,8 +1860,8 @@ func (x *GraphNode) GetCallCount() int32 { // 图边 type GraphEdge struct { state protoimpl.MessageState `protogen:"open.v1"` - Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` // 源节点ID - Target string `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` // 目标节点ID + Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` // 源节点Key + Target string `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` // 目标节点Key Value int32 `protobuf:"varint,3,opt,name=value,proto3" json:"value,omitempty"` // 边权重 unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -1957,11 +1973,13 @@ func (x *GetFunctionUpstreamResponse) GetEdges() []*GraphEdge { // 获取函数下游调用关系请求 type GetFunctionDownstreamRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - DbPath string `protobuf:"bytes,1,opt,name=db_path,json=dbPath,proto3" json:"db_path,omitempty"` // 数据库路径 - FunctionKey string `protobuf:"bytes,2,opt,name=function_key,json=functionKey,proto3" json:"function_key,omitempty"` // 函数唯一标识 - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + DbPath string `protobuf:"bytes,1,opt,name=db_path,json=dbPath,proto3" json:"db_path,omitempty"` // 数据库路径 + FunctionKey string `protobuf:"bytes,2,opt,name=function_key,json=functionKey,proto3" json:"function_key,omitempty"` // 函数唯一标识符(短格式key) + FunctionPackage string `protobuf:"bytes,3,opt,name=function_package,json=functionPackage,proto3" json:"function_package,omitempty"` // 函数包名 + Depth int32 `protobuf:"varint,4,opt,name=depth,proto3" json:"depth,omitempty"` // 查询深度,默认为2 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetFunctionDownstreamRequest) Reset() { @@ -2008,6 +2026,20 @@ func (x *GetFunctionDownstreamRequest) GetFunctionKey() string { return "" } +func (x *GetFunctionDownstreamRequest) GetFunctionPackage() string { + if x != nil { + return x.FunctionPackage + } + return "" +} + +func (x *GetFunctionDownstreamRequest) GetDepth() int32 { + if x != nil { + return x.Depth + } + return 0 +} + // 获取函数下游调用关系响应 type GetFunctionDownstreamResponse struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -2065,7 +2097,7 @@ func (x *GetFunctionDownstreamResponse) GetEdges() []*GraphEdge { type GetFunctionFullChainRequest struct { state protoimpl.MessageState `protogen:"open.v1"` DbPath string `protobuf:"bytes,1,opt,name=db_path,json=dbPath,proto3" json:"db_path,omitempty"` // 数据库路径 - FunctionKey string `protobuf:"bytes,2,opt,name=function_key,json=functionKey,proto3" json:"function_key,omitempty"` // 函数唯一标识 + FunctionKey string `protobuf:"bytes,2,opt,name=function_key,json=functionKey,proto3" json:"function_key,omitempty"` // 函数唯一标识符(短格式key) unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -2170,8 +2202,8 @@ func (x *GetFunctionFullChainResponse) GetEdges() []*GraphEdge { // 获取树状图请求 type GetTreeGraphReq struct { state protoimpl.MessageState `protogen:"open.v1"` - DbPath string `protobuf:"bytes,1,opt,name=db_path,json=dbPath,proto3" json:"db_path,omitempty"` // 数据库路径 - FunctionName string `protobuf:"bytes,2,opt,name=function_name,json=functionName,proto3" json:"function_name,omitempty"` // 函数名称 + DbPath string `protobuf:"bytes,1,opt,name=db_path,json=dbPath,proto3" json:"db_path,omitempty"` // 数据库路径 + FunctionKey string `protobuf:"bytes,2,opt,name=function_key,json=functionKey,proto3" json:"function_key,omitempty"` // 函数唯一标识符(短格式key) unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -2213,9 +2245,9 @@ func (x *GetTreeGraphReq) GetDbPath() string { return "" } -func (x *GetTreeGraphReq) GetFunctionName() string { +func (x *GetTreeGraphReq) GetFunctionKey() string { if x != nil { - return x.FunctionName + return x.FunctionKey } return "" } @@ -2496,7 +2528,7 @@ func (x *GetFunctionAnalysisReply_FunctionNode) GetChildren() []*GetFunctionAnal type GetFunctionCallGraphReply_GraphNode struct { state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // 节点ID + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // 函数唯一标识符(短格式key) Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // 函数名称 Package string `protobuf:"bytes,3,opt,name=package,proto3" json:"package,omitempty"` // 包名 CallCount int32 `protobuf:"varint,4,opt,name=call_count,json=callCount,proto3" json:"call_count,omitempty"` // 调用次数 @@ -2536,9 +2568,9 @@ func (*GetFunctionCallGraphReply_GraphNode) Descriptor() ([]byte, []int) { return file_staticanalysis_v1_staticanalysis_proto_rawDescGZIP(), []int{16, 0} } -func (x *GetFunctionCallGraphReply_GraphNode) GetId() string { +func (x *GetFunctionCallGraphReply_GraphNode) GetKey() string { if x != nil { - return x.Id + return x.Key } return "" } @@ -2580,8 +2612,8 @@ func (x *GetFunctionCallGraphReply_GraphNode) GetNodeType() string { type GetFunctionCallGraphReply_GraphEdge struct { state protoimpl.MessageState `protogen:"open.v1"` - Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` // 源节点ID - Target string `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` // 目标节点ID + Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` // 源节点Key + Target string `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` // 目标节点Key Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"` // 边标签 EdgeType string `protobuf:"bytes,4,opt,name=edge_type,json=edgeType,proto3" json:"edge_type,omitempty"` // 边类型: "caller_to_root", "root_to_callee" unknownFields protoimpl.UnknownFields @@ -2648,490 +2680,214 @@ func (x *GetFunctionCallGraphReply_GraphEdge) GetEdgeType() string { var File_staticanalysis_v1_staticanalysis_proto protoreflect.FileDescriptor -var file_staticanalysis_v1_staticanalysis_proto_rawDesc = string([]byte{ - 0x0a, 0x26, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, - 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, - 0x69, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x44, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x69, 0x0a, 0x0a, 0x44, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, - 0x4f, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x44, 0x62, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x66, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x62, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x22, 0x68, 0x0a, 0x19, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x6c, 0x67, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x61, 0x6c, 0x67, 0x6f, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x69, 0x0a, 0x1a, 0x41, 0x6e, - 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x6d, - 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x61, 0x73, - 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x0a, - 0x14, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x44, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, 0x22, 0x59, - 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x6e, 0x63, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x6c, 0x0a, 0x0b, 0x48, 0x6f, 0x74, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6c, 0x6c, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x61, - 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa6, 0x02, 0x0a, 0x15, 0x41, 0x6e, 0x61, 0x6c, - 0x79, 0x7a, 0x65, 0x44, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x73, 0x12, 0x57, 0x0a, 0x14, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x65, - 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x65, - 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x13, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, - 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x68, - 0x6f, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, - 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0c, 0x68, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x2d, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x62, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x72, 0x74, 0x42, 0x79, 0x22, - 0x80, 0x02, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x51, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x94, 0x01, 0x0a, 0x0b, - 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6c, - 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, - 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x76, 0x67, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x76, 0x67, 0x54, 0x69, - 0x6d, 0x65, 0x22, 0x64, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65, 0x71, 0x12, 0x22, 0x0a, 0x0c, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xcf, 0x02, 0x0a, 0x18, 0x47, 0x65, 0x74, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x54, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x44, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x1a, 0xdc, 0x01, 0x0a, 0x0c, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, - 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, - 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x76, 0x67, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x76, 0x67, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, - 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x72, 0x0a, 0x17, 0x47, 0x65, - 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x52, 0x65, 0x71, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, - 0x70, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, 0x70, 0x74, 0x68, - 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xca, - 0x03, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, - 0x6c, 0x6c, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4c, 0x0a, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x05, 0x65, 0x64, - 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x64, 0x67, - 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x1a, 0xa0, 0x01, 0x0a, 0x09, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x76, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x76, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x6e, 0x0a, 0x09, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x45, 0x64, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1b, - 0x0a, 0x09, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x64, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xae, 0x02, 0x0a, 0x10, - 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x17, 0x0a, 0x07, 0x77, 0x65, - 0x62, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x77, 0x65, 0x62, - 0x55, 0x72, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x73, 0x68, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x68, 0x74, 0x74, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x69, 0x73, - 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x6c, 0x61, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x1f, 0x0a, 0x1d, - 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x69, 0x0a, - 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x47, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, - 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x51, 0x0a, 0x1c, 0x43, 0x6c, 0x6f, 0x6e, - 0x65, 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6f, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6f, - 0x55, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x72, 0x0a, 0x1d, 0x43, - 0x6c, 0x6f, 0x6e, 0x65, 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x69, 0x72, 0x22, - 0x69, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, - 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd0, 0x01, 0x0a, 0x1e, 0x47, - 0x65, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, - 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, - 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x62, 0x0a, - 0x16, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, - 0x70, 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, - 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0x6d, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x47, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x50, - 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x58, 0x0a, 0x17, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x58, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x22, 0x68, 0x0a, - 0x09, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6c, 0x6c, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x61, - 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x51, 0x0a, 0x09, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x45, 0x64, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x1b, 0x47, - 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x32, - 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, - 0x65, 0x73, 0x22, 0x5a, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x22, 0x87, - 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, - 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x32, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, - 0x6f, 0x64, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x64, 0x67, - 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0x59, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x75, 0x6c, 0x6c, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4b, 0x65, 0x79, 0x22, 0x86, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x46, 0x75, 0x6c, 0x6c, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x12, - 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x8b, 0x01, - 0x0a, 0x08, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, - 0x65, 0x64, 0x12, 0x37, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x44, 0x0a, 0x11, 0x47, - 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x2f, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6f, - 0x74, 0x32, 0xcc, 0x12, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x41, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x63, 0x44, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x44, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, - 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x69, 0x63, 0x44, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2f, 0x64, 0x62, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0xa5, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, - 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x2e, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x63, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x2f, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x12, 0x41, 0x6e, 0x61, 0x6c, - 0x79, 0x7a, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2c, - 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, - 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x63, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x2f, 0x70, 0x61, 0x74, 0x68, - 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x44, 0x62, 0x46, 0x69, - 0x6c, 0x65, 0x12, 0x27, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, - 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x44, 0x62, - 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x44, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, - 0x22, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2f, 0x61, 0x6e, - 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x12, 0x29, 0x2e, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x2b, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, - 0x22, 0x1d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2f, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x12, - 0xc5, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x61, 0x6c, 0x6c, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x2a, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x52, 0x65, 0x71, 0x1a, 0x2c, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x53, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4d, 0x5a, 0x1f, 0x62, 0x01, 0x2a, 0x12, - 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2f, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x12, 0x2a, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x12, 0xa6, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, - 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x30, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, - 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x4c, 0x61, - 0x62, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, - 0x4c, 0x61, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, - 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2f, 0x67, 0x69, 0x74, - 0x6c, 0x61, 0x62, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, - 0x12, 0x9f, 0x01, 0x0a, 0x15, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2f, 0x2e, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6c, 0x6f, 0x6e, 0x65, 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x63, 0x2f, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2f, 0x63, 0x6c, 0x6f, - 0x6e, 0x65, 0x12, 0xaa, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x30, 0x2e, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x65, - 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x31, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, - 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x2d, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, - 0x8e, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x74, 0x46, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, - 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x63, 0x2f, 0x68, 0x6f, 0x74, 0x2d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x91, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2a, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x63, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9e, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x2d, 0x2e, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x63, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x75, 0x70, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0xa6, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, - 0x2f, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x30, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2d, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0xa2, - 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x75, - 0x6c, 0x6c, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x2e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x75, 0x6c, 0x6c, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x75, 0x6c, 0x6c, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, - 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x66, 0x75, 0x6c, 0x6c, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x12, 0x7b, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x12, 0x22, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, - 0x72, 0x65, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x21, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x63, 0x2f, 0x74, 0x72, 0x65, 0x65, 0x2d, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x42, 0x38, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, - 0x6f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x2f, 0x67, 0x6f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, - 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x73, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, -}) +const file_staticanalysis_v1_staticanalysis_proto_rawDesc = "" + + "\n" + + "&staticanalysis/v1/staticanalysis.proto\x12\x11staticanalysis.v1\x1a\x1cgoogle/api/annotations.proto\"\x19\n" + + "\x17GetStaticDbFilesRequest\"i\n" + + "\n" + + "DbFileInfo\x12\x12\n" + + "\x04path\x18\x01 \x01(\tR\x04path\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x12\n" + + "\x04size\x18\x03 \x01(\x03R\x04size\x12\x1f\n" + + "\vcreate_time\x18\x04 \x01(\tR\n" + + "createTime\"O\n" + + "\x18GetStaticDbFilesResponse\x123\n" + + "\x05files\x18\x01 \x03(\v2\x1d.staticanalysis.v1.DbFileInfoR\x05files\"h\n" + + "\x19AnalyzeProjectPathRequest\x12\x12\n" + + "\x04path\x18\x01 \x01(\tR\x04path\x12\x12\n" + + "\x04algo\x18\x02 \x01(\tR\x04algo\x12#\n" + + "\rignore_method\x18\x03 \x01(\tR\fignoreMethod\"i\n" + + "\x1aAnalyzeProjectPathResponse\x12\x18\n" + + "\asuccess\x18\x01 \x01(\bR\asuccess\x12\x18\n" + + "\amessage\x18\x02 \x01(\tR\amessage\x12\x17\n" + + "\atask_id\x18\x03 \x01(\tR\x06taskId\"7\n" + + "\x1cGetAnalysisTaskStatusRequest\x12\x17\n" + + "\atask_id\x18\x01 \x01(\tR\x06taskId\"m\n" + + "\x1dGetAnalysisTaskStatusResponse\x12\x16\n" + + "\x06status\x18\x01 \x01(\x05R\x06status\x12\x18\n" + + "\amessage\x18\x02 \x01(\tR\amessage\x12\x1a\n" + + "\bprogress\x18\x03 \x01(\x02R\bprogress\"/\n" + + "\x14AnalyzeDbFileRequest\x12\x17\n" + + "\adb_path\x18\x01 \x01(\tR\x06dbPath\"Y\n" + + "\x11PackageDependency\x12\x16\n" + + "\x06source\x18\x01 \x01(\tR\x06source\x12\x16\n" + + "\x06target\x18\x02 \x01(\tR\x06target\x12\x14\n" + + "\x05count\x18\x03 \x01(\x05R\x05count\"l\n" + + "\vHotFunction\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x18\n" + + "\apackage\x18\x03 \x01(\tR\apackage\x12\x1d\n" + + "\n" + + "call_count\x18\x04 \x01(\x05R\tcallCount\"\xa6\x02\n" + + "\x15AnalyzeDbFileResponse\x12'\n" + + "\x0ftotal_functions\x18\x01 \x01(\x05R\x0etotalFunctions\x12\x1f\n" + + "\vtotal_calls\x18\x02 \x01(\x05R\n" + + "totalCalls\x12%\n" + + "\x0etotal_packages\x18\x03 \x01(\x05R\rtotalPackages\x12W\n" + + "\x14package_dependencies\x18\x04 \x03(\v2$.staticanalysis.v1.PackageDependencyR\x13packageDependencies\x12C\n" + + "\rhot_functions\x18\x05 \x03(\v2\x1e.staticanalysis.v1.HotFunctionR\fhotFunctions\"-\n" + + "\x12GetHotFunctionsReq\x12\x17\n" + + "\asort_by\x18\x01 \x01(\tR\x06sortBy\"\x80\x02\n" + + "\x14GetHotFunctionsReply\x12Q\n" + + "\tfunctions\x18\x01 \x03(\v23.staticanalysis.v1.GetHotFunctionsReply.HotFunctionR\tfunctions\x1a\x94\x01\n" + + "\vHotFunction\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n" + + "\apackage\x18\x02 \x01(\tR\apackage\x12\x1d\n" + + "\n" + + "call_count\x18\x03 \x01(\x05R\tcallCount\x12\x1d\n" + + "\n" + + "total_time\x18\x04 \x01(\tR\ttotalTime\x12\x19\n" + + "\bavg_time\x18\x05 \x01(\tR\aavgTime\"d\n" + + "\x16GetFunctionAnalysisReq\x12\"\n" + + "\ffunctionName\x18\x01 \x01(\tR\ffunctionName\x12\x12\n" + + "\x04type\x18\x02 \x01(\tR\x04type\x12\x12\n" + + "\x04path\x18\x03 \x01(\tR\x04path\"\xcf\x02\n" + + "\x18GetFunctionAnalysisReply\x12T\n" + + "\bcallData\x18\x01 \x03(\v28.staticanalysis.v1.GetFunctionAnalysisReply.FunctionNodeR\bcallData\x1a\xdc\x01\n" + + "\fFunctionNode\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x18\n" + + "\apackage\x18\x03 \x01(\tR\apackage\x12\x1d\n" + + "\n" + + "call_count\x18\x04 \x01(\x05R\tcallCount\x12\x19\n" + + "\bavg_time\x18\x05 \x01(\tR\aavgTime\x12T\n" + + "\bchildren\x18\x06 \x03(\v28.staticanalysis.v1.GetFunctionAnalysisReply.FunctionNodeR\bchildren\"p\n" + + "\x17GetFunctionCallGraphReq\x12!\n" + + "\ffunction_key\x18\x01 \x01(\tR\vfunctionKey\x12\x14\n" + + "\x05depth\x18\x02 \x01(\x05R\x05depth\x12\x1c\n" + + "\tdirection\x18\x03 \x01(\tR\tdirection\"\xcc\x03\n" + + "\x19GetFunctionCallGraphReply\x12L\n" + + "\x05nodes\x18\x01 \x03(\v26.staticanalysis.v1.GetFunctionCallGraphReply.GraphNodeR\x05nodes\x12L\n" + + "\x05edges\x18\x02 \x03(\v26.staticanalysis.v1.GetFunctionCallGraphReply.GraphEdgeR\x05edges\x1a\xa2\x01\n" + + "\tGraphNode\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x18\n" + + "\apackage\x18\x03 \x01(\tR\apackage\x12\x1d\n" + + "\n" + + "call_count\x18\x04 \x01(\x05R\tcallCount\x12\x19\n" + + "\bavg_time\x18\x05 \x01(\tR\aavgTime\x12\x1b\n" + + "\tnode_type\x18\x06 \x01(\tR\bnodeType\x1an\n" + + "\tGraphEdge\x12\x16\n" + + "\x06source\x18\x01 \x01(\tR\x06source\x12\x16\n" + + "\x06target\x18\x02 \x01(\tR\x06target\x12\x14\n" + + "\x05label\x18\x03 \x01(\tR\x05label\x12\x1b\n" + + "\tedge_type\x18\x04 \x01(\tR\bedgeType\"\xae\x02\n" + + "\x10GitLabRepository\x12\x0e\n" + + "\x02id\x18\x01 \x01(\x05R\x02id\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x1b\n" + + "\tfull_name\x18\x03 \x01(\tR\bfullName\x12 \n" + + "\vdescription\x18\x04 \x01(\tR\vdescription\x12%\n" + + "\x0edefault_branch\x18\x05 \x01(\tR\rdefaultBranch\x12\x17\n" + + "\aweb_url\x18\x06 \x01(\tR\x06webUrl\x12\x17\n" + + "\assh_url\x18\a \x01(\tR\x06sshUrl\x12\x19\n" + + "\bhttp_url\x18\b \x01(\tR\ahttpUrl\x12\x1e\n" + + "\n" + + "visibility\x18\t \x01(\tR\n" + + "visibility\x12#\n" + + "\rlast_activity\x18\n" + + " \x01(\tR\flastActivity\"\x1f\n" + + "\x1dListGitLabRepositoriesRequest\"i\n" + + "\x1eListGitLabRepositoriesResponse\x12G\n" + + "\frepositories\x18\x01 \x03(\v2#.staticanalysis.v1.GitLabRepositoryR\frepositories\"Q\n" + + "\x1cCloneGitLabRepositoryRequest\x12\x19\n" + + "\brepo_url\x18\x01 \x01(\tR\arepoUrl\x12\x16\n" + + "\x06branch\x18\x02 \x01(\tR\x06branch\"r\n" + + "\x1dCloneGitLabRepositoryResponse\x12\x18\n" + + "\asuccess\x18\x01 \x01(\bR\asuccess\x12\x18\n" + + "\amessage\x18\x02 \x01(\tR\amessage\x12\x1d\n" + + "\n" + + "target_dir\x18\x03 \x01(\tR\ttargetDir\"i\n" + + "\x1dGetPackageDependenciesRequest\x12\x17\n" + + "\adb_path\x18\x01 \x01(\tR\x06dbPath\x12\x12\n" + + "\x04page\x18\x02 \x01(\x05R\x04page\x12\x1b\n" + + "\tpage_size\x18\x03 \x01(\x05R\bpageSize\"\xd0\x01\n" + + "\x1eGetPackageDependenciesResponse\x12H\n" + + "\fdependencies\x18\x01 \x03(\v2$.staticanalysis.v1.PackageDependencyR\fdependencies\x12\x14\n" + + "\x05total\x18\x02 \x01(\x05R\x05total\x12\x12\n" + + "\x04page\x18\x03 \x01(\x05R\x04page\x12\x1b\n" + + "\tpage_size\x18\x04 \x01(\x05R\bpageSize\x12\x1d\n" + + "\n" + + "page_count\x18\x05 \x01(\x05R\tpageCount\"b\n" + + "\x16GetHotFunctionsRequest\x12\x17\n" + + "\adb_path\x18\x01 \x01(\tR\x06dbPath\x12\x12\n" + + "\x04page\x18\x02 \x01(\x05R\x04page\x12\x1b\n" + + "\tpage_size\x18\x03 \x01(\x05R\bpageSize\"\xbd\x01\n" + + "\x17GetHotFunctionsResponse\x12<\n" + + "\tfunctions\x18\x01 \x03(\v2\x1e.staticanalysis.v1.HotFunctionR\tfunctions\x12\x14\n" + + "\x05total\x18\x02 \x01(\x05R\x05total\x12\x12\n" + + "\x04page\x18\x03 \x01(\x05R\x04page\x12\x1b\n" + + "\tpage_size\x18\x04 \x01(\x05R\bpageSize\x12\x1d\n" + + "\n" + + "page_count\x18\x05 \x01(\x05R\tpageCount\"m\n" + + "\fFunctionInfo\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x18\n" + + "\apackage\x18\x03 \x01(\tR\apackage\x12\x1d\n" + + "\n" + + "call_count\x18\x04 \x01(\x05R\tcallCount\"G\n" + + "\x16SearchFunctionsRequest\x12\x17\n" + + "\adb_path\x18\x01 \x01(\tR\x06dbPath\x12\x14\n" + + "\x05query\x18\x02 \x01(\tR\x05query\"X\n" + + "\x17SearchFunctionsResponse\x12=\n" + + "\tfunctions\x18\x01 \x03(\v2\x1f.staticanalysis.v1.FunctionInfoR\tfunctions\"\x99\x01\n" + + "\x1aGetFunctionUpstreamRequest\x12\x17\n" + + "\adb_path\x18\x01 \x01(\tR\x06dbPath\x12!\n" + + "\ffunction_key\x18\x02 \x01(\tR\vfunctionKey\x12)\n" + + "\x10function_package\x18\x03 \x01(\tR\x0ffunctionPackage\x12\x14\n" + + "\x05depth\x18\x04 \x01(\x05R\x05depth\"j\n" + + "\tGraphNode\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x18\n" + + "\apackage\x18\x03 \x01(\tR\apackage\x12\x1d\n" + + "\n" + + "call_count\x18\x04 \x01(\x05R\tcallCount\"Q\n" + + "\tGraphEdge\x12\x16\n" + + "\x06source\x18\x01 \x01(\tR\x06source\x12\x16\n" + + "\x06target\x18\x02 \x01(\tR\x06target\x12\x14\n" + + "\x05value\x18\x03 \x01(\x05R\x05value\"\x85\x01\n" + + "\x1bGetFunctionUpstreamResponse\x122\n" + + "\x05nodes\x18\x01 \x03(\v2\x1c.staticanalysis.v1.GraphNodeR\x05nodes\x122\n" + + "\x05edges\x18\x02 \x03(\v2\x1c.staticanalysis.v1.GraphEdgeR\x05edges\"\x9b\x01\n" + + "\x1cGetFunctionDownstreamRequest\x12\x17\n" + + "\adb_path\x18\x01 \x01(\tR\x06dbPath\x12!\n" + + "\ffunction_key\x18\x02 \x01(\tR\vfunctionKey\x12)\n" + + "\x10function_package\x18\x03 \x01(\tR\x0ffunctionPackage\x12\x14\n" + + "\x05depth\x18\x04 \x01(\x05R\x05depth\"\x87\x01\n" + + "\x1dGetFunctionDownstreamResponse\x122\n" + + "\x05nodes\x18\x01 \x03(\v2\x1c.staticanalysis.v1.GraphNodeR\x05nodes\x122\n" + + "\x05edges\x18\x02 \x03(\v2\x1c.staticanalysis.v1.GraphEdgeR\x05edges\"Y\n" + + "\x1bGetFunctionFullChainRequest\x12\x17\n" + + "\adb_path\x18\x01 \x01(\tR\x06dbPath\x12!\n" + + "\ffunction_key\x18\x02 \x01(\tR\vfunctionKey\"\x86\x01\n" + + "\x1cGetFunctionFullChainResponse\x122\n" + + "\x05nodes\x18\x01 \x03(\v2\x1c.staticanalysis.v1.GraphNodeR\x05nodes\x122\n" + + "\x05edges\x18\x02 \x03(\v2\x1c.staticanalysis.v1.GraphEdgeR\x05edges\"M\n" + + "\x0fGetTreeGraphReq\x12\x17\n" + + "\adb_path\x18\x01 \x01(\tR\x06dbPath\x12!\n" + + "\ffunction_key\x18\x02 \x01(\tR\vfunctionKey\"\x8b\x01\n" + + "\bTreeNode\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x14\n" + + "\x05value\x18\x02 \x01(\x03R\x05value\x12\x1c\n" + + "\tcollapsed\x18\x03 \x01(\bR\tcollapsed\x127\n" + + "\bchildren\x18\x04 \x03(\v2\x1b.staticanalysis.v1.TreeNodeR\bchildren\"D\n" + + "\x11GetTreeGraphReply\x12/\n" + + "\x04root\x18\x01 \x01(\v2\x1b.staticanalysis.v1.TreeNodeR\x04root2\xcb\x12\n" + + "\x0eStaticAnalysis\x12\x88\x01\n" + + "\x10GetStaticDbFiles\x12*.staticanalysis.v1.GetStaticDbFilesRequest\x1a+.staticanalysis.v1.GetStaticDbFilesResponse\"\x1b\x82\xd3\xe4\x93\x02\x15\x12\x13/api/static/dbfiles\x12\xa5\x01\n" + + "\x15GetAnalysisTaskStatus\x12/.staticanalysis.v1.GetAnalysisTaskStatusRequest\x1a0.staticanalysis.v1.GetAnalysisTaskStatusResponse\")\x82\xd3\xe4\x93\x02#\x12!/api/static/task/{task_id}/status\x12\x96\x01\n" + + "\x12AnalyzeProjectPath\x12,.staticanalysis.v1.AnalyzeProjectPathRequest\x1a-.staticanalysis.v1.AnalyzeProjectPathResponse\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/api/static/analyze/path\x12\x82\x01\n" + + "\rAnalyzeDbFile\x12'.staticanalysis.v1.AnalyzeDbFileRequest\x1a(.staticanalysis.v1.AnalyzeDbFileResponse\"\x1e\x82\xd3\xe4\x93\x02\x18:\x01*\"\x13/api/static/analyze\x12\x97\x01\n" + + "\x13GetFunctionAnalysis\x12).staticanalysis.v1.GetFunctionAnalysisReq\x1a+.staticanalysis.v1.GetFunctionAnalysisReply\"(\x82\xd3\xe4\x93\x02\":\x01*\"\x1d/api/static/function/analysis\x12\xc4\x01\n" + + "\x14GetFunctionCallGraph\x12*.staticanalysis.v1.GetFunctionCallGraphReq\x1a,.staticanalysis.v1.GetFunctionCallGraphReply\"R\x82\xd3\xe4\x93\x02LZ\x1fb\x01*\x12\x1a/api/static/function/graph\x12)/api/static/function/{function_key}/graph\x12\xa6\x01\n" + + "\x16ListGitLabRepositories\x120.staticanalysis.v1.ListGitLabRepositoriesRequest\x1a1.staticanalysis.v1.ListGitLabRepositoriesResponse\"'\x82\xd3\xe4\x93\x02!\x12\x1f/api/static/gitlab/repositories\x12\x9f\x01\n" + + "\x15CloneGitLabRepository\x12/.staticanalysis.v1.CloneGitLabRepositoryRequest\x1a0.staticanalysis.v1.CloneGitLabRepositoryResponse\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/api/static/gitlab/clone\x12\xaa\x01\n" + + "\x16GetPackageDependencies\x120.staticanalysis.v1.GetPackageDependenciesRequest\x1a1.staticanalysis.v1.GetPackageDependenciesResponse\"+\x82\xd3\xe4\x93\x02%:\x01*\" /api/static/package-dependencies\x12\x8e\x01\n" + + "\x0fGetHotFunctions\x12).staticanalysis.v1.GetHotFunctionsRequest\x1a*.staticanalysis.v1.GetHotFunctionsResponse\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\"\x19/api/static/hot-functions\x12\x91\x01\n" + + "\x0fSearchFunctions\x12).staticanalysis.v1.SearchFunctionsRequest\x1a*.staticanalysis.v1.SearchFunctionsResponse\"'\x82\xd3\xe4\x93\x02!:\x01*\"\x1c/api/static/search-functions\x12\x9e\x01\n" + + "\x13GetFunctionUpstream\x12-.staticanalysis.v1.GetFunctionUpstreamRequest\x1a..staticanalysis.v1.GetFunctionUpstreamResponse\"(\x82\xd3\xe4\x93\x02\":\x01*\"\x1d/api/static/function-upstream\x12\xa6\x01\n" + + "\x15GetFunctionDownstream\x12/.staticanalysis.v1.GetFunctionDownstreamRequest\x1a0.staticanalysis.v1.GetFunctionDownstreamResponse\"*\x82\xd3\xe4\x93\x02$:\x01*\"\x1f/api/static/function-downstream\x12\xa2\x01\n" + + "\x14GetFunctionFullChain\x12..staticanalysis.v1.GetFunctionFullChainRequest\x1a/.staticanalysis.v1.GetFunctionFullChainResponse\")\x82\xd3\xe4\x93\x02#:\x01*\"\x1e/api/static/function-fullchain\x12{\n" + + "\fGetTreeGraph\x12\".staticanalysis.v1.GetTreeGraphReq\x1a$.staticanalysis.v1.GetTreeGraphReply\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/api/static/tree-graphB8Z6github.com/toheart/goanalysis/api/staticanalysis/v1;v1b\x06proto3" var ( file_staticanalysis_v1_staticanalysis_proto_rawDescOnce sync.Once diff --git a/api/staticanalysis/v1/staticanalysis.pb.gw.go b/api/staticanalysis/v1/staticanalysis.pb.gw.go index 33d7c98..418bee2 100644 --- a/api/staticanalysis/v1/staticanalysis.pb.gw.go +++ b/api/staticanalysis/v1/staticanalysis.pb.gw.go @@ -163,7 +163,7 @@ func local_request_StaticAnalysis_GetFunctionAnalysis_0(ctx context.Context, mar return msg, metadata, err } -var filter_StaticAnalysis_GetFunctionCallGraph_0 = &utilities.DoubleArray{Encoding: map[string]int{"function_name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +var filter_StaticAnalysis_GetFunctionCallGraph_0 = &utilities.DoubleArray{Encoding: map[string]int{"function_key": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_StaticAnalysis_GetFunctionCallGraph_0(ctx context.Context, marshaler runtime.Marshaler, client StaticAnalysisClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( @@ -172,13 +172,13 @@ func request_StaticAnalysis_GetFunctionCallGraph_0(ctx context.Context, marshale err error ) io.Copy(io.Discard, req.Body) - val, ok := pathParams["function_name"] + val, ok := pathParams["function_key"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "function_name") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "function_key") } - protoReq.FunctionName, err = runtime.String(val) + protoReq.FunctionKey, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "function_name", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "function_key", err) } if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) @@ -196,13 +196,13 @@ func local_request_StaticAnalysis_GetFunctionCallGraph_0(ctx context.Context, ma metadata runtime.ServerMetadata err error ) - val, ok := pathParams["function_name"] + val, ok := pathParams["function_key"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "function_name") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "function_key") } - protoReq.FunctionName, err = runtime.String(val) + protoReq.FunctionKey, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "function_name", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "function_key", err) } if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) @@ -570,7 +570,7 @@ func RegisterStaticAnalysisHandlerServer(ctx context.Context, mux *runtime.Serve var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/staticanalysis.v1.StaticAnalysis/GetFunctionCallGraph", runtime.WithHTTPPathPattern("/api/static/function/{function_name}/graph")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/staticanalysis.v1.StaticAnalysis/GetFunctionCallGraph", runtime.WithHTTPPathPattern("/api/static/function/{function_key}/graph")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -913,7 +913,7 @@ func RegisterStaticAnalysisHandlerClient(ctx context.Context, mux *runtime.Serve ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/staticanalysis.v1.StaticAnalysis/GetFunctionCallGraph", runtime.WithHTTPPathPattern("/api/static/function/{function_name}/graph")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/staticanalysis.v1.StaticAnalysis/GetFunctionCallGraph", runtime.WithHTTPPathPattern("/api/static/function/{function_key}/graph")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1105,7 +1105,7 @@ var ( pattern_StaticAnalysis_AnalyzeProjectPath_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "static", "analyze", "path"}, "")) pattern_StaticAnalysis_AnalyzeDbFile_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "static", "analyze"}, "")) pattern_StaticAnalysis_GetFunctionAnalysis_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "static", "function", "analysis"}, "")) - pattern_StaticAnalysis_GetFunctionCallGraph_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "static", "function", "function_name", "graph"}, "")) + pattern_StaticAnalysis_GetFunctionCallGraph_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "static", "function", "function_key", "graph"}, "")) pattern_StaticAnalysis_GetFunctionCallGraph_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "static", "function", "graph"}, "")) pattern_StaticAnalysis_ListGitLabRepositories_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "static", "gitlab", "repositories"}, "")) pattern_StaticAnalysis_CloneGitLabRepository_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "static", "gitlab", "clone"}, "")) diff --git a/api/staticanalysis/v1/staticanalysis.proto b/api/staticanalysis/v1/staticanalysis.proto index 5a62887..8c0ffcd 100644 --- a/api/staticanalysis/v1/staticanalysis.proto +++ b/api/staticanalysis/v1/staticanalysis.proto @@ -50,7 +50,7 @@ service StaticAnalysis { // 获取函数调用关系图 rpc GetFunctionCallGraph(GetFunctionCallGraphReq) returns (GetFunctionCallGraphReply) { option (google.api.http) = { - get: "/api/static/function/{function_name}/graph" + get: "/api/static/function/{function_key}/graph" additional_bindings { get: "/api/static/function/graph" response_body: "*" @@ -129,6 +129,8 @@ service StaticAnalysis { body: "*" }; } + + // GetFunctionMindMap API 已删除 - 已替换为树形表格功能 } // 获取静态分析数据库文件列表请求 @@ -243,7 +245,7 @@ message GetFunctionAnalysisReply { // 获取函数调用关系图的请求 message GetFunctionCallGraphReq { - string function_name = 1; // 函数名称 + string function_key = 1; // 函数唯一标识符(短格式key) int32 depth = 2; // 调用深度,默认为2 string direction = 3; // 方向: "caller"(调用者), "callee"(被调用), "both"(双向) } @@ -251,7 +253,7 @@ message GetFunctionCallGraphReq { // 获取函数调用关系图的响应 message GetFunctionCallGraphReply { message GraphNode { - string id = 1; // 节点ID + string key = 1; // 函数唯一标识符(短格式key) string name = 2; // 函数名称 string package = 3; // 包名 int32 call_count = 4; // 调用次数 @@ -260,8 +262,8 @@ message GetFunctionCallGraphReply { } message GraphEdge { - string source = 1; // 源节点ID - string target = 2; // 目标节点ID + string source = 1; // 源节点Key + string target = 2; // 目标节点Key string label = 3; // 边标签 string edge_type = 4; // 边类型: "caller_to_root", "root_to_callee" } @@ -359,13 +361,15 @@ message SearchFunctionsResponse { // 获取函数上游调用关系请求 message GetFunctionUpstreamRequest { - string db_path = 1; // 数据库路径 - string function_key = 2; // 函数唯一标识 + string db_path = 1; // 数据库路径 + string function_key = 2; // 函数唯一标识符(短格式key) + string function_package = 3; // 函数包名 + int32 depth = 4; // 查询深度,默认为2 } // 图节点 message GraphNode { - string id = 1; // 节点ID + string key = 1; // 函数唯一标识符(短格式key) string name = 2; // 函数名称 string package = 3; // 包名 int32 call_count = 4; // 调用次数 @@ -373,8 +377,8 @@ message GraphNode { // 图边 message GraphEdge { - string source = 1; // 源节点ID - string target = 2; // 目标节点ID + string source = 1; // 源节点Key + string target = 2; // 目标节点Key int32 value = 3; // 边权重 } @@ -386,8 +390,10 @@ message GetFunctionUpstreamResponse { // 获取函数下游调用关系请求 message GetFunctionDownstreamRequest { - string db_path = 1; // 数据库路径 - string function_key = 2; // 函数唯一标识 + string db_path = 1; // 数据库路径 + string function_key = 2; // 函数唯一标识符(短格式key) + string function_package = 3; // 函数包名 + int32 depth = 4; // 查询深度,默认为2 } // 获取函数下游调用关系响应 @@ -399,7 +405,7 @@ message GetFunctionDownstreamResponse { // 获取函数全链路调用关系请求 message GetFunctionFullChainRequest { string db_path = 1; // 数据库路径 - string function_key = 2; // 函数唯一标识 + string function_key = 2; // 函数唯一标识符(短格式key) } // 获取函数全链路调用关系响应 @@ -411,7 +417,7 @@ message GetFunctionFullChainResponse { // 获取树状图请求 message GetTreeGraphReq { string db_path = 1; // 数据库路径 - string function_name = 2; // 函数名称 + string function_key = 2; // 函数唯一标识符(短格式key) } @@ -426,4 +432,6 @@ message TreeNode { // 获取树状图响应 message GetTreeGraphReply { TreeNode root = 1; // 根节点 -} \ No newline at end of file +} + +// 思维导图相关message已删除 - 已替换为树形表格功能 \ No newline at end of file diff --git a/api/staticanalysis/v1/staticanalysis_grpc.pb.go b/api/staticanalysis/v1/staticanalysis_grpc.pb.go index 35e5cfa..77e75ba 100644 --- a/api/staticanalysis/v1/staticanalysis_grpc.pb.go +++ b/api/staticanalysis/v1/staticanalysis_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v6.30.0--rc1 +// - protoc v6.31.1 // source: staticanalysis/v1/staticanalysis.proto package v1 diff --git a/cmd/cmd.go b/cmd/cmd.go index b823f2d..db59ef1 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -24,6 +24,9 @@ func RegisterAllCommands() { // 注册服务器命令 Registry.Register(commands.NewServerCommand()) + // 注册配置文件生成命令 + Registry.Register(commands.NewConfigCommand()) + // 注册调用图命令 Registry.Register(commands.NewCallGraphCommand()) diff --git a/cmd/commands/config.go b/cmd/commands/config.go new file mode 100644 index 0000000..df6e50e --- /dev/null +++ b/cmd/commands/config.go @@ -0,0 +1,110 @@ +package commands + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/spf13/cobra" + "github.com/toheart/goanalysis/cmd/cmdbase" +) + +// ConfigCommand 配置文件命令 +type ConfigCommand struct { + cmdbase.BaseCommand + output string +} + +// NewConfigCommand 创建配置文件命令 +func NewConfigCommand() *ConfigCommand { + cmd := &ConfigCommand{} + cmd.CobraCmd = &cobra.Command{ + Use: "config", + Short: "generate default configuration file", + Long: "Generate a default configuration file with all available options", + Run: cmd.Run, + } + return cmd +} + +// Init 初始化配置文件命令 +func (c *ConfigCommand) Init() { + c.CobraCmd.Flags().StringVarP(&c.output, "output", "o", "./configs/config.yaml", "output path for the configuration file") +} + +// defaultConfigContent 默认配置文件内容 +const defaultConfigContent = `server: + http: + addr: 0.0.0.0:8000 + timeout: 1s + grpc: + addr: 0.0.0.0:9000 + timeout: 1s + +logger: + level: debug # 日志级别: debug, info, warn, error + file_path: ./logs/app.log # 日志文件路径 + console: true # 同时输出到控制台 + max_size: 100 # 单个日志文件最大大小(MB) + max_age: 7 # 日志文件保留天数 + max_backups: 10 # 保留的旧日志文件最大数量 + compress: true + # 压缩旧日志文件 + + +biz: + gitlab: + token: "${GITLAB_TOKEN}" # GitLab访问令牌,用于API认证 + url: "${GITLAB_API_URL}" # GitLab API URL + clone_dir: ./data + openai: + api_key: "${OPENAI_API_KEY}" + api_base: "${OPENAI_API_BASE}" + model: "${OPENAI_MODEL}" + staticStorePath: ./data/static + runtimeStorePath: ./data/runtime + file_storage_path: ./data/files + +data: + dbpath: ./goanalysis.db +` + +// Run 执行配置文件生成命令 +func (c *ConfigCommand) Run(cmd *cobra.Command, args []string) { + // 检查输出路径是否存在,如果不存在则创建目录 + outputDir := filepath.Dir(c.output) + if err := os.MkdirAll(outputDir, 0755); err != nil { + fmt.Printf("Error creating directory %s: %v\n", outputDir, err) + os.Exit(1) + } + + // 检查文件是否已存在 + if _, err := os.Stat(c.output); err == nil { + fmt.Printf("Configuration file already exists at %s\n", c.output) + fmt.Print("Do you want to overwrite it? (y/N): ") + + var response string + fmt.Scanln(&response) + if response != "y" && response != "Y" && response != "yes" && response != "Yes" { + fmt.Println("Operation cancelled.") + return + } + } + + // 写入配置文件 + if err := os.WriteFile(c.output, []byte(defaultConfigContent), 0644); err != nil { + fmt.Printf("Error writing configuration file: %v\n", err) + os.Exit(1) + } + + fmt.Printf("Configuration file generated successfully at: %s\n", c.output) + fmt.Println("\nNext steps:") + fmt.Println("1. Edit the configuration file to match your environment") + fmt.Println("2. Set the required environment variables:") + fmt.Println(" - GITLAB_TOKEN: Your GitLab access token") + fmt.Println(" - GITLAB_API_URL: Your GitLab API URL") + fmt.Println(" - OPENAI_API_KEY: Your OpenAI API key") + fmt.Println(" - OPENAI_API_BASE: OpenAI API base URL") + fmt.Println(" - OPENAI_MODEL: OpenAI model name") + fmt.Printf("3. Start the server: goanalysis server --conf=%s\n", c.output) +} diff --git a/configs/config.yaml b/configs/config.yaml index b26e0ea..4fe9783 100644 --- a/configs/config.yaml +++ b/configs/config.yaml @@ -17,8 +17,6 @@ logger: # 压缩旧日志文件 - - biz: gitlab: token: "${GITLAB_TOKEN}" # GitLab访问令牌,用于API认证 diff --git a/go.mod b/go.mod index 13c1c5f..21a2b69 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/evanphx/json-patch/v5 v5.9.11 github.com/go-kratos/kratos/contrib/log/zap/v2 v2.0.0-20250307161706-982270e9576b github.com/go-kratos/kratos/v2 v2.8.4 + github.com/go-resty/resty/v2 v2.16.5 github.com/google/wire v0.6.0 github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1 @@ -43,7 +44,6 @@ require ( github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-openapi/inflect v0.19.0 // indirect - github.com/go-resty/resty/v2 v2.16.5 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-querystring v1.1.0 // indirect @@ -64,6 +64,7 @@ require ( github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect + github.com/rakyll/statik v0.1.7 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/skeema/knownhosts v1.3.1 // indirect diff --git a/go.sum b/go.sum index 0b8dc66..cfc8d7c 100644 --- a/go.sum +++ b/go.sum @@ -161,6 +161,8 @@ github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= diff --git a/internal/biz/analysis/analysis.go b/internal/biz/analysis/analysis.go index 78d1038..dca399d 100644 --- a/internal/biz/analysis/analysis.go +++ b/internal/biz/analysis/analysis.go @@ -236,21 +236,6 @@ func (a *AnalysisBiz) IsGoroutineFinished(dbpath string, gid uint64) (bool, erro return traceDB.IsGoroutineFinished(gid) } -// GetUnfinishedFunctions 获取未完成的函数列表 -func (a *AnalysisBiz) GetUnfinishedFunctions(dbpath string, threshold int64) ([]entity.AllUnfinishedFunction, error) { - a.log.Infof("get unfinished functions with threshold: %d ms from db: %s", threshold, dbpath) - traceDB, err := a.data.GetTraceDB(dbpath) - if err != nil { - return nil, err - } - functions, err := traceDB.GetAllUnfinishedFunctions(threshold) - if err != nil { - return nil, err - } - - return functions, nil -} - func (a *AnalysisBiz) GetUpstreamTreeGraph(dbpath string, functionName string, depth int) ([]*entity.TreeNode, error) { traceDB, err := a.data.GetTraceDB(dbpath) if err != nil { @@ -475,26 +460,6 @@ func (a *AnalysisBiz) buildFullChainTreeNodes(functionName string, upstreamGraph return upstreamGraph, nil } -// 根据节点ID获取节点名称 -func getNodeNameById(nodes []entity.FunctionGraphNode, id string) string { - for _, node := range nodes { - if node.ID == id { - return node.Name - } - } - return id // 如果找不到,返回ID本身 -} - -// 从边标签解析调用次数 -func parseCallCount(label string) (int, error) { - var count int - _, err := fmt.Sscanf(label, "调用次数: %d", &count) - if err != nil { - return 1, err // 默认返回1 - } - return count, nil -} - // GetTreeGraphByGID 根据GID获取多棵树状图数据 func (a *AnalysisBiz) GetTreeGraphByGID(dbpath string, gid uint64) ([]*entity.TreeNode, error) { a.log.Infof("get tree graph by gid: %d, dbpath: %s", gid, dbpath) diff --git a/internal/biz/callgraph/dos/node.go b/internal/biz/callgraph/dos/node.go index 6a7bc58..b58870e 100644 --- a/internal/biz/callgraph/dos/node.go +++ b/internal/biz/callgraph/dos/node.go @@ -7,9 +7,10 @@ type FuncEdge struct { // FuncNode 表示函数节点 type FuncNode struct { - Key string `json:"key"` // 唯一标识 - Pkg string `json:"pkg"` // 包名 - Name string `json:"name"` // 函数名 - Parent []string `json:"parent"` // 父节点索引 - Children []string `json:"children"` // 子节点索引 + Key string `json:"key"` // 短格式唯一标识,如 "n6796" + FullName string `json:"full_name"` // 完整的函数路径,如 "crypto/hmac.New$1" + Pkg string `json:"pkg"` // 包名 + Name string `json:"name"` // 函数名 + Parents []*FuncNode `json:"parents"` // 父节点 + Childrens []*FuncNode `json:"childrens"` // 子节点 } diff --git a/internal/biz/callgraph/edge_manager.go b/internal/biz/callgraph/edge_manager.go index 41cd7d2..01c3109 100644 --- a/internal/biz/callgraph/edge_manager.go +++ b/internal/biz/callgraph/edge_manager.go @@ -33,8 +33,8 @@ func (em *EdgeManager) AddEdge(callerKey, calleeKey string) { func (em *EdgeManager) BuildRelationship(caller, callee *dos.FuncNode) { if caller != nil && callee != nil { // 建立父子关系 - caller.Children = append(caller.Children, callee.Key) - callee.Parent = append(callee.Parent, caller.Key) + caller.Childrens = append(caller.Childrens, callee) + callee.Parents = append(callee.Parents, caller) // 添加边到通道 em.AddEdge(caller.Key, callee.Key) diff --git a/internal/biz/callgraph/filter.go b/internal/biz/callgraph/filter.go index 6d0d3ee..e69ac11 100644 --- a/internal/biz/callgraph/filter.go +++ b/internal/biz/callgraph/filter.go @@ -47,8 +47,8 @@ func (f *Filter) ShouldProcessEdge(edge *callgraph.Edge) bool { caller := edge.Caller callee := edge.Callee - // 排除标准库 - if f.IsStandardLibrary(caller) && f.IsStandardLibrary(callee) { + // 排除标准库节点:如果调用者或被调用者是标准库,则排除 + if f.IsStandardLibrary(caller) || f.IsStandardLibrary(callee) { return false } @@ -57,8 +57,12 @@ func (f *Filter) ShouldProcessEdge(edge *callgraph.Edge) bool { return false } - // 至少有一个是内部模块 - if !f.IsInternal(caller) && !f.IsInternal(callee) { + // 排除调用者、被调用者两者都不属于当前项目的方法 + callerIsInternal := f.IsInternal(caller) + calleeIsInternal := f.IsInternal(callee) + + // 至少有一个必须是内部模块,否则排除 + if !callerIsInternal && !calleeIsInternal { return false } @@ -74,9 +78,42 @@ func isSynthetic(edge *callgraph.Edge) bool { // isStdPkgPath 检查包路径是否为标准库 func isStdPkgPath(path string) bool { - // 标准库包路径通常不包含域名(没有点号) + // 标准库包路径特征: + // 1. 不包含域名(没有点号) + // 2. 常见的标准库包前缀 + + // 如果包含点号,通常是第三方包 if strings.Contains(path, ".") { return false } - return true + + // 空路径或特殊路径 + if path == "" || path == "command-line-arguments" { + return false + } + + // 常见的标准库包 + stdPkgs := []string{ + "fmt", "os", "io", "net", "http", "time", "strings", "bytes", + "context", "errors", "log", "math", "sort", "sync", "unsafe", + "runtime", "reflect", "encoding", "crypto", "database", "go", + "html", "image", "index", "mime", "path", "regexp", "strconv", + "testing", "text", "unicode", "archive", "bufio", "builtin", + "compress", "container", "debug", "expvar", "flag", "hash", + "heap", "plugin", "syscall", + } + + // 检查是否是标准库包或其子包 + for _, stdPkg := range stdPkgs { + if path == stdPkg || strings.HasPrefix(path, stdPkg+"/") { + return true + } + } + + // 其他判断:不包含斜杠的单个词通常是标准库 + if !strings.Contains(path, "/") && path != "" { + return true + } + + return false } diff --git a/internal/biz/callgraph/node_manager.go b/internal/biz/callgraph/node_manager.go index 70b8158..3a92bd1 100644 --- a/internal/biz/callgraph/node_manager.go +++ b/internal/biz/callgraph/node_manager.go @@ -1,6 +1,8 @@ package callgraph import ( + "fmt" + "github.com/toheart/goanalysis/internal/biz/callgraph/dos" ) @@ -35,27 +37,33 @@ func (nm *NodeManager) GetNode(key string) *dos.FuncNode { } // CreateNode 创建节点 -func (nm *NodeManager) CreateNode(key, pkg, name string) *dos.FuncNode { +func (nm *NodeManager) CreateNode(nodeID int, fullName, pkg, name string) *dos.FuncNode { + // 生成短格式Key + key := fmt.Sprintf("n%d", nodeID) + return &dos.FuncNode{ - Key: key, - Pkg: pkg, - Name: name, + Key: key, + FullName: fullName, + Pkg: pkg, + Name: name, } } // AddNode 添加节点 -func (nm *NodeManager) AddNode(node *dos.FuncNode) { +func (nm *NodeManager) AddNode(node *dos.FuncNode) { nm.tree[node.Key] = node nm.nodeChan <- node } // GetOrCreateNode 获取或创建节点 -func (nm *NodeManager) GetOrCreateNode(key, pkg, name string) *dos.FuncNode { +func (nm *NodeManager) GetOrCreateNode(nodeID int, fullName, pkg, name string) *dos.FuncNode { + key := fmt.Sprintf("n%d", nodeID) + if nm.NodeExists(key) { return nm.GetNode(key) } - node := nm.CreateNode(key, pkg, name) + node := nm.CreateNode(nodeID, fullName, pkg, name) nm.AddNode(node) return node } diff --git a/internal/biz/callgraph/program.go b/internal/biz/callgraph/program.go index db77a07..954cc83 100644 --- a/internal/biz/callgraph/program.go +++ b/internal/biz/callgraph/program.go @@ -314,8 +314,9 @@ func (p *ProgramAnalysis) setTree(statusChan chan []byte) error { caller := edge.Caller callee := edge.Callee - if !p.isVisited[caller.String()] { - p.isVisited[caller.String()] = true + callerKey := fmt.Sprintf("n%d", caller.ID) + if !p.isVisited[callerKey] { + p.isVisited[callerKey] = true p.tracker.ProcessedNodes++ } @@ -327,10 +328,9 @@ func (p *ProgramAnalysis) setTree(statusChan chan []byte) error { p.log.Infof("caller: %s, callee: %s", caller.String(), callee.String()) // 处理caller节点 - callerKey := caller.String() + callerFullName := caller.String() callerPkg := caller.Func.Pkg.Pkg.Path() callerName := caller.Func.RelString(caller.Func.Pkg.Pkg) - if !p.nodeManager.NodeExists(callerKey) { nodeCount++ // 每处理10个节点发送一次状态更新 @@ -338,13 +338,14 @@ func (p *ProgramAnalysis) setTree(statusChan chan []byte) error { p.reporter.ReportStatus(fmt.Sprintf("Processed %d nodes, %d edges", nodeCount, edgeCount)) } } - callerNode := p.nodeManager.GetOrCreateNode(callerKey, callerPkg, callerName) + callerNode := p.nodeManager.GetOrCreateNode(caller.ID, callerFullName, callerPkg, callerName) // 处理callee节点 - calleeKey := callee.String() + calleeFullName := callee.String() calleePkg := callee.Func.Pkg.Pkg.Path() calleeName := callee.Func.RelString(callee.Func.Pkg.Pkg) + calleeKey := fmt.Sprintf("n%d", callee.ID) if !p.nodeManager.NodeExists(calleeKey) { nodeCount++ // 每处理10个节点发送一次状态更新 @@ -352,7 +353,7 @@ func (p *ProgramAnalysis) setTree(statusChan chan []byte) error { p.reporter.ReportStatus(fmt.Sprintf("Processed %d nodes, %d edges", nodeCount, edgeCount)) } } - calleeNode := p.nodeManager.GetOrCreateNode(calleeKey, calleePkg, calleeName) + calleeNode := p.nodeManager.GetOrCreateNode(callee.ID, calleeFullName, calleePkg, calleeName) // 建立边关系 - 使用EdgeManager封装逻辑 p.edgeManager.BuildRelationship(callerNode, calleeNode) @@ -528,8 +529,9 @@ func (p *ProgramAnalysis) produceData(statusChan chan []byte) error { caller := edge.Caller callee := edge.Callee - if !p.isVisited[caller.String()] { - p.isVisited[caller.String()] = true + callerKey := fmt.Sprintf("n%d", caller.ID) + if !p.isVisited[callerKey] { + p.isVisited[callerKey] = true p.tracker.ProcessedNodes++ } @@ -540,10 +542,9 @@ func (p *ProgramAnalysis) produceData(statusChan chan []byte) error { p.log.Infof("caller: %s, callee: %s", caller.String(), callee.String()) // 处理caller节点 - callerKey := caller.String() + callerFullName := caller.String() callerPkg := caller.Func.Pkg.Pkg.Path() callerName := caller.Func.RelString(caller.Func.Pkg.Pkg) - if !p.nodeManager.NodeExists(callerKey) { nodeCount++ // 每处理10个节点发送一次状态更新 @@ -551,13 +552,14 @@ func (p *ProgramAnalysis) produceData(statusChan chan []byte) error { p.reporter.ReportStatus(fmt.Sprintf("Processed %d nodes, %d edges", nodeCount, edgeCount)) } } - callerNode := p.nodeManager.GetOrCreateNode(callerKey, callerPkg, callerName) + callerNode := p.nodeManager.GetOrCreateNode(caller.ID, callerFullName, callerPkg, callerName) // 处理callee节点 - calleeKey := callee.String() + calleeFullName := callee.String() calleePkg := callee.Func.Pkg.Pkg.Path() calleeName := callee.Func.RelString(callee.Func.Pkg.Pkg) + calleeKey := fmt.Sprintf("n%d", callee.ID) if !p.nodeManager.NodeExists(calleeKey) { nodeCount++ // 每处理10个节点发送一次状态更新 @@ -565,7 +567,7 @@ func (p *ProgramAnalysis) produceData(statusChan chan []byte) error { p.reporter.ReportStatus(fmt.Sprintf("Processed %d nodes, %d edges", nodeCount, edgeCount)) } } - calleeNode := p.nodeManager.GetOrCreateNode(calleeKey, calleePkg, calleeName) + calleeNode := p.nodeManager.GetOrCreateNode(callee.ID, calleeFullName, calleePkg, calleeName) // 建立边关系 - 使用EdgeManager封装逻辑 p.edgeManager.BuildRelationship(callerNode, calleeNode) diff --git a/internal/biz/entity/analysis.go b/internal/biz/entity/analysis.go index 04d89bd..0504069 100644 --- a/internal/biz/entity/analysis.go +++ b/internal/biz/entity/analysis.go @@ -65,6 +65,7 @@ type Function struct { AvgTime string // 平均耗时 ParamCount int // 参数数量 Depth int // 深度 + Seq string // 序列号 } func NewFunction(id int64, name string, callCount int, totalTime string, avgTime string) *Function { @@ -90,17 +91,6 @@ func (f *Function) SetPackage() { f.Package = packageName } -// UnfinishedFunction 未完成的函数 -type UnfinishedFunction struct { - ID int64 // ID - Name string // 函数名称 - GID uint64 // Goroutine ID - StartTime string // 开始时间 - ElapsedMS int64 // 已经过去的毫秒数 - StackTrace string // 堆栈跟踪 - IsBlocking bool // 是否阻塞 -} - // HotPathInfo 热点路径信息 type HotPathInfo struct { Path []string // 路径上的函数名称序列 diff --git a/internal/biz/entity/define.go b/internal/biz/entity/define.go index a89fe84..96a0740 100644 --- a/internal/biz/entity/define.go +++ b/internal/biz/entity/define.go @@ -9,5 +9,5 @@ func GetFileStoragePath(constPath string, runtime bool) string { if runtime { return filepath.Join(constPath, "runtime", time.Now().Format("20060102")) } - return filepath.Join(constPath, "static", time.Now().Format("20060102")) + return filepath.Join(constPath, "static") } diff --git a/internal/biz/entity/gitlab.go b/internal/biz/entity/gitlab.go deleted file mode 100644 index acdbd94..0000000 --- a/internal/biz/entity/gitlab.go +++ /dev/null @@ -1,16 +0,0 @@ -package entity - -// Repository GitLab仓库信息 -type Repository struct { - ID int `json:"id"` - Name string `json:"name"` - FullName string `json:"full_name"` - Description string `json:"description"` - DefaultBranch string `json:"default_branch"` - WebURL string `json:"web_url"` - SSHURLToRepo string `json:"ssh_url_to_repo"` - HTTPURLToRepo string `json:"http_url_to_repo"` - Visibility string `json:"visibility"` - LastActivity string `json:"last_activity_at"` -} - diff --git a/internal/biz/entity/runtime.go b/internal/biz/entity/runtime.go index e20461d..134ea87 100644 --- a/internal/biz/entity/runtime.go +++ b/internal/biz/entity/runtime.go @@ -58,12 +58,3 @@ type FunctionGraphEdge struct { Label string // 边标签 EdgeType string // 边类型: "caller_to_root", "root_to_callee" } - -// UnfinishedFunction 未完成的函数 -type AllUnfinishedFunction struct { - Name string `json:"name"` // 函数名称 - GID uint64 `json:"gid"` // goroutine ID - RunningTime string `json:"runningTime"` // 运行时间 - IsBlocking bool `json:"isBlocking"` // 是否阻塞 - FunctionID int64 `json:"functionId"` // 函数ID -} diff --git a/internal/biz/entity/file.go b/internal/biz/filemanager/dos/file.go similarity index 98% rename from internal/biz/entity/file.go rename to internal/biz/filemanager/dos/file.go index da93beb..2ba9bb7 100644 --- a/internal/biz/entity/file.go +++ b/internal/biz/filemanager/dos/file.go @@ -1,4 +1,4 @@ -package entity +package dos import ( "time" diff --git a/internal/biz/filemanager/file_biz.go b/internal/biz/filemanager/file_biz.go index 98f133e..8242e92 100644 --- a/internal/biz/filemanager/file_biz.go +++ b/internal/biz/filemanager/file_biz.go @@ -6,6 +6,7 @@ import ( "github.com/go-kratos/kratos/v2/log" "github.com/toheart/goanalysis/internal/biz/entity" + "github.com/toheart/goanalysis/internal/biz/filemanager/dos" "github.com/toheart/goanalysis/internal/biz/repo" "github.com/toheart/goanalysis/internal/conf" ) @@ -31,7 +32,7 @@ func (f *FileBiz) GetUploadDir(runtime bool) string { } // UploadFile 上传文件 -func (f *FileBiz) SaveFileInfo(fileInfo *entity.FileInfo) (*entity.FileInfo, error) { +func (f *FileBiz) SaveFileInfo(fileInfo *dos.FileInfo) (*dos.FileInfo, error) { if err := f.repo.SaveFileInfo(fileInfo); err != nil { // 删除已上传的文件 os.Remove(fileInfo.FilePath) @@ -42,7 +43,7 @@ func (f *FileBiz) SaveFileInfo(fileInfo *entity.FileInfo) (*entity.FileInfo, err } // GetFileInfo 获取文件信息 -func (f *FileBiz) GetFileInfo(id int64) (*entity.FileInfo, error) { +func (f *FileBiz) GetFileInfo(id int64) (*dos.FileInfo, error) { fileInfo, err := f.repo.GetFileInfoByID(id) if err != nil { return nil, fmt.Errorf("get file info failed: %w", err) @@ -56,7 +57,7 @@ func (f *FileBiz) GetFileInfo(id int64) (*entity.FileInfo, error) { } // ListFiles 获取文件列表 -func (f *FileBiz) ListFiles(fileType entity.FileType, limit int, offset int) ([]*entity.FileInfo, error) { +func (f *FileBiz) ListFiles(fileType dos.FileType, limit int, offset int) ([]*dos.FileInfo, error) { fileInfos, err := f.repo.ListFileInfos(fileType, limit, offset) if err != nil { return nil, fmt.Errorf("list file infos failed: %w", err) diff --git a/internal/biz/repo/callgraph.go b/internal/biz/repo/callgraph.go index cc66579..8bcb3f3 100644 --- a/internal/biz/repo/callgraph.go +++ b/internal/biz/repo/callgraph.go @@ -27,6 +27,9 @@ type StaticDBStore interface { // GetAllFuncEdges 获取所有函数调用边 GetAllFuncEdges() ([]*dos.FuncEdge, error) + // SearchFuncNodes 模糊搜索函数节点 + SearchFuncNodes(query string, limit int) ([]*dos.FuncNode, error) + // InitTable 初始化数据库表 InitTable() error } diff --git a/internal/biz/repo/file.go b/internal/biz/repo/file.go index 872558a..4a53b29 100644 --- a/internal/biz/repo/file.go +++ b/internal/biz/repo/file.go @@ -1,10 +1,10 @@ package repo -import "github.com/toheart/goanalysis/internal/biz/entity" +import "github.com/toheart/goanalysis/internal/biz/filemanager/dos" type FileRepo interface { DeleteFileInfo(id int64) error - GetFileInfoByID(id int64) (*entity.FileInfo, error) - ListFileInfos(fileType entity.FileType, limit int, offset int) ([]*entity.FileInfo, error) - SaveFileInfo(info *entity.FileInfo) error + GetFileInfoByID(id int64) (*dos.FileInfo, error) + ListFileInfos(fileType dos.FileType, limit int, offset int) ([]*dos.FileInfo, error) + SaveFileInfo(info *dos.FileInfo) error } diff --git a/internal/biz/rewrite/rewrite.go b/internal/biz/rewrite/rewrite.go index 6ad1add..a88b0fe 100644 --- a/internal/biz/rewrite/rewrite.go +++ b/internal/biz/rewrite/rewrite.go @@ -64,7 +64,7 @@ func RewriteDir(dir string) { func NewRewrite(fullPath string) (*Rewrite, error) { fset := token.NewFileSet() - f, err := parser.ParseFile(fset, fullPath, nil, 0) + f, err := parser.ParseFile(fset, fullPath, nil, parser.ParseComments) if err != nil { return nil, err } diff --git a/internal/conf/conf.pb.go b/internal/conf/conf.pb.go index c49271b..c585d9c 100644 --- a/internal/conf/conf.pb.go +++ b/internal/conf/conf.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v5.28.3 +// protoc-gen-go v1.36.6 +// protoc v6.31.1 // source: conf/conf.proto package conf @@ -12,6 +12,7 @@ import ( durationpb "google.golang.org/protobuf/types/known/durationpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -22,23 +23,20 @@ const ( ) type Bootstrap struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Server *Server `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"` + Biz *Biz `protobuf:"bytes,2,opt,name=biz,proto3" json:"biz,omitempty"` + Logger *Logger `protobuf:"bytes,3,opt,name=logger,proto3" json:"logger,omitempty"` // 添加日志配置 + Data *Data `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` unknownFields protoimpl.UnknownFields - - Server *Server `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"` - Biz *Biz `protobuf:"bytes,2,opt,name=biz,proto3" json:"biz,omitempty"` - Logger *Logger `protobuf:"bytes,3,opt,name=logger,proto3" json:"logger,omitempty"` // 添加日志配置 - Data *Data `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Bootstrap) Reset() { *x = Bootstrap{} - if protoimpl.UnsafeEnabled { - mi := &file_conf_conf_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_conf_conf_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Bootstrap) String() string { @@ -49,7 +47,7 @@ func (*Bootstrap) ProtoMessage() {} func (x *Bootstrap) ProtoReflect() protoreflect.Message { mi := &file_conf_conf_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -93,21 +91,18 @@ func (x *Bootstrap) GetData() *Data { } type Server struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Http *Server_HTTP `protobuf:"bytes,1,opt,name=http,proto3" json:"http,omitempty"` + Grpc *Server_GRPC `protobuf:"bytes,2,opt,name=grpc,proto3" json:"grpc,omitempty"` unknownFields protoimpl.UnknownFields - - Http *Server_HTTP `protobuf:"bytes,1,opt,name=http,proto3" json:"http,omitempty"` - Grpc *Server_GRPC `protobuf:"bytes,2,opt,name=grpc,proto3" json:"grpc,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Server) Reset() { *x = Server{} - if protoimpl.UnsafeEnabled { - mi := &file_conf_conf_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_conf_conf_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Server) String() string { @@ -118,7 +113,7 @@ func (*Server) ProtoMessage() {} func (x *Server) ProtoReflect() protoreflect.Message { mi := &file_conf_conf_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -148,26 +143,23 @@ func (x *Server) GetGrpc() *Server_GRPC { } type Logger struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Level string `protobuf:"bytes,1,opt,name=level,proto3" json:"level,omitempty"` // 日志级别: debug, info, warn, error + FilePath string `protobuf:"bytes,2,opt,name=file_path,json=filePath,proto3" json:"file_path,omitempty"` // 日志文件路径 + Console bool `protobuf:"varint,3,opt,name=console,proto3" json:"console,omitempty"` // 是否同时输出到控制台 + MaxSize int32 `protobuf:"varint,4,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` // 单个日志文件最大大小(MB) + MaxAge int32 `protobuf:"varint,5,opt,name=max_age,json=maxAge,proto3" json:"max_age,omitempty"` // 日志文件保留天数 + MaxBackups int32 `protobuf:"varint,6,opt,name=max_backups,json=maxBackups,proto3" json:"max_backups,omitempty"` // 保留的旧日志文件最大数量 + Compress bool `protobuf:"varint,7,opt,name=compress,proto3" json:"compress,omitempty"` // 是否压缩旧日志文件 unknownFields protoimpl.UnknownFields - - Level string `protobuf:"bytes,1,opt,name=level,proto3" json:"level,omitempty"` // 日志级别: debug, info, warn, error - FilePath string `protobuf:"bytes,2,opt,name=file_path,json=filePath,proto3" json:"file_path,omitempty"` // 日志文件路径 - Console bool `protobuf:"varint,3,opt,name=console,proto3" json:"console,omitempty"` // 是否同时输出到控制台 - MaxSize int32 `protobuf:"varint,4,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` // 单个日志文件最大大小(MB) - MaxAge int32 `protobuf:"varint,5,opt,name=max_age,json=maxAge,proto3" json:"max_age,omitempty"` // 日志文件保留天数 - MaxBackups int32 `protobuf:"varint,6,opt,name=max_backups,json=maxBackups,proto3" json:"max_backups,omitempty"` // 保留的旧日志文件最大数量 - Compress bool `protobuf:"varint,7,opt,name=compress,proto3" json:"compress,omitempty"` // 是否压缩旧日志文件 + sizeCache protoimpl.SizeCache } func (x *Logger) Reset() { *x = Logger{} - if protoimpl.UnsafeEnabled { - mi := &file_conf_conf_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_conf_conf_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Logger) String() string { @@ -178,7 +170,7 @@ func (*Logger) ProtoMessage() {} func (x *Logger) ProtoReflect() protoreflect.Message { mi := &file_conf_conf_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -243,22 +235,21 @@ func (x *Logger) GetCompress() bool { } type Biz struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - FileStoragePath string `protobuf:"bytes,1,opt,name=file_storage_path,json=fileStoragePath,proto3" json:"file_storage_path,omitempty"` // 文件存储路径 - Gitlab *GitLab `protobuf:"bytes,2,opt,name=gitlab,proto3" json:"gitlab,omitempty"` // GitLab配置 - Openai *OpenAI `protobuf:"bytes,3,opt,name=openai,proto3" json:"openai,omitempty"` // OpenAI配置 + state protoimpl.MessageState `protogen:"open.v1"` + FileStoragePath string `protobuf:"bytes,1,opt,name=file_storage_path,json=fileStoragePath,proto3" json:"file_storage_path,omitempty"` // 文件存储路径 + Gitlab *GitLab `protobuf:"bytes,2,opt,name=gitlab,proto3" json:"gitlab,omitempty"` // GitLab配置 + Openai *OpenAI `protobuf:"bytes,3,opt,name=openai,proto3" json:"openai,omitempty"` // OpenAI配置 + StaticStorePath string `protobuf:"bytes,4,opt,name=staticStorePath,proto3" json:"staticStorePath,omitempty"` // 静态分析存储路径 + RuntimeStorePath string `protobuf:"bytes,5,opt,name=runtimeStorePath,proto3" json:"runtimeStorePath,omitempty"` // 运行时分析存储路径 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Biz) Reset() { *x = Biz{} - if protoimpl.UnsafeEnabled { - mi := &file_conf_conf_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_conf_conf_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Biz) String() string { @@ -269,7 +260,7 @@ func (*Biz) ProtoMessage() {} func (x *Biz) ProtoReflect() protoreflect.Message { mi := &file_conf_conf_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -305,21 +296,32 @@ func (x *Biz) GetOpenai() *OpenAI { return nil } +func (x *Biz) GetStaticStorePath() string { + if x != nil { + return x.StaticStorePath + } + return "" +} + +func (x *Biz) GetRuntimeStorePath() string { + if x != nil { + return x.RuntimeStorePath + } + return "" +} + type Data struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Dbpath string `protobuf:"bytes,1,opt,name=dbpath,proto3" json:"dbpath,omitempty"` unknownFields protoimpl.UnknownFields - - Dbpath string `protobuf:"bytes,1,opt,name=dbpath,proto3" json:"dbpath,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Data) Reset() { *x = Data{} - if protoimpl.UnsafeEnabled { - mi := &file_conf_conf_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_conf_conf_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Data) String() string { @@ -330,7 +332,7 @@ func (*Data) ProtoMessage() {} func (x *Data) ProtoReflect() protoreflect.Message { mi := &file_conf_conf_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -353,22 +355,19 @@ func (x *Data) GetDbpath() string { } type OpenAI struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ApiKey string `protobuf:"bytes,1,opt,name=api_key,json=apiKey,proto3" json:"api_key,omitempty"` + ApiBase string `protobuf:"bytes,2,opt,name=api_base,json=apiBase,proto3" json:"api_base,omitempty"` + Model string `protobuf:"bytes,3,opt,name=model,proto3" json:"model,omitempty"` unknownFields protoimpl.UnknownFields - - ApiKey string `protobuf:"bytes,1,opt,name=api_key,json=apiKey,proto3" json:"api_key,omitempty"` - ApiBase string `protobuf:"bytes,2,opt,name=api_base,json=apiBase,proto3" json:"api_base,omitempty"` - Model string `protobuf:"bytes,3,opt,name=model,proto3" json:"model,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OpenAI) Reset() { *x = OpenAI{} - if protoimpl.UnsafeEnabled { - mi := &file_conf_conf_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_conf_conf_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OpenAI) String() string { @@ -379,7 +378,7 @@ func (*OpenAI) ProtoMessage() {} func (x *OpenAI) ProtoReflect() protoreflect.Message { mi := &file_conf_conf_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -416,22 +415,19 @@ func (x *OpenAI) GetModel() string { } type GitLab struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + CloneDir string `protobuf:"bytes,3,opt,name=clone_dir,json=cloneDir,proto3" json:"clone_dir,omitempty"` unknownFields protoimpl.UnknownFields - - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` - CloneDir string `protobuf:"bytes,3,opt,name=clone_dir,json=cloneDir,proto3" json:"clone_dir,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GitLab) Reset() { *x = GitLab{} - if protoimpl.UnsafeEnabled { - mi := &file_conf_conf_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_conf_conf_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GitLab) String() string { @@ -442,7 +438,7 @@ func (*GitLab) ProtoMessage() {} func (x *GitLab) ProtoReflect() protoreflect.Message { mi := &file_conf_conf_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -479,22 +475,19 @@ func (x *GitLab) GetCloneDir() string { } type Server_HTTP struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Network string `protobuf:"bytes,1,opt,name=network,proto3" json:"network,omitempty"` + Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"` + Timeout *durationpb.Duration `protobuf:"bytes,3,opt,name=timeout,proto3" json:"timeout,omitempty"` unknownFields protoimpl.UnknownFields - - Network string `protobuf:"bytes,1,opt,name=network,proto3" json:"network,omitempty"` - Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"` - Timeout *durationpb.Duration `protobuf:"bytes,3,opt,name=timeout,proto3" json:"timeout,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Server_HTTP) Reset() { *x = Server_HTTP{} - if protoimpl.UnsafeEnabled { - mi := &file_conf_conf_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_conf_conf_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Server_HTTP) String() string { @@ -505,7 +498,7 @@ func (*Server_HTTP) ProtoMessage() {} func (x *Server_HTTP) ProtoReflect() protoreflect.Message { mi := &file_conf_conf_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -542,22 +535,19 @@ func (x *Server_HTTP) GetTimeout() *durationpb.Duration { } type Server_GRPC struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Network string `protobuf:"bytes,1,opt,name=network,proto3" json:"network,omitempty"` + Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"` + Timeout *durationpb.Duration `protobuf:"bytes,3,opt,name=timeout,proto3" json:"timeout,omitempty"` unknownFields protoimpl.UnknownFields - - Network string `protobuf:"bytes,1,opt,name=network,proto3" json:"network,omitempty"` - Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"` - Timeout *durationpb.Duration `protobuf:"bytes,3,opt,name=timeout,proto3" json:"timeout,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Server_GRPC) Reset() { *x = Server_GRPC{} - if protoimpl.UnsafeEnabled { - mi := &file_conf_conf_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_conf_conf_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Server_GRPC) String() string { @@ -568,7 +558,7 @@ func (*Server_GRPC) ProtoMessage() {} func (x *Server_GRPC) ProtoReflect() protoreflect.Message { mi := &file_conf_conf_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -606,94 +596,66 @@ func (x *Server_GRPC) GetTimeout() *durationpb.Duration { var File_conf_conf_proto protoreflect.FileDescriptor -var file_conf_conf_proto_rawDesc = []byte{ - 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x0a, 0x6b, 0x72, 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xac, 0x01, - 0x0a, 0x09, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x12, 0x2a, 0x0a, 0x06, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6b, 0x72, - 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, - 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x03, 0x62, 0x69, 0x7a, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6b, 0x72, 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x42, 0x69, 0x7a, 0x52, 0x03, 0x62, 0x69, 0x7a, 0x12, 0x2a, 0x0a, 0x06, 0x6c, 0x6f, - 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6b, 0x72, 0x61, - 0x74, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x52, 0x06, - 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6b, 0x72, 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xb8, 0x02, 0x0a, - 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6b, 0x72, 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x04, - 0x68, 0x74, 0x74, 0x70, 0x12, 0x2b, 0x0a, 0x04, 0x67, 0x72, 0x70, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6b, 0x72, 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x52, 0x04, 0x67, 0x72, 0x70, - 0x63, 0x1a, 0x69, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x1a, 0x69, 0x0a, 0x04, - 0x47, 0x52, 0x50, 0x43, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, - 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, - 0x64, 0x72, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xc6, 0x01, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x67, - 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, - 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x12, - 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x61, - 0x78, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x61, 0x78, - 0x41, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x22, 0x89, 0x01, 0x0a, 0x03, 0x42, 0x69, 0x7a, 0x12, 0x2a, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, - 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x2a, 0x0a, 0x06, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6b, 0x72, 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x52, 0x06, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, - 0x12, 0x2a, 0x0a, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x6b, 0x72, 0x61, 0x74, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x41, 0x49, 0x52, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x22, 0x1e, 0x0a, 0x04, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x22, 0x52, 0x0a, 0x06, - 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x12, - 0x19, 0x0a, 0x08, 0x61, 0x70, 0x69, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x70, 0x69, 0x42, 0x61, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x22, 0x4d, 0x0a, 0x06, 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x44, 0x69, 0x72, 0x42, - 0x1f, 0x5a, 0x1d, 0x67, 0x6f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x3b, 0x63, 0x6f, 0x6e, 0x66, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_conf_conf_proto_rawDesc = "" + + "\n" + + "\x0fconf/conf.proto\x12\n" + + "kratos.api\x1a\x1egoogle/protobuf/duration.proto\"\xac\x01\n" + + "\tBootstrap\x12*\n" + + "\x06server\x18\x01 \x01(\v2\x12.kratos.api.ServerR\x06server\x12!\n" + + "\x03biz\x18\x02 \x01(\v2\x0f.kratos.api.BizR\x03biz\x12*\n" + + "\x06logger\x18\x03 \x01(\v2\x12.kratos.api.LoggerR\x06logger\x12$\n" + + "\x04data\x18\x04 \x01(\v2\x10.kratos.api.DataR\x04data\"\xb8\x02\n" + + "\x06Server\x12+\n" + + "\x04http\x18\x01 \x01(\v2\x17.kratos.api.Server.HTTPR\x04http\x12+\n" + + "\x04grpc\x18\x02 \x01(\v2\x17.kratos.api.Server.GRPCR\x04grpc\x1ai\n" + + "\x04HTTP\x12\x18\n" + + "\anetwork\x18\x01 \x01(\tR\anetwork\x12\x12\n" + + "\x04addr\x18\x02 \x01(\tR\x04addr\x123\n" + + "\atimeout\x18\x03 \x01(\v2\x19.google.protobuf.DurationR\atimeout\x1ai\n" + + "\x04GRPC\x12\x18\n" + + "\anetwork\x18\x01 \x01(\tR\anetwork\x12\x12\n" + + "\x04addr\x18\x02 \x01(\tR\x04addr\x123\n" + + "\atimeout\x18\x03 \x01(\v2\x19.google.protobuf.DurationR\atimeout\"\xc6\x01\n" + + "\x06Logger\x12\x14\n" + + "\x05level\x18\x01 \x01(\tR\x05level\x12\x1b\n" + + "\tfile_path\x18\x02 \x01(\tR\bfilePath\x12\x18\n" + + "\aconsole\x18\x03 \x01(\bR\aconsole\x12\x19\n" + + "\bmax_size\x18\x04 \x01(\x05R\amaxSize\x12\x17\n" + + "\amax_age\x18\x05 \x01(\x05R\x06maxAge\x12\x1f\n" + + "\vmax_backups\x18\x06 \x01(\x05R\n" + + "maxBackups\x12\x1a\n" + + "\bcompress\x18\a \x01(\bR\bcompress\"\xdf\x01\n" + + "\x03Biz\x12*\n" + + "\x11file_storage_path\x18\x01 \x01(\tR\x0ffileStoragePath\x12*\n" + + "\x06gitlab\x18\x02 \x01(\v2\x12.kratos.api.GitLabR\x06gitlab\x12*\n" + + "\x06openai\x18\x03 \x01(\v2\x12.kratos.api.OpenAIR\x06openai\x12(\n" + + "\x0fstaticStorePath\x18\x04 \x01(\tR\x0fstaticStorePath\x12*\n" + + "\x10runtimeStorePath\x18\x05 \x01(\tR\x10runtimeStorePath\"\x1e\n" + + "\x04Data\x12\x16\n" + + "\x06dbpath\x18\x01 \x01(\tR\x06dbpath\"R\n" + + "\x06OpenAI\x12\x17\n" + + "\aapi_key\x18\x01 \x01(\tR\x06apiKey\x12\x19\n" + + "\bapi_base\x18\x02 \x01(\tR\aapiBase\x12\x14\n" + + "\x05model\x18\x03 \x01(\tR\x05model\"M\n" + + "\x06GitLab\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x12\x10\n" + + "\x03url\x18\x02 \x01(\tR\x03url\x12\x1b\n" + + "\tclone_dir\x18\x03 \x01(\tR\bcloneDirB\x1fZ\x1dgoanalysis/internal/conf;confb\x06proto3" var ( file_conf_conf_proto_rawDescOnce sync.Once - file_conf_conf_proto_rawDescData = file_conf_conf_proto_rawDesc + file_conf_conf_proto_rawDescData []byte ) func file_conf_conf_proto_rawDescGZIP() []byte { file_conf_conf_proto_rawDescOnce.Do(func() { - file_conf_conf_proto_rawDescData = protoimpl.X.CompressGZIP(file_conf_conf_proto_rawDescData) + file_conf_conf_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_conf_conf_proto_rawDesc), len(file_conf_conf_proto_rawDesc))) }) return file_conf_conf_proto_rawDescData } var file_conf_conf_proto_msgTypes = make([]protoimpl.MessageInfo, 9) -var file_conf_conf_proto_goTypes = []interface{}{ +var file_conf_conf_proto_goTypes = []any{ (*Bootstrap)(nil), // 0: kratos.api.Bootstrap (*Server)(nil), // 1: kratos.api.Server (*Logger)(nil), // 2: kratos.api.Logger @@ -728,121 +690,11 @@ func file_conf_conf_proto_init() { if File_conf_conf_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_conf_conf_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Bootstrap); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conf_conf_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Server); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conf_conf_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Logger); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conf_conf_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Biz); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conf_conf_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Data); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conf_conf_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenAI); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conf_conf_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GitLab); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conf_conf_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Server_HTTP); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conf_conf_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Server_GRPC); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_conf_conf_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_conf_conf_proto_rawDesc), len(file_conf_conf_proto_rawDesc)), NumEnums: 0, NumMessages: 9, NumExtensions: 0, @@ -853,7 +705,6 @@ func file_conf_conf_proto_init() { MessageInfos: file_conf_conf_proto_msgTypes, }.Build() File_conf_conf_proto = out.File - file_conf_conf_proto_rawDesc = nil file_conf_conf_proto_goTypes = nil file_conf_conf_proto_depIdxs = nil } diff --git a/internal/data/ent/static/gen/funcnode.go b/internal/data/ent/static/gen/funcnode.go index fb59a6d..555848b 100644 --- a/internal/data/ent/static/gen/funcnode.go +++ b/internal/data/ent/static/gen/funcnode.go @@ -17,8 +17,10 @@ type FuncNode struct { config `json:"-"` // ID of the ent. ID int `json:"id,omitempty"` - // Key holds the value of the "key" field. + // 短格式唯一标识,如 n6796 Key string `json:"key,omitempty"` + // 完整的函数路径,如 crypto/hmac.New$1 + FullName string `json:"full_name,omitempty"` // Pkg holds the value of the "pkg" field. Pkg string `json:"pkg,omitempty"` // Name holds the value of the "name" field. @@ -37,7 +39,7 @@ func (*FuncNode) scanValues(columns []string) ([]any, error) { switch columns[i] { case funcnode.FieldID: values[i] = new(sql.NullInt64) - case funcnode.FieldKey, funcnode.FieldPkg, funcnode.FieldName: + case funcnode.FieldKey, funcnode.FieldFullName, funcnode.FieldPkg, funcnode.FieldName: values[i] = new(sql.NullString) case funcnode.FieldCreatedAt, funcnode.FieldUpdatedAt: values[i] = new(sql.NullTime) @@ -68,6 +70,12 @@ func (fn *FuncNode) assignValues(columns []string, values []any) error { } else if value.Valid { fn.Key = value.String } + case funcnode.FieldFullName: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field full_name", values[i]) + } else if value.Valid { + fn.FullName = value.String + } case funcnode.FieldPkg: if value, ok := values[i].(*sql.NullString); !ok { return fmt.Errorf("unexpected type %T for field pkg", values[i]) @@ -131,6 +139,9 @@ func (fn *FuncNode) String() string { builder.WriteString("key=") builder.WriteString(fn.Key) builder.WriteString(", ") + builder.WriteString("full_name=") + builder.WriteString(fn.FullName) + builder.WriteString(", ") builder.WriteString("pkg=") builder.WriteString(fn.Pkg) builder.WriteString(", ") diff --git a/internal/data/ent/static/gen/funcnode/funcnode.go b/internal/data/ent/static/gen/funcnode/funcnode.go index a36a16c..dfae7b1 100644 --- a/internal/data/ent/static/gen/funcnode/funcnode.go +++ b/internal/data/ent/static/gen/funcnode/funcnode.go @@ -15,6 +15,8 @@ const ( FieldID = "id" // FieldKey holds the string denoting the key field in the database. FieldKey = "key" + // FieldFullName holds the string denoting the full_name field in the database. + FieldFullName = "full_name" // FieldPkg holds the string denoting the pkg field in the database. FieldPkg = "pkg" // FieldName holds the string denoting the name field in the database. @@ -31,6 +33,7 @@ const ( var Columns = []string{ FieldID, FieldKey, + FieldFullName, FieldPkg, FieldName, FieldCreatedAt, @@ -50,6 +53,8 @@ func ValidColumn(column string) bool { var ( // KeyValidator is a validator for the "key" field. It is called by the builders before save. KeyValidator func(string) error + // FullNameValidator is a validator for the "full_name" field. It is called by the builders before save. + FullNameValidator func(string) error // PkgValidator is a validator for the "pkg" field. It is called by the builders before save. PkgValidator func(string) error // NameValidator is a validator for the "name" field. It is called by the builders before save. @@ -73,6 +78,11 @@ func ByKey(opts ...sql.OrderTermOption) OrderOption { return sql.OrderByField(FieldKey, opts...).ToFunc() } +// ByFullName orders the results by the full_name field. +func ByFullName(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldFullName, opts...).ToFunc() +} + // ByPkg orders the results by the pkg field. func ByPkg(opts ...sql.OrderTermOption) OrderOption { return sql.OrderByField(FieldPkg, opts...).ToFunc() diff --git a/internal/data/ent/static/gen/funcnode/where.go b/internal/data/ent/static/gen/funcnode/where.go index cdf8bdd..312824d 100644 --- a/internal/data/ent/static/gen/funcnode/where.go +++ b/internal/data/ent/static/gen/funcnode/where.go @@ -59,6 +59,11 @@ func Key(v string) predicate.FuncNode { return predicate.FuncNode(sql.FieldEQ(FieldKey, v)) } +// FullName applies equality check predicate on the "full_name" field. It's identical to FullNameEQ. +func FullName(v string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldEQ(FieldFullName, v)) +} + // Pkg applies equality check predicate on the "pkg" field. It's identical to PkgEQ. func Pkg(v string) predicate.FuncNode { return predicate.FuncNode(sql.FieldEQ(FieldPkg, v)) @@ -144,6 +149,71 @@ func KeyContainsFold(v string) predicate.FuncNode { return predicate.FuncNode(sql.FieldContainsFold(FieldKey, v)) } +// FullNameEQ applies the EQ predicate on the "full_name" field. +func FullNameEQ(v string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldEQ(FieldFullName, v)) +} + +// FullNameNEQ applies the NEQ predicate on the "full_name" field. +func FullNameNEQ(v string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldNEQ(FieldFullName, v)) +} + +// FullNameIn applies the In predicate on the "full_name" field. +func FullNameIn(vs ...string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldIn(FieldFullName, vs...)) +} + +// FullNameNotIn applies the NotIn predicate on the "full_name" field. +func FullNameNotIn(vs ...string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldNotIn(FieldFullName, vs...)) +} + +// FullNameGT applies the GT predicate on the "full_name" field. +func FullNameGT(v string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldGT(FieldFullName, v)) +} + +// FullNameGTE applies the GTE predicate on the "full_name" field. +func FullNameGTE(v string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldGTE(FieldFullName, v)) +} + +// FullNameLT applies the LT predicate on the "full_name" field. +func FullNameLT(v string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldLT(FieldFullName, v)) +} + +// FullNameLTE applies the LTE predicate on the "full_name" field. +func FullNameLTE(v string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldLTE(FieldFullName, v)) +} + +// FullNameContains applies the Contains predicate on the "full_name" field. +func FullNameContains(v string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldContains(FieldFullName, v)) +} + +// FullNameHasPrefix applies the HasPrefix predicate on the "full_name" field. +func FullNameHasPrefix(v string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldHasPrefix(FieldFullName, v)) +} + +// FullNameHasSuffix applies the HasSuffix predicate on the "full_name" field. +func FullNameHasSuffix(v string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldHasSuffix(FieldFullName, v)) +} + +// FullNameEqualFold applies the EqualFold predicate on the "full_name" field. +func FullNameEqualFold(v string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldEqualFold(FieldFullName, v)) +} + +// FullNameContainsFold applies the ContainsFold predicate on the "full_name" field. +func FullNameContainsFold(v string) predicate.FuncNode { + return predicate.FuncNode(sql.FieldContainsFold(FieldFullName, v)) +} + // PkgEQ applies the EQ predicate on the "pkg" field. func PkgEQ(v string) predicate.FuncNode { return predicate.FuncNode(sql.FieldEQ(FieldPkg, v)) diff --git a/internal/data/ent/static/gen/funcnode_create.go b/internal/data/ent/static/gen/funcnode_create.go index 2f14ede..3c80eec 100644 --- a/internal/data/ent/static/gen/funcnode_create.go +++ b/internal/data/ent/static/gen/funcnode_create.go @@ -26,6 +26,12 @@ func (fnc *FuncNodeCreate) SetKey(s string) *FuncNodeCreate { return fnc } +// SetFullName sets the "full_name" field. +func (fnc *FuncNodeCreate) SetFullName(s string) *FuncNodeCreate { + fnc.mutation.SetFullName(s) + return fnc +} + // SetPkg sets the "pkg" field. func (fnc *FuncNodeCreate) SetPkg(s string) *FuncNodeCreate { fnc.mutation.SetPkg(s) @@ -121,6 +127,14 @@ func (fnc *FuncNodeCreate) check() error { return &ValidationError{Name: "key", err: fmt.Errorf(`gen: validator failed for field "FuncNode.key": %w`, err)} } } + if _, ok := fnc.mutation.FullName(); !ok { + return &ValidationError{Name: "full_name", err: errors.New(`gen: missing required field "FuncNode.full_name"`)} + } + if v, ok := fnc.mutation.FullName(); ok { + if err := funcnode.FullNameValidator(v); err != nil { + return &ValidationError{Name: "full_name", err: fmt.Errorf(`gen: validator failed for field "FuncNode.full_name": %w`, err)} + } + } if _, ok := fnc.mutation.Pkg(); !ok { return &ValidationError{Name: "pkg", err: errors.New(`gen: missing required field "FuncNode.pkg"`)} } @@ -173,6 +187,10 @@ func (fnc *FuncNodeCreate) createSpec() (*FuncNode, *sqlgraph.CreateSpec) { _spec.SetField(funcnode.FieldKey, field.TypeString, value) _node.Key = value } + if value, ok := fnc.mutation.FullName(); ok { + _spec.SetField(funcnode.FieldFullName, field.TypeString, value) + _node.FullName = value + } if value, ok := fnc.mutation.Pkg(); ok { _spec.SetField(funcnode.FieldPkg, field.TypeString, value) _node.Pkg = value diff --git a/internal/data/ent/static/gen/funcnode_query.go b/internal/data/ent/static/gen/funcnode_query.go index 6ed9e29..2221507 100644 --- a/internal/data/ent/static/gen/funcnode_query.go +++ b/internal/data/ent/static/gen/funcnode_query.go @@ -491,8 +491,8 @@ type FuncNodeSelect struct { } // Aggregate adds the given aggregation functions to the selector query. -func (fns *FuncNodeSelect) Aggregate(agg ...AggregateFunc) *FuncNodeSelect { - fns.fns = append(fns.fns, agg...) +func (fns *FuncNodeSelect) Aggregate(fnss ...AggregateFunc) *FuncNodeSelect { + fns.fns = append(fns.fns, fnss...) return fns } diff --git a/internal/data/ent/static/gen/funcnode_update.go b/internal/data/ent/static/gen/funcnode_update.go index 5a6d9ab..fa7ba23 100644 --- a/internal/data/ent/static/gen/funcnode_update.go +++ b/internal/data/ent/static/gen/funcnode_update.go @@ -42,6 +42,20 @@ func (fnu *FuncNodeUpdate) SetNillableKey(s *string) *FuncNodeUpdate { return fnu } +// SetFullName sets the "full_name" field. +func (fnu *FuncNodeUpdate) SetFullName(s string) *FuncNodeUpdate { + fnu.mutation.SetFullName(s) + return fnu +} + +// SetNillableFullName sets the "full_name" field if the given value is not nil. +func (fnu *FuncNodeUpdate) SetNillableFullName(s *string) *FuncNodeUpdate { + if s != nil { + fnu.SetFullName(*s) + } + return fnu +} + // SetPkg sets the "pkg" field. func (fnu *FuncNodeUpdate) SetPkg(s string) *FuncNodeUpdate { fnu.mutation.SetPkg(s) @@ -137,6 +151,11 @@ func (fnu *FuncNodeUpdate) check() error { return &ValidationError{Name: "key", err: fmt.Errorf(`gen: validator failed for field "FuncNode.key": %w`, err)} } } + if v, ok := fnu.mutation.FullName(); ok { + if err := funcnode.FullNameValidator(v); err != nil { + return &ValidationError{Name: "full_name", err: fmt.Errorf(`gen: validator failed for field "FuncNode.full_name": %w`, err)} + } + } if v, ok := fnu.mutation.Pkg(); ok { if err := funcnode.PkgValidator(v); err != nil { return &ValidationError{Name: "pkg", err: fmt.Errorf(`gen: validator failed for field "FuncNode.pkg": %w`, err)} @@ -165,6 +184,9 @@ func (fnu *FuncNodeUpdate) sqlSave(ctx context.Context) (n int, err error) { if value, ok := fnu.mutation.Key(); ok { _spec.SetField(funcnode.FieldKey, field.TypeString, value) } + if value, ok := fnu.mutation.FullName(); ok { + _spec.SetField(funcnode.FieldFullName, field.TypeString, value) + } if value, ok := fnu.mutation.Pkg(); ok { _spec.SetField(funcnode.FieldPkg, field.TypeString, value) } @@ -211,6 +233,20 @@ func (fnuo *FuncNodeUpdateOne) SetNillableKey(s *string) *FuncNodeUpdateOne { return fnuo } +// SetFullName sets the "full_name" field. +func (fnuo *FuncNodeUpdateOne) SetFullName(s string) *FuncNodeUpdateOne { + fnuo.mutation.SetFullName(s) + return fnuo +} + +// SetNillableFullName sets the "full_name" field if the given value is not nil. +func (fnuo *FuncNodeUpdateOne) SetNillableFullName(s *string) *FuncNodeUpdateOne { + if s != nil { + fnuo.SetFullName(*s) + } + return fnuo +} + // SetPkg sets the "pkg" field. func (fnuo *FuncNodeUpdateOne) SetPkg(s string) *FuncNodeUpdateOne { fnuo.mutation.SetPkg(s) @@ -319,6 +355,11 @@ func (fnuo *FuncNodeUpdateOne) check() error { return &ValidationError{Name: "key", err: fmt.Errorf(`gen: validator failed for field "FuncNode.key": %w`, err)} } } + if v, ok := fnuo.mutation.FullName(); ok { + if err := funcnode.FullNameValidator(v); err != nil { + return &ValidationError{Name: "full_name", err: fmt.Errorf(`gen: validator failed for field "FuncNode.full_name": %w`, err)} + } + } if v, ok := fnuo.mutation.Pkg(); ok { if err := funcnode.PkgValidator(v); err != nil { return &ValidationError{Name: "pkg", err: fmt.Errorf(`gen: validator failed for field "FuncNode.pkg": %w`, err)} @@ -364,6 +405,9 @@ func (fnuo *FuncNodeUpdateOne) sqlSave(ctx context.Context) (_node *FuncNode, er if value, ok := fnuo.mutation.Key(); ok { _spec.SetField(funcnode.FieldKey, field.TypeString, value) } + if value, ok := fnuo.mutation.FullName(); ok { + _spec.SetField(funcnode.FieldFullName, field.TypeString, value) + } if value, ok := fnuo.mutation.Pkg(); ok { _spec.SetField(funcnode.FieldPkg, field.TypeString, value) } diff --git a/internal/data/ent/static/gen/migrate/schema.go b/internal/data/ent/static/gen/migrate/schema.go index da1bd0d..110352c 100644 --- a/internal/data/ent/static/gen/migrate/schema.go +++ b/internal/data/ent/static/gen/migrate/schema.go @@ -38,6 +38,7 @@ var ( FuncNodesColumns = []*schema.Column{ {Name: "id", Type: field.TypeInt, Increment: true}, {Name: "key", Type: field.TypeString, Unique: true}, + {Name: "full_name", Type: field.TypeString}, {Name: "pkg", Type: field.TypeString}, {Name: "name", Type: field.TypeString}, {Name: "created_at", Type: field.TypeTime}, @@ -52,13 +53,18 @@ var ( { Name: "funcnode_pkg", Unique: false, - Columns: []*schema.Column{FuncNodesColumns[2]}, + Columns: []*schema.Column{FuncNodesColumns[3]}, }, { Name: "funcnode_key", Unique: true, Columns: []*schema.Column{FuncNodesColumns[1]}, }, + { + Name: "funcnode_full_name", + Unique: false, + Columns: []*schema.Column{FuncNodesColumns[2]}, + }, }, } // Tables holds all the tables in the schema. diff --git a/internal/data/ent/static/gen/mutation.go b/internal/data/ent/static/gen/mutation.go index 61cee58..d6ceeb5 100644 --- a/internal/data/ent/static/gen/mutation.go +++ b/internal/data/ent/static/gen/mutation.go @@ -524,6 +524,7 @@ type FuncNodeMutation struct { typ string id *int key *string + full_name *string pkg *string name *string _CreatedAt *time.Time @@ -668,6 +669,42 @@ func (m *FuncNodeMutation) ResetKey() { m.key = nil } +// SetFullName sets the "full_name" field. +func (m *FuncNodeMutation) SetFullName(s string) { + m.full_name = &s +} + +// FullName returns the value of the "full_name" field in the mutation. +func (m *FuncNodeMutation) FullName() (r string, exists bool) { + v := m.full_name + if v == nil { + return + } + return *v, true +} + +// OldFullName returns the old "full_name" field's value of the FuncNode entity. +// If the FuncNode object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *FuncNodeMutation) OldFullName(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldFullName is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldFullName requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldFullName: %w", err) + } + return oldValue.FullName, nil +} + +// ResetFullName resets all changes to the "full_name" field. +func (m *FuncNodeMutation) ResetFullName() { + m.full_name = nil +} + // SetPkg sets the "pkg" field. func (m *FuncNodeMutation) SetPkg(s string) { m.pkg = &s @@ -846,10 +883,13 @@ func (m *FuncNodeMutation) Type() string { // order to get all numeric fields that were incremented/decremented, call // AddedFields(). func (m *FuncNodeMutation) Fields() []string { - fields := make([]string, 0, 5) + fields := make([]string, 0, 6) if m.key != nil { fields = append(fields, funcnode.FieldKey) } + if m.full_name != nil { + fields = append(fields, funcnode.FieldFullName) + } if m.pkg != nil { fields = append(fields, funcnode.FieldPkg) } @@ -872,6 +912,8 @@ func (m *FuncNodeMutation) Field(name string) (ent.Value, bool) { switch name { case funcnode.FieldKey: return m.Key() + case funcnode.FieldFullName: + return m.FullName() case funcnode.FieldPkg: return m.Pkg() case funcnode.FieldName: @@ -891,6 +933,8 @@ func (m *FuncNodeMutation) OldField(ctx context.Context, name string) (ent.Value switch name { case funcnode.FieldKey: return m.OldKey(ctx) + case funcnode.FieldFullName: + return m.OldFullName(ctx) case funcnode.FieldPkg: return m.OldPkg(ctx) case funcnode.FieldName: @@ -915,6 +959,13 @@ func (m *FuncNodeMutation) SetField(name string, value ent.Value) error { } m.SetKey(v) return nil + case funcnode.FieldFullName: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetFullName(v) + return nil case funcnode.FieldPkg: v, ok := value.(string) if !ok { @@ -995,6 +1046,9 @@ func (m *FuncNodeMutation) ResetField(name string) error { case funcnode.FieldKey: m.ResetKey() return nil + case funcnode.FieldFullName: + m.ResetFullName() + return nil case funcnode.FieldPkg: m.ResetPkg() return nil diff --git a/internal/data/ent/static/gen/runtime.go b/internal/data/ent/static/gen/runtime.go index a872a13..6b00aa4 100644 --- a/internal/data/ent/static/gen/runtime.go +++ b/internal/data/ent/static/gen/runtime.go @@ -19,20 +19,24 @@ func init() { funcnodeDescKey := funcnodeFields[0].Descriptor() // funcnode.KeyValidator is a validator for the "key" field. It is called by the builders before save. funcnode.KeyValidator = funcnodeDescKey.Validators[0].(func(string) error) + // funcnodeDescFullName is the schema descriptor for full_name field. + funcnodeDescFullName := funcnodeFields[1].Descriptor() + // funcnode.FullNameValidator is a validator for the "full_name" field. It is called by the builders before save. + funcnode.FullNameValidator = funcnodeDescFullName.Validators[0].(func(string) error) // funcnodeDescPkg is the schema descriptor for pkg field. - funcnodeDescPkg := funcnodeFields[1].Descriptor() + funcnodeDescPkg := funcnodeFields[2].Descriptor() // funcnode.PkgValidator is a validator for the "pkg" field. It is called by the builders before save. funcnode.PkgValidator = funcnodeDescPkg.Validators[0].(func(string) error) // funcnodeDescName is the schema descriptor for name field. - funcnodeDescName := funcnodeFields[2].Descriptor() + funcnodeDescName := funcnodeFields[3].Descriptor() // funcnode.NameValidator is a validator for the "name" field. It is called by the builders before save. funcnode.NameValidator = funcnodeDescName.Validators[0].(func(string) error) // funcnodeDescCreatedAt is the schema descriptor for CreatedAt field. - funcnodeDescCreatedAt := funcnodeFields[3].Descriptor() + funcnodeDescCreatedAt := funcnodeFields[4].Descriptor() // funcnode.DefaultCreatedAt holds the default value on creation for the CreatedAt field. funcnode.DefaultCreatedAt = funcnodeDescCreatedAt.Default.(func() time.Time) // funcnodeDescUpdatedAt is the schema descriptor for UpdatedAt field. - funcnodeDescUpdatedAt := funcnodeFields[4].Descriptor() + funcnodeDescUpdatedAt := funcnodeFields[5].Descriptor() // funcnode.DefaultUpdatedAt holds the default value on creation for the UpdatedAt field. funcnode.DefaultUpdatedAt = funcnodeDescUpdatedAt.Default.(func() time.Time) } diff --git a/internal/data/ent/static/schema/funcnode.go b/internal/data/ent/static/schema/funcnode.go index 17c3d42..d071ac9 100644 --- a/internal/data/ent/static/schema/funcnode.go +++ b/internal/data/ent/static/schema/funcnode.go @@ -18,7 +18,11 @@ func (FuncNode) Fields() []ent.Field { return []ent.Field{ field.String("key"). Unique(). - NotEmpty(), + NotEmpty(). + Comment("短格式唯一标识,如 n6796"), + field.String("full_name"). + NotEmpty(). + Comment("完整的函数路径,如 crypto/hmac.New$1"), field.String("pkg"). NotEmpty(), field.String("name"). @@ -41,5 +45,6 @@ func (FuncNode) Indexes() []ent.Index { index.Fields("pkg"), index.Fields("key"). Unique(), + index.Fields("full_name"), } } diff --git a/internal/data/sqlite/file_ent.go b/internal/data/sqlite/file_ent.go index 804d67b..7967635 100644 --- a/internal/data/sqlite/file_ent.go +++ b/internal/data/sqlite/file_ent.go @@ -5,7 +5,7 @@ import ( "fmt" "entgo.io/ent/dialect" - "github.com/toheart/goanalysis/internal/biz/entity" + "github.com/toheart/goanalysis/internal/biz/filemanager/dos" "github.com/toheart/goanalysis/internal/biz/repo" "github.com/toheart/goanalysis/internal/conf" "github.com/toheart/goanalysis/internal/data/ent/file/gen" @@ -53,7 +53,7 @@ func (f *FileEntDB) initTables(ctx context.Context) error { } // SaveFileInfo 保存文件信息 -func (f *FileEntDB) SaveFileInfo(info *entity.FileInfo) error { +func (f *FileEntDB) SaveFileInfo(info *dos.FileInfo) error { ctx := context.Background() // 使用 Ent 创建文件信息 @@ -77,7 +77,7 @@ func (f *FileEntDB) SaveFileInfo(info *entity.FileInfo) error { } // GetFileInfoByID 根据ID获取文件信息 -func (f *FileEntDB) GetFileInfoByID(id int64) (*entity.FileInfo, error) { +func (f *FileEntDB) GetFileInfoByID(id int64) (*dos.FileInfo, error) { ctx := context.Background() // 查询文件信息 @@ -90,11 +90,11 @@ func (f *FileEntDB) GetFileInfoByID(id int64) (*entity.FileInfo, error) { } // 转换为业务实体 - info := &entity.FileInfo{ + info := &dos.FileInfo{ ID: fileEnt.ID, FileName: fileEnt.FileName, FilePath: fileEnt.FilePath, - FileType: entity.FileType(fileEnt.FileType), + FileType: dos.FileType(fileEnt.FileType), FileSize: fileEnt.FileSize, ContentType: fileEnt.ContentType, UploadTime: fileEnt.UploadTime, @@ -105,7 +105,7 @@ func (f *FileEntDB) GetFileInfoByID(id int64) (*entity.FileInfo, error) { } // ListFileInfos 获取文件信息列表 -func (f *FileEntDB) ListFileInfos(fileType entity.FileType, limit int, offset int) ([]*entity.FileInfo, error) { +func (f *FileEntDB) ListFileInfos(fileType dos.FileType, limit int, offset int) ([]*dos.FileInfo, error) { ctx := context.Background() // 如果 limit 为 0,设置一个默认值 @@ -131,13 +131,13 @@ func (f *FileEntDB) ListFileInfos(fileType entity.FileType, limit int, offset in } // 转换为业务实体 - var fileInfos []*entity.FileInfo + var fileInfos []*dos.FileInfo for _, fileEnt := range fileEnts { - info := &entity.FileInfo{ + info := &dos.FileInfo{ ID: int64(fileEnt.ID), FileName: fileEnt.FileName, FilePath: fileEnt.FilePath, - FileType: entity.FileType(fileEnt.FileType), + FileType: dos.FileType(fileEnt.FileType), FileSize: fileEnt.FileSize, ContentType: fileEnt.ContentType, UploadTime: fileEnt.UploadTime, @@ -148,7 +148,7 @@ func (f *FileEntDB) ListFileInfos(fileType entity.FileType, limit int, offset in // 如果没有找到记录,返回空切片而不是 nil if len(fileInfos) == 0 { - return []*entity.FileInfo{}, nil + return []*dos.FileInfo{}, nil } return fileInfos, nil diff --git a/internal/data/sqlite/funcnode_ent.go b/internal/data/sqlite/funcnode_ent.go index dba616b..3b1d5b4 100644 --- a/internal/data/sqlite/funcnode_ent.go +++ b/internal/data/sqlite/funcnode_ent.go @@ -9,6 +9,7 @@ import ( "github.com/toheart/goanalysis/internal/biz/callgraph/dos" "github.com/toheart/goanalysis/internal/biz/repo" "github.com/toheart/goanalysis/internal/data/ent/static/gen" + "github.com/toheart/goanalysis/internal/data/ent/static/gen/funcedge" "github.com/toheart/goanalysis/internal/data/ent/static/gen/funcnode" ) @@ -58,6 +59,7 @@ func (s *StaticEntDBImpl) SaveFuncNode(node *dos.FuncNode) error { _, err = s.client.FuncNode. Update(). Where(funcnode.Key(node.Key)). + SetFullName(node.FullName). SetPkg(node.Pkg). SetName(node.Name). Save(ctx) @@ -66,6 +68,7 @@ func (s *StaticEntDBImpl) SaveFuncNode(node *dos.FuncNode) error { _, err = s.client.FuncNode. Create(). SetKey(node.Key). + SetFullName(node.FullName). SetPkg(node.Pkg). SetName(node.Name). Save(ctx) @@ -113,26 +116,21 @@ func (s *StaticEntDBImpl) GetFuncNodeByKey(key string) (*dos.FuncNode, error) { // 转换为业务实体 node := &dos.FuncNode{ Key: funcEnt.Key, + FullName: funcEnt.FullName, Pkg: funcEnt.Pkg, Name: funcEnt.Name, - Parent: []string{}, - Children: []string{}, } // 获取父节点 parents, err := s.GetCallerEdges(key) if err == nil { - for _, p := range parents { - node.Parent = append(node.Parent, p.Key) - } + node.Parents = parents } // 获取子节点 children, err := s.GetCalleeEdges(key) if err == nil { - for _, c := range children { - node.Children = append(node.Children, c.Key) - } + node.Childrens = children } return node, nil @@ -143,9 +141,9 @@ func (s *StaticEntDBImpl) GetCallerEdges(calleeKey string) ([]*dos.FuncNode, err ctx := context.Background() // 查询调用该函数的节点 - callers, err := s.client.FuncNode. + callers, err := s.client.FuncEdge. Query(). - Where(funcnode.Key(calleeKey)). + Where(funcedge.CalleeKey(calleeKey)). All(ctx) if err != nil { return nil, fmt.Errorf("get caller edges failed: %w", err) @@ -154,10 +152,18 @@ func (s *StaticEntDBImpl) GetCallerEdges(calleeKey string) ([]*dos.FuncNode, err // 转换为业务实体 var nodes []*dos.FuncNode for _, caller := range callers { + funcNode, err := s.client.FuncNode. + Query(). + Where(funcnode.Key(caller.CallerKey)). + Only(ctx) + if err != nil { + return nil, fmt.Errorf("get caller node failed: %w", err) + } node := &dos.FuncNode{ - Key: caller.Key, - Pkg: caller.Pkg, - Name: caller.Name, + Key: funcNode.Key, + FullName: funcNode.FullName, + Pkg: funcNode.Pkg, + Name: funcNode.Name, } nodes = append(nodes, node) } @@ -170,9 +176,9 @@ func (s *StaticEntDBImpl) GetCalleeEdges(callerKey string) ([]*dos.FuncNode, err ctx := context.Background() // 查询调用该函数的节点 - callers, err := s.client.FuncNode. + callers, err := s.client.FuncEdge. Query(). - Where(funcnode.Key(callerKey)). + Where(funcedge.CallerKey(callerKey)). All(ctx) if err != nil { return nil, fmt.Errorf("get caller edges failed: %w", err) @@ -181,10 +187,18 @@ func (s *StaticEntDBImpl) GetCalleeEdges(callerKey string) ([]*dos.FuncNode, err // 转换为业务实体 var nodes []*dos.FuncNode for _, caller := range callers { + funcNode, err := s.client.FuncNode. + Query(). + Where(funcnode.Key(caller.CalleeKey)). + Only(ctx) + if err != nil { + return nil, fmt.Errorf("get caller node failed: %w", err) + } node := &dos.FuncNode{ - Key: caller.Key, - Pkg: caller.Pkg, - Name: caller.Name, + Key: funcNode.Key, + FullName: funcNode.FullName, + Pkg: funcNode.Pkg, + Name: funcNode.Name, } nodes = append(nodes, node) } @@ -207,9 +221,10 @@ func (s *StaticEntDBImpl) GetAllFuncNodes() ([]*dos.FuncNode, error) { var nodes []*dos.FuncNode for _, funcEnt := range funcEnts { node := &dos.FuncNode{ - Key: funcEnt.Key, - Pkg: funcEnt.Pkg, - Name: funcEnt.Name, + Key: funcEnt.Key, + FullName: funcEnt.FullName, + Pkg: funcEnt.Pkg, + Name: funcEnt.Name, } nodes = append(nodes, node) } @@ -242,6 +257,40 @@ func (s *StaticEntDBImpl) GetAllFuncEdges() ([]*dos.FuncEdge, error) { return edges, nil } +// SearchFuncNodes 模糊搜索函数节点 +func (s *StaticEntDBImpl) SearchFuncNodes(query string, limit int) ([]*dos.FuncNode, error) { + ctx := context.Background() + + // 构建模糊查询条件 + funcEnts, err := s.client.FuncNode. + Query(). + Where( + funcnode.Or( + funcnode.NameContainsFold(query), // 函数名模糊匹配(不区分大小写) + funcnode.PkgContainsFold(query), // 包名模糊匹配(不区分大小写) + ), + ). + Limit(limit). + All(ctx) + if err != nil { + return nil, fmt.Errorf("模糊搜索函数节点失败: %w", err) + } + + // 转换为业务实体 + var nodes []*dos.FuncNode + for _, funcEnt := range funcEnts { + node := &dos.FuncNode{ + Key: funcEnt.Key, + FullName: funcEnt.FullName, + Pkg: funcEnt.Pkg, + Name: funcEnt.Name, + } + nodes = append(nodes, node) + } + + return nodes, nil +} + // Close 关闭数据库连接 func (s *StaticEntDBImpl) Close() error { return s.client.Close() diff --git a/internal/data/sqlite/trace_ent.go b/internal/data/sqlite/trace_ent.go index c4763e0..3f72008 100644 --- a/internal/data/sqlite/trace_ent.go +++ b/internal/data/sqlite/trace_ent.go @@ -404,6 +404,7 @@ func (d *TraceEntDB) GetChildFunctions(parentId int64) ([]*entity.Function, erro f := entity.NewFunction(int64(item.ID), item.Name, 0, item.TimeCost, "0ms") f.ParamCount = item.ParamsCount f.Depth = item.Indent + 1 + f.Seq = item.Seq // 添加seq字段 result = append(result, f) } @@ -951,57 +952,6 @@ func (d *TraceEntDB) IsGoroutineFinished(gid uint64) (bool, error) { return goroutine.IsFinished == 1, nil } -// GetAllUnfinishedFunctions 获取所有未完成的函数 -func (d *TraceEntDB) GetAllUnfinishedFunctions(threshold int64) ([]entity.AllUnfinishedFunction, error) { - ctx := context.Background() - - // 获取最后一条trace - trace, err := d.GetLastFunction() - if err != nil { - return nil, fmt.Errorf("get last function failed: %w", err) - } - lastTraceTime, err := time.Parse(time.RFC3339Nano, trace.CreatedAt) - if err != nil { - return nil, fmt.Errorf("parse last trace time failed: %w", err) - } - - // 查询未完成的跟踪数据 - var unfinishedFunctions []entity.AllUnfinishedFunction - traces, err := d.client.TraceData.Query(). - Where(tracedata.TimeCostIsNil()). - Order(gen.Desc(tracedata.FieldCreatedAt)). - All(ctx) - if err != nil { - return nil, fmt.Errorf("find unfinished functions failed: %w", err) - } - - // 过滤超过阈值的函数 - for _, trace := range traces { - // 解析创建时间 - createTime, err := time.Parse(time.RFC3339Nano, trace.CreatedAt) - if err != nil { - continue - } - - // 计算已经过去的毫秒数 - elapsedMS := lastTraceTime.Sub(createTime).Milliseconds() - - // 只保留超过阈值的函数 - if elapsedMS > threshold { - unfinishedFunction := entity.AllUnfinishedFunction{ - Name: trace.Name, - GID: trace.Gid, - RunningTime: lastTraceTime.Sub(createTime).String(), - IsBlocking: true, - FunctionID: int64(trace.ID), - } - unfinishedFunctions = append(unfinishedFunctions, unfinishedFunction) - } - } - - return unfinishedFunctions, nil -} - func (d *TraceEntDB) SearchFunctions(ctx context.Context, dbPath string, query string, limit int32) ([]*entity.Function, int32, error) { traces, err := d.client.TraceData.Query(). Where(tracedata.NameContains(query)). diff --git a/internal/server/handler.go b/internal/server/handler.go index 8613bfd..fcc5bf9 100644 --- a/internal/server/handler.go +++ b/internal/server/handler.go @@ -6,16 +6,14 @@ import ( "io" "net/http" "os" - "path/filepath" "strconv" - "strings" "time" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" - "github.com/toheart/goanalysis/internal/biz/entity" + "github.com/toheart/goanalysis/internal/biz/filemanager/dos" ) -func (h *HttpServer) BaseHandler(mux *runtime.ServeMux, frontendDir string, fileServer http.Handler) http.HandlerFunc { +func (h *HttpServer) BaseHandler(mux *runtime.ServeMux, fileServer http.Handler) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // 检查是否是API路径 if isAPIPath(r.URL.Path) { @@ -29,25 +27,8 @@ func (h *HttpServer) BaseHandler(mux *runtime.ServeMux, frontendDir string, file return } - // 构建静态资源的完整路径 - path := filepath.Join(frontendDir, r.URL.Path) - - // 检查请求的文件是否存在 - if fileExists(path) && !strings.HasSuffix(path, "/") { - // 如果文件存在,直接提供该文件 - fileServer.ServeHTTP(w, r) - return - } - - // 如果是目录或文件不存在,返回index.html(SPA应用通常需要这样处理) - indexPath := filepath.Join(frontendDir, "index.html") - if fileExists(indexPath) { - http.ServeFile(w, r, indexPath) - return - } - - // 如果index.html也不存在,返回404 - http.NotFound(w, r) + // 尝试从嵌入的文件系统获取文件 + fileServer.ServeHTTP(w, r) } } @@ -151,10 +132,10 @@ func (h *HttpServer) HandleChunkUpload(w http.ResponseWriter, r *http.Request) { } // 确定文件类型 - fileTypeEnum := entity.FileTypeRuntime + fileTypeEnum := dos.FileTypeRuntime // 创建文件信息 - fileInfo := &entity.FileInfo{ + fileInfo := &dos.FileInfo{ FileName: fileName, FilePath: filePath, FileType: fileTypeEnum, diff --git a/internal/server/http.go b/internal/server/http.go index a3f96e7..9284e6a 100644 --- a/internal/server/http.go +++ b/internal/server/http.go @@ -5,12 +5,12 @@ import ( "encoding/json" "fmt" "net/http" - "os" "strings" "github.com/go-kratos/kratos/v2/transport" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "github.com/prometheus/client_golang/prometheus/promhttp" + "github.com/rakyll/statik/fs" "github.com/toheart/goanalysis/internal/biz/entity" "github.com/toheart/goanalysis/internal/biz/filemanager" "github.com/toheart/goanalysis/internal/biz/staticanalysis" @@ -21,6 +21,9 @@ import ( "github.com/go-kratos/kratos/v2/log" "github.com/rs/cors" + + // 导入生成的 statik 包 + _ "github.com/toheart/goanalysis/statik" ) var _ transport.Server = (*HttpServer)(nil) @@ -151,10 +154,42 @@ func sendSSEEvent(w http.ResponseWriter, data interface{}) error { return err } -// 添加一个辅助函数来检查文件是否存在 -func fileExists(path string) bool { - _, err := os.Stat(path) - return !os.IsNotExist(err) +// createSPAFileServer 创建SPA友好的文件服务器 +func (h *HttpServer) createSPAFileServer(statikFS http.FileSystem) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // 尝试打开请求的文件 + file, err := statikFS.Open(r.URL.Path) + if err == nil { + // 文件存在,提供文件内容 + defer file.Close() + + // 获取文件信息 + stat, err := file.Stat() + if err == nil && !stat.IsDir() { + http.ServeContent(w, r, stat.Name(), stat.ModTime(), file) + return + } + } + + // 文件不存在或是目录,对于SPA应用返回index.html + indexFile, err := statikFS.Open("/index.html") + if err != nil { + // 如果连index.html都不存在,返回404 + http.NotFound(w, r) + return + } + defer indexFile.Close() + + stat, err := indexFile.Stat() + if err != nil { + http.NotFound(w, r) + return + } + + // 设置正确的Content-Type + w.Header().Set("Content-Type", "text/html; charset=utf-8") + http.ServeContent(w, r, stat.Name(), stat.ModTime(), indexFile) + }) } // NewHTTPServer new an HTTP server. @@ -188,16 +223,21 @@ func NewHTTPServer(c *conf.Server, logger log.Logger, staticBiz *staticanalysis. handler.HandleFunc("/api/static/analysis/", h.handleAnalysisEvents) logHelper.Infof("SSE endpoint registered: /api/static/analysis/{taskId}") - // 定义前端目录 - frontendDir := "./web" - fileServer := http.FileServer(http.Dir(frontendDir)) + // 使用 statik 嵌入的静态文件 + statikFS, err := fs.New() + if err != nil { + logHelper.Fatalf("Failed to create statik filesystem: %v", err) + } + + // 创建SPA友好的文件服务器 + fileServer := h.createSPAFileServer(statikFS) // 创建一个处理所有请求的处理器 - rootHandler := h.BaseHandler(mux, frontendDir, fileServer) + rootHandler := h.BaseHandler(mux, fileServer) // 将根处理器包装在CORS处理器中 handler.Handle("/", corsHandler.Handler(rootHandler)) - logHelper.Infof("Root handler with CORS and static file serving registered") + logHelper.Infof("Root handler with CORS and embedded static file serving registered") serverAddr := c.Http.Addr h.server = &http.Server{ @@ -214,7 +254,7 @@ func NewHTTPServer(c *conf.Server, logger log.Logger, staticBiz *staticanalysis. } // 添加Prometheus 接口 - err := mux.HandlePath("GET", "/metrics", func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) { + err = mux.HandlePath("GET", "/metrics", func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) { promhttp.Handler().ServeHTTP(w, r) }) if err != nil { diff --git a/internal/service/analysis.go b/internal/service/analysis.go index f4eef0a..62791ca 100644 --- a/internal/service/analysis.go +++ b/internal/service/analysis.go @@ -2,8 +2,6 @@ package service import ( "context" - "errors" - "fmt" "strings" "github.com/go-kratos/kratos/v2/log" @@ -57,6 +55,7 @@ func (a *AnalysisService) GetAnalysisByGID(ctx context.Context, in *v1.AnalysisB ParamCount: int32(trace.ParamCount), TimeCost: trace.TimeCost, ParentId: int64(trace.ParentId), + Seq: trace.Seq, // 添加seq字段 } reply.TraceData = append(reply.TraceData, traceData) @@ -297,6 +296,7 @@ func (a *AnalysisService) GetChildFunctions(ctx context.Context, in *v1.GetChild TimeCost: function.TotalTime, ParamCount: int32(function.ParamCount), Depth: int32(function.Depth), + Seq: function.Seq, // 添加seq字段 }) } return reply, nil @@ -396,77 +396,6 @@ func (a *AnalysisService) InstrumentProject(ctx context.Context, in *v1.Instrume }, nil } -// GetUnfinishedFunctions 获取未完成的函数列表 -func (a *AnalysisService) GetUnfinishedFunctions(ctx context.Context, in *v1.GetUnfinishedFunctionsReq) (*v1.GetUnfinishedFunctionsReply, error) { - a.log.WithContext(ctx).Infof("GetUnfinishedFunctions request received: threshold=%d, dbpath=%s, page=%d, limit=%d", - in.Threshold, in.Dbpath, in.Page, in.Limit) - - // 参数验证 - if in.Dbpath == "" { - a.log.WithContext(ctx).Errorf("GetUnfinishedFunctions failed: dbpath is empty") - return nil, errors.New("dbpath is required") - } - - // 获取未完成函数列表 - functions, err := a.uc.GetUnfinishedFunctions(in.Dbpath, in.Threshold) - if err != nil { - a.log.WithContext(ctx).Errorf("Failed to get unfinished functions: %v", err) - return nil, fmt.Errorf("failed to get unfinished functions: %w", err) - } - - // 计算分页 - totalCount := len(functions) - page := int(in.Page) - limit := int(in.Limit) - - // 默认值处理 - if page <= 0 { - page = 1 - } - if limit <= 0 { - limit = 10 // 默认每页10条 - } - - // 计算起始和结束索引 - startIndex := (page - 1) * limit - endIndex := startIndex + limit - - // 边界检查 - if startIndex >= totalCount { - startIndex = 0 - endIndex = 0 - } else if endIndex > totalCount { - endIndex = totalCount - } - - // 获取当前页的数据 - var pagedFunctions []entity.AllUnfinishedFunction - if startIndex < endIndex { - pagedFunctions = functions[startIndex:endIndex] - } else { - pagedFunctions = []entity.AllUnfinishedFunction{} - } - - // 构建响应 - reply := &v1.GetUnfinishedFunctionsReply{ - Total: int32(totalCount), - } - - for _, function := range pagedFunctions { - reply.Functions = append(reply.Functions, &v1.GetUnfinishedFunctionsReply_UnfinishedFunction{ - Name: function.Name, - Gid: function.GID, - RunningTime: function.RunningTime, - IsBlocking: function.IsBlocking, - FunctionId: int64(function.FunctionID), - }) - } - - a.log.WithContext(ctx).Infof("Found %d unfinished functions, returning page %d with %d items", - totalCount, page, len(pagedFunctions)) - return reply, nil -} - // GetTreeGraph 获取树状图 func (a *AnalysisService) GetTreeGraph(ctx context.Context, req *v1.GetTreeGraphReq) (*v1.GetTreeGraphReply, error) { a.log.Infof("get tree graph, function: %s, dbpath: %s, chain_type: %s, depth: %d", req.FunctionName, req.DbPath, req.ChainType, req.Depth) diff --git a/internal/service/filemanager.go b/internal/service/filemanager.go index 24f80d4..86c67d3 100644 --- a/internal/service/filemanager.go +++ b/internal/service/filemanager.go @@ -10,8 +10,8 @@ import ( "github.com/go-kratos/kratos/v2/log" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" v1 "github.com/toheart/goanalysis/api/filemanager/v1" - "github.com/toheart/goanalysis/internal/biz/entity" "github.com/toheart/goanalysis/internal/biz/filemanager" + "github.com/toheart/goanalysis/internal/biz/filemanager/dos" "github.com/toheart/goanalysis/internal/server/iface" "google.golang.org/grpc" ) @@ -60,7 +60,7 @@ func (s *FileManagerService) GetFileInfo(ctx context.Context, req *v1.GetFileInf // ListFiles 获取文件列表 func (s *FileManagerService) ListFiles(ctx context.Context, req *v1.ListFilesRequest) (*v1.ListFilesReply, error) { // 转换文件类型 - fileType := entity.NewFileType(req.FileType) + fileType := dos.NewFileType(req.FileType) // 获取文件列表 fileInfos, err := s.fileBiz.ListFiles(fileType, int(req.Limit), int(req.Offset)) @@ -116,12 +116,12 @@ func (s *FileManagerService) DownloadFile(ctx context.Context, req *v1.DownloadF } // convertToProtoFileInfo 将实体文件信息转换为proto文件信息 -func convertToProtoFileInfo(fileInfo *entity.FileInfo) *v1.FileInfo { +func convertToProtoFileInfo(fileInfo *dos.FileInfo) *v1.FileInfo { var fileType v1.FileType switch fileInfo.FileType { - case entity.FileTypeRuntime: + case dos.FileTypeRuntime: fileType = v1.FileType_FILE_TYPE_RUNTIME - case entity.FileTypeStatic: + case dos.FileTypeStatic: fileType = v1.FileType_FILE_TYPE_STATIC default: fileType = v1.FileType_FILE_TYPE_UNSPECIFIED diff --git a/internal/service/staticanalysis.go b/internal/service/staticanalysis.go index b603973..4044bcd 100644 --- a/internal/service/staticanalysis.go +++ b/internal/service/staticanalysis.go @@ -6,7 +6,6 @@ import ( "os" "path/filepath" "sort" - "strings" "time" "github.com/go-kratos/kratos/v2/log" @@ -156,28 +155,6 @@ func (s *StaticAnalysisService) AnalyzeDbFile(ctx context.Context, req *v1.Analy return nil, err } - // 转换为API响应格式 - var packageDeps []*v1.PackageDependency - if result.PackageDependencies != nil { - for _, dep := range result.PackageDependencies { - packageDeps = append(packageDeps, &v1.PackageDependency{ - Source: dep.Source, - Target: dep.Target, - Count: int32(dep.Count), - }) - } - } - - var hotFuncs []*v1.HotFunction - if result.HotFunctions != nil { - for _, fn := range result.HotFunctions { - hotFuncs = append(hotFuncs, &v1.HotFunction{ - Name: fn.Name, - CallCount: int32(fn.CallCount), - }) - } - } - s.log.Infof("Database analysis completed, found %d functions, %d calls, %d packages", result.TotalFunctions, result.TotalCalls, result.TotalPackages) @@ -185,8 +162,8 @@ func (s *StaticAnalysisService) AnalyzeDbFile(ctx context.Context, req *v1.Analy TotalFunctions: int32(result.TotalFunctions), TotalCalls: int32(result.TotalCalls), TotalPackages: int32(result.TotalPackages), - PackageDependencies: packageDeps, - HotFunctions: hotFuncs, + PackageDependencies: nil, // 移除包依赖关系分析 + HotFunctions: nil, // 移除热点函数分析 }, nil } @@ -330,9 +307,9 @@ func (s *StaticAnalysisService) GetFunctionAnalysis(ctx context.Context, req *v1 // GetFunctionCallGraph 获取函数调用关系图 func (s *StaticAnalysisService) GetFunctionCallGraph(ctx context.Context, req *v1.GetFunctionCallGraphReq) (*v1.GetFunctionCallGraphReply, error) { // 验证函数名称 - if req.FunctionName == "" { - s.log.Error("Function name cannot be empty") - return nil, fmt.Errorf("Function name cannot be empty") + if req.FunctionKey == "" { + s.log.Error("Function key cannot be empty") + return nil, fmt.Errorf("Function key cannot be empty") } // 设置默认值 @@ -349,8 +326,8 @@ func (s *StaticAnalysisService) GetFunctionCallGraph(ctx context.Context, req *v return nil, fmt.Errorf("Invalid direction: %s, should be 'caller', 'callee' or 'both'", direction) } - s.log.Infof("Getting call graph for function %s, depth: %d, direction: %s", req.FunctionName, depth, direction) - nodes, edges, err := s.uc.GetFunctionCallGraph(req.FunctionName, depth, direction) + s.log.Infof("Getting call graph for function %s, depth: %d, direction: %s", req.FunctionKey, depth, direction) + nodes, edges, err := s.uc.GetFunctionCallGraph(req.FunctionKey, depth, direction) if err != nil { s.log.Errorf("Failed to get function call graph: %v", err) return nil, err @@ -359,7 +336,7 @@ func (s *StaticAnalysisService) GetFunctionCallGraph(ctx context.Context, req *v var protoNodes []*v1.GetFunctionCallGraphReply_GraphNode for _, node := range nodes { protoNodes = append(protoNodes, &v1.GetFunctionCallGraphReply_GraphNode{ - Id: node.ID, + Key: node.ID, Name: node.Name, Package: node.Package, CallCount: int32(node.CallCount), @@ -392,20 +369,11 @@ type staticDbFile struct { CreateTime time.Time `json:"createTime"` } -// 分析结果结构 +// 分析结果结构(简化版:仅包含基本统计信息) type staticAnalysisResult struct { - TotalFunctions int `json:"totalFunctions"` - TotalCalls int `json:"totalCalls"` - TotalPackages int `json:"totalPackages"` - PackageDependencies []struct { - Source string `json:"source"` - Target string `json:"target"` - Count int `json:"count"` - } `json:"packageDependencies"` - HotFunctions []struct { - Name string `json:"name"` - CallCount int `json:"callCount"` - } `json:"hotFunctions"` + TotalFunctions int `json:"totalFunctions"` + TotalCalls int `json:"totalCalls"` + TotalPackages int `json:"totalPackages"` } // 获取数据库文件列表 @@ -420,28 +388,27 @@ func (s *StaticAnalysisService) getDbFiles() ([]staticDbFile, error) { s.log.Infof("Getting database files from directory %s", dbPath) - files, err := os.ReadDir(dbPath) - if err != nil { - s.log.Errorf("Failed to read database directory: %v", err) - return nil, fmt.Errorf("Failed to read database directory: %v", err) - } - var dbFiles []staticDbFile - for _, file := range files { - if filepath.Ext(file.Name()) == ".db" { - info, err := file.Info() - if err != nil { - s.log.Warnf("Failed to get file info: %s, error: %v", file.Name(), err) - continue - } + err := filepath.Walk(dbPath, func(path string, info os.FileInfo, err error) error { + if err != nil { + s.log.Warnf("Failed to access path %s: %v", path, err) + return nil + } + if !info.IsDir() && filepath.Ext(path) == ".db" { dbFiles = append(dbFiles, staticDbFile{ - Path: filepath.Join(dbPath, file.Name()), - Name: file.Name(), + Path: path, + Name: info.Name(), Size: info.Size(), CreateTime: info.ModTime(), }) } + return nil + }) + + if err != nil { + s.log.Errorf("Failed to walk database directory: %v", err) + return nil, fmt.Errorf("Failed to walk database directory: %v", err) } // 按创建时间降序排序,最新的文件排在前面 @@ -453,7 +420,7 @@ func (s *StaticAnalysisService) getDbFiles() ([]staticDbFile, error) { return dbFiles, nil } -// 从数据库中读取实际的调用图数据 +// 从数据库中读取实际的调用图数据(优化后:仅统计基本信息,移除包依赖和热点函数分析) func (s *StaticAnalysisService) analyzeDbReal(dbPath string) (*staticAnalysisResult, error) { // 验证文件是否存在 if _, err := os.Stat(dbPath); err != nil { @@ -469,127 +436,32 @@ func (s *StaticAnalysisService) analyzeDbReal(dbPath string) (*staticAnalysisRes return nil, fmt.Errorf("Failed to get database connection: %v", err) } - // 获取所有函数节点 + // 获取所有函数节点(只为统计数量和包数量) nodes, err := funcNodeDB.GetAllFuncNodes() if err != nil { s.log.Errorf("Failed to get function nodes: %v", err) return nil, fmt.Errorf("Failed to get function nodes: %v", err) } - // 获取所有函数调用边 + // 获取所有函数调用边(只为统计数量) edges, err := funcNodeDB.GetAllFuncEdges() if err != nil { s.log.Errorf("Failed to get function edges: %v", err) return nil, fmt.Errorf("Failed to get function edges: %v", err) } - // 统计包依赖关系 - packageDeps := make(map[string]map[string]int) - for _, edge := range edges { - // 获取调用方和被调用方的节点 - caller, err := funcNodeDB.GetFuncNodeByKey(edge.CallerKey) - if err != nil || caller == nil { - continue - } - - callee, err := funcNodeDB.GetFuncNodeByKey(edge.CalleeKey) - if err != nil || callee == nil { - continue - } - - // 如果调用方和被调用方的包不同,则记录包依赖关系 - if caller.Pkg != callee.Pkg { - if _, ok := packageDeps[caller.Pkg]; !ok { - packageDeps[caller.Pkg] = make(map[string]int) - } - packageDeps[caller.Pkg][callee.Pkg]++ - } - } - - // 统计热点函数(被调用次数最多的函数) - funcCallCounts := make(map[string]int) - for _, edge := range edges { - funcCallCounts[edge.CalleeKey]++ - } - - // 转换包依赖关系为结果格式 - var packageDependencies []struct { - Source string `json:"source"` - Target string `json:"target"` - Count int `json:"count"` - } - - for source, targets := range packageDeps { - for target, count := range targets { - packageDependencies = append(packageDependencies, struct { - Source string `json:"source"` - Target string `json:"target"` - Count int `json:"count"` - }{ - Source: source, - Target: target, - Count: count, - }) - } - } - - // 按依赖关系数量排序 - sort.Slice(packageDependencies, func(i, j int) bool { - return packageDependencies[i].Count > packageDependencies[j].Count - }) - - // 限制返回的包依赖关系数量 - if len(packageDependencies) > 20 { - packageDependencies = packageDependencies[:20] - } - - // 转换热点函数为结果格式 - var hotFunctions []struct { - Name string `json:"name"` - CallCount int `json:"callCount"` - } - - // 创建一个函数键到函数节点的映射 - funcNodeMap := make(map[string]*dos.FuncNode) - for _, node := range nodes { - funcNodeMap[node.Key] = node - } - - // 将函数调用次数转换为热点函数列表 - for key, count := range funcCallCounts { - if node, ok := funcNodeMap[key]; ok { - hotFunctions = append(hotFunctions, struct { - Name string `json:"name"` - CallCount int `json:"callCount"` - }{ - Name: fmt.Sprintf("%s.%s", node.Pkg, node.Name), - CallCount: count, - }) - } - } - - // 按调用次数排序 - sort.Slice(hotFunctions, func(i, j int) bool { - return hotFunctions[i].CallCount > hotFunctions[j].CallCount - }) - - // 限制返回的热点函数数量 - if len(hotFunctions) > 20 { - hotFunctions = hotFunctions[:20] - } - - // 统计包的数量 + // 统计包的数量(优化:使用map去重) packages := make(map[string]bool) for _, node := range nodes { - packages[node.Pkg] = true + if node.Pkg != "" { + packages[node.Pkg] = true + } } result := &staticAnalysisResult{ - TotalFunctions: len(nodes), - TotalCalls: len(edges), - TotalPackages: len(packages), - PackageDependencies: packageDependencies, - HotFunctions: hotFunctions, + TotalFunctions: len(nodes), + TotalCalls: len(edges), + TotalPackages: len(packages), } s.log.Infof("Database analysis completed, found %d functions, %d calls, %d packages", @@ -782,54 +654,25 @@ func (s *StaticAnalysisService) SearchFunctions(ctx context.Context, req *v1.Sea return nil, fmt.Errorf("Failed to get database connection: %v", err) } - // 获取所有函数节点 - nodes, err := funcNodeDB.GetAllFuncNodes() - if err != nil { - s.log.Errorf("Failed to get function nodes: %v", err) - return nil, fmt.Errorf("Failed to get function nodes: %v", err) - } - s.log.Infof("Total function nodes: %d", len(nodes)) + // 设置查询限制 + maxResults := 50 - // 获取所有函数调用边 - edges, err := funcNodeDB.GetAllFuncEdges() + // 使用数据库模糊查询 + nodes, err := funcNodeDB.SearchFuncNodes(req.Query, maxResults) if err != nil { - s.log.Errorf("Failed to get function edges: %v", err) - return nil, fmt.Errorf("Failed to get function edges: %v", err) - } - s.log.Infof("Total function edges: %d", len(edges)) - - // 统计函数被调用次数 - funcCallCounts := make(map[string]int) - for _, edge := range edges { - funcCallCounts[edge.CalleeKey]++ + s.log.Errorf("Failed to search function nodes: %v", err) + return nil, fmt.Errorf("Failed to search function nodes: %v", err) } - // 模糊搜索函数 - query := strings.ToLower(req.Query) + // 转换为API响应格式 var matchedFunctions []*v1.FunctionInfo - for _, node := range nodes { - // 检查函数名或包名是否包含查询字符串 - if strings.Contains(strings.ToLower(node.Name), query) || - strings.Contains(strings.ToLower(node.Pkg), query) { - matchedFunctions = append(matchedFunctions, &v1.FunctionInfo{ - Key: node.Key, - Name: node.Name, - Package: node.Pkg, - CallCount: int32(funcCallCounts[node.Key]), - }) - } - } - - // 按调用次数排序 - sort.Slice(matchedFunctions, func(i, j int) bool { - return matchedFunctions[i].CallCount > matchedFunctions[j].CallCount - }) - - // 限制返回的结果数量 - maxResults := 50 - if len(matchedFunctions) > maxResults { - matchedFunctions = matchedFunctions[:maxResults] + matchedFunctions = append(matchedFunctions, &v1.FunctionInfo{ + Key: node.Key, + Name: node.Name, + Package: node.Pkg, + CallCount: 0, // 不计算调用次数,提高性能 + }) } s.log.Infof("Found %d matching functions for query: %s", len(matchedFunctions), req.Query) @@ -837,12 +680,11 @@ func (s *StaticAnalysisService) SearchFunctions(ctx context.Context, req *v1.Sea // 打印前几个匹配结果的详细信息 if len(matchedFunctions) > 0 { for i := 0; i < min(5, len(matchedFunctions)); i++ { - s.log.Infof("Match %d: Key=%s, Name=%s, Package=%s, CallCount=%d", + s.log.Infof("Match %d: Key=%s, Name=%s, Package=%s", i+1, matchedFunctions[i].Key, matchedFunctions[i].Name, - matchedFunctions[i].Package, - matchedFunctions[i].CallCount) + matchedFunctions[i].Package) } } @@ -912,7 +754,7 @@ func (s *StaticAnalysisService) GetFunctionUpstream(ctx context.Context, req *v1 // 添加目标节点 graphNodes = append(graphNodes, &v1.GraphNode{ - Id: targetNode.Key, + Key: targetNode.Key, Name: targetNode.Name, Package: targetNode.Pkg, CallCount: int32(funcCallCounts[targetNode.Key]), @@ -969,7 +811,7 @@ func (s *StaticAnalysisService) findAllUpstreamCalls( // 添加节点 *graphNodes = append(*graphNodes, &v1.GraphNode{ - Id: callerNode.Key, + Key: callerNode.Key, Name: callerNode.Name, Package: callerNode.Pkg, CallCount: int32(funcCallCounts[callerNode.Key]), @@ -1000,7 +842,7 @@ func (s *StaticAnalysisService) findTopLevelCallers(nodes []*v1.GraphNode, edges // 找出没有被调用的节点(最顶层调用函数) var topLevelNodes []*v1.GraphNode for _, node := range nodes { - if !hasCallers[node.Id] && node.Id != "" { + if !hasCallers[node.Key] && node.Key != "" { topLevelNodes = append(topLevelNodes, node) } } @@ -1061,7 +903,7 @@ func (s *StaticAnalysisService) GetFunctionDownstream(ctx context.Context, req * // 添加目标节点 graphNodes = append(graphNodes, &v1.GraphNode{ - Id: targetNode.Key, + Key: targetNode.Key, Name: targetNode.Name, Package: targetNode.Pkg, CallCount: int32(funcCallCounts[targetNode.Key]), @@ -1118,7 +960,7 @@ func (s *StaticAnalysisService) findAllDownstreamCalls( // 添加节点 *graphNodes = append(*graphNodes, &v1.GraphNode{ - Id: calleeNode.Key, + Key: calleeNode.Key, Name: calleeNode.Name, Package: calleeNode.Pkg, CallCount: int32(funcCallCounts[calleeNode.Key]), @@ -1149,7 +991,7 @@ func (s *StaticAnalysisService) findLeafNodes(nodes []*v1.GraphNode, edges []*v1 // 找出没有调用其他节点的节点(叶子节点) var leafNodes []*v1.GraphNode for _, node := range nodes { - if !hasCallees[node.Id] { + if !hasCallees[node.Key] { leafNodes = append(leafNodes, node) } } @@ -1211,7 +1053,7 @@ func (s *StaticAnalysisService) GetFunctionFullChain(ctx context.Context, req *v // 添加目标节点 graphNodes = append(graphNodes, &v1.GraphNode{ - Id: targetNode.Key, + Key: targetNode.Key, Name: targetNode.Name, Package: targetNode.Pkg, CallCount: int32(funcCallCounts[targetNode.Key]), @@ -1243,8 +1085,8 @@ func (s *StaticAnalysisService) mergeNodes(nodes []*v1.GraphNode) []*v1.GraphNod nodeMap := make(map[string]*v1.GraphNode) for _, node := range nodes { - if _, exists := nodeMap[node.Id]; !exists { - nodeMap[node.Id] = node + if _, exists := nodeMap[node.Key]; !exists { + nodeMap[node.Key] = node } } @@ -1258,10 +1100,10 @@ func (s *StaticAnalysisService) mergeNodes(nodes []*v1.GraphNode) []*v1.GraphNod // GetTreeGraph 获取静态分析树状图数据 func (s *StaticAnalysisService) GetTreeGraph(ctx context.Context, req *v1.GetTreeGraphReq) (*v1.GetTreeGraphReply, error) { - s.log.Infof("get tree graph, function: %s, dbpath: %s", req.FunctionName, req.DbPath) + s.log.Infof("get tree graph, function: %s, dbpath: %s", req.FunctionKey, req.DbPath) // 调用业务逻辑获取树状图数据 - treeGraph, err := s.uc.GetTreeGraph(req.FunctionName, req.DbPath) + treeGraph, err := s.uc.GetTreeGraph(req.FunctionKey, req.DbPath) if err != nil { s.log.Errorf("get tree graph failed: %v", err) return nil, err @@ -1297,3 +1139,22 @@ func (s *StaticAnalysisService) convertTreeNodeToProto(node *entity.TreeNode) *v return protoNode } + +// findFunctionByKey 通过函数Key查找函数节点 +func (s *StaticAnalysisService) findFunctionByKey(funcNodeDB repo.StaticDBStore, functionKey string) (*dos.FuncNode, error) { + // 直接通过Key查找函数节点 + node, err := funcNodeDB.GetFuncNodeByKey(functionKey) + if err != nil { + return nil, fmt.Errorf("Failed to get function node by key: %s", err) + } + + if node == nil { + return nil, fmt.Errorf("Function not found with key: %s", functionKey) + } + + return node, nil +} + +// GetFunctionMindMap 已删除 - 已替换为树形表格功能 + +// 思维导图相关辅助方法已删除 - 已替换为树形表格功能 diff --git a/openapi.yaml b/openapi.yaml index 3402445..4207b81 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -459,25 +459,6 @@ paths: application/json: schema: $ref: '#/components/schemas/analysis.v1.GetTreeGraphByGIDReply' - /api/runtime/unfinished-functions: - post: - tags: - - Analysis - description: GetUnfinishedFunctions 获取未完成的函数列表 - operationId: Analysis_GetUnfinishedFunctions - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/analysis.v1.GetUnfinishedFunctionsReq' - required: true - responses: - "200": - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/analysis.v1.GetUnfinishedFunctionsReply' /api/runtime/verify/path: post: tags: @@ -631,7 +612,7 @@ paths: description: 获取函数调用关系图 operationId: StaticAnalysis_GetFunctionCallGraph parameters: - - name: functionName + - name: functionKey in: query schema: type: string @@ -651,14 +632,14 @@ paths: application/json: schema: $ref: '#/components/schemas/staticanalysis.v1.GetFunctionCallGraphReply' - /api/static/function/{functionName}/graph: + /api/static/function/{functionKey}/graph: get: tags: - StaticAnalysis description: 获取函数调用关系图 operationId: StaticAnalysis_GetFunctionCallGraph parameters: - - name: functionName + - name: functionKey in: path required: true schema: @@ -839,6 +820,8 @@ components: type: string parentId: type: string + seq: + type: string analysis.v1.AnalysisByGIDRequest: type: object properties: @@ -913,6 +896,8 @@ components: depth: type: integer format: int32 + seq: + type: string analysis.v1.GetAllFunctionNameReply: type: object properties: @@ -1192,6 +1177,8 @@ components: type: string parentId: type: string + seq: + type: string analysis.v1.GetTracesByParentFuncReq: type: object properties: @@ -1237,44 +1224,6 @@ components: type: integer format: int32 description: 获取树状图请求 - analysis.v1.GetUnfinishedFunctionsReply: - type: object - properties: - functions: - type: array - items: - $ref: '#/components/schemas/analysis.v1.GetUnfinishedFunctionsReply_UnfinishedFunction' - total: - type: integer - format: int32 - description: GetUnfinishedFunctions 响应 - analysis.v1.GetUnfinishedFunctionsReply_UnfinishedFunction: - type: object - properties: - name: - type: string - gid: - type: string - runningTime: - type: string - isBlocking: - type: boolean - functionId: - type: string - analysis.v1.GetUnfinishedFunctionsReq: - type: object - properties: - dbpath: - type: string - threshold: - type: string - page: - type: integer - format: int32 - limit: - type: integer - format: int32 - description: GetUnfinishedFunctions 请求 analysis.v1.InstrumentProjectReply: type: object properties: @@ -1607,7 +1556,7 @@ components: staticanalysis.v1.GetFunctionCallGraphReply_GraphNode: type: object properties: - id: + key: type: string name: type: string @@ -1627,6 +1576,11 @@ components: type: string functionKey: type: string + functionPackage: + type: string + depth: + type: integer + format: int32 description: 获取函数下游调用关系请求 staticanalysis.v1.GetFunctionDownstreamResponse: type: object @@ -1667,6 +1621,11 @@ components: type: string functionKey: type: string + functionPackage: + type: string + depth: + type: integer + format: int32 description: 获取函数上游调用关系请求 staticanalysis.v1.GetFunctionUpstreamResponse: type: object @@ -1763,7 +1722,7 @@ components: properties: dbPath: type: string - functionName: + functionKey: type: string description: 获取树状图请求 staticanalysis.v1.GitLabRepository: @@ -1805,7 +1764,7 @@ components: staticanalysis.v1.GraphNode: type: object properties: - id: + key: type: string name: type: string