返回博客

Metrics 作为 Ontology:统一业务指标与运营监控

传统方式:Metrics 和业务数据是两个世界

Coomia发布于 2025年8月14日18 分钟阅读
分享本文Twitter / X

Metrics 作为 Ontology:统一业务指标与运营监控

系列:S4 本体建模 · 第 10 篇 | 难度:中级 | 阅读时间:18 分钟

#TL;DR

  • Metrics 不再是独立系统——coomia-dip 将监控指标(CPU、延迟、错误率)和业务 KPI(收入、转化率、客户满意度)统一纳入 Ontology 模型,成为 ObjectType 的一等公民属性。
  • MetricSource 定义了指标的采集、聚合和存储规则——每个指标声明数据来源(Prometheus、业务数据库、事件流)、聚合方式(SUM/AVG/P99)、时间粒度(秒/分/时/天),系统自动完成采集和物化。
  • 统一查询接口让用户可以在同一个 API 中同时查询"这个服务的 P99 延迟是多少"和"这个客户的月度消费是多少",打通技术监控和业务分析的数据孤岛。

#1. 为什么要把 Metrics 纳入 Ontology

#1.1 传统架构的数据孤岛

Code
传统方式:Metrics 和业务数据是两个世界

世界 1:技术监控
  Prometheus → Grafana
  ├── CPU 使用率
  ├── 内存占用
  ├── 请求延迟 P99
  ├── 错误率
  └── 存储在时序数据库(独立的数据模型)

世界 2:业务分析
  MySQL/PostgreSQL → BI Dashboard
  ├── 日活用户
  ├── 订单转化率
  ├── 客户生命周期价值
  ├── 收入增长率
  └── 存储在关系数据库(另一个数据模型)

问题:
├── "订单系统延迟升高时,转化率下降了多少?"
│   → 需要在两个系统之间手动关联
├── "哪些客户受到了昨天系统故障的影响?"
│   → 需要跨系统查询并手动匹配
├── "服务的错误率和对应业务的退款率有没有相关性?"
│   → 需要导出数据到 Excel 手动分析
└── 每次分析都是一次"数据考古"

#1.2 coomia-dip 的统一模型

Code
coomia-dip 方式:Metrics 是 ObjectType 的属性

ObjectType: OrderService
  普通属性:
    serviceId: STRING
    serviceName: STRING
    version: STRING
  Metric 属性:
    cpuUsage: METRIC(gauge, source=prometheus)
    requestLatencyP99: METRIC(histogram, source=prometheus)
    errorRate: METRIC(gauge, source=prometheus)
    orderCount: METRIC(counter, source=business_db)
    conversionRate: METRIC(gauge, source=computed)
    revenue: METRIC(counter, source=business_db)

统一查询:
  GET /api/v1/objects/OrderService/svc-001
  {
    "serviceId": "svc-001",
    "serviceName": "order-service",
    "cpuUsage": 67.3,
    "requestLatencyP99": 245,
    "errorRate": 0.02,
    "orderCount": 15234,
    "conversionRate": 0.034,
    "revenue": 1523400.00
  }

技术监控和业务数据在同一个对象上!
无需跨系统查询,直接关联分析。

#2. MetricSource:指标的定义与采集

#2.1 MetricSource 模型

Code
MetricSource 定义:

┌─────────────────────────────────────────────────────┐
│  MetricSource                                        │
├─────────────────────────────────────────────────────┤
│  metricId: STRING             # 指标唯一标识         │
│  name: STRING                 # 人类可读名称         │
│  description: STRING          # 描述                │
│  metricType: ENUM             # COUNTER / GAUGE /    │
│                               # HISTOGRAM / SUMMARY  │
│  unit: STRING                 # 单位(ms, %, bytes) │
│  source: MetricDataSource     # 数据来源定义         │
│  aggregation: AggregationRule # 聚合规则             │
│  retention: RetentionPolicy   # 数据保留策略         │
│  alertRules: List[AlertRule]  # 告警规则             │
└─────────────────────────────────────────────────────┘

MetricDataSource:
├── type: PROMETHEUS / DATABASE / EVENT_STREAM / COMPUTED
├── query: STRING(PromQL / SQL / Expression)
├── refreshInterval: DURATION(采集间隔)
├── timeout: DURATION(采集超时)
└── labels: Map<String, String>(标签映射)

AggregationRule:
├── function: SUM / AVG / MIN / MAX / P50 / P90 / P95 / P99 / COUNT
├── timeWindows: List[DURATION](1m, 5m, 1h, 1d, 7d, 30d)
├── groupBy: List[STRING](分组维度)
└── fillPolicy: ZERO / NULL / PREVIOUS / LINEAR_INTERPOLATION

RetentionPolicy:
├── rawRetention: DURATION(原始数据保留时长)
├── minuteRetention: DURATION(分钟粒度保留时长)
├── hourRetention: DURATION(小时粒度保留时长)
├── dayRetention: DURATION(天粒度保留时长)
└── downsampleEnabled: BOOLEAN(是否自动降采样)

#2.2 Prometheus 数据源

Code
从 Prometheus 采集技术指标:

metricSource:
  metricId: "order_service_latency_p99"
  name: "订单服务 P99 延迟"
  metricType: HISTOGRAM
  unit: "ms"
  source:
    type: PROMETHEUS
    query: |
      histogram_quantile(0.99,
        rate(http_request_duration_seconds_bucket{
          service="order-service",
          instance="{{instanceId}}"
        }[5m])
      ) * 1000
    refreshInterval: 15s
    timeout: 5s
    labels:
      instanceId: "{{objectId}}"  # 映射到 ObjectType 实例

  aggregation:
    function: P99
    timeWindows: [1m, 5m, 15m, 1h, 6h, 1d]
    fillPolicy: PREVIOUS

  retention:
    rawRetention: 7d
    minuteRetention: 30d
    hourRetention: 365d
    dayRetention: 3y

采集流程:
  1. 每 15 秒执行 PromQL 查询
  2. 将结果关联到对应的 ObjectType 实例
  3. 存储原始值到时序存储
  4. 自动聚合到各时间窗口
  5. 过期数据自动降采样

#2.3 业务数据库数据源

Code
从业务数据库采集业务指标:

metricSource:
  metricId: "customer_monthly_revenue"
  name: "客户月度收入"
  metricType: COUNTER
  unit: "CNY"
  source:
    type: DATABASE
    query: |
      SELECT
        customer_id,
        SUM(total_amount) as monthly_revenue
      FROM orders
      WHERE customer_id = '{{objectId}}'
        AND created_at >= DATE_TRUNC('month', CURRENT_DATE)
        AND status = 'COMPLETED'
      GROUP BY customer_id
    refreshInterval: 5m
    timeout: 30s

  aggregation:
    function: SUM
    timeWindows: [1h, 1d, 7d, 30d]
    groupBy: ["productCategory"]
    fillPolicy: ZERO

  retention:
    rawRetention: 30d
    hourRetention: 365d
    dayRetention: 5y

#2.4 计算型数据源

Code
基于其他指标计算的派生指标:

metricSource:
  metricId: "order_conversion_rate"
  name: "订单转化率"
  metricType: GAUGE
  unit: "%"
  source:
    type: COMPUTED
    expression: |
      (metric("completed_orders", window="1h") /
       metric("page_views", window="1h")) * 100
    refreshInterval: 1m
    dependencies:
      - "completed_orders"
      - "page_views"

  aggregation:
    function: AVG
    timeWindows: [5m, 15m, 1h, 1d]
    fillPolicy: LINEAR_INTERPOLATION

注意:计算型指标与派生属性的区别
├── 派生属性:基于对象属性计算,返回单个值
├── 计算型指标:基于时序数据计算,返回时间序列
├── 派生属性:SUM(LineItem.lineTotal) → 一个数字
└── 计算型指标:completedOrders/pageViews → 每分钟一个数据点

#3. 指标的时序存储

#3.1 多粒度存储架构

Code
时序数据的分层存储:

┌─────────────────────────────────────────────────┐
│               时序存储架构                        │
│                                                  │
│  Hot Storage(最近 24h)                         │
│  ├── 原始粒度(15s 采样间隔)                    │
│  ├── 存储:内存 + SSD                            │
│  └── 查询延迟:< 10ms                           │
│                                                  │
│  Warm Storage(1d ~ 30d)                        │
│  ├── 分钟粒度(1m 聚合)                         │
│  ├── 存储:SSD                                   │
│  └── 查询延迟:< 100ms                          │
│                                                  │
│  Cold Storage(30d ~ 1y)                        │
│  ├── 小时粒度(1h 聚合)                         │
│  ├── 存储:HDD / 对象存储                        │
│  └── 查询延迟:< 1s                             │
│                                                  │
│  Archive Storage(> 1y)                         │
│  ├── 天粒度(1d 聚合)                           │
│  ├── 存储:对象存储(S3/MinIO)                  │
│  └── 查询延迟:< 10s                            │
└─────────────────────────────────────────────────┘

自动降采样(Downsampling):
  原始 → 分钟:每分钟取 AVG/MIN/MAX/P99
  分钟 → 小时:每小时取 AVG/MIN/MAX/P99
  小时 → 天:每天取 AVG/MIN/MAX/P99

降采样保留了多个聚合值,支持不同的查询场景:
  "过去 1 小时的平均 CPU" → 用分钟粒度的 AVG
  "过去 1 小时的最高 CPU" → 用分钟粒度的 MAX
  "过去 30 天的 P99 延迟趋势" → 用小时粒度的 P99

#3.2 时序数据模型

Code
时序数据点(TimeSeriesPoint):

┌─────────────────────────────────────────────────┐
│  TimeSeriesPoint                                 │
├─────────────────────────────────────────────────┤
│  metricId: STRING          # 指标标识            │
│  objectId: STRING          # 关联的对象实例       │
│  timestamp: TIMESTAMP      # 时间戳              │
│  value: DOUBLE             # 指标值              │
│  labels: Map               # 附加标签            │
│  granularity: ENUM         # RAW/MIN/HOUR/DAY    │
│  aggregations: Map         # 聚合值              │
│    avg: DOUBLE                                   │
│    min: DOUBLE                                   │
│    max: DOUBLE                                   │
│    p50: DOUBLE                                   │
│    p99: DOUBLE                                   │
│    count: LONG                                   │
│    sum: DOUBLE                                   │
└─────────────────────────────────────────────────┘

存储示例:

metricId: "cpu_usage"
objectId: "server-001"
timestamp: "2025-01-15T10:30:00Z"
granularity: MINUTE
aggregations:
  avg: 67.3
  min: 45.2
  max: 89.1
  p99: 87.5
  count: 4    # 1 分钟内有 4 个原始数据点
  sum: 269.2

#4. 统一查询接口

#4.1 单对象指标查询

Code
API: GET /api/v1/objects/{objectTypeId}/{objectId}/metrics

查询参数:
  metrics: cpu_usage,request_latency_p99,error_rate
  from: 2025-01-15T00:00:00Z
  to: 2025-01-15T12:00:00Z
  granularity: 1h
  aggregation: avg

响应:
{
  "objectId": "svc-001",
  "objectType": "OrderService",
  "timeRange": {
    "from": "2025-01-15T00:00:00Z",
    "to": "2025-01-15T12:00:00Z"
  },
  "granularity": "1h",
  "metrics": {
    "cpu_usage": {
      "unit": "percent",
      "dataPoints": [
        {"timestamp": "2025-01-15T00:00:00Z", "value": 23.5},
        {"timestamp": "2025-01-15T01:00:00Z", "value": 21.8},
        {"timestamp": "2025-01-15T02:00:00Z", "value": 19.2},
        ...
      ]
    },
    "request_latency_p99": {
      "unit": "ms",
      "dataPoints": [
        {"timestamp": "2025-01-15T00:00:00Z", "value": 145.3},
        {"timestamp": "2025-01-15T01:00:00Z", "value": 132.7},
        ...
      ]
    },
    "error_rate": {
      "unit": "percent",
      "dataPoints": [
        {"timestamp": "2025-01-15T00:00:00Z", "value": 0.01},
        {"timestamp": "2025-01-15T01:00:00Z", "value": 0.02},
        ...
      ]
    }
  }
}

#4.2 跨对象指标聚合

Code
API: POST /api/v1/objects/{objectTypeId}/metrics/aggregate

请求:
{
  "filter": {
    "region": "us-east-1",
    "environment": "production"
  },
  "metrics": ["cpu_usage", "request_latency_p99"],
  "aggregation": "avg",
  "groupBy": ["serviceTeam"],
  "from": "2025-01-15T00:00:00Z",
  "to": "2025-01-15T12:00:00Z",
  "granularity": "1h"
}

响应:
{
  "groups": [
    {
      "key": {"serviceTeam": "payment-team"},
      "metrics": {
        "cpu_usage": {
          "avg": 45.2,
          "dataPoints": [...]
        },
        "request_latency_p99": {
          "avg": 234.5,
          "dataPoints": [...]
        }
      }
    },
    {
      "key": {"serviceTeam": "order-team"},
      "metrics": {
        "cpu_usage": {
          "avg": 67.8,
          "dataPoints": [...]
        },
        "request_latency_p99": {
          "avg": 189.3,
          "dataPoints": [...]
        }
      }
    }
  ]
}

#4.3 混合查询(属性 + 指标)

Code
API: POST /api/v1/objects/{objectTypeId}/query

请求:
{
  "select": ["serviceName", "version", "cpu_usage", "revenue"],
  "filter": {
    "cpu_usage.avg(1h)": {">": 80},
    "environment": "production"
  },
  "timeRange": {
    "from": "2025-01-15T00:00:00Z",
    "to": "2025-01-15T12:00:00Z"
  },
  "orderBy": [{"cpu_usage.avg(1h)": "DESC"}],
  "limit": 10
}

响应:
{
  "results": [
    {
      "objectId": "svc-003",
      "serviceName": "payment-service",
      "version": "2.1.0",
      "cpu_usage": {"avg_1h": 92.3, "current": 88.7},
      "revenue": {"sum_24h": 234567.89}
    },
    {
      "objectId": "svc-001",
      "serviceName": "order-service",
      "version": "3.0.1",
      "cpu_usage": {"avg_1h": 85.1, "current": 82.4},
      "revenue": {"sum_24h": 523456.12}
    }
  ]
}

这个查询的含义:
"找出 CPU 使用率超过 80% 的生产服务,显示它们的收入"
→ 一个查询同时获取技术指标和业务数据
→ 无需跨系统关联

#5. 告警规则与 Ontology 联动

#5.1 基于指标的告警

Code
告警规则定义:

alertRule:
  ruleId: "alert-cpu-high"
  name: "CPU 使用率过高"
  metric: "cpu_usage"
  condition:
    operator: ">"
    threshold: 85
    duration: 5m        # 持续 5 分钟触发
    aggregation: avg
  severity: WARNING
  actions:
    - type: NOTIFY
      channels: ["slack:#ops-alerts", "email:oncall@company.com"]
    - type: CREATE_ACTION
      actionType: "ScaleUpService"
      parameters:
        targetReplicas: "{{current_replicas + 2}}"

告警与 Ontology 的联动:

传统告警:CPU > 85% → 发通知
coomia-dip 告警:CPU > 85% → 发通知
  + 查询该服务的关联 ObjectType
  + 找到受影响的业务流程
  + 评估业务影响(收入损失估算)
  + 自动触发扩容 Action

告警上下文示例:
┌────────────────────────────────────────────────────┐
│  ALERT: CPU 使用率过高                              │
│                                                     │
│  Service: order-service (svc-001)                   │
│  CPU: 92.3% (avg over 5min)                         │
│  Duration: 7 minutes                                │
│                                                     │
│  Business Impact (via Ontology):                    │
│  ├── Request Latency P99: 450ms (normal: 150ms)     │
│  ├── Error Rate: 3.2% (normal: 0.1%)               │
│  ├── Affected Orders: ~1,200 in last 5 min          │
│  ├── Estimated Revenue Impact: ¥45,000/hour         │
│  ├── Affected Customers: 340 (12 VIP)               │
│  └── Related Downstream: payment-service, sms-svc   │
│                                                     │
│  Auto Action: ScaleUpService triggered               │
│  Target: 3 → 5 replicas                             │
└────────────────────────────────────────────────────┘

#5.2 业务指标告警

Code
不仅技术指标可以设告警,业务 KPI 也可以:

alertRule:
  ruleId: "alert-conversion-drop"
  name: "转化率异常下降"
  metric: "conversion_rate"
  condition:
    type: ANOMALY_DETECTION
    baseline: "same_hour_last_week"
    deviationThreshold: -30%   # 比上周同期低 30%
    duration: 15m
  severity: CRITICAL
  actions:
    - type: NOTIFY
      channels: ["slack:#business-alerts"]
    - type: CORRELATE
      correlateWith: ["error_rate", "latency_p99", "deployment_events"]
      timeWindow: 1h

业务告警的自动关联分析:
  转化率下降 30%
  → 自动查询同时段的技术指标
  → 发现 error_rate 从 0.1% 上升到 3.2%
  → 发现 30 分钟前有一次部署
  → 自动生成关联报告

关联报告:
  "转化率下降可能与 30 分钟前的 order-service v3.0.1 部署有关,
   该部署后错误率上升了 32 倍。建议回滚到 v3.0.0。"

#6. 指标驱动的派生属性

#6.1 基于指标的派生属性

Code
指标可以参与派生属性的计算:

ObjectType: Service
  metrics:
    cpuUsage: METRIC(gauge)
    memoryUsage: METRIC(gauge)
    errorRate: METRIC(gauge)
    latencyP99: METRIC(histogram)

  derivedProperties:
    healthScore: DERIVED
      expression: |
        100
        - (IF(metric("cpuUsage", "avg", "5m") > 80, 20, 0))
        - (IF(metric("memoryUsage", "avg", "5m") > 85, 20, 0))
        - (IF(metric("errorRate", "avg", "5m") > 1, 30, 0))
        - (IF(metric("latencyP99", "avg", "5m") > 500, 30, 0))
      evaluationMode: REALTIME
      refreshInterval: 1m

    riskLevel: DERIVED
      expression: |
        CASE
          WHEN healthScore >= 80 THEN "LOW"
          WHEN healthScore >= 50 THEN "MEDIUM"
          WHEN healthScore >= 20 THEN "HIGH"
          ELSE "CRITICAL"
        END

效果:
  Service 的 healthScore 每分钟自动重算
  基于 4 个维度的实时健康度评估
  riskLevel 随 healthScore 自动更新
  所有消费者看到的是统一的健康度视图

#6.2 跨对象的指标聚合派生

Code
高层对象聚合低层对象的指标:

ObjectType: ServiceCluster
  derivedProperties:
    avgCpuUsage: DERIVED
      reducer: AVG
      sourceObjectType: Service
      sourceMetric: cpuUsage
      aggregation: avg
      timeWindow: 5m

    maxLatencyP99: DERIVED
      reducer: MAX
      sourceObjectType: Service
      sourceMetric: latencyP99
      aggregation: p99
      timeWindow: 5m

    totalErrorCount: DERIVED
      reducer: SUM
      sourceObjectType: Service
      sourceMetric: errorCount
      aggregation: sum
      timeWindow: 1h

    clusterHealthScore: DERIVED
      expression: |
        100
        - (IF(avgCpuUsage > 75, 15, 0))
        - (IF(maxLatencyP99 > 300, 25, 0))
        - (IF(totalErrorCount > 100, 30, 0))
        - (IF(unhealthyServiceCount > 0, 30, 0))

层级关系:
  Company
    └── ServiceCluster(聚合 Service 指标)
         └── Service(聚合 Instance 指标)
              └── Instance(原始指标)

每一层都可以看到聚合后的健康度
CEO 看 Company 级别:一个数字
CTO 看 Cluster 级别:各集群健康度
SRE 看 Service 级别:各服务详情
运维看 Instance 级别:各实例详情

#7. Metrics 的访问控制

#7.1 指标级权限

Code
不同角色看到不同的指标:

权限矩阵:

┌──────────────┬─────────┬──────────┬──────────┬──────────┐
│ 角色          │ 技术指标 │ 业务KPI  │ 财务指标  │ 用户指标  │
├──────────────┼─────────┼──────────┼──────────┼──────────┤
│ SRE/运维      │ ✓ 全部  │ ✓ 只读   │ ✗ 无     │ ✗ 无     │
│ 产品经理      │ ✓ 摘要  │ ✓ 全部   │ ✓ 只读   │ ✓ 聚合   │
│ 数据分析师    │ ✓ 只读  │ ✓ 全部   │ ✓ 全部   │ ✓ 聚合   │
│ 高管          │ ✓ 摘要  │ ✓ 摘要   │ ✓ 全部   │ ✓ 摘要   │
│ 外部合作伙伴  │ ✗ 无    │ ✓ 受限   │ ✗ 无     │ ✗ 无     │
└──────────────┴─────────┴──────────┴──────────┴──────────┘

权限控制粒度:
├── 指标可见性(能否看到这个指标存在)
├── 时间范围(只能看最近 7 天 vs 全部历史)
├── 粒度限制(只能看小时粒度 vs 原始粒度)
├── 聚合限制(只能看聚合值 vs 明细值)
└── 对象范围(只能看自己团队的 vs 全部)

#8. 指标与 Action 的联动

#8.1 指标触发 Action

Code
指标变化自动触发 Ontology Action:

场景 1:自动扩容
  metric: cpuUsage > 80% for 5m
  → Action: ScaleUpService(replicas += 2)

场景 2:自动降级
  metric: errorRate > 5% for 2m
  → Action: EnableCircuitBreaker(service=order-service)
  → Action: NotifyOnCall(severity=P1)

场景 3:业务响应
  metric: conversionRate < baseline * 0.7 for 15m
  → Action: CreateIncident(type=BUSINESS_ANOMALY)
  → Action: TriggerRCA(correlateMetrics=[errorRate, latency, deployments])

场景 4:成本优化
  metric: cpuUsage < 20% for 24h
  → Action: ScaleDownService(replicas -= 1)
  → Action: NotifyOwner("Consider downsizing this service")

这些都是通过 Ontology 的 ActionType 定义的,
享受 ActionType 的所有能力:
├── 审批工作流
├── 前置检查(Guard)
├── 审计日志
├── 回滚机制
└── 权限控制

#9. 实战:构建统一监控模型

#9.1 电商平台监控建模

Code
电商平台的统一 Ontology 监控模型:

ObjectType: EcommerceService
  属性:
    serviceId, serviceName, team, environment

  技术指标:
    cpuUsage, memoryUsage, diskUsage
    requestCount, requestLatency, errorRate
    connectionPoolUsage, threadPoolUsage
    gcPauseTime, heapUsage

  业务指标:
    orderCount, orderValue, conversionRate
    cartAbandonRate, paymentSuccessRate
    avgOrderValue, returnRate

  派生属性:
    healthScore(基于技术指标)
    businessImpactScore(基于业务指标)
    overallScore = healthScore * 0.6 + businessImpactScore * 0.4

ObjectType: EcommerceCluster
  派生指标(聚合 Service):
    totalOrderValue = SUM(Service.orderValue)
    avgHealthScore = AVG(Service.healthScore)
    worstLatency = MAX(Service.requestLatency)
    totalErrorCount = SUM(Service.errorCount)

ObjectType: EcommercePlatform(顶层单例)
  派生指标(聚合 Cluster):
    platformGMV = SUM(Cluster.totalOrderValue)
    platformHealthScore = AVG(Cluster.avgHealthScore)
    platformAvailability = 1 - (Cluster.totalErrorCount / Cluster.totalRequestCount)

三层模型的价值:
  Platform → "今天平台 GMV 多少?整体健康度如何?"
  Cluster → "哪个集群有问题?影响了多少订单?"
  Service → "具体哪个服务的 CPU 高?延迟高的原因是什么?"

#9.2 指标仪表板自动生成

Code
基于 Ontology 模型自动生成 Grafana Dashboard:

API: POST /api/v1/ontology/metrics/dashboard/generate

请求:
{
  "objectTypeId": "EcommerceService",
  "objectId": "svc-001",
  "layout": "standard",
  "includeMetrics": ["*"],
  "includeRelated": true
}

自动生成的 Dashboard 结构:
┌─────────────────────────────────────────────────┐
│  EcommerceService: order-service                │
├─────────────────────────────────────────────────┤
│  Overview Row:                                   │
│  [Health Score] [Risk Level] [Uptime]            │
│                                                  │
│  Technical Metrics Row:                          │
│  [CPU] [Memory] [Disk] [GC Pause]               │
│                                                  │
│  Request Metrics Row:                            │
│  [Request Rate] [Latency P99] [Error Rate]      │
│                                                  │
│  Business Metrics Row:                           │
│  [Order Count] [Conversion Rate] [Revenue]      │
│                                                  │
│  Related Services Row:                           │
│  [payment-svc health] [inventory-svc health]    │
│                                                  │
│  Alerts Row:                                    │
│  [Active Alerts] [Recent Incidents]             │
└─────────────────────────────────────────────────┘

Dashboard 和 Ontology 模型保持同步:
├── ObjectType 新增指标 → Dashboard 自动添加面板
├── ObjectType 删除指标 → Dashboard 自动移除面板
├── 新增 Service 实例 → 自动生成实例 Dashboard
└── 关系变更 → Related Services 面板自动更新

#10. 与传统方案的对比

Code
Metrics-as-Ontology vs 传统监控方案:

┌──────────────┬────────────────────┬──────────────────────┐
│ 特性          │ coomia-dip           │ Prometheus + Grafana │
├──────────────┼────────────────────┼──────────────────────┤
│ 技术监控      │ ✓ 内置              │ ✓ 核心能力           │
│ 业务指标      │ ✓ 统一模型          │ ✗ 需要额外系统       │
│ 关联分析      │ ✓ 自动(Ontology)  │ ✗ 手动关联           │
│ 告警上下文    │ ✓ 业务影响分析      │ ✗ 纯技术告警         │
│ 权限控制      │ ✓ 属性级别          │ ✗ Dashboard 级别     │
│ 自动 Action   │ ✓ ActionType 驱动  │ △ 需要 AlertManager  │
│ 历史追溯      │ ✓ 版本化            │ ✗ 覆盖写             │
│ 数据治理      │ ✓ Ontology 治理    │ ✗ 无                 │
│ 仪表板        │ ✓ 自动生成          │ ✓ 手动配置           │
│ 学习成本      │ 中等(Ontology)    │ 低(PromQL)         │
└──────────────┴────────────────────┴──────────────────────┘

coomia-dip 不是要替代 Prometheus:
├── Prometheus 仍然是采集和存储的最佳工具
├── coomia-dip 在 Prometheus 之上建立了 Ontology 模型
├── 将技术指标和业务数据统一到同一个查询接口
├── 通过 Ontology 的关系和派生属性实现自动关联
└── 让"监控"从纯技术视角升级到业务视角

#Key Takeaways

  1. Metrics 纳入 Ontology 打破了技术监控和业务分析的数据孤岛——同一个 ObjectType 上既有普通属性也有指标属性,一个查询就能获取"服务延迟"和"业务收入",无需跨系统关联。
  2. MetricSource 统一了指标的定义和采集——无论数据来自 Prometheus、业务数据库还是计算表达式,都通过相同的模型定义,相同的 API 查询,消费者无需关心数据来源。
  3. 指标与 Ontology 的联动创造了新价值——告警不再是孤立的"CPU 高了",而是带有完整业务上下文的"CPU 高了,影响了 1200 个订单,预计损失 ¥45,000/小时"。
  4. 多层聚合实现了不同角色的视角——Instance → Service → Cluster → Platform,每一层自动聚合下层指标,CEO 看全局健康度,SRE 看具体实例。
  5. 指标触发 Action 实现了闭环自动化——不只是看到问题(告警),还能自动处理(扩容、降级、创建事件),通过 ActionType 机制享受审批、审计、回滚等完整能力。

#Next Article

下一篇 S4-11 数据接入(Data Onboarding) 将讨论如何将外部数据源的数据映射到 Ontology 模型——CSV 文件、数据库表、API 接口、消息队列,如何定义映射规则,如何处理数据质量问题,如何实现增量同步。

#ontology #metrics #monitoring #time-series #kpi #alerting #observability #business-metrics #unified-model