1. 29 Apr, 2026 1 commit
    • erio's avatar
      feat(ops): allow retention days = 0 to wipe table on each scheduled cleanup · 4b6954f9
      erio authored
      Background / 背景
      
      The ops cleanup task currently rejects retention days < 1 in both validate
      and normalize, so operators who want minimal-history setups (e.g. high
      churn deployments that prefer near-realtime cleanup) cannot express that
      intent through the UI. The only options are 1+ days, which keeps at least
      24h of history regardless of cron frequency.
      
      ops 清理任务目前在 validate 和 normalize 两处都拒绝小于 1 的保留天数,
      让希望尽量不留历史的运维场景(高吞吐部署 + 想用近实时清理)无法通过 UI
      表达。最低只能配 1,等于不管 cron 多频繁,至少都会保留 24 小时的历史。
      
      Purpose / 目的
      
      Let admins set retention days to 0, meaning "every scheduled cleanup
      run wipes the corresponding table(s) entirely". Combined with a more
      frequent cron (e.g. `0 * * * *`) this yields effectively rolling cleanup.
      
      允许管理员把保留天数设为 0,语义为"每次定时清理时把对应表全部清空"。
      搭配更频繁的 cron(比如每小时整点)即可获得近似滚动清理的效果。
      
      Changes / 改动内容
      
      Backend
      
      - service/ops_settings.go: validate accepts [0, 365]; normalize only
        refills default 30 when value is < 0 (negative is treated as legacy
        bad data, 0 is honoured)
      - service/ops_cleanup_service.go: introduce `opsCleanupPlan(now, days)`
        returning `(cutoff, truncate, ok)`. days==0 returns truncate=true and
        short-circuits to a new `truncateOpsTable` helper that uses
        `TRUNCATE TABLE` (O(1), no WAL, no VACUUM pressure). days>0 keeps
        the existing batched DELETE path unchanged. Empty tables skip
        TRUNCATE to avoid the ACCESS EXCLUSIVE lock entirely
      - Extract `isMissingRelationError` helper to dedupe the "table not
        yet created" tolerance shared by both delete and truncate paths
      - Add unit tests for `opsCleanupPlan` (three branches) and
        `isMissingRelationError`
      
      后端
      
      - service/ops_settings.go: validate 接受 [0, 365];normalize 仅在 < 0
        时回填默认 30(负数视为脏数据,0 被尊重)
      - service/ops_cleanup_service.go: 抽 `opsCleanupPlan(now, days)` 返回
        `(cutoff, truncate, ok)`。days==0 → truncate=true,走新增
        `truncateOpsTable`(TRUNCATE TABLE,O(1),无 WAL、无 VACUUM 压力);
        days>0 仍走原批量 DELETE 路径,行为完全不变。空表跳过 TRUNCATE,
        避免无意义的 ACCESS EXCLUSIVE 锁
      - 抽 `isMissingRelationError` helper 复用 delete / truncate 两处的
        "表不存在"宽容判断
      - 补 `opsCleanupPlan` 三分支 + `isMissingRelationError` 单元测试
      
      Frontend
      
      - OpsSettingsDialog.vue: validation accepts [0, 365]; input min=0
      - i18n (zh/en): hint mentions "0 = wipe all on every cleanup",
        validation message updated to 0-365 range
      
      前端
      
      - OpsSettingsDialog.vue: 校验放宽到 [0, 365],input min 改 0
      - i18n(zh/en):hint 补"0 = 每次清理时清空所有",错误提示改 0-365
      
      Trade-offs / 取舍
      
      - TRUNCATE requires ACCESS EXCLUSIVE lock briefly, but ops tables only
        have the cleanup task as a writer, so the lock is invisible to other
        workloads
      - Empty-table guard avoids the lock when there is nothing to clean
      - Negative values are still treated as legacy bad data and replaced
        with default 30 to preserve compatibility
      4b6954f9
  2. 21 Apr, 2026 1 commit
    • erio's avatar
      feat(channel-monitor): aggregate history to daily rollups + soft delete · 8cf83c98
      erio authored
      明细只保留 1 天,超过 1 天聚合到新表 channel_monitor_daily_rollups(按
      monitor_id/model/bucket_date 维度),聚合保留 30 天。两张表都用 SoftDeleteMixin
      软删除(DELETE 自动改为 UPDATE deleted_at = NOW())。
      
      聚合 + 清理任务由 OpsCleanupService 的 cron 统一调度,与运维监控的清理共享
      schedule(默认 0 2 * * *)和 leader lock。ChannelMonitorRunner 的 cleanupLoop
      被移除,只保留 dueCheckLoop。
      
      读取路径 ComputeAvailability* 改为 UNION 明细(今天 deleted_at IS NULL)+
      聚合(过去 windowDays 天 deleted_at IS NULL),SUM(ok)/SUM(total) 自然加权
      计算可用率,AVG latency 用 SUM(sum_latency_ms)/SUM(count_latency)。
      
      watermark 表 channel_monitor_aggregation_watermark 单行(id=1),记录
      last_aggregated_date,重启后从该日期 +1 继续聚合,首次为 nil 则从
      today - 30d 开始回填,单次最多 35 天上限避免长事务。
      
      raw SQL 的 ListLatestPerModel / ListLatestForMonitorIDs / ListRecentHistoryForMonitors
      都补上 deleted_at IS NULL 过滤(SoftDeleteMixin interceptor 只对 ent query 生效)。
      
      bump version to 0.1.114.28
      
      GroupBadge 在 MonitorKeyPickerDialog 中复用平台主题色 + 倍率/专属倍率
      (顺手优化)。
      8cf83c98
  3. 12 Feb, 2026 2 commits
  4. 15 Jan, 2026 1 commit
    • IanShaw027's avatar
      refactor(ops): 优化任务心跳和组件刷新机制 · 23aa69f5
      IanShaw027 authored
      后端改动:
      - 添加 ops_job_heartbeats.last_result 字段记录任务执行结果
      - 优化告警评估器统计信息(规则数/事件数/邮件数)
      - 统一各定时任务的心跳记录格式
      
      前端改动:
      - 重构 OpsConcurrencyCard 使用父组件统一控制刷新节奏
      - 移除独立的 5 秒刷新定时器,改用 refreshToken 机制
      - 修复 TypeScript 类型错误
      23aa69f5
  5. 11 Jan, 2026 3 commits
    • IanShaw027's avatar
      fix(ci): 修复剩余的CI错误 · 19b67e89
      IanShaw027 authored
      - 修复 ops_repo_latency_histogram_buckets.go 中另一个函数的 WriteString 未检查错误
      - 修复 ops_repo_request_details.go 和 ops_repo_trends.go 中的 Rows.Close 未检查错误
      - 修复 ops_alert_models.go, ops_cleanup_service.go, ops_request_details.go 的格式化问题
      - 移除 ops_retry.go 中未使用的 status 字段
      - 修复 maxTime 函数重复声明(将测试文件中的函数重命名为 testMaxTime)
      19b67e89
    • IanShaw027's avatar
      fix(lint): 修复代码格式和未使用变量问题 · ce3336e3
      IanShaw027 authored
      - 修复 ops_ws_handler.go 中的代码格式和返回值
      - 移除 ops_repo_latency_histogram_buckets.go 中不必要的错误检查
      - 修复 api_contract_test.go 缩进并添加运维监控配置项测试
      - 移除 ops_cleanup_service.go 中未使用的变量
      - 添加 ops_retry.go 中缺失的 status 字段
      ce3336e3
    • IanShaw027's avatar
      fix(lint): 修复所有golangci-lint错误 · 54c5788b
      IanShaw027 authored
      - 修复depguard错误:为ops service文件添加redis导入例外
      - 修复errcheck错误:添加错误检查和类型断言检查
      - 修复gofmt错误:格式化代码
      - 修复ineffassign错误:移除无效的idx++赋值
      - 修复staticcheck错误:合并条件赋值
      - 修复unused错误:移除未使用的字段和函数
        - ops_cleanup_service.go: entryID字段
        - ops_retry.go: status字段
        - ops_upstream_context.go: getOpsUpstreamErrors函数
      54c5788b
  6. 09 Jan, 2026 2 commits
    • IanShaw027's avatar
      feat(运维监控): 增强监控功能和健康评分系统 · 585257d3
      IanShaw027 authored
      后端改进:
      - 新增健康评分计算服务(ops_health_score.go)
      - 添加分布式锁支持(ops_advisory_lock.go)
      - 优化指标采集和聚合逻辑
      - 新增运维指标采集间隔配置(60-3600秒)
      - 移除未使用的WebSocket查询token认证中间件
      - 改进清理服务和告警评估逻辑
      
      前端改进:
      - 简化OpsDashboard组件结构
      - 完善国际化文本(中英文)
      - 新增运维监控相关API类型定义
      - 添加运维指标采集间隔设置界面
      - 优化错误详情模态框
      
      测试:
      - 添加健康评分单元测试
      - 更新API契约测试
      585257d3
    • IanShaw027's avatar
      feat(service): 实现运维监控业务逻辑层 · 5baa8b56
      IanShaw027 authored
      - 新增 ops 主服务(ops_service.go)和端口定义(ops_port.go)
      - 实现账号可用性检查服务(ops_account_availability.go)
      - 实现数据聚合服务(ops_aggregation_service.go)
      - 实现告警评估服务(ops_alert_evaluator_service.go)
      - 实现告警管理服务(ops_alerts.go)
      - 实现数据清理服务(ops_cleanup_service.go)
      - 实现并发控制服务(ops_concurrency.go)
      - 实现仪表板服务(ops_dashboard.go)
      - 实现错误处理服务(ops_errors.go)
      - 实现直方图服务(ops_histograms.go)
      - 实现指标采集服务(ops_metrics_collector.go)
      - 实现查询模式服务(ops_query_mode.go)
      - 实现实时监控服务(ops_realtime.go)
      - 实现请求详情服务(ops_request_details.go)
      - 实现重试机制服务(ops_retry.go)
      - 实现配置管理服务(ops_settings.go)
      - 实现趋势分析服务(ops_trends.go)
      - 实现窗口统计服务(ops_window_stats.go)
      - 添加 ops 相关领域常量
      - 注册 service 依赖注入
      5baa8b56