透過 API 管理快訊政策

本文說明如何使用 Cloud Monitoring API,以程式輔助方式建立、編輯、刪除、列出及取得指標型快訊政策。這些範例說明如何使用 Google Cloud CLI 和用戶端程式庫。 這項內容不適用於以記錄檔為準的快訊政策。 如要瞭解記錄快訊政策,請參閱「監控記錄」。

您也可以使用 Google Cloud 控制台執行這些工作,詳情請參閱下列文件:

這項功能僅支援 Google Cloud 專案。 如果是 App Hub 設定,請選取 App Hub 主專案或管理專案。

關於快訊政策

快訊政策由 AlertPolicy 物件呈現,說明一組用來指出您系統中可能存在不良健康狀態的條件。快訊政策會參照通知管道,進而讓您指定您想如何收到已觸發快訊政策的通知。

每項快訊政策都屬於指標範圍的限定範圍專案。每個專案最多可包含 2,000 項政策。發出 API 呼叫時,您必須提供「專案 ID」,並使用指標範圍的範圍專案 ID 做為值。在這些範例中,指標範圍的範圍設定專案 ID 為 a-gcp-project

AlertPolicy 資源支援五種作業:

  • 建立新政策
  • 刪除現有政策
  • 擷取特定政策
  • 擷取所有政策
  • 修改現有政策

快訊政策可以 JSON 或 YAML 格式表示,方便您將政策記錄在檔案中,並使用檔案備份及還原政策。您可以使用 Google Cloud CLI,從任一格式的檔案建立政策。您可以使用 REST API,從 JSON 檔案建立政策。 如要查看 JSON 格式的快訊政策選集,請參閱「範例政策」。

下列範例使用 gcloud 介面和 API,說明這些基本用途。API 範例摘錄自範例程式,該程式使用 API 實作快訊政策的備份和還原系統。如需更完整的範例,請參閱「範例:備份及還原」。

事前準備

在針對 API 編寫程式碼之前,您應該先:

  • 熟悉適用於快訊政策的一般概念與術語;詳情請參閱快訊總覽
  • 確保啟用 Cloud Monitoring API 以供使用;詳情請參閱啟用 API
  • 如果您打算使用用戶端程式庫,請針對您想使用的語言安裝程式庫;詳情請參閱用戶端程式庫。目前只為 C#、Go、Java、Node.js 與 Python 提供 API 快訊支援。
  • 如果您打算使用 Google Cloud CLI,請安裝該工具。 不過,如果您使用 Cloud Shell,系統會預先安裝 Google Cloud CLI。

    這裡還提供了使用 gcloud 介面的範例。 請注意,所有 gcloud 範例都假設目前的專案已設為目標 (gcloud config set project [PROJECT_ID]),因此呼叫會省略明確的 --project 旗標。範例中目前專案的 ID 為 a-gcp-project。如果是 App Hub 設定,請選取 App Hub 主專案或管理專案。

建立快訊政策

如要在專案中建立快訊政策,請使用 alertPolicies.create 方法。如要瞭解如何叫用這個方法、其參數和回應資料,請參閱alertPolicies.create參考頁面。

您可以利用 JSON 或 YAML 檔案建立政策,Google Cloud CLI 接受這些檔案做為引數。您可以透過程式讀取 JSON 檔案、將該檔案轉換為 AlertPolicy 物件,並透過 alertPolicies.create 方法來利用這些檔案建立政策。如果您有包含警告規則的 Prometheus JSON 或 YAML 設定檔,gcloud CLI 可以將其遷移至 Cloud Monitoring 警告政策,並加入 PromQL 條件。詳情請參閱「從 Prometheus 遷移快訊規則和接收者」。

下列範例說明如何建立快訊政策,但未說明如何建立描述快訊政策的 JSON 或 YAML 檔案。不過,這些範例會假設有 JSON 格式的檔案,並說明如何發出 API 呼叫。如需 JSON 檔案範例,請參閱「範例政策」。如要瞭解如何監控指標比率,請參閱「指標比率」。

gcloud

如要在專案中建立快訊政策,請使用 gcloud alpha monitoring policies create 指令。下列範例會利用 rising-cpu-usage.json 檔案,在 a-gcp-project 中建立快訊政策:

gcloud alpha monitoring policies create --policy-from-file="rising-cpu-usage.json" 

若成功,這個指令會傳回新政策的名稱,例如:

Created alert policy [projects/a-gcp-project/alertPolicies/12669073143329903307]. 

rising-cpu-usage.json 檔案包含顯示名稱為「High CPU rate of change」的政策 JSON。如要瞭解這項政策的詳細資料,請參閱「變更率政策」。

詳情請參閱 gcloud alpha monitoring policies create 參考資料。

C#

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

static void RestorePolicies(string projectId, string filePath) {     var policyClient = AlertPolicyServiceClient.Create();     var channelClient = NotificationChannelServiceClient.Create();     List<Exception> exceptions = new List<Exception>();     var backup = JsonConvert.DeserializeObject<BackupRecord>(         File.ReadAllText(filePath), new ProtoMessageConverter());     var projectName = new ProjectName(projectId);     bool isSameProject = projectId == backup.ProjectId;     // When a channel is recreated, rather than updated, it will get     // a new name.  We have to update the AlertPolicy with the new     // name.  Track the names in this map.     var channelNameMap = new Dictionary<string, string>();     foreach (NotificationChannel channel in backup.Channels)     {     }     foreach (AlertPolicy policy in backup.Policies)     {         string policyName = policy.Name;         // These two fields cannot be set directly, so clear them.         policy.CreationRecord = null;         policy.MutationRecord = null;         // Update channel names if the channel was recreated with         // another name.         for (int i = 0; i < policy.NotificationChannels.Count; ++i)         {             if (channelNameMap.ContainsKey(policy.NotificationChannels[i]))             {                 policy.NotificationChannels[i] =                     channelNameMap[policy.NotificationChannels[i]];             }         }         try         {             Console.WriteLine("Updating policy.\n{0}",                 policy.DisplayName);             bool updated = false;             if (isSameProject)                 try                 {                     policyClient.UpdateAlertPolicy(null, policy);                     updated = true;                 }                 catch (Grpc.Core.RpcException e)                 when (e.Status.StatusCode == StatusCode.NotFound)                 { }             if (!updated)             {                 // The policy no longer exists.  Recreate it.                 policy.Name = null;                 foreach (var condition in policy.Conditions)                 {                     condition.Name = null;                 }                 policyClient.CreateAlertPolicy(projectName, policy);             }             Console.WriteLine("Restored {0}.", policyName);         }         catch (Exception e)         {             // If one failed, continue trying to update the others.             exceptions.Add(e);         }     }     if (exceptions.Count > 0)     {         throw new AggregateException(exceptions);     } } 

Go

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

 // restorePolicies updates the project with the alert policies and // notification channels in r. func restorePolicies(w io.Writer, projectID string, r io.Reader) error { 	b := backup{} 	if err := json.NewDecoder(r).Decode(&b); err != nil { 		return err 	} 	sameProject := projectID == b.ProjectID  	ctx := context.Background()  	alertClient, err := monitoring.NewAlertPolicyClient(ctx) 	if err != nil { 		return err 	} 	defer alertClient.Close() 	channelClient, err := monitoring.NewNotificationChannelClient(ctx) 	if err != nil { 		return err 	} 	defer channelClient.Close()  	// When a channel is recreated, rather than updated, it will get 	// a new name.  We have to update the AlertPolicy with the new 	// name.  channelNames keeps track of the new names. 	channelNames := make(map[string]string) 	for _, c := range b.Channels { 		fmt.Fprintf(w, "Updating channel %q\n", c.GetDisplayName()) 		c.VerificationStatus = monitoringpb.NotificationChannel_VERIFICATION_STATUS_UNSPECIFIED 		updated := false 		if sameProject { 			req := &monitoringpb.UpdateNotificationChannelRequest{ 				NotificationChannel: c.NotificationChannel, 			} 			_, err := channelClient.UpdateNotificationChannel(ctx, req) 			if err == nil { 				updated = true 			} 		} 		if !updated { 			req := &monitoringpb.CreateNotificationChannelRequest{ 				Name:                "projects/" + projectID, 				NotificationChannel: c.NotificationChannel, 			} 			oldName := c.GetName() 			c.Name = "" 			newC, err := channelClient.CreateNotificationChannel(ctx, req) 			if err != nil { 				return err 			} 			channelNames[oldName] = newC.GetName() 		} 	}  	for _, policy := range b.AlertPolicies { 		fmt.Fprintf(w, "Updating alert %q\n", policy.GetDisplayName()) 		policy.CreationRecord = nil 		policy.MutationRecord = nil 		for i, aChannel := range policy.GetNotificationChannels() { 			if c, ok := channelNames[aChannel]; ok { 				policy.NotificationChannels[i] = c 			} 		} 		updated := false 		if sameProject { 			req := &monitoringpb.UpdateAlertPolicyRequest{ 				AlertPolicy: policy.AlertPolicy, 			} 			_, err := alertClient.UpdateAlertPolicy(ctx, req) 			if err == nil { 				updated = true 			} 		} 		if !updated { 			req := &monitoringpb.CreateAlertPolicyRequest{ 				Name:        "projects/" + projectID, 				AlertPolicy: policy.AlertPolicy, 			} 			if _, err = alertClient.CreateAlertPolicy(ctx, req); err != nil { 				log.Fatal(err) 			} 		} 	} 	fmt.Fprintf(w, "Successfully restored alerts.") 	return nil } 

Java

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

private static void restoreRevisedPolicies(     String projectId, boolean isSameProject, List<AlertPolicy> policies) throws IOException {   try (AlertPolicyServiceClient client = AlertPolicyServiceClient.create()) {     for (AlertPolicy policy : policies) {       if (!isSameProject) {         policy = client.createAlertPolicy(ProjectName.of(projectId), policy);       } else {         try {           client.updateAlertPolicy(null, policy);         } catch (Exception e) {           policy =               client.createAlertPolicy(                   ProjectName.of(projectId), policy.toBuilder().clearName().build());         }       }       System.out.println(String.format("Restored %s", policy.getName()));     }   } }

Node.js

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

const fs = require('fs');  // Imports the Google Cloud client library const monitoring = require('@google-cloud/monitoring');  // Creates a client const client = new monitoring.AlertPolicyServiceClient();  async function restorePolicies() {   // Note: The policies are restored one at a time due to limitations in   // the API. Otherwise, you may receive a 'service unavailable'  error   // while trying to create multiple alerts simultaneously.    /**    * TODO(developer): Uncomment the following lines before running the sample.    */   // const projectId = 'YOUR_PROJECT_ID';    console.log('Loading policies from ./policies_backup.json');   const fileContent = fs.readFileSync('./policies_backup.json', 'utf-8');   const policies = JSON.parse(fileContent);    for (const index in policies) {     // Restore each policy one at a time     let policy = policies[index];     if (await doesAlertPolicyExist(policy.name)) {       policy = await client.updateAlertPolicy({         alertPolicy: policy,       });     } else {       // Clear away output-only fields       delete policy.name;       delete policy.creationRecord;       delete policy.mutationRecord;       policy.conditions.forEach(condition => delete condition.name);        policy = await client.createAlertPolicy({         name: client.projectPath(projectId),         alertPolicy: policy,       });     }      console.log(`Restored ${policy[0].name}.`);   }   async function doesAlertPolicyExist(name) {     try {       const [policy] = await client.getAlertPolicy({         name,       });       return policy ? true : false;     } catch (err) {       if (err && err.code === 5) {         // Error code 5 comes from the google.rpc.code.NOT_FOUND protobuf         return false;       }       throw err;     }   } } restorePolicies();

PHP

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

use Google\Cloud\Monitoring\V3\AlertPolicy; use Google\Cloud\Monitoring\V3\AlertPolicy\Condition; use Google\Cloud\Monitoring\V3\AlertPolicy\Condition\MetricThreshold; use Google\Cloud\Monitoring\V3\AlertPolicy\ConditionCombinerType; use Google\Cloud\Monitoring\V3\Client\AlertPolicyServiceClient; use Google\Cloud\Monitoring\V3\ComparisonType; use Google\Cloud\Monitoring\V3\CreateAlertPolicyRequest; use Google\Protobuf\Duration;  /**  * @param string $projectId Your project ID  */ function alert_create_policy($projectId) {     $alertClient = new AlertPolicyServiceClient([         'projectId' => $projectId,     ]);     $projectName = 'projects/' . $projectId;      $policy = new AlertPolicy();     $policy->setDisplayName('Test Alert Policy');     $policy->setCombiner(ConditionCombinerType::PBOR);     /** @see https://cloud.google.com/monitoring/api/resources for a list of resource.type */     /** @see https://cloud.google.com/monitoring/api/metrics_gcp for a list of metric.type */     $policy->setConditions([new Condition([         'display_name' => 'condition-1',         'condition_threshold' => new MetricThreshold([             'filter' => 'resource.type = "gce_instance" AND metric.type = "compute.googleapis.com/instance/cpu/utilization"',             'duration' => new Duration(['seconds' => '60']),             'comparison' => ComparisonType::COMPARISON_LT,         ])     ])]);     $createAlertPolicyRequest = (new CreateAlertPolicyRequest())         ->setName($projectName)         ->setAlertPolicy($policy);      $policy = $alertClient->createAlertPolicy($createAlertPolicyRequest);     printf('Created alert policy %s' . PHP_EOL, $policy->getName()); }

Python

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

def restore(project_name, backup_filename):     """Restore alert policies in a project.      Arguments:         project_name (str): The Google Cloud Project to use. The project name             must be in the format - 'projects/<PROJECT_NAME>'.         backup_filename (str): Name of the file (along with its path) from             which the alert policies will be restored.     """     print(         "Loading alert policies and notification channels from {}.".format(             backup_filename         )     )     record = json.load(open(backup_filename, "rt"))     is_same_project = project_name == record["project_name"]     # Convert dicts to AlertPolicies.     policies_json = [json.dumps(policy) for policy in record["policies"]]     policies = [         monitoring_v3.AlertPolicy.from_json(policy_json)         for policy_json in policies_json     ]     # Convert dicts to NotificationChannels     channels_json = [json.dumps(channel) for channel in record["channels"]]     channels = [         monitoring_v3.NotificationChannel.from_json(channel_json)         for channel_json in channels_json     ]      # Restore the channels.     channel_client = monitoring_v3.NotificationChannelServiceClient()     channel_name_map = {}      for channel in channels:         updated = False         print("Updating channel", channel.display_name)         # This field is immutable and it is illegal to specify a         # non-default value (UNVERIFIED or VERIFIED) in the         # Create() or Update() operations.         channel.verification_status = (             monitoring_v3.NotificationChannel.VerificationStatus.VERIFICATION_STATUS_UNSPECIFIED         )          if is_same_project:             try:                 channel_client.update_notification_channel(notification_channel=channel)                 updated = True             except google.api_core.exceptions.NotFound:                 pass  # The channel was deleted.  Create it below.          if not updated:             # The channel no longer exists.  Recreate it.             old_name = channel.name             del channel.name             new_channel = channel_client.create_notification_channel(                 name=project_name, notification_channel=channel             )             channel_name_map[old_name] = new_channel.name      # Restore the alerts     alert_client = monitoring_v3.AlertPolicyServiceClient()      for policy in policies:         print("Updating policy", policy.display_name)         # These two fields cannot be set directly, so clear them.         del policy.creation_record         del policy.mutation_record          # Update old channel names with new channel names.         for i, channel in enumerate(policy.notification_channels):             new_channel = channel_name_map.get(channel)             if new_channel:                 policy.notification_channels[i] = new_channel          updated = False          if is_same_project:             try:                 alert_client.update_alert_policy(alert_policy=policy)                 updated = True             except google.api_core.exceptions.NotFound:                 pass  # The policy was deleted.  Create it below.             except google.api_core.exceptions.InvalidArgument:                 # Annoying that API throws InvalidArgument when the policy                 # does not exist.  Seems like it should throw NotFound.                 pass  # The policy was deleted.  Create it below.          if not updated:             # The policy no longer exists.  Recreate it.             old_name = policy.name             del policy.name             for condition in policy.conditions:                 del condition.name             policy = alert_client.create_alert_policy(                 name=project_name, alert_policy=policy             )         print("Updated", policy.name)  

建立的 AlertPolicy 物件將擁有其他欄位。 政策本身會包含 namecreationRecordmutationRecord 欄位。此外,政策中的每項條件也會標示 name。這些欄位無法從外部修改,因此建立政策時不必設定。用於建立政策的所有 JSON 範例都不包含這些欄位,但如果在利用這些欄位建立政策之後擷取政策,這些欄位會顯示出來。

列出及取得快訊政策

如要在專案中擷取政策的清單,請使用 alertPolicies.list 方法。 使用這個方法可擷取政策,並對每項政策套用某些動作,例如備份政策。這個方法也支援以 filterorderBy 選項來限制及排序結果;詳情請參閱「排序與篩選」。

如果您要尋找特定政策且知道政策名稱,則可以使用 alertPolicies.get 方法只擷取這個政策。政策名稱是 AlertPolicy 物件中的 name 欄位值,而非 displayName。政策名稱的格式為 projects/[PROJECT_ID]/alertPolicies/[POLICY_ID],例如:

projects/a-gcp-project/alertPolicies/12669073143329903307 

gcloud

如要列出專案中的所有快訊政策,請使用 gcloud alpha monitoring policies list 指令:

gcloud alpha monitoring policies list 

如果成功,list 指令會提供指定專案中所有政策的清單 (清單格式為 YAML)。舉例來說,在其他列出的政策中,專案 a-gcp-project 中顯示名稱為「High CPU rate of change」(高 CPU 變更頻率) 的政策會以下列方式列出:

--- combiner: OR conditions: - conditionThreshold:     aggregations:     - alignmentPeriod: 900s       perSeriesAligner: ALIGN_PERCENT_CHANGE     comparison: COMPARISON_GT     duration: 180s     filter: metric.type="compute.googleapis.com/instance/cpu/utilization" AND resource.type="gce_instance"     thresholdValue: 0.5     trigger:       count: 1   displayName: CPU usage is increasing at a high rate   name: projects/a-gcp-project/alertPolicies/12669073143329903307/conditions/12669073143329903008 creationRecord:   mutateTime: '2018-03-26T18:52:39.363601689Z'   mutatedBy: [USER@DOMAIN] displayName: High CPU rate of change enabled: true mutationRecord:   mutateTime: '2018-03-26T18:52:39.363601689Z'   mutatedBy: [USER@DOMAIN] name: projects/a-gcp-project/alertPolicies/12669073143329903307 --- 

如要列出單一快訊政策,請改用 gcloud alpha monitoring policies describe,並指定政策名稱。例如,這個指令只會傳回上方的清單:

gcloud alpha monitoring policies describe projects/a-gcp-project/alertPolicies/12669073143329903307 

詳情請參閱 gcloud alpha monitoring policies listdescribe 參考資料。describe 指令與 API 中的 alertPolicies.get 方法對應。

C#

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

static void ListAlertPolicies(string projectId) {     var client = AlertPolicyServiceClient.Create();     var response = client.ListAlertPolicies(new ProjectName(projectId));     foreach (AlertPolicy policy in response)     {         Console.WriteLine(policy.Name);         if (policy.DisplayName != null)         {             Console.WriteLine(policy.DisplayName);         }         if (policy.Documentation?.Content != null)         {             Console.WriteLine(policy.Documentation.Content);         }         Console.WriteLine();     } } 

Go

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

 // listAlertPolicies lists the alert policies in the project. func listAlertPolicies(w io.Writer, projectID string) error { 	ctx := context.Background() 	client, err := monitoring.NewAlertPolicyClient(ctx) 	if err != nil { 		return err 	} 	defer client.Close()  	req := &monitoringpb.ListAlertPoliciesRequest{ 		Name: "projects/" + projectID, 		// Filter:  "", // See https://cloud.google.com/monitoring/api/v3/sorting-and-filtering. 		// OrderBy: "", // See https://cloud.google.com/monitoring/api/v3/sorting-and-filtering. 	} 	it := client.ListAlertPolicies(ctx, req) 	for { 		resp, err := it.Next() 		if err == iterator.Done { 			fmt.Fprintln(w, "Done") 			break 		} 		if err != nil { 			return err 		} 		fmt.Fprintf(w, "  Name: %q\n", resp.GetName()) 		fmt.Fprintf(w, "  Display Name: %q\n", resp.GetDisplayName()) 		fmt.Fprintf(w, "  Documentation Content: %q\n\n", resp.GetDocumentation().GetContent()) 	} 	return nil } 

Java

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

private static void listAlertPolicies(String projectId) throws IOException {   try (AlertPolicyServiceClient client = AlertPolicyServiceClient.create()) {     ListAlertPoliciesPagedResponse response = client.listAlertPolicies(ProjectName.of(projectId));      System.out.println("Alert Policies:");     for (AlertPolicy policy : response.iterateAll()) {       System.out.println(           String.format("\nPolicy %s\nalert-id: %s", policy.getDisplayName(), policy.getName()));       int channels = policy.getNotificationChannelsCount();       if (channels > 0) {         System.out.println("notification-channels:");         for (int i = 0; i < channels; i++) {           System.out.println("\t" + policy.getNotificationChannels(i));         }       }       if (policy.hasDocumentation() && policy.getDocumentation().getContent() != null) {         System.out.println(policy.getDocumentation().getContent());       }     }   } }

Node.js

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

// Imports the Google Cloud client library const monitoring = require('@google-cloud/monitoring');  // Creates a client const client = new monitoring.AlertPolicyServiceClient();  async function listPolicies() {   /**    * TODO(developer): Uncomment the following lines before running the sample.    */   // const projectId = 'YOUR_PROJECT_ID';    const listAlertPoliciesRequest = {     name: client.projectPath(projectId),   };   const [policies] = await client.listAlertPolicies(listAlertPoliciesRequest);   console.log('Policies:');   policies.forEach(policy => {     console.log(`  Display name: ${policy.displayName}`);     if (policy.documentation && policy.documentation.content) {       console.log(`     Documentation: ${policy.documentation.content}`);     }   }); } listPolicies();

PHP

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

use Google\Cloud\Monitoring\V3\Client\AlertPolicyServiceClient; use Google\Cloud\Monitoring\V3\ListAlertPoliciesRequest;  /**  * Adds a new column to the Albums table in the example database.  * Example:  * ```  * alert_list_policies($projectId);  * ```  *  * @param string $projectId Your project ID  */ function alert_list_policies($projectId) {     $projectName = 'projects/' . $projectId;     $alertClient = new AlertPolicyServiceClient([         'projectId' => $projectId,     ]);     $listAlertPoliciesRequest = (new ListAlertPoliciesRequest())         ->setName($projectName);      $policies = $alertClient->listAlertPolicies($listAlertPoliciesRequest);     foreach ($policies->iterateAllElements() as $policy) {         printf('Name: %s (%s)' . PHP_EOL, $policy->getDisplayName(), $policy->getName());     } }

Python

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

def list_alert_policies(project_name):     """List alert policies in a project.      Arguments:         project_name (str): The Google Cloud Project to use. The project name             must be in the format - 'projects/<PROJECT_NAME>'.     """      client = monitoring_v3.AlertPolicyServiceClient()     policies = client.list_alert_policies(name=project_name)     print(         str(             tabulate.tabulate(                 [(policy.name, policy.display_name) for policy in policies],                 ("name", "display_name"),             )         )     )  

刪除快訊政策

如要刪除專案中的政策,請使用 alertPolicies.delete 方法,並提供要刪除的快訊政策名稱。

gcloud

如要刪除快訊政策,請使用 gcloud alpha monitoring policies delete,並指定要刪除的政策名稱。舉例來說,下列指令會刪除顯示名稱為「High CPU rate of change」的政策

gcloud alpha monitoring policies delete projects/a-gcp-project/alertPolicies/12669073143329903307 

詳情請參閱 gcloud alpha monitoring policies delete 參考資料。

修改快訊政策

如要修改快訊政策,請使用 alertPolicies.patch 方法 (在 REST API 中)。其他 API 實作與 gcloud 介面將這個方法稱為 update,而不是 patch

更新作業可以完全取代現有政策,也可以修改欄位子集。更新作業會採用新的 AlertPolicy 物件與選用的欄位遮罩

如果指定欄位遮罩,則列在欄位遮罩中的任何欄位,都會更新為所提供政策中的值。如果提供的政策不包含欄位遮罩中提及的欄位,則會清除該欄位並將其設定為預設值。未列在遮罩中的任何欄位會保留之前的值。

如未指定欄位遮罩,現有政策會由提供的政策取代,但名稱 (projects/[PROJECT_ID]/alertPolicies/[POLICY_ID]) 會重複使用。新政策中含有 name 值的任何條件,如果包含 CONDITION_ID,將保留這些名稱。若非如此,則會建立新條件與政策名稱。

使用 gcloud 指令列更新政策時,會使用指令列標記 (而不是欄位遮罩) 來指定要更新的欄位。詳情請參閱gcloud alpha monitoring policies update

您可以使用標籤將快訊政策與 App Hub 應用程式建立關聯。詳情請參閱「如何將快訊政策與 App Hub 應用程式建立關聯」。

啟用或停用快訊政策

如要啟用或停用政策,請變更 AlertPolicy 物件中的布林 enabled 欄位值。請注意,在您啟用政策之後,仍可透過停用時收集的資料觸發。

gcloud

如要停用快訊政策,請使用 gcloud alpha monitoring policies update 指令並提供 --no-enabled 標記。下列指令會停用專案 a-gcp-project 中的「High CPU rate of change」快訊政策:

gcloud alpha monitoring policies update projects/a-gcp-project/alertPolicies/12669073143329903307 --no-enabled 

如要啟用政策,請使用相同指令並提供 --enabled 標記。 詳情請參閱 gcloud alpha monitoring policies update 參考資料。update 指令與 REST API 中的 alertPolicies.patch 方法對應。

C#

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

static object EnablePolicies(string projectId, string filter, bool enable) {     var client = AlertPolicyServiceClient.Create();     var request = new ListAlertPoliciesRequest()     {         ProjectName = new ProjectName(projectId),         Filter = filter     };     var response = client.ListAlertPolicies(request);     int result = 0;     foreach (AlertPolicy policy in response)     {         try         {             if (policy.Enabled == enable)             {                 Console.WriteLine("Policy {0} is already {1}.",                     policy.Name, enable ? "enabled" : "disabled");                 continue;             }             policy.Enabled = enable;             var fieldMask = new FieldMask { Paths = { "enabled" } };             client.UpdateAlertPolicy(fieldMask, policy);             Console.WriteLine("{0} {1}.", enable ? "Enabled" : "Disabled",                 policy.Name);         }         catch (Grpc.Core.RpcException e)         when (e.Status.StatusCode == StatusCode.InvalidArgument)         {             Console.WriteLine(e.Message);             result -= 1;         }     }     // Return a negative count of how many enable operations failed.     return result; } 

Go

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

 // enablePolicies enables or disables all alert policies in the project. func enablePolicies(w io.Writer, projectID string, enable bool) error { 	ctx := context.Background()  	client, err := monitoring.NewAlertPolicyClient(ctx) 	if err != nil { 		return err 	} 	defer client.Close()  	req := &monitoringpb.ListAlertPoliciesRequest{ 		Name: "projects/" + projectID, 		// Filter:  "", // See https://cloud.google.com/monitoring/api/v3/sorting-and-filtering. 		// OrderBy: "", // See https://cloud.google.com/monitoring/api/v3/sorting-and-filtering. 	} 	it := client.ListAlertPolicies(ctx, req) 	for { 		a, err := it.Next() 		if err == iterator.Done { 			break 		} 		if err != nil { 			return err 		} 		if a.GetEnabled().GetValue() == enable { 			fmt.Fprintf(w, "Policy %q already has enabled=%v", a.GetDisplayName(), enable) 			continue 		} 		a.Enabled = &wrappers.BoolValue{Value: enable} 		req := &monitoringpb.UpdateAlertPolicyRequest{ 			AlertPolicy: a, 			UpdateMask: &fieldmask.FieldMask{ 				Paths: []string{"enabled"}, 			}, 		} 		if _, err := client.UpdateAlertPolicy(ctx, req); err != nil { 			return err 		} 	} 	fmt.Fprintln(w, "Successfully updated alerts.") 	return nil } 

Java

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

private static void enablePolicies(String projectId, String filter, boolean enable)     throws IOException {   try (AlertPolicyServiceClient client = AlertPolicyServiceClient.create()) {     ListAlertPoliciesPagedResponse response =         client.listAlertPolicies(             ListAlertPoliciesRequest.newBuilder()                 .setName(ProjectName.of(projectId).toString())                 .setFilter(filter)                 .build());      for (AlertPolicy policy : response.iterateAll()) {       if (policy.getEnabled().getValue() == enable) {         System.out.println(             String.format(                 "Policy %s is already %b.", policy.getName(), enable ? "enabled" : "disabled"));         continue;       }       AlertPolicy updatedPolicy =           AlertPolicy.newBuilder()               .setName(policy.getName())               .setEnabled(BoolValue.newBuilder().setValue(enable))               .build();       AlertPolicy result =           client.updateAlertPolicy(               FieldMask.newBuilder().addPaths("enabled").build(), updatedPolicy);       System.out.println(           String.format(               "%s %s",               result.getDisplayName(), result.getEnabled().getValue() ? "enabled" : "disabled"));     }   } }

Node.js

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

// Imports the Google Cloud client library const monitoring = require('@google-cloud/monitoring');  // Creates a client const client = new monitoring.AlertPolicyServiceClient();  async function enablePolicies() {   /**    * TODO(developer): Uncomment the following lines before running the sample.    */   // const projectId = 'YOUR_PROJECT_ID';   // const enabled = true;   // const filter = 'A filter for selecting policies, e.g. description:"cloud"';    const listAlertPoliciesRequest = {     name: client.projectPath(projectId),     // See https://cloud.google.com/monitoring/alerting/docs/sorting-and-filtering     filter: filter,   };    const [policies] = await client.listAlertPolicies(listAlertPoliciesRequest);   const responses = [];   for (const policy of policies) {     responses.push(       await client.updateAlertPolicy({         updateMask: {           paths: ['enabled'],         },         alertPolicy: {           name: policy.name,           enabled: {             value: enabled,           },         },       })     );   }   responses.forEach(response => {     const alertPolicy = response[0];     console.log(`${enabled ? 'Enabled' : 'Disabled'} ${alertPolicy.name}.`);   }); } enablePolicies();

PHP

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

use Google\Cloud\Monitoring\V3\Client\AlertPolicyServiceClient; use Google\Cloud\Monitoring\V3\ListAlertPoliciesRequest; use Google\Cloud\Monitoring\V3\UpdateAlertPolicyRequest; use Google\Protobuf\FieldMask;  /**  * Enable or disable alert policies in a project.  *  * @param string $projectId Your project ID  * @param bool $enable Enable or disable the policies.  * @param string $filter Only enable/disable alert policies that match a filter.  *        See https://cloud.google.com/monitoring/api/v3/sorting-and-filtering  */ function alert_enable_policies($projectId, $enable = true, $filter = null) {     $alertClient = new AlertPolicyServiceClient([         'projectId' => $projectId,     ]);     $projectName = 'projects/' . $projectId;     $listAlertPoliciesRequest = (new ListAlertPoliciesRequest())         ->setName($projectName)         ->setFilter($filter);      $policies = $alertClient->listAlertPolicies($listAlertPoliciesRequest);     foreach ($policies->iterateAllElements() as $policy) {         $isEnabled = $policy->getEnabled()->getValue();         if ($enable == $isEnabled) {             printf('Policy %s is already %s' . PHP_EOL,                 $policy->getName(),                 $isEnabled ? 'enabled' : 'disabled'             );         } else {             $policy->getEnabled()->setValue((bool) $enable);             $mask = new FieldMask();             $mask->setPaths(['enabled']);             $updateAlertPolicyRequest = (new UpdateAlertPolicyRequest())                 ->setAlertPolicy($policy)                 ->setUpdateMask($mask);             $alertClient->updateAlertPolicy($updateAlertPolicyRequest);             printf('%s %s' . PHP_EOL,                 $enable ? 'Enabled' : 'Disabled',                 $policy->getName()             );         }     } }

Python

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

def enable_alert_policies(project_name, enable, filter_=None):     """Enable or disable alert policies in a project.      Arguments:         project_name (str): The Google Cloud Project to use. The project name             must be in the format - 'projects/<PROJECT_NAME>'.         enable (bool): Enable or disable the policies.         filter_ (str, optional): Only enable/disable alert policies that match             this filter_.  See             https://cloud.google.com/monitoring/api/v3/sorting-and-filtering     """      client = monitoring_v3.AlertPolicyServiceClient()     policies = client.list_alert_policies(         request={"name": project_name, "filter": filter_}     )      for policy in policies:         if bool(enable) == policy.enabled:             print(                 "Policy",                 policy.name,                 "is already",                 "enabled" if policy.enabled else "disabled",             )         else:             policy.enabled = bool(enable)             mask = field_mask.FieldMask()             mask.paths.append("enabled")             client.update_alert_policy(alert_policy=policy, update_mask=mask)             print("Enabled" if enable else "Disabled", policy.name)  

更新快訊政策中的通知管道

您也可以更新快訊政策參照的通知管道。 快訊政策會依名稱參照通知管道。管道必須存在,才能用於快訊政策。

您可以透過程式建立及管理通知管道,方法是使用 NotificationChannelNotificationChannelDescriptors 資源。本節的範例均假設這些管道已經存在,並在程式範例中顯示這些 API 的使用情況。

如要進一步瞭解通知管道物件,請參閱「由 API 建立及管理通知管道」。

gcloud

如要修改快訊政策中的通知管道,請使用 gcloud alpha monitoring policies update 指令。有多個與通知管道相關的標記,可讓您移除通知管道、取代通知管道,及新增通知管道。

例如,a-gcp-project 專案中顯示名稱為「High CPU rate of change」的政策,在建立時並沒有使用通知管道。

如要為這項政策新增通知管道,請使用 gcloud alpha monitoring policies update 指令,並以 --add-notification-channels 旗標指定要新增的管道:

gcloud alpha monitoring policies update projects/a-gcp-project/alertPolicies/12669073143329903307 \ --add-notification-channels="projects/a-gcp-project/notificationChannels/1355376463305411567" 

詳情請參閱 gcloud alpha monitoring policies update 參考資料。update 指令與 REST API 中的 alertPolicies.patch 方法對應。

您必須先建立通知管道,才能在此新增。詳情請參閱「建立通知管道」。

C#

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

static void ReplaceChannels(string projectId, string alertPolicyId,     IEnumerable<string> channelIds) {     var alertClient = AlertPolicyServiceClient.Create();     var policy = new AlertPolicy()     {         Name = new AlertPolicyName(projectId, alertPolicyId).ToString()     };     foreach (string channelId in channelIds)     {         policy.NotificationChannels.Add(             new NotificationChannelName(projectId, channelId)             .ToString());     }     var response = alertClient.UpdateAlertPolicy(         new FieldMask { Paths = { "notification_channels" } }, policy);     Console.WriteLine("Updated {0}.", response.Name); } 

Go

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

 // replaceChannels replaces the notification channels in the alert policy // with channelIDs. func replaceChannels(w io.Writer, projectID, alertPolicyID string, channelIDs []string) error { 	ctx := context.Background()  	client, err := monitoring.NewAlertPolicyClient(ctx) 	if err != nil { 		return err 	} 	defer client.Close()  	policy := &monitoringpb.AlertPolicy{ 		Name: "projects/" + projectID + "/alertPolicies/" + alertPolicyID, 	} 	for _, c := range channelIDs { 		c = "projects/" + projectID + "/notificationChannels/" + c 		policy.NotificationChannels = append(policy.NotificationChannels, c) 	} 	req := &monitoringpb.UpdateAlertPolicyRequest{ 		AlertPolicy: policy, 		UpdateMask: &fieldmask.FieldMask{ 			Paths: []string{"notification_channels"}, 		}, 	} 	if _, err := client.UpdateAlertPolicy(ctx, req); err != nil { 		return fmt.Errorf("UpdateAlertPolicy: %w", err) 	} 	fmt.Fprintf(w, "Successfully replaced channels.") 	return nil } 

Java

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

private static void replaceChannels(String projectId, String alertPolicyId, String[] channelIds)     throws IOException {   AlertPolicy.Builder policyBuilder =       AlertPolicy.newBuilder().setName(AlertPolicyName.of(projectId, alertPolicyId).toString());   for (String channelId : channelIds) {     policyBuilder.addNotificationChannels(         NotificationChannelName.of(projectId, channelId).toString());   }   try (AlertPolicyServiceClient client = AlertPolicyServiceClient.create()) {     AlertPolicy result =         client.updateAlertPolicy(             FieldMask.newBuilder().addPaths("notification_channels").build(),             policyBuilder.build());     System.out.println(String.format("Updated %s", result.getName()));   } }

Node.js

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

 // Imports the Google Cloud client library const monitoring = require('@google-cloud/monitoring');  // Creates clients const alertClient = new monitoring.AlertPolicyServiceClient(); const notificationClient = new monitoring.NotificationChannelServiceClient();  async function replaceChannels() {   /**    * TODO(developer): Uncomment the following lines before running the sample.    */   // const projectId = 'YOUR_PROJECT_ID';   // const alertPolicyId = '123456789012314';   // const channelIds = [   //   'channel-1',   //   'channel-2',   //   'channel-3',   // ];    const notificationChannels = channelIds.map(id =>     notificationClient.projectNotificationChannelPath(projectId, id)   );    for (const channel of notificationChannels) {     const updateChannelRequest = {       updateMask: {         paths: ['enabled'],       },       notificationChannel: {         name: channel,         enabled: {           value: true,         },       },     };     try {       await notificationClient.updateNotificationChannel(         updateChannelRequest       );     } catch (err) {       const createChannelRequest = {         notificationChannel: {           name: channel,           notificationChannel: {             type: 'email',           },         },       };       const newChannel =         await notificationClient.createNotificationChannel(           createChannelRequest         );       notificationChannels.push(newChannel);     }   }    const updateAlertPolicyRequest = {     updateMask: {       paths: ['notification_channels'],     },     alertPolicy: {       name: alertClient.projectAlertPolicyPath(projectId, alertPolicyId),       notificationChannels: notificationChannels,     },   };   const [alertPolicy] = await alertClient.updateAlertPolicy(     updateAlertPolicyRequest   );   console.log(`Updated ${alertPolicy.name}.`); } replaceChannels();

PHP

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

use Google\Cloud\Monitoring\V3\AlertPolicy; use Google\Cloud\Monitoring\V3\Client\AlertPolicyServiceClient; use Google\Cloud\Monitoring\V3\Client\NotificationChannelServiceClient; use Google\Cloud\Monitoring\V3\UpdateAlertPolicyRequest; use Google\Protobuf\FieldMask;  /**  * @param string $projectId Your project ID  * @param string $alertPolicyId Your alert policy id ID  * @param string[] $channelIds array of channel IDs  */ function alert_replace_channels(string $projectId, string $alertPolicyId, array $channelIds): void {     $alertClient = new AlertPolicyServiceClient([         'projectId' => $projectId,     ]);      $channelClient = new NotificationChannelServiceClient([         'projectId' => $projectId,     ]);     $policy = new AlertPolicy();     $policy->setName($alertClient->alertPolicyName($projectId, $alertPolicyId));      $newChannels = [];     foreach ($channelIds as $channelId) {         $newChannels[] = $channelClient->notificationChannelName($projectId, $channelId);     }     $policy->setNotificationChannels($newChannels);     $mask = new FieldMask();     $mask->setPaths(['notification_channels']);     $updateAlertPolicyRequest = (new UpdateAlertPolicyRequest())         ->setAlertPolicy($policy)         ->setUpdateMask($mask);     $updatedPolicy = $alertClient->updateAlertPolicy($updateAlertPolicyRequest);     printf('Updated %s' . PHP_EOL, $updatedPolicy->getName()); }

Python

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

def replace_notification_channels(project_name, alert_policy_id, channel_ids):     """Replace notification channel of an alert.      Arguments:         project_name (str): The Google Cloud Project to use. The project name             must be in the format - 'projects/<PROJECT_NAME>'.         alert_policy_id (str): The ID of the alert policy whose notification             channels are to be replaced.         channel_ids (str): ID of notification channel to be added as channel             for the given alert policy.     """      _, project_id = project_name.split("/")     alert_client = monitoring_v3.AlertPolicyServiceClient()     channel_client = monitoring_v3.NotificationChannelServiceClient()     policy = monitoring_v3.AlertPolicy()     policy.name = alert_client.alert_policy_path(project_id, alert_policy_id)      for channel_id in channel_ids:         policy.notification_channels.append(             channel_client.notification_channel_path(project_id, channel_id)         )      mask = field_mask.FieldMask()     mask.paths.append("notification_channels")     updated_policy = alert_client.update_alert_policy(         alert_policy=policy, update_mask=mask     )     print("Updated", updated_policy.name)  

修改快訊政策中的說明文件

政策可以包含與政策相關聯之事件和通知隨附的說明文件。使用這個欄位說明資訊,以協助回應者瞭解及處理快訊政策所指出的問題。說明文件包含在允許使用該說明文件的電子郵件通知與通知類型中;其他管道類型可能會省略說明文件。

gcloud

如要為政策新增說明文件或取代現有說明文件,請使用 gcloud alpha monitoring policies update 指令並提供 --documentation-format="text/markdown" 旗標 (唯一支援的格式),以及 --documentation 旗標 (從指令列輸入值) 或 --documentation-from-file 旗標 (從檔案讀取值)。

舉例來說,a-gcp-project 專案中顯示名稱為「High CPU rate of change」(高 CPU 變更頻率) 的政策建立時並沒有說明文件。

下列指令會將指定政策中的 documentation 欄位設定為 cpu-usage-doc.md 檔案的內容:

gcloud alpha monitoring policies update projects/a-gcp-project/alertPolicies/12669073143329903307 \ --documentation-format="text/markdown" \ --documentation-from-file="cpu-usage-doc.md" 

詳情請參閱 gcloud alpha monitoring policies update 參考資料。update 指令與 REST API 中的 alertPolicies.patch 方法對應。

在資訊主頁中新增快訊政策

如要在自訂資訊主頁上顯示單一條件快訊政策的摘要,請將 AlertChart 小工具新增至資訊主頁。您可以使用 dashboards.create 方法建立新資訊主頁,並使用 dashboards.patch 方法建立現有資訊主頁。

如果您指定多條件快訊政策,AlertChart 小工具就不會顯示資料。

如要進一步瞭解如何使用這些 API 方法,請參閱使用 API 建立及管理資訊主頁

範例:備份與還原

顯示的所有 API 範例均提取自較大的應用程式,進而可將專案中的快訊政策備份到檔案中,並在可能的情況下,將政策還原至其他專案。如果用於備份與還原的專案不同,應用程式可在專案之間有效匯出及匯入政策。

本節會將適用於備份與還原的程式碼顯示在背景資訊中,而不是顯示為一組小型的獨立摘錄。

備份政策

備份作業非常簡單。每個專案中的快訊政策集與通知管道集都會以 JSON 格式收集並儲存至外部儲存空間。

C#

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

        static void BackupPolicies(string projectId, string filePath)         {             var policyClient = AlertPolicyServiceClient.Create();             var channelClient = NotificationChannelServiceClient.Create();             var projectName = new ProjectName(projectId);             File.WriteAllText(filePath, JsonConvert.SerializeObject(                 new BackupRecord()                 {                     ProjectId = projectId,                     Policies = policyClient.ListAlertPolicies(projectName),                     Channels = channelClient.ListNotificationChannels(projectName)                 }, new ProtoMessageConverter()));         }         class BackupRecord         {             public string ProjectId { get; set; }             public IEnumerable<AlertPolicy> Policies { get; set; }             public IEnumerable<NotificationChannel> Channels { get; set; }         }          /// <summary>         /// Lets Newtonsoft.Json and Protobuf's json converters play nicely         /// together.  The default Netwtonsoft.Json Deserialize method will         /// not correctly deserialize proto messages.         /// </summary>         class ProtoMessageConverter : JsonConverter         {             public override bool CanConvert(System.Type objectType)             {                 return typeof(Google.Protobuf.IMessage)                     .IsAssignableFrom(objectType);             }              public override object ReadJson(JsonReader reader,                 System.Type objectType, object existingValue,                 JsonSerializer serializer)             {                 // Read an entire object from the reader.                 var converter = new ExpandoObjectConverter();                 object o = converter.ReadJson(reader, objectType, existingValue,                     serializer);                 // Convert it back to json text.                 string text = JsonConvert.SerializeObject(o);                 // And let protobuf's parser parse the text.                 IMessage message = (IMessage)Activator                     .CreateInstance(objectType);                 return Google.Protobuf.JsonParser.Default.Parse(text,                     message.Descriptor);             }              public override void WriteJson(JsonWriter writer, object value,                 JsonSerializer serializer)             {                 writer.WriteRawValue(Google.Protobuf.JsonFormatter.Default                     .Format((IMessage)value));             }         } 

Go

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

 // backupPolicies writes a JSON representation of the project's alert // policies and notification channels. func backupPolicies(w io.Writer, projectID string) error { 	b := backup{ProjectID: projectID} 	ctx := context.Background()  	alertClient, err := monitoring.NewAlertPolicyClient(ctx) 	if err != nil { 		return err 	} 	defer alertClient.Close() 	alertReq := &monitoringpb.ListAlertPoliciesRequest{ 		Name: "projects/" + projectID, 		// Filter:  "", // See https://cloud.google.com/monitoring/api/v3/sorting-and-filtering. 		// OrderBy: "", // See https://cloud.google.com/monitoring/api/v3/sorting-and-filtering. 	} 	alertIt := alertClient.ListAlertPolicies(ctx, alertReq) 	for { 		resp, err := alertIt.Next() 		if err == iterator.Done { 			break 		} 		if err != nil { 			return err 		} 		b.AlertPolicies = append(b.AlertPolicies, &alertPolicy{resp}) 	}  	channelClient, err := monitoring.NewNotificationChannelClient(ctx) 	if err != nil { 		return err 	} 	defer channelClient.Close() 	channelReq := &monitoringpb.ListNotificationChannelsRequest{ 		Name: "projects/" + projectID, 		// Filter:  "", // See https://cloud.google.com/monitoring/api/v3/sorting-and-filtering. 		// OrderBy: "", // See https://cloud.google.com/monitoring/api/v3/sorting-and-filtering. 	} 	channelIt := channelClient.ListNotificationChannels(ctx, channelReq) 	for { 		resp, err := channelIt.Next() 		if err == iterator.Done { 			break 		} 		if err != nil { 			return err 		} 		b.Channels = append(b.Channels, &channel{resp}) 	} 	bs, err := json.MarshalIndent(b, "", "  ") 	if err != nil { 		return err 	} 	if _, err := w.Write(bs); err != nil { 		return err 	} 	return nil }  // alertPolicy is a wrapper around the AlertPolicy proto to // ensure JSON marshaling/unmarshaling works correctly. type alertPolicy struct { 	*monitoringpb.AlertPolicy }  // channel is a wrapper around the NotificationChannel proto to // ensure JSON marshaling/unmarshaling works correctly. type channel struct { 	*monitoringpb.NotificationChannel }  // backup is used to backup and restore a project's policies. type backup struct { 	ProjectID     string 	AlertPolicies []*alertPolicy 	Channels      []*channel }  func (a *alertPolicy) MarshalJSON() ([]byte, error) { 	m := &jsonpb.Marshaler{EmitDefaults: true} 	b := new(bytes.Buffer) 	m.Marshal(b, a.AlertPolicy) 	return b.Bytes(), nil }  func (a *alertPolicy) UnmarshalJSON(b []byte) error { 	u := &jsonpb.Unmarshaler{} 	a.AlertPolicy = new(monitoringpb.AlertPolicy) 	return u.Unmarshal(bytes.NewReader(b), a.AlertPolicy) }  func (c *channel) MarshalJSON() ([]byte, error) { 	m := &jsonpb.Marshaler{} 	b := new(bytes.Buffer) 	m.Marshal(b, c.NotificationChannel) 	return b.Bytes(), nil }  func (c *channel) UnmarshalJSON(b []byte) error { 	u := &jsonpb.Unmarshaler{} 	c.NotificationChannel = new(monitoringpb.NotificationChannel) 	return u.Unmarshal(bytes.NewReader(b), c.NotificationChannel) } 

Java

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

private static void backupPolicies(String projectId, String filePath) throws IOException {   List<AlertPolicy> alertPolicies = getAlertPolicies(projectId);   List<NotificationChannel> notificationChannels = getNotificationChannels(projectId);   writePoliciesBackupFile(projectId, filePath, alertPolicies, notificationChannels);   System.out.println(String.format("Saved policies to %s", filePath)); }  private static List<AlertPolicy> getAlertPolicies(String projectId) throws IOException {   List<AlertPolicy> alertPolicies = Lists.newArrayList();   try (AlertPolicyServiceClient client = AlertPolicyServiceClient.create()) {     ListAlertPoliciesPagedResponse response = client.listAlertPolicies(ProjectName.of(projectId));      for (AlertPolicy policy : response.iterateAll()) {       alertPolicies.add(policy);     }   }   return alertPolicies; }  private static List<NotificationChannel> getNotificationChannels(String projectId)     throws IOException {   List<NotificationChannel> notificationChannels = Lists.newArrayList();   try (NotificationChannelServiceClient client = NotificationChannelServiceClient.create()) {     ListNotificationChannelsPagedResponse listNotificationChannelsResponse =         client.listNotificationChannels(ProjectName.of(projectId));     for (NotificationChannel channel : listNotificationChannelsResponse.iterateAll()) {       notificationChannels.add(channel);     }   }   return notificationChannels; }  private static void writePoliciesBackupFile(     String projectId,     String filePath,     List<AlertPolicy> alertPolicies,     List<NotificationChannel> notificationChannels)     throws IOException {   JsonObject backupContents = new JsonObject();   backupContents.add("project_id", new JsonPrimitive(projectId));   JsonArray policiesJson = new JsonArray();   for (AlertPolicy policy : alertPolicies) {     policiesJson.add(gson.toJsonTree(policy));   }   backupContents.add("policies", policiesJson);    JsonArray notificationsJson = new JsonArray();   for (NotificationChannel channel : notificationChannels) {     notificationsJson.add(gson.toJsonTree(channel));   }   backupContents.add("notification_channels", notificationsJson);    FileWriter writer = new FileWriter(filePath);   writer.write(backupContents.toString());   writer.close(); }

Node.js

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

const fs = require('fs');  // Imports the Google Cloud client library const monitoring = require('@google-cloud/monitoring');  // Creates a client const client = new monitoring.AlertPolicyServiceClient();  async function backupPolicies() {   /**    * TODO(developer): Uncomment the following lines before running the sample.    */   // const projectId = 'YOUR_PROJECT_ID';    const listAlertPoliciesRequest = {     name: client.projectPath(projectId),   };    let [policies] = await client.listAlertPolicies(listAlertPoliciesRequest);    // filter out any policies created by tests for this sample   policies = policies.filter(policy => {     return !policy.displayName.startsWith('gcloud-tests-');   });    fs.writeFileSync(     './policies_backup.json',     JSON.stringify(policies, null, 2),     'utf-8'   );    console.log('Saved policies to ./policies_backup.json');

PHP

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

use Google\Cloud\Monitoring\V3\Client\AlertPolicyServiceClient; use Google\Cloud\Monitoring\V3\Client\NotificationChannelServiceClient; use Google\Cloud\Monitoring\V3\ListAlertPoliciesRequest; use Google\Cloud\Monitoring\V3\ListNotificationChannelsRequest;  /**  * Back up alert policies.  *  * @param string $projectId Your project ID  */ function alert_backup_policies($projectId) {     $alertClient = new AlertPolicyServiceClient([         'projectId' => $projectId,     ]);     $channelClient = new NotificationChannelServiceClient([         'projectId' => $projectId,     ]);     $projectName = 'projects/' . $projectId;      $record = [         'project_name' => $projectName,         'policies' => [],         'channels' => [],     ];     $listAlertPoliciesRequest = (new ListAlertPoliciesRequest())         ->setName($projectName);     $policies = $alertClient->listAlertPolicies($listAlertPoliciesRequest);     foreach ($policies->iterateAllElements() as $policy) {         $record['policies'][] = json_decode($policy->serializeToJsonString());     }     $listNotificationChannelsRequest = (new ListNotificationChannelsRequest())         ->setName($projectName);     $channels = $channelClient->listNotificationChannels($listNotificationChannelsRequest);     foreach ($channels->iterateAllElements() as $channel) {         $record['channels'][] = json_decode($channel->serializeToJsonString());     }     file_put_contents('backup.json', json_encode($record, JSON_PRETTY_PRINT));     print('Backed up alert policies and notification channels to backup.json.'); }

Python

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

def backup(project_name, backup_filename):     """Backup alert policies from a project to a local file.      Arguments:         project_name (str): The Google Cloud Project to use. The project name             must be in the format - 'projects/<PROJECT_NAME>'         backup_filename (str): Name of the file (along with its path) to which             the alert policies will be written as backup.     """      alert_client = monitoring_v3.AlertPolicyServiceClient()     channel_client = monitoring_v3.NotificationChannelServiceClient()     record = {         "project_name": project_name,         "policies": list(alert_client.list_alert_policies(name=project_name)),         "channels": list(channel_client.list_notification_channels(name=project_name)),     }     json.dump(record, open(backup_filename, "wt"), cls=ProtoEncoder, indent=2)     print(         "Backed up alert policies and notification channels to {}.".format(             backup_filename         )     )   class ProtoEncoder(json.JSONEncoder):     """Encode protobufs as json."""      def default(self, obj):         if type(obj) in (monitoring_v3.AlertPolicy, monitoring_v3.NotificationChannel):             text = proto.Message.to_json(obj)             return json.loads(text)         return super(ProtoEncoder, self).default(obj)  

還原備份政策

還原程序比原始備份更複雜。您可以還原至最初備份的專案,也可以還原至其他專案,進而有效提供快訊政策的匯入內容。

如果您還原至相同專案,任何現有管道或政策都會更新 (若其仍然存在)。如果沒有,系統會重新建立這些檔案。 還原程序會先清除備份政策中的唯讀欄位 (例如建立和異動記錄),再重新建立政策和通知。

您可以利用儲存在某個專案中的政策,在另一個專案中建立全新或類似的政策。但是,您必須在儲存政策的副本中先進行下列變更:

  • 從任何通知管道移除下列欄位:
    • name
    • verificationStatus
  • 建立通知管道,然後在快訊政策中參照這些通知管道 (您需要新的管道 ID)。
  • 從任何重新建立的快訊政策中移除下列欄位:
    • name
    • condition.name
    • creationRecord
    • mutationRecord

此外,如果要在新專案中重新建立政策,備份政策中任何條件的名稱也要與建立和異動記錄一併清除。

另外,在不同專案中重新建立通知管道時,會取得不同名稱,因此還原程序必須將所備份快訊政策中管道的名稱對應至其新名稱,並將舊名稱取代為新名稱。

除了通知管道名稱,建立或更新管道時,無法設定 verificationStatus 欄位的值,因此會使用信號值 unspecified。在將管道還原至新專案之後,必須對其明確驗證。

C#

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

        static void RestorePolicies(string projectId, string filePath)         {             var policyClient = AlertPolicyServiceClient.Create();             var channelClient = NotificationChannelServiceClient.Create();             List<Exception> exceptions = new List<Exception>();             var backup = JsonConvert.DeserializeObject<BackupRecord>(                 File.ReadAllText(filePath), new ProtoMessageConverter());             var projectName = new ProjectName(projectId);             bool isSameProject = projectId == backup.ProjectId;             // When a channel is recreated, rather than updated, it will get             // a new name.  We have to update the AlertPolicy with the new             // name.  Track the names in this map.             var channelNameMap = new Dictionary<string, string>();             foreach (NotificationChannel channel in backup.Channels)             {                 try                 {                     bool updated = false;                     Console.WriteLine("Updating channel.\n{0}",                         channel.DisplayName);                     // This field is immutable and it is illegal to specify a                     // non-default value (UNVERIFIED or VERIFIED) in the                     // Create() or Update() operations.                     channel.VerificationStatus = NotificationChannel.Types                         .VerificationStatus.Unspecified;                     if (isSameProject)                         try                         {                             channelClient.UpdateNotificationChannel(                                 null, channel);                             updated = true;                         }                         catch (Grpc.Core.RpcException e)                         when (e.Status.StatusCode == StatusCode.NotFound)                         { }                     if (!updated)                     {                         // The channel no longer exists.  Recreate it.                         string oldName = channel.Name;                         channel.Name = null;                         var response = channelClient.CreateNotificationChannel(                             projectName, channel);                         channelNameMap.Add(oldName, response.Name);                     }                 }                 catch (Exception e)                 {                     // If one failed, continue trying to update the others.                     exceptions.Add(e);                 }             }             foreach (AlertPolicy policy in backup.Policies)             {                 string policyName = policy.Name;                 // These two fields cannot be set directly, so clear them.                 policy.CreationRecord = null;                 policy.MutationRecord = null;                 // Update channel names if the channel was recreated with                 // another name.                 for (int i = 0; i < policy.NotificationChannels.Count; ++i)                 {                     if (channelNameMap.ContainsKey(policy.NotificationChannels[i]))                     {                         policy.NotificationChannels[i] =                             channelNameMap[policy.NotificationChannels[i]];                     }                 }                 try                 {                     Console.WriteLine("Updating policy.\n{0}",                         policy.DisplayName);                     bool updated = false;                     if (isSameProject)                         try                         {                             policyClient.UpdateAlertPolicy(null, policy);                             updated = true;                         }                         catch (Grpc.Core.RpcException e)                         when (e.Status.StatusCode == StatusCode.NotFound)                         { }                     if (!updated)                     {                         // The policy no longer exists.  Recreate it.                         policy.Name = null;                         foreach (var condition in policy.Conditions)                         {                             condition.Name = null;                         }                         policyClient.CreateAlertPolicy(projectName, policy);                     }                     Console.WriteLine("Restored {0}.", policyName);                 }                 catch (Exception e)                 {                     // If one failed, continue trying to update the others.                     exceptions.Add(e);                 }             }             if (exceptions.Count > 0)             {                 throw new AggregateException(exceptions);             }         }          class BackupRecord         {             public string ProjectId { get; set; }             public IEnumerable<AlertPolicy> Policies { get; set; }             public IEnumerable<NotificationChannel> Channels { get; set; }         }          /// <summary>         /// Lets Newtonsoft.Json and Protobuf's json converters play nicely         /// together.  The default Netwtonsoft.Json Deserialize method will         /// not correctly deserialize proto messages.         /// </summary>         class ProtoMessageConverter : JsonConverter         {             public override bool CanConvert(System.Type objectType)             {                 return typeof(Google.Protobuf.IMessage)                     .IsAssignableFrom(objectType);             }              public override object ReadJson(JsonReader reader,                 System.Type objectType, object existingValue,                 JsonSerializer serializer)             {                 // Read an entire object from the reader.                 var converter = new ExpandoObjectConverter();                 object o = converter.ReadJson(reader, objectType, existingValue,                     serializer);                 // Convert it back to json text.                 string text = JsonConvert.SerializeObject(o);                 // And let protobuf's parser parse the text.                 IMessage message = (IMessage)Activator                     .CreateInstance(objectType);                 return Google.Protobuf.JsonParser.Default.Parse(text,                     message.Descriptor);             }              public override void WriteJson(JsonWriter writer, object value,                 JsonSerializer serializer)             {                 writer.WriteRawValue(Google.Protobuf.JsonFormatter.Default                     .Format((IMessage)value));             }         } 

Go

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

 // restorePolicies updates the project with the alert policies and // notification channels in r. func restorePolicies(w io.Writer, projectID string, r io.Reader) error { 	b := backup{} 	if err := json.NewDecoder(r).Decode(&b); err != nil { 		return err 	} 	sameProject := projectID == b.ProjectID  	ctx := context.Background()  	alertClient, err := monitoring.NewAlertPolicyClient(ctx) 	if err != nil { 		return err 	} 	defer alertClient.Close() 	channelClient, err := monitoring.NewNotificationChannelClient(ctx) 	if err != nil { 		return err 	} 	defer channelClient.Close()  	// When a channel is recreated, rather than updated, it will get 	// a new name.  We have to update the AlertPolicy with the new 	// name.  channelNames keeps track of the new names. 	channelNames := make(map[string]string) 	for _, c := range b.Channels { 		fmt.Fprintf(w, "Updating channel %q\n", c.GetDisplayName()) 		c.VerificationStatus = monitoringpb.NotificationChannel_VERIFICATION_STATUS_UNSPECIFIED 		updated := false 		if sameProject { 			req := &monitoringpb.UpdateNotificationChannelRequest{ 				NotificationChannel: c.NotificationChannel, 			} 			_, err := channelClient.UpdateNotificationChannel(ctx, req) 			if err == nil { 				updated = true 			} 		} 		if !updated { 			req := &monitoringpb.CreateNotificationChannelRequest{ 				Name:                "projects/" + projectID, 				NotificationChannel: c.NotificationChannel, 			} 			oldName := c.GetName() 			c.Name = "" 			newC, err := channelClient.CreateNotificationChannel(ctx, req) 			if err != nil { 				return err 			} 			channelNames[oldName] = newC.GetName() 		} 	}  	for _, policy := range b.AlertPolicies { 		fmt.Fprintf(w, "Updating alert %q\n", policy.GetDisplayName()) 		policy.CreationRecord = nil 		policy.MutationRecord = nil 		for i, aChannel := range policy.GetNotificationChannels() { 			if c, ok := channelNames[aChannel]; ok { 				policy.NotificationChannels[i] = c 			} 		} 		updated := false 		if sameProject { 			req := &monitoringpb.UpdateAlertPolicyRequest{ 				AlertPolicy: policy.AlertPolicy, 			} 			_, err := alertClient.UpdateAlertPolicy(ctx, req) 			if err == nil { 				updated = true 			} 		} 		if !updated { 			req := &monitoringpb.CreateAlertPolicyRequest{ 				Name:        "projects/" + projectID, 				AlertPolicy: policy.AlertPolicy, 			} 			if _, err = alertClient.CreateAlertPolicy(ctx, req); err != nil { 				log.Fatal(err) 			} 		} 	} 	fmt.Fprintf(w, "Successfully restored alerts.") 	return nil } 

Java

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

private static void restorePolicies(String projectId, String filePath) throws IOException {   FileReader reader = new FileReader(filePath);   BufferedReader bufferedReader = new BufferedReader(reader);    JsonObject backupContent = getPolicyJsonContents(filePath, bufferedReader);   String backupProjectId = backupContent.get("project_id").getAsString();   boolean isSameProject = projectId.equals(backupProjectId);    AlertPolicy[] policies = gson.fromJson(backupContent.get("policies"), AlertPolicy[].class);   List<NotificationChannel> notificationChannels = readNotificationChannelsJson(backupContent);   Map<String, String> restoredChannelIds =       restoreNotificationChannels(projectId, notificationChannels, isSameProject);   List<AlertPolicy> policiesToRestore =       reviseRestoredPolicies(policies, isSameProject, restoredChannelIds);    restoreRevisedPolicies(projectId, isSameProject, policiesToRestore); }  private static List<AlertPolicy> reviseRestoredPolicies(     AlertPolicy[] policies, boolean isSameProject, Map<String, String> restoredChannelIds) {   List<AlertPolicy> newPolicies = Lists.newArrayListWithCapacity(policies.length);   for (AlertPolicy policy : policies) {     AlertPolicy.Builder policyBuilder =         policy             .toBuilder()             .clearNotificationChannels()             .clearMutationRecord()             .clearCreationRecord();     // Update restored notification channel names.     for (String channelName : policy.getNotificationChannelsList()) {       String newChannelName = restoredChannelIds.get(channelName);       if (!Strings.isNullOrEmpty(newChannelName)) {         policyBuilder.addNotificationChannels(newChannelName);       }     }     if (!isSameProject) {       policyBuilder.clearName();       policyBuilder.clearConditions();       for (AlertPolicy.Condition condition : policy.getConditionsList()) {         policyBuilder.addConditions(condition.toBuilder().clearName());       }     }     newPolicies.add(policyBuilder.build());   }   return newPolicies; }  private static void restoreRevisedPolicies(     String projectId, boolean isSameProject, List<AlertPolicy> policies) throws IOException {   try (AlertPolicyServiceClient client = AlertPolicyServiceClient.create()) {     for (AlertPolicy policy : policies) {       if (!isSameProject) {         policy = client.createAlertPolicy(ProjectName.of(projectId), policy);       } else {         try {           client.updateAlertPolicy(null, policy);         } catch (Exception e) {           policy =               client.createAlertPolicy(                   ProjectName.of(projectId), policy.toBuilder().clearName().build());         }       }       System.out.println(String.format("Restored %s", policy.getName()));     }   } }  private static List<NotificationChannel> readNotificationChannelsJson(JsonObject backupContent) {   if (backupContent.has("notification_channels")) {     NotificationChannel[] channels =         gson.fromJson(backupContent.get("notification_channels"), NotificationChannel[].class);     return Lists.newArrayList(channels);   }   return Lists.newArrayList(); }  private static Map<String, String> restoreNotificationChannels(     String projectId, List<NotificationChannel> channels, boolean isSameProject)     throws IOException {   Map<String, String> newChannelNames = Maps.newHashMap();   try (NotificationChannelServiceClient client = NotificationChannelServiceClient.create()) {     for (NotificationChannel channel : channels) {       // Update channel name if project ID is different.       boolean channelUpdated = false;       if (isSameProject) {         try {           NotificationChannel updatedChannel =               client.updateNotificationChannel(NOTIFICATION_CHANNEL_UPDATE_MASK, channel);           newChannelNames.put(channel.getName(), updatedChannel.getName());           channelUpdated = true;         } catch (Exception e) {           channelUpdated = false;         }       }       if (!channelUpdated) {         NotificationChannel newChannel =             client.createNotificationChannel(                 ProjectName.of(projectId),                 channel.toBuilder().clearName().clearVerificationStatus().build());         newChannelNames.put(channel.getName(), newChannel.getName());       }     }   }   return newChannelNames; }  private static JsonObject getPolicyJsonContents(String filePath, BufferedReader content) {   try {     return gson.fromJson(content, JsonObject.class);   } catch (JsonSyntaxException jse) {     throw new RuntimeException(String.format("Could not parse policies file %s", filePath), jse);   } }

Node.js

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

const fs = require('fs');  // Imports the Google Cloud client library const monitoring = require('@google-cloud/monitoring');  // Creates a client const client = new monitoring.AlertPolicyServiceClient();  async function restorePolicies() {   // Note: The policies are restored one at a time due to limitations in   // the API. Otherwise, you may receive a 'service unavailable'  error   // while trying to create multiple alerts simultaneously.    /**    * TODO(developer): Uncomment the following lines before running the sample.    */   // const projectId = 'YOUR_PROJECT_ID';    console.log('Loading policies from ./policies_backup.json');   const fileContent = fs.readFileSync('./policies_backup.json', 'utf-8');   const policies = JSON.parse(fileContent);    for (const index in policies) {     // Restore each policy one at a time     let policy = policies[index];     if (await doesAlertPolicyExist(policy.name)) {       policy = await client.updateAlertPolicy({         alertPolicy: policy,       });     } else {       // Clear away output-only fields       delete policy.name;       delete policy.creationRecord;       delete policy.mutationRecord;       policy.conditions.forEach(condition => delete condition.name);        policy = await client.createAlertPolicy({         name: client.projectPath(projectId),         alertPolicy: policy,       });     }      console.log(`Restored ${policy[0].name}.`);   }   async function doesAlertPolicyExist(name) {     try {       const [policy] = await client.getAlertPolicy({         name,       });       return policy ? true : false;     } catch (err) {       if (err && err.code === 5) {         // Error code 5 comes from the google.rpc.code.NOT_FOUND protobuf         return false;       }       throw err;     }   } } restorePolicies();

PHP

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

use Google\ApiCore\ApiException; use Google\Cloud\Monitoring\V3\AlertPolicy; use Google\Cloud\Monitoring\V3\Client\AlertPolicyServiceClient; use Google\Cloud\Monitoring\V3\Client\NotificationChannelServiceClient; use Google\Cloud\Monitoring\V3\CreateAlertPolicyRequest; use Google\Cloud\Monitoring\V3\CreateNotificationChannelRequest; use Google\Cloud\Monitoring\V3\NotificationChannel; use Google\Cloud\Monitoring\V3\NotificationChannel\VerificationStatus; use Google\Cloud\Monitoring\V3\UpdateAlertPolicyRequest; use Google\Cloud\Monitoring\V3\UpdateNotificationChannelRequest;  /**  * @param string $projectId Your project ID  */ function alert_restore_policies(string $projectId): void {     $alertClient = new AlertPolicyServiceClient([         'projectId' => $projectId,     ]);      $channelClient = new NotificationChannelServiceClient([         'projectId' => $projectId,     ]);      print('Loading alert policies and notification channels from backup.json.' . PHP_EOL);     $projectName = 'projects/' . $projectId;     $record = json_decode((string) file_get_contents('backup.json'), true);     $isSameProject = $projectName == $record['project_name'];      # Convert dicts to AlertPolicies.     $policies = [];     foreach ($record['policies'] as $policyArray) {         $policy = new AlertPolicy();         $policy->mergeFromJsonString((string) json_encode($policyArray));         $policies[] = $policy;     }      # Convert dicts to NotificationChannels     $channels = [];     foreach (array_filter($record['channels']) as $channelArray) {         $channel = new NotificationChannel();         $channel->mergeFromJsonString((string) json_encode($channelArray));         $channels[] = $channel;     }      # Restore the channels.     $channelNameMap = [];     foreach ($channels as $channel) {         $updated = false;         printf('Updating channel %s' . PHP_EOL, $channel->getDisplayName());          # This field is immutable and it is illegal to specify a         # non-default value (UNVERIFIED or VERIFIED) in the         # Create() or Update() operations.         $channel->setVerificationStatus(             VerificationStatus::VERIFICATION_STATUS_UNSPECIFIED         );          if ($isSameProject) {             try {                 $updateNotificationChannelRequest = (new UpdateNotificationChannelRequest())                     ->setNotificationChannel($channel);                 $channelClient->updateNotificationChannel($updateNotificationChannelRequest);                 $updated = true;             } catch (ApiException $e) {                 # The channel was deleted.  Create it below.                 if ($e->getStatus() !== 'NOT_FOUND') {                     throw $e;                 }             }         }          if (!$updated) {             # The channel no longer exists.  Recreate it.             $oldName = $channel->getName();             $channel->setName('');             $createNotificationChannelRequest = (new CreateNotificationChannelRequest())                 ->setName($projectName)                 ->setNotificationChannel($channel);             $newChannel = $channelClient->createNotificationChannel($createNotificationChannelRequest);             $channelNameMap[$oldName] = $newChannel->getName();         }     }      # Restore the alerts     foreach ($policies as $policy) {         printf('Updating policy %s' . PHP_EOL, $policy->getDisplayName());         # These two fields cannot be set directly, so clear them.         $policy->clearCreationRecord();         $policy->clearMutationRecord();          $notificationChannels = $policy->getNotificationChannels();          # Update old channel names with new channel names.         foreach ($notificationChannels as $i => $channel) {             if (isset($channelNameMap[$channel])) {                 $notificationChannels[$i] = $channelNameMap[$channel];             }         }          $updated = false;         if ($isSameProject) {             try {                 $updateAlertPolicyRequest = (new UpdateAlertPolicyRequest())                     ->setAlertPolicy($policy);                 $alertClient->updateAlertPolicy($updateAlertPolicyRequest);                 $updated = true;             } catch (ApiException $e) {                 # The policy was deleted.  Create it below.                 if ($e->getStatus() !== 'NOT_FOUND') {                     throw $e;                 }             }         }          if (!$updated) {             # The policy no longer exists.  Recreate it.             $oldName = $policy->getName();             $policy->setName('');             foreach ($policy->getConditions() as $condition) {                 $condition->setName('');             }             $createAlertPolicyRequest = (new CreateAlertPolicyRequest())                 ->setName($projectName)                 ->setAlertPolicy($policy);             $policy = $alertClient->createAlertPolicy($createAlertPolicyRequest);         }         printf('Updated %s' . PHP_EOL, $policy->getName());     }     print('Restored alert policies and notification channels from backup.json.'); }

Python

如要驗證 Monitoring,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

def restore(project_name, backup_filename):     """Restore alert policies in a project.      Arguments:         project_name (str): The Google Cloud Project to use. The project name             must be in the format - 'projects/<PROJECT_NAME>'.         backup_filename (str): Name of the file (along with its path) from             which the alert policies will be restored.     """     print(         "Loading alert policies and notification channels from {}.".format(             backup_filename         )     )     record = json.load(open(backup_filename, "rt"))     is_same_project = project_name == record["project_name"]     # Convert dicts to AlertPolicies.     policies_json = [json.dumps(policy) for policy in record["policies"]]     policies = [         monitoring_v3.AlertPolicy.from_json(policy_json)         for policy_json in policies_json     ]     # Convert dicts to NotificationChannels     channels_json = [json.dumps(channel) for channel in record["channels"]]     channels = [         monitoring_v3.NotificationChannel.from_json(channel_json)         for channel_json in channels_json     ]      # Restore the channels.     channel_client = monitoring_v3.NotificationChannelServiceClient()     channel_name_map = {}      for channel in channels:         updated = False         print("Updating channel", channel.display_name)         # This field is immutable and it is illegal to specify a         # non-default value (UNVERIFIED or VERIFIED) in the         # Create() or Update() operations.         channel.verification_status = (             monitoring_v3.NotificationChannel.VerificationStatus.VERIFICATION_STATUS_UNSPECIFIED         )          if is_same_project:             try:                 channel_client.update_notification_channel(notification_channel=channel)                 updated = True             except google.api_core.exceptions.NotFound:                 pass  # The channel was deleted.  Create it below.          if not updated:             # The channel no longer exists.  Recreate it.             old_name = channel.name             del channel.name             new_channel = channel_client.create_notification_channel(                 name=project_name, notification_channel=channel             )             channel_name_map[old_name] = new_channel.name      # Restore the alerts     alert_client = monitoring_v3.AlertPolicyServiceClient()      for policy in policies:         print("Updating policy", policy.display_name)         # These two fields cannot be set directly, so clear them.         del policy.creation_record         del policy.mutation_record          # Update old channel names with new channel names.         for i, channel in enumerate(policy.notification_channels):             new_channel = channel_name_map.get(channel)             if new_channel:                 policy.notification_channels[i] = new_channel          updated = False          if is_same_project:             try:                 alert_client.update_alert_policy(alert_policy=policy)                 updated = True             except google.api_core.exceptions.NotFound:                 pass  # The policy was deleted.  Create it below.             except google.api_core.exceptions.InvalidArgument:                 # Annoying that API throws InvalidArgument when the policy                 # does not exist.  Seems like it should throw NotFound.                 pass  # The policy was deleted.  Create it below.          if not updated:             # The policy no longer exists.  Recreate it.             old_name = policy.name             del policy.name             for condition in policy.conditions:                 del condition.name             policy = alert_client.create_alert_policy(                 name=project_name, alert_policy=policy             )         print("Updated", policy.name)  

快訊與 Google Cloud CLI

在 Google Cloud CLI 中,管理快訊政策與通知管道的指令群組是 monitoring,這是 Alpha 版。monitoring 群組位於 alpha 元件中。 也就是說,這些指令都會以以下內容開頭:

gcloud alpha monitoring 

如要檢查是否已安裝 alpha 元件,請執行下列指令:

gcloud components list 

如果沒有安裝 alpha 元件,請執行下列指令進行安裝:

gcloud components install alpha 

如果已安裝 alpha 元件,請執行下列指令,檢查 monitoring 群組:

gcloud alpha monitoring --help 

如果未包含 monitoring 群組,Google Cloud CLI 會提示您新增:

You do not currently have this command group installed. [...] Do you want to continue (Y/n)?  y