---
# Assign config: uses oncall_team routing plus special rules
# (nighttime, personal, summary-based, tenant-specific).
extractors:
  component: "{{ with .Fields.Components }}{{ (index . 0).Name }}{{ end }}"
  provider_type: "{{ (.Fields.Unknowns.customfield_10160 | tryUnmarshalJson).labels.provider_type }}"
  o11y_biz_type: "{{ (.Fields.Unknowns.customfield_10160 | tryUnmarshalJson).labels.o11y_biz_type }}"
  summary: "{{ .Fields.Summary }}"
  daytime: "{{if isDayTime}}day{{else}}night{{end}}"
  daytime16: "{{if isDayTime16}}day{{else}}night{{end}}"
  project: "{{ .Fields.Project.Key }}"
  priority: "{{ .Fields.Priority.Name }}"
  stability_governance: "{{ (.Fields.Unknowns.customfield_10160 | tryUnmarshalJson).labels.stability_governance }}"
  cluster_id: "{{ .Fields.Unknowns.customfield_10149 }}"
  tier: "{{ (.Fields.Unknowns.customfield_10160 | tryUnmarshalJson).labels.tier }}"
  cluster_name: "{{ .Fields.Unknowns.customfield_10162 }}"
  owner_id: "{{ (.Fields.Unknowns.customfield_10160 | tryUnmarshalJson).labels.owner_id }}"
  regions: "{{ (.Fields.Unknowns.customfield_10160 | tryUnmarshalJson).labels.regions }}"
  tenant_id: "{{ .Fields.Unknowns.customfield_10157 }}"
  assign: "{{ (.Fields.Unknowns.customfield_10160 | tryUnmarshalJson).labels.assign }}"
  job: "{{ (.Fields.Unknowns.customfield_10160 | tryUnmarshalJson).labels.job }}"
  isWeekday: "{{ if isWeekday }}true{{ else }}false{{ end }}"
  visibility: "{{ (.Fields.Unknowns.customfield_10160 | tryUnmarshalJson).labels.visibility }}"
  isNightTime05: "{{ if isNightTime05 }}true{{ else }}false{{ end }}"
  isNightTime59: "{{ if isNightTime59 }}true{{ else }}false{{ end }}"
  isNightTime012: "{{ if isNightTime012 }}true{{ else }}false{{ end }}"
  oncall_tier: "{{ with .Fields.Unknowns.customfield_10164 }}{{ .value }}{{ end }}"
  oncall_team: "{{ with (.Fields.Unknowns.customfield_10160 | tryUnmarshalJson) }}{{ with .labels }}{{ with .oncall_team }}{{ . }}{{ end }}{{ end }}{{ end }}"
routes:
  # ============================================================
  # Section 1: Special rules (cannot be replaced by oncall_team)
  # These use daytime, summary, tenant, cluster, or oncall_tier matching
  # ============================================================

  - receiver: 9
    match:
      summary: TiDBClusterLogBackupLagHigh$

  # TCOC oncall tier routing
  - receiver: 22
    match:
      project: TCOC
      oncall_tier: Serverless
      component: ^(TiDB Cloud|core-svc|dedicated-regional-server|Cloud Service|Cluster Service|GitOps|kubernetes|node|infra-api|tidb-cluster|cert-manager|infra-provider|etcd|dbaas-proxy|tidb-auditlog|tidb-operator|nginx-ingress|cluster-autoscaler|eks-provider|gke-provider|quota-exporter|chaos-svc|chaos-provider|gitops|config-manager|k8s-pod|cluster management|Tools)$
  - receiver: 73
    match:
      project: TCOC
      oncall_tier: "TiDB X"
      component: ^(TiDB Cloud|core-svc|dedicated-regional-server|Cloud Service|Cluster Service|GitOps|kubernetes|node|infra-api|tidb-cluster|cert-manager|infra-provider|etcd|dbaas-proxy|tidb-auditlog|tidb-operator|nginx-ingress|cluster-autoscaler|eks-provider|gke-provider|quota-exporter|chaos-svc|chaos-provider|gitops|config-manager|k8s-pod|cluster management|Tools)$

  # Serverless changefeed creating too long → data-replication
  - receiver: 77
    match:
      summary: ChangefeedCreatingTooLong$
      provider_type: ^aws-free-tier$

  # BizChangefeed summary-based → resilience daytime
  - receiver: 47
    match:
      summary: (BizChangefeedIsFailedByKernelStatus|BizChangefeedIsWarningByKernelStatus|TiKVSideCDCSinkMemoryHighUsage|BizChangefeedCheckpointHighDelay1h|BizChangefeedCheckpointHighDelay2h|BizChangefeedCheckpointHighDelay3h)$
      daytime: ^day$
  - receiver: 47
    match:
      summary: (BizChangefeedIsFailedByKernelStatus|BizChangefeedIsWarningByKernelStatus|TiKVSideCDCSinkMemoryHighUsage|BizChangefeedCheckpointHighDelay1h|BizChangefeedCheckpointHighDelay2h|BizChangefeedCheckpointHighDelay3h)$
      daytime: ^night$

  # Serverless ticdc - yuping all shifts
  - receiver: yuping@pingcap.com
    match:
      component: ^ticdc$
      "!summary": ChangefeedCreatingTooLong$
      daytime: ^day$
      provider_type: ^aws-free-tier$
  - receiver: yuping@pingcap.com
    match:
      component: ^ticdc$
      "!summary": ChangefeedCreatingTooLong$
      isNightTime05: ^true$
      provider_type: ^aws-free-tier$
  - receiver: yuping@pingcap.com
    match:
      component: ^ticdc$
      "!summary": ChangefeedCreatingTooLong$
      isNightTime59: ^true$
      provider_type: ^aws-free-tier$

  # P999 NextGen nighttime
  - receiver: wuxuelian@pingcap.com
    match:
      isNightTime59: ^true$
      summary: TiDBP999LatencySurgeNextGen
  - receiver: stanley.huang@pingcap.com
    match:
      isNightTime05: ^true$
      summary: TiDBP999LatencySurgeNextGen

  # TiKV kernel nighttime critical
  - receiver: zhangbokang@pingcap.com
    match:
      oncall_team: ^tikv_unified$
      daytime16: ^night$
      priority: Critical$
      isWeekday: ^true$
  - receiver: zhangbokang@pingcap.com
    match:
      oncall_team: ^serverless$
      component: ^tikv$
      daytime16: ^night$
      priority: Critical$
      isWeekday: ^true$
  - receiver: zhangjinpeng@pingcap.com
    match:
      oncall_team: ^tikv_unified$
      daytime16: ^night$
      priority: Critical$
      isWeekday: ^true$

  # Plaud external
  - receiver: 22
    match:
      visibility: ^external$
      tenant_id: ^1372813089209291473$

  # Japan tenant kernel → mock
  - receiver: mock@pingcap.com
    match:
      tenant_id: ^(1372813089191061283|1372813089201471287)$
      stability_governance: ^(kernel-tcocp|kernel-governance|errorlog-governance|errorlog-tcocp|capacity)$

  # WeTech test
  - receiver: zhangming@pingcap.com
    match:
      summary: For2mForWeTechTest$

  # ResourcePoolIdle
  - receiver: 47
    match:
      owner_id: ^1372813089194331289$
      summary: (ResourcePoolIdleFor12Hours|ResourcePoolIdleFor36Hours)$
  - receiver: 73
    match:
      owner_id: ^(1372813089209272198|1372813089209271775)$
      summary: (ResourcePoolIdleFor12Hours|ResourcePoolIdleFor36Hours)$
  - receiver: 48
    match:
      owner_id: ^1372813089209281154$
      summary: (ResourcePoolIdleFor12Hours|ResourcePoolIdleFor36Hours)$
  - receiver: 17
    match:
      summary: (ResourcePoolIdleFor12Hours|ResourcePoolIdleFor36Hours)$

  # WeTech poc clusters
  - receiver: 42
    match:
      cluster_id: ^(10957523948617165785|10507769162283759836|10956278120794001035|10892745802387698762)$


  # PDLeaderChange/PDTSOFailed → pd team
  - receiver: 7
    match:
      summary: (PDLeaderChange|PDTSOFailed)$

  # worker-tidb owned by SQL when the alert is labeled as tidb_executor.
  - receiver: 2
    match:
      oncall_team: ^tidb_executor$
      component: ^worker-tidb$

  # ============================================================
  # Section 2: oncall_team-based routing
  # ============================================================
  - receiver: 47
    match:
      oncall_team: ^resilience$
  - receiver: 42
    match:
      oncall_team: ^dedicated_service$
  - receiver: 23
    match:
      oncall_team: ^o11y$
  - receiver: 77
    match:
      oncall_team: ^tidb_x_tools$
  - receiver: 17
    match:
      oncall_team: ^global_control$
  - receiver: 73
    match:
      oncall_team: ^premium$
  - receiver: 22
    match:
      oncall_team: ^serverless$
  - receiver: 18
    match:
      oncall_team: ^tiflash$
  - receiver: 4
    match:
      oncall_team: ^tidb_executor$
  - receiver: 7
    match:
      oncall_team: ^pd$
  - receiver: 74
    match:
      oncall_team: ^tiproxy$
  - receiver: 30
    match:
      oncall_team: ^billing$
  - receiver: 31
    match:
      oncall_team: ^account$
  - receiver: 48
    match:
      oncall_team: ^operator$
  - receiver: 72
    match:
      oncall_team: ^clinic$
  - receiver: 9
    match:
      oncall_team: ^br$
  - receiver: 37
    match:
      oncall_team: ^ticdc$
  - receiver: 76
    match:
      oncall_team: ^tikv_unified$
  - receiver: 3
    match:
      oncall_team: ^tidb_optimizer$
  - receiver: 10
    match:
      oncall_team: ^tidb_txn$
  - receiver: 2
    match:
      oncall_team: ^tidb_sql$
  - receiver: 12
    match:
      oncall_team: ^ingress_service$
  - receiver: 78
    match:
      oncall_team: ^security$

  # ============================================================
  # Section 3: component-based fallback routing
  # For alerts WITHOUT an oncall_team label. Mirrors the legacy
  # component-based rules from assign.yml. Order matters; these run
  # last, after all oncall_team routing above.
  # ============================================================

  # next-gen data tools (dataflow / ticdc / br / export)
  - receiver: 77
    match:
      component: ^(dataflow-service-ng|ticdc|next-gen-br|next-gen-export)$
      tier: ^next-gen$
  # Serverless free-tier tools
  - receiver: 77
    match:
      component: ^(dm|export|import|br)$
      provider_type: ^aws-free-tier$
  # TEST / resilience component (exclude free-tier & devtier)
  - receiver: 47
    match:
      component: ^(TEST|resilience)$
      daytime: ^day$
      "!provider_type": ^aws-free-tier$
      "!o11y_biz_type": ^prod-devtier$
  - receiver: 47
    match:
      component: ^(TEST|resilience)$
      daytime: ^night$
      "!provider_type": ^aws-free-tier$
      "!o11y_biz_type": ^prod-devtier$

  # next gen related
  # PD
  - receiver: 7
    match:
      tier: next-gen
      component: ^pd$
  # Executor
  - receiver: 4
    match:
      tier: next-gen
      component: ^tidb$
  # Optimizer
  - receiver: 3
    match:
      tier: next-gen
      component: ^tidb-optimizer$
  # TiKV
  - receiver: 76
    match:
      tier: next-gen
      component: ^tikv$
  # SQL Data
  - receiver: 12
    match:
      component: ^(tidb-sql-data|tidb-worker)$
  # TiFlash
  - receiver: 18
    match:
      tier: next-gen
      component: ^tiflash$
  # SQL Infra
  - receiver: 74
    match:
      tier: next-gen
      component: ^(tiproxy|TiProxy)$
  # Data Replication
  - receiver: 37
    match:
      tier: next-gen
      component: ^ticdc-kernel$
  # Transaction
  - receiver: 10
    match:
      tier: next-gen
      component: ^tidb-txn$
  # BR
  - receiver: 9
    match:
      tier: next-gen
      component: ^(br|next-gen-br-kernel)$
  # next gen related end

  # sql
  - receiver: 2
    match:
      component: ^tidb-sql$
  # ddl
  - receiver: 2
    match:
      component: ^tidb-sql-data$
      stability_governance: ^(kernel-tcocp|kernel-governance|errorlog-governance|errorlog-tcocp|capacity)$
  - receiver: 4
    match:
      component: ^tidb-executor$
      stability_governance: ^(kernel-tcocp|kernel-governance|errorlog-governance|errorlog-tcocp|capacity)$
  # txn
  - receiver: 10
    match:
      component: ^tidb-txn$
      stability_governance: ^(kernel-tcocp|kernel-governance|errorlog-governance|errorlog-tcocp|capacity)$
  # optimizer
  - receiver: 3
    match:
      component: ^tidb-optimizer$
      stability_governance: ^(kernel-tcocp|kernel-governance|errorlog-governance|errorlog-tcocp|capacity)$
  # tiflash
  - receiver: 18
    match:
      component: ^tiflash$
      stability_governance: ^(kernel-tcocp|kernel-governance|errorlog-governance|errorlog-tcocp|capacity)$
  # storage / tikv
  - receiver: 76
    match:
      component: ^tikv$
      stability_governance: ^(kernel-tcocp|kernel-governance|errorlog-governance|errorlog-tcocp|capacity)$
  # data replication
  - receiver: 77
    match:
      component: ^ticdc$
      stability_governance: ^(kernel-tcocp|kernel-governance|errorlog-governance|errorlog-tcocp|capacity)$
  # scheduling
  - receiver: 7
    match:
      component: ^pd$
      stability_governance: ^(kernel-tcocp|kernel-governance|errorlog-governance|errorlog-tcocp|capacity)$

  # serverless related
  - receiver: 76
    match:
      provider_type: ^aws-free-tier$
      component: ^tiflash$
  - receiver: 76
    match:
      o11y_biz_type: ^prod-devtier$
      component: ^tiflash$
  - receiver: 76
    match:
      provider_type: ^aws-free-tier$
      component: ^tikv$
  - receiver: 76
    match:
      o11y_biz_type: ^prod-devtier$
      component: ^tikv$
  - receiver: 22
    match:
      provider_type: ^aws-free-tier$
      component: ^ecosystem-server$
  - receiver: 22
    match:
      o11y_biz_type: ^prod-devtier$
      component: ^ecosystem-server$
  - receiver: 18
    match:
      provider_type: ^aws-free-tier$
      component: ^tiflash-autoscale$
  - receiver: 23
    match:
      provider_type: ^aws-free-tier$
      component: ^(o11y|vmagent)$
  - receiver: 23
    match:
      o11y_biz_type: ^prod-devtier$
      component: ^(o11y|vmagent)$
  - receiver: 77
    match:
      provider_type: ^aws-free-tier$
      component: ^(lightning|data-migration)$
  - receiver: 22
    match:
      provider_type: ^aws-free-tier$
  - receiver: 22
    match:
      o11y_biz_type: ^prod-devtier$
  - receiver: 22
    match:
      component: ^(serverless-svc|Serverless)$
  - receiver: 72
    match:
      component: ^(Clinic|clinic|cicd)$

  # resilience: kernel alert day/night
  - receiver: 47
    match:
      component: ^(metrics-integration|tidb|tiflash|tikv|Alert)$
      daytime: ^day$
  - receiver: 47
    match:
      component: ^pd$
      daytime: ^day$
      "!summary": (PDLeaderChange|PDTSOFailed)$
  - receiver: 47
    match:
      component: ^(metrics-integration|tidb|tiflash|tikv|Alert)$
      daytime: ^night$
  - receiver: 47
    match:
      component: ^pd$
      daytime: ^night$
      "!summary": (PDLeaderChange|PDTSOFailed)$

  # ci cd
  - receiver: 48
    match:
      project: ^(TCOC|O11Y)$
      component: ^(dataplane-controller|goldpinger)$
  # dataflow service
  - receiver: 77
    match:
      project: ^(TCOC|O11Y)$
      component: ^(TiKV CDC|TiCDC|ticdc|dataflow-server|dataflow-service|dadaflow-worker|TiDB Lightning|TiDB Binlog|sync-diff-inspector|Cloud DM|import/export|Cloud Import|Dumpling|lightning|data-migration|tcidm-regional|import-controller|Quota|br|BR|TiKV BR|Import/Export|Backup/Restore|Data Migration)$
  # DM/DDL OP
  - receiver: 12
    match:
      project: ^GTOC$
      component: ^(Tools|TiDB Lightning|TiDB Binlog|sync-diff-inspector|DM|import/export|Lightning|Dumpling|lightning|data-migration)$
  # Regional Service
  - receiver: 17
    match:
      component: ^(cost-provider-server|OpenAPI|network|api-gateway|Dashboard|dataservice|Dataservice)$
  - receiver: 17
    match:
      component: tidb-management-service
      "!job": dedicated-global-service
  # O11Y
  - receiver: 23
    match:
      component: ^(metering-server|Monitoring|Prometheus|thanos|alertmanager|prometheus|logging|o11y|metrics-server|vmagent|loki|observability-global-server|observability-regional-server|ngmonitoring)$
  # ci cd for auditlog (next-gen)
  - receiver: 48
    match:
      project: ^(TCOC|O11Y)$
      tier: next-gen
      component: tidb-auditlog
  # Cluster service
  - receiver: 42
    match:
      project: ^(TCOC|O11Y)$
      component: ^(TiDB Cloud|core-svc|dedicated-regional-server|Cloud Service|Cluster Service|GitOps|kubernetes|node|infra-api|tidb-cluster|cert-manager|infra-provider|etcd|dbaas-proxy|tidb-auditlog|tidb-operator|nginx-ingress|cluster-autoscaler|eks-provider|gke-provider|quota-exporter|chaos-svc|chaos-provider|gitops|config-manager|k8s-pod|cluster management|Tools)$
      "!o11y_biz_type": prod-tidbcloud-nextgen
  - receiver: 42
    match:
      project: ^(TCOC|O11Y)$
      component: tidb-management-service
      job: dedicated-global-service
  # Billing
  - receiver: 30
    match:
      component: ^(billing-server|Billing)$
  # Account
  - receiver: 31
    match:
      component: ^(account-server|central-server|Account)$
  - receiver: 74
    match:
      component: ^(tiproxy|TiProxy)$
  # TiSpark
  - receiver: 22
    match:
      component: ^(ecosystem-server|TiSpark)$
  # FE
  - receiver: 36
    match:
      component: ^(DBaaS Frontend|frontend)$
  - receiver: 7
    match:
      component: ^PD$
  # SQL
  - receiver: 2
    match:
      component: ^(DDL|TiDB|TiDB connection|TiDB partitions|TiDB charsets|TiUP)$
    continue: true
  # Optimizer
  - receiver: 3
    continue: true
    match:
      component: ^(Performance Tuning|TiDB|TiDB Optimizer|TiDB OOM)$
  # TiDB Compute
  - receiver: 4
    match:
      component: ^(TiDB Compute|TiDB|TiDB connection|TiDB OOM)$
  - receiver: 10
    match:
      component: ^TiDB Transaction$
  # Operator
  - receiver: 48
    match:
      component: ^(TiDB-Operator|TiDB Operator)$
  - receiver: 18
    match:
      component: ^TiFlash$
  # TiKV
  - receiver: 76
    match:
      component: ^(TiKV|PiTR)$
    continue: true
  # CDC OP
  - receiver: 37
    match:
      project: ^(GTOC|O11Y)$
      component: ^(TiKV CDC|TiCDC|ticdc-kernel)$
  # BR OP
  - receiver: 9
    match:
      project: ^GTOC$
      component: ^(BR|TiKV BR)$
  - receiver: sunyishen@pingcap.com
    match:
      component: ^ng-auto-scaler$
  - receiver: 73
    match:
      project: ^O11Y$
      component: ^(next-gen-import|cluster-ng-service)$
  - receiver: 73
    match:
      project: ^O11Y$
      o11y_biz_type: prod-tidbcloud-nextgen
  - receiver: 78
    match:
      project: ^O11Y$
      component: ^security$
