全部产品
Search
文档中心

Resource Orchestration Service:ALIYUN::CMS::ResourceMetricRule

更新时间:Jul 06, 2025

ALIYUN::CMS::ResourceMetricRule digunakan untuk membuat aturan peringatan berbasis ambang batas untuk metrik suatu sumber daya.

Sintaksis

{
  "Type": "ALIYUN::CMS::ResourceMetricRule",
  "Properties": {
    "NoEffectiveInterval": String,
    "ContactGroups": List,
    "SilenceTime": Integer,
    "RuleId": String,
    "Period": Integer,
    "Prometheus": Map,
    "Labels": List,
    "EffectiveInterval": String,
    "NoDataPolicy": String,
    "Namespace": String,
    "MetricName": String,
    "DeletionForce": Boolean,
    "Escalations": Map,
    "EmailSubject": String,
    "CompositeExpression": Map,
    "Webhook": String,
    "Resources": List,
    "RuleName": String,
    "Interval": Integer
  }
}

Properti

Properti

Tipe

Diperlukan

Dapat Diedit

Deskripsi

Kendala

ContactGroups

List

Ya

Ya

Grup kontak peringatan.

CloudMonitor mengirimkan notifikasi peringatan ke kontak peringatan yang termasuk dalam grup kontak peringatan.

Catatan

Sebuah grup kontak peringatan dapat berisi satu atau lebih kontak peringatan. Untuk informasi lebih lanjut tentang cara membuat kontak peringatan dan grup kontak peringatan, lihat PutContact dan PutContactGroup.

Escalations

Map

Ya

Ya

Detail peringatan.

Untuk informasi lebih lanjut, lihat Properti Escalations.

MetricName

String

Ya

Ya

Nama metrik.

Untuk informasi lebih lanjut tentang cara menanyakan nama metrik, lihat Lampiran 1: Metrik.

Catatan

Jika Anda membuat aturan peringatan Prometheus untuk Pemantauan Cloud Hybrid, Anda harus menetapkan properti ini ke nama namespace. Untuk informasi lebih lanjut tentang cara menanyakan nama namespace, lihat DescribeHybridMonitorNamespaceList.

Namespace

String

Ya

Ya

Namespace layanan cloud.

Untuk informasi lebih lanjut tentang cara menanyakan namespace layanan cloud, lihat Lampiran 1: Metrik.

Catatan

Anda harus menetapkan properti ini ke acs_prometheus saat Anda membuat aturan peringatan Prometheus untuk Pemantauan Cloud Hybrid.

Resources

List

Ya

Ya

Informasi tentang sumber daya.

Contoh: [{"instanceId":"i-uf6j91r34rnwawoo****"}] dan [{"userId":"100931896542****"}]. Untuk informasi lebih lanjut tentang dimensi yang didukung yang digunakan untuk menanyakan sumber daya, lihat Lampiran 1: Metrik.

CompositeExpression

Map

Tidak

Ya

Kondisi pemicu untuk beberapa metrik.

Untuk informasi lebih lanjut, lihat Properti CompositeExpression.

Catatan

Kondisi pemicu untuk satu metrik dan beberapa metrik saling eksklusif. Anda tidak dapat menentukan kondisi pemicu untuk satu metrik dan beberapa metrik dalam satu permintaan.

DeletionForce

Boolean

Tidak

Ya

Menentukan apakah akan memaksa menghapus aturan peringatan.

Nilai valid:

  • true

  • false

EffectiveInterval

String

Tidak

Ya

Periode waktu selama aturan peringatan efektif.

Contoh: 00:00-23:59.

EmailSubject

String

Tidak

Ya

Subjek email notifikasi peringatan.

Tidak ada.

Interval

Integer

Tidak

Ya

Interval di mana peringatan dipicu berdasarkan aturan peringatan.

Satuan: detik.

Catatan

Untuk informasi lebih lanjut tentang cara menanyakan periode statistik dari metrik, lihat Lampiran 1: Metrik.

Labels

List

Tidak

Ya

Informasi tentang tag.

Untuk informasi lebih lanjut, lihat Properti Labels.

NoDataPolicy

String

Tidak

Ya

Metode yang digunakan untuk menangani peringatan ketika tidak ditemukan data pemantauan.

Nilai valid:

  • KEEP_LAST_STATE (default): tidak melakukan operasi apa pun.

  • INSUFFICIENT_DATA: memicu peringatan dengan isi "Data tidak cukup".

  • OK: menganggap status normal.

NoEffectiveInterval

String

Tidak

Ya

Periode waktu selama aturan peringatan tidak efektif.

Contoh: 00:00-23:59.

Period

Integer

Tidak

Ya

Periode statistik dari metrik.

Satuan: detik. Nilai default adalah interval di mana data pemantauan metrik dikumpulkan.

Catatan

Untuk informasi lebih lanjut tentang cara menanyakan periode statistik dari metrik, lihat Lampiran 1: Metrik.

Prometheus

Map

Tidak

Ya

Informasi tentang aturan peringatan Prometheus.

Untuk informasi lebih lanjut, lihat Properti Prometheus.

Catatan

Anda harus menentukan properti ini saat Anda membuat aturan peringatan Prometheus untuk Pemantauan Cloud Hybrid.

RuleId

String

Tidak

Tidak

ID aturan peringatan.

Anda dapat menentukan ID baru atau ID aturan peringatan yang sudah ada. Untuk informasi lebih lanjut tentang cara menanyakan ID aturan peringatan, lihat DescribeMetricRuleList.

Catatan

Jika Anda menentukan ID baru, aturan peringatan berbasis ambang batas dibuat.

RuleName

String

Tidak

Ya

Nama aturan peringatan.

Anda dapat menentukan nama baru atau nama aturan peringatan yang sudah ada di CloudMonitor. Untuk informasi lebih lanjut tentang cara menanyakan nama aturan peringatan, lihat DescribeMetricRuleList.

Catatan

Jika Anda menentukan nama baru, aturan peringatan berbasis ambang batas dibuat.

SilenceTime

Integer

Tidak

Ya

Periode bisu di mana notifikasi peringatan baru tidak dikirim meskipun kondisi pemicu terpenuhi.

Satuan: detik. Nilai default: 86400.

Catatan

Jika peringatan tidak dibersihkan setelah periode bisu berakhir, CloudMonitor mengirim ulang notifikasi peringatan.

Webhook

String

Tidak

Ya

URL panggilan balik ke mana permintaan POST dikirim ketika peringatan dipicu berdasarkan aturan peringatan.

Tidak ada.

Sintaksis Prometheus

"Prometheus": {
  "Annotations": List,
  "PromQL": String,
  "Times": Integer,
  "Level": String
}

Properti Prometheus

Properti

Tipe

Diperlukan

Dapat Diedit

Deskripsi

Kendala

Level

String

Ya

Ya

Tingkat peringatan.

Nilai valid:

  • Critical

  • Warn

  • Info

PromQL

String

Ya

Ya

Pernyataan query PromQL.

Tidak ada.

Times

Integer

Ya

Ya

Jumlah pemicu berturut-turut. Jika jumlah kali nilai metrik memenuhi kondisi pemicu mencapai nilai properti ini, CloudMonitor mengirimkan notifikasi peringatan.

Tidak ada.

Annotations

List

Tidak

Ya

Anotasi aturan peringatanPrometheus. Saat peringatan Prometheus dipicu, sistem merender kunci dan nilai anotasi.

Untuk informasi lebih lanjut, lihat Properti Annotations.

Catatan

Properti ini memiliki efek yang sama dengan properti Annotation dalam properti Prometheus.

Sintaksis Annotations

"Annotations": [
  {
    "Value": String,
    "Key": String
  }
]

Properti Annotations

Properti

Tipe

Diperlukan

Dapat Diedit

Deskripsi

Kendala

Key

String

Tidak

Ya

Kunci anotasi.

Tidak ada.

Value

String

Tidak

Ya

Nilai anotasi.

Tidak ada.

Sintaksis Labels

"Labels": [
  {
    "Value": String,
    "Key": String
  }
]

Properti Labels

Properti

Tipe

Diperlukan

Dapat Diedit

Deskripsi

Kendala

Key

String

Ya

Ya

Kunci tag.

Tidak ada.

Value

String

Tidak

Ya

Nilai tag.

Tidak ada.

Sintaksis Escalations

"Escalations": {
  "Critical": Map,
  "Info": Map,
  "Warn": Map
}

Properti Escalations

Properti

Tipe

Diperlukan

Dapat Diedit

Deskripsi

Kendala

Critical

Map

Tidak

Ya

Detail peringatan tingkat Critical.

Untuk informasi lebih lanjut, lihat Properti Critical.

Info

Map

Tidak

Ya

Detail peringatan tingkat Info.

Untuk informasi lebih lanjut, lihat Properti Info.

Warn

Map

Tidak

Ya

Detail peringatan tingkat Warn.

Untuk informasi lebih lanjut, lihat Properti Warn.

Sintaksis Critical

"Critical": {
  "ComparisonOperator": String,
  "Times": Integer,
  "Statistics": String,
  "Threshold": String
}

Properti Critical

Properti

Tipe

Diperlukan

Dapat Diedit

Deskripsi

Kendala

ComparisonOperator

String

Ya

Ya

Operator yang digunakan untuk membandingkan nilai metrik dengan ambang batas untuk peringatan tingkat Critical.

Nilai valid:

  • GreaterThanOrEqualToThreshold: lebih besar dari atau sama dengan ambang batas

  • GreaterThanThreshold: lebih besar dari ambang batas

  • LessThanOrEqualToThreshold: kurang dari atau sama dengan ambang batas

  • LessThanThreshold: kurang dari ambang batas

  • NotEqualToThreshold: tidak sama dengan ambang batas

  • GreaterThanYesterday: lebih besar dari nilai metrik pada waktu yang sama kemarin

  • LessThanYesterday: kurang dari nilai metrik pada waktu yang sama kemarin

  • GreaterThanLastWeek: lebih besar dari nilai metrik pada waktu yang sama minggu lalu

  • LessThanLastWeek: kurang dari nilai metrik pada waktu yang sama minggu lalu

  • GreaterThanLastPeriod: lebih besar dari nilai metrik dalam siklus pemantauan sebelumnya

  • LessThanLastPeriod: kurang dari nilai metrik dalam siklus pemantauan sebelumnya

Catatan

Anda harus mengonfigurasi setidaknya satu dari tingkat peringatan Critical, Warn, dan Info serta menentukan properti Statistics, ComparisonOperator, Threshold, dan Times untuk tingkat peringatan tersebut.

Statistics

String

Ya

Ya

Metode statistik untuk peringatan tingkat Critical.

Nilai valid:

  • Maximum: nilai maksimum

  • Minimum: nilai minimum

  • Average: nilai rata-rata

  • Availability: tingkat ketersediaan

Catatan

Anda harus mengonfigurasi setidaknya satu dari tingkat peringatan Critical, Warn, dan Info serta menentukan properti Statistics, ComparisonOperator, Threshold, dan Times untuk tingkat peringatan tersebut.

Threshold

String

Ya

Ya

Ambang batas untuk peringatan tingkat Critical.

Catatan

Anda harus mengonfigurasi setidaknya satu dari tingkat peringatan Critical, Warn, dan Info serta menentukan properti Statistics, ComparisonOperator, Threshold, dan Times untuk tingkat peringatan tersebut.

Times

Integer

Ya

Ya

Jumlah kali berturut-turut nilai metrik harus memenuhi kondisi pemicu sebelum peringatan tingkat Critical dipicu.

Catatan

Anda harus mengonfigurasi setidaknya satu dari tingkat peringatan Critical, Warn, dan Info serta menentukan properti Statistics, ComparisonOperator, Threshold, dan Times untuk tingkat peringatan tersebut.

Sintaksis Info

"Info": {
  "ComparisonOperator": String,
  "Times": Integer,
  "Statistics": String,
  "Threshold": String
}

Properti Info

Properti

Tipe

Diperlukan

Dapat Diedit

Deskripsi

Kendala

ComparisonOperator

String

Ya

Ya

Operator yang digunakan untuk membandingkan nilai metrik dengan ambang batas untuk peringatan tingkat Info.

Nilai valid:

  • GreaterThanOrEqualToThreshold: lebih besar dari atau sama dengan ambang batas

  • GreaterThanThreshold: lebih besar dari ambang batas

  • LessThanOrEqualToThreshold: kurang dari atau sama dengan ambang batas

  • LessThanThreshold: kurang dari ambang batas

  • NotEqualToThreshold: tidak sama dengan ambang batas

  • GreaterThanYesterday: lebih besar dari nilai metrik pada waktu yang sama kemarin

  • LessThanYesterday: kurang dari nilai metrik pada waktu yang sama kemarin

  • GreaterThanLastWeek: lebih besar dari nilai metrik pada waktu yang sama minggu lalu

  • LessThanLastWeek: kurang dari nilai metrik pada waktu yang sama minggu lalu

  • GreaterThanLastPeriod: lebih besar dari nilai metrik dalam siklus pemantauan sebelumnya

  • LessThanLastPeriod: kurang dari nilai metrik dalam siklus pemantauan sebelumnya

Catatan

Anda harus mengonfigurasi setidaknya satu dari tingkat peringatan Critical, Warn, dan Info serta menentukan properti Statistics, ComparisonOperator, Threshold, dan Times untuk tingkat peringatan tersebut.

Statistics

String

Ya

Ya

Metode statistik untuk peringatan tingkat Info.

Nilai valid:

  • Maximum: nilai maksimum

  • Minimum: nilai minimum

  • Average: nilai rata-rata

  • Availability: tingkat ketersediaan

Catatan

Anda harus mengonfigurasi setidaknya satu dari tingkat peringatan Critical, Warn, dan Info serta menentukan properti Statistics, ComparisonOperator, Threshold, dan Times untuk tingkat peringatan tersebut.

Threshold

String

Ya

Ya

Ambang batas untuk peringatan tingkat Info.

Catatan

Anda harus mengonfigurasi setidaknya satu dari tingkat peringatan Critical, Warn, dan Info serta menentukan properti Statistics, ComparisonOperator, Threshold, dan Times untuk tingkat peringatan tersebut.

Times

Integer

Ya

Ya

Jumlah kali berturut-turut nilai metrik harus memenuhi kondisi pemicu sebelum peringatan tingkat Info dipicu.

Catatan

Anda harus mengonfigurasi setidaknya satu dari tingkat peringatan Critical, Warn, dan Info serta menentukan properti Statistics, ComparisonOperator, Threshold, dan Times untuk tingkat peringatan tersebut.

Sintaksis Warn

"Warn": {
  "ComparisonOperator": String,
  "Times": Integer,
  "Statistics": String,
  "Threshold": String
}

Properti Warn

Properti

Tipe

Diperlukan

Dapat Diedit

Deskripsi

Kendala

ComparisonOperator

String

Ya

Ya

Operator yang digunakan untuk membandingkan nilai metrik dengan ambang batas untuk peringatan tingkat Warn.

Nilai valid:

  • GreaterThanOrEqualToThreshold: lebih besar dari atau sama dengan ambang batas

  • GreaterThanThreshold: lebih besar dari ambang batas

  • LessThanOrEqualToThreshold: kurang dari atau sama dengan ambang batas

  • LessThanThreshold: kurang dari ambang batas

  • NotEqualToThreshold: tidak sama dengan ambang batas

  • GreaterThanYesterday: lebih besar dari nilai metrik pada waktu yang sama kemarin

  • LessThanYesterday: kurang dari nilai metrik pada waktu yang sama kemarin

  • GreaterThanLastWeek: lebih besar dari nilai metrik pada waktu yang sama minggu lalu

  • LessThanLastWeek: kurang dari nilai metrik pada waktu yang sama minggu lalu

  • GreaterThanLastPeriod: lebih besar dari nilai metrik dalam siklus pemantauan sebelumnya

  • LessThanLastPeriod: kurang dari nilai metrik dalam siklus pemantauan sebelumnya

Catatan

Anda harus mengonfigurasi setidaknya satu dari tingkat peringatan Critical, Warn, dan Info serta menentukan properti Statistics, ComparisonOperator, Threshold, dan Times untuk tingkat peringatan tersebut.

Statistics

String

Ya

Ya

Metode statistik untuk peringatan tingkat Warn.

Nilai valid:

  • Maximum: nilai maksimum

  • Minimum: nilai minimum

  • Average: nilai rata-rata

  • Availability: tingkat ketersediaan

Catatan

Anda harus mengonfigurasi setidaknya satu dari tingkat peringatan Critical, Warn, dan Info serta menentukan properti Statistics, ComparisonOperator, Threshold, dan Times untuk tingkat peringatan tersebut.

Threshold

String

Ya

Ya

Ambang batas untuk peringatan tingkat Warn.

Catatan

Anda harus mengonfigurasi setidaknya satu dari tingkat peringatan Critical, Warn, dan Info serta menentukan properti Statistics, ComparisonOperator, Threshold, dan Times untuk tingkat peringatan tersebut.

Times

Integer

Ya

Ya

Jumlah kali berturut-turut nilai metrik harus memenuhi kondisi pemicu sebelum peringatan tingkat Warn dipicu.

Catatan

Anda harus mengonfigurasi setidaknya satu dari tingkat peringatan Critical, Warn, dan Info serta menentukan properti Statistics, ComparisonOperator, Threshold, dan Times untuk tingkat peringatan tersebut.

Sintaksis CompositeExpression

"CompositeExpression": {
  "Times": Integer,
  "ExpressionRaw": String,
  "ExpressionListJoin": String,
  "Level": String,
  "ExpressionList": List
}

Properti CompositeExpression

Properti

Tipe

Diperlukan

Dapat Diedit

Deskripsi

Kendala

Level

String

Ya

Ya

Tingkat peringatan.

Nilai valid:

  • Critical

  • Warn

  • Info

Times

Integer

Ya

Ya

Jumlah pemicu berturut-turut. Jika jumlah kali nilai metrik memenuhi kondisi pemicu mencapai nilai properti ini, CloudMonitor mengirimkan notifikasi peringatan.

Tidak ada.

ExpressionList

List

Tidak

Ya

Kondisi pemicu yang dibuat dalam mode standar.

Untuk informasi lebih lanjut, lihat Properti ExpressionList.

ExpressionListJoin

String

Tidak

Ya

Hubungan antara kondisi pemicu untuk beberapa metrik.

Nilai valid:

  • &&: Peringatan dipicu hanya jika semua metrik memenuhi kondisi pemicu.

  • ||: Peringatan dipicu jika salah satu metrik memenuhi kondisi pemicu.

ExpressionRaw

String

Tidak

Ya

Kondisi pemicu yang dibuat menggunakan ekspresi.

Anda dapat menggunakan ekspresi untuk membuat kondisi pemicu dalam skenario berikut:

  • Konfigurasikan daftar hitam peringatan untuk sumber daya tertentu. Sebagai contoh, jika Anda menentukan $instanceId != 'i-io8kfvcpp7x5****' && $Average > 50, tidak ada peringatan yang dipicu ketika nilai metrik rata-rata dari instance i-io8kfvcpp7x5**** melebihi 50.

  • Tentukan ambang batas peringatan khusus untuk instance tertentu dalam aturan peringatan. Sebagai contoh, jika Anda menentukan $Average > ($instanceId == 'i-io8kfvcpp7x5****'? 80: 50), peringatan dipicu ketika nilai metrik rata-rata dari instance i-io8kfvcpp7x5**** melebihi 80 atau nilai metrik rata-rata dari instance lainnya melebihi 50.

  • Batasi jumlah instance yang nilainya melebihi ambang batas. Sebagai contoh, jika Anda menentukan count($Average > 20) > 3, peringatan dipicu hanya ketika nilai metrik rata-rata lebih dari tiga instance melebihi 20.

Sintaksis ExpressionList

"ExpressionList": [
  {
    "MetricName": String,
    "ComparisonOperator": String,
    "Period": Integer,
    "Statistics": String,
    "Threshold": String
  }
]

Properti ExpressionList

Properti

Tipe

Diperlukan

Dapat Diedit

Deskripsi

Kendala

ComparisonOperator

String

Ya

Ya

Operator yang digunakan untuk membandingkan nilai metrik dengan ambang batas.

Nilai valid:

  • GreaterThanOrEqualToThreshold: lebih besar dari atau sama dengan ambang batas

  • GreaterThanThreshold: lebih besar dari ambang batas

  • LessThanOrEqualToThreshold: kurang dari atau sama dengan ambang batas

  • LessThanThreshold: kurang dari ambang batas

  • NotEqualToThreshold: tidak sama dengan ambang batas

  • GreaterThanYesterday: lebih besar dari nilai metrik pada waktu yang sama kemarin

  • LessThanYesterday: kurang dari nilai metrik pada waktu yang sama kemarin

  • GreaterThanLastWeek: lebih besar dari nilai metrik pada waktu yang sama minggu lalu

  • LessThanLastWeek: kurang dari nilai metrik pada waktu yang sama minggu lalu

  • GreaterThanLastPeriod: lebih besar dari nilai metrik dalam siklus pemantauan sebelumnya

  • LessThanLastPeriod: kurang dari nilai metrik dalam siklus pemantauan sebelumnya

MetricName

String

Ya

Ya

Nama metrik layanan cloud.

Tidak ada.

Period

Integer

Ya

Ya

Periode agregasi metrik.

Satuan: detik.

Statistics

String

Ya

Ya

Metode statistik metrik.

Nilai valid:

  • $Maximum: nilai maksimum.

  • $Minimum: nilai minimum.

  • $Average: nilai rata-rata.

  • $Availability: tingkat ketersediaan. Dalam kebanyakan kasus, tingkat ketersediaan digunakan untuk pemantauan situs.

Catatan

$ adalah awalan metrik. Untuk informasi lebih lanjut tentang layanan cloud yang didukung oleh CloudMonitor, lihat Lampiran 1: Metrik.

Threshold

String

Ya

Ya

Ambang batas peringatan.

Tidak ada.

Nilai Pengembalian

Fn::GetAtt

  • RuleId: ID aturan peringatan.

  • RuleName: nama aturan peringatan.

Contoh

Format JSON

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "ContactGroups": {
      "Type": "Json",
      "Description": "Grup kontak peringatan.\nNotifikasi peringatan dikirim ke kontak peringatan yang termasuk dalam grup kontak peringatan.\nCatatan: Grup kontak peringatan dapat berisi satu atau lebih kontak peringatan. Untuk informasi tentang cara membuat kontak peringatan dan grup kontak peringatan, lihat PutContact dan PutContactGroup.",
      "MinLength": 1
    },
    "Namespace": {
      "Type": "String",
      "Description": "Namespace layanan cloud.\nUntuk informasi tentang cara menanyakan namespace layanan cloud, Lampiran 1: Metrik.\nCatatan: Jika Anda membuat aturan peringatan Prometheus untuk Pemantauan Cloud Hybrid, Anda harus menetapkan parameter ini ke acs_prometheus."
    },
    "MetricName": {
      "Type": "String",
      "Description": "Nama metrik.\nUntuk informasi tentang cara menanyakan nama metrik, lihat Lampiran 1: Metrik.\nCatatan: Jika Anda membuat aturan peringatan Prometheus untuk Pemantauan Cloud Hybrid, Anda harus menetapkan parameter ini ke nama namespace. Untuk informasi tentang cara mendapatkan nama namespace, lihat DescribeHybridMonitorNamespaceList."
    },
    "Escalations": {
      "Type": "Json",
      "Description": "Anda harus memilih setidaknya satu dari tingkat peringatan Critical, Warn, dan Info.",
      "MinLength": 1
    },
    "Resources": {
      "Type": "Json",
      "Description": "Informasi tentang sumber daya.\nContoh: [{\"instanceId\":\"i-uf6j91r34rnwawoo****\"}] dan [{\"userId\":\"100931896542****\"}].\nUntuk informasi tentang dimensi yang didukung yang digunakan untuk menanyakan sumber daya, lihat Lampiran 1: Metrik.",
      "MinLength": 1
    }
  },
  "Resources": {
    "ResourceMetricRule": {
      "Type": "ALIYUN::CMS::ResourceMetricRule",
      "Properties": {
        "ContactGroups": {
          "Ref": "ContactGroups"
        },
        "Namespace": {
          "Ref": "Namespace"
        },
        "MetricName": {
          "Ref": "MetricName"
        },
        "Resources": {
          "Ref": "Resources"
        },
        "Escalations": {
          "Ref": "Escalations"
        }
      }
    }
  },
  "Outputs": {
    "RuleId": {
      "Description": "ID aturan peringatan.",
      "Value": {
        "Fn::GetAtt": [
          "ResourceMetricRule",
          "RuleId"
        ]
      }
    },
    "RuleName": {
      "Description": "Nama aturan peringatan.",
      "Value": {
        "Fn::GetAtt": [
          "ResourceMetricRule",
          "RuleName"
        ]
      }
    }
  }
}