monitoring/uptime/uptime.go (197 lines of code) (raw):

// Copyright 2019 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package uptime contains samples of uptime checks. package uptime import ( "context" "encoding/base64" "fmt" "io" monitoring "cloud.google.com/go/monitoring/apiv3" "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb" "github.com/golang/protobuf/ptypes/duration" "google.golang.org/api/iterator" "google.golang.org/genproto/googleapis/api/monitoredres" "google.golang.org/genproto/protobuf/field_mask" ) // [START monitoring_uptime_check_create] // createGet creates an example uptime check on a GET request. func createGet(w io.Writer, projectID string) (*monitoringpb.UptimeCheckConfig, error) { ctx := context.Background() client, err := monitoring.NewUptimeCheckClient(ctx) if err != nil { return nil, fmt.Errorf("NewUptimeCheckClient: %w", err) } defer client.Close() req := &monitoringpb.CreateUptimeCheckConfigRequest{ Parent: "projects/" + projectID, UptimeCheckConfig: &monitoringpb.UptimeCheckConfig{ DisplayName: "new GET uptime check", Resource: &monitoringpb.UptimeCheckConfig_MonitoredResource{ MonitoredResource: &monitoredres.MonitoredResource{ Type: "uptime_url", Labels: map[string]string{ "host": "example.com", }, }, }, CheckRequestType: &monitoringpb.UptimeCheckConfig_HttpCheck_{ HttpCheck: &monitoringpb.UptimeCheckConfig_HttpCheck{ RequestMethod: monitoringpb.UptimeCheckConfig_HttpCheck_GET, Path: "/", Port: 80, }, }, Timeout: &duration.Duration{Seconds: 10}, Period: &duration.Duration{Seconds: 300}, }, } config, err := client.CreateUptimeCheckConfig(ctx, req) if err != nil { return nil, fmt.Errorf("CreateUptimeCheckConfig GET: %w", err) } fmt.Fprintf(w, "Successfully created GET uptime check %q\n", config.GetDisplayName()) return config, nil } // createPost creates an example uptime check on a POST request. func createPost(w io.Writer, projectID string) (*monitoringpb.UptimeCheckConfig, error) { ctx := context.Background() client, err := monitoring.NewUptimeCheckClient(ctx) if err != nil { return nil, fmt.Errorf("NewUptimeCheckClient: %w", err) } defer client.Close() req := &monitoringpb.CreateUptimeCheckConfigRequest{ Parent: "projects/" + projectID, UptimeCheckConfig: &monitoringpb.UptimeCheckConfig{ DisplayName: "new POST uptime check", Resource: &monitoringpb.UptimeCheckConfig_MonitoredResource{ MonitoredResource: &monitoredres.MonitoredResource{ Type: "uptime_url", Labels: map[string]string{ "host": "example.com", }, }, }, CheckRequestType: &monitoringpb.UptimeCheckConfig_HttpCheck_{ HttpCheck: &monitoringpb.UptimeCheckConfig_HttpCheck{ RequestMethod: monitoringpb.UptimeCheckConfig_HttpCheck_POST, ContentType: monitoringpb.UptimeCheckConfig_HttpCheck_URL_ENCODED, Path: "/", Port: 80, Body: []byte(base64.URLEncoding.EncodeToString([]byte("key: value"))), }, }, Timeout: &duration.Duration{Seconds: 10}, Period: &duration.Duration{Seconds: 300}, }, } config, err := client.CreateUptimeCheckConfig(ctx, req) if err != nil { return nil, fmt.Errorf("CreateUptimeCheckConfig POST: %w", err) } fmt.Fprintf(w, "Successfully created POST uptime check %q\n", config.GetDisplayName()) return config, nil } // [END monitoring_uptime_check_create] // [START monitoring_uptime_check_list_configs] // list is an example of listing the uptime checks in projectID. func list(w io.Writer, projectID string) error { ctx := context.Background() client, err := monitoring.NewUptimeCheckClient(ctx) if err != nil { return fmt.Errorf("NewUptimeCheckClient: %w", err) } defer client.Close() req := &monitoringpb.ListUptimeCheckConfigsRequest{ Parent: "projects/" + projectID, } it := client.ListUptimeCheckConfigs(ctx, req) for { config, err := it.Next() if err == iterator.Done { break } if err != nil { return fmt.Errorf("ListUptimeCheckConfigs: %w", err) } fmt.Fprintln(w, config) } fmt.Fprintln(w, "Done listing uptime checks") return nil } // [END monitoring_uptime_check_list_configs] // [START monitoring_uptime_check_list_ips] // listIPs is an example of listing uptime check IPs. func listIPs(w io.Writer) error { ctx := context.Background() client, err := monitoring.NewUptimeCheckClient(ctx) if err != nil { return fmt.Errorf("NewUptimeCheckClient: %w", err) } defer client.Close() req := &monitoringpb.ListUptimeCheckIpsRequest{} it := client.ListUptimeCheckIps(ctx, req) for { config, err := it.Next() if err == iterator.Done { break } if err != nil { return fmt.Errorf("ListUptimeCheckIps: %w", err) } fmt.Fprintln(w, config) } fmt.Fprintln(w, "Done listing uptime check IPs") return nil } // [END monitoring_uptime_check_list_ips] // [START monitoring_uptime_check_get] // get is an example of getting an uptime check. resourceName should be // of the form `projects/[PROJECT_ID]/uptimeCheckConfigs/[UPTIME_CHECK_ID]`. func get(w io.Writer, resourceName string) (*monitoringpb.UptimeCheckConfig, error) { ctx := context.Background() client, err := monitoring.NewUptimeCheckClient(ctx) if err != nil { return nil, fmt.Errorf("NewUptimeCheckClient: %w", err) } defer client.Close() req := &monitoringpb.GetUptimeCheckConfigRequest{ Name: resourceName, } config, err := client.GetUptimeCheckConfig(ctx, req) if err != nil { return nil, fmt.Errorf("GetUptimeCheckConfig: %w", err) } fmt.Fprintf(w, "Config: %v", config) return config, nil } // [END monitoring_uptime_check_get] // [START monitoring_uptime_check_update] // update is an example of updating an uptime check. resourceName should be // of the form `projects/[PROJECT_ID]/uptimeCheckConfigs/[UPTIME_CHECK_ID]`. func update(w io.Writer, resourceName, displayName, httpCheckPath string) (*monitoringpb.UptimeCheckConfig, error) { ctx := context.Background() client, err := monitoring.NewUptimeCheckClient(ctx) if err != nil { return nil, fmt.Errorf("NewUptimeCheckClient: %w", err) } defer client.Close() getReq := &monitoringpb.GetUptimeCheckConfigRequest{ Name: resourceName, } config, err := client.GetUptimeCheckConfig(ctx, getReq) if err != nil { return nil, fmt.Errorf("GetUptimeCheckConfig: %w", err) } config.DisplayName = displayName config.GetHttpCheck().Path = httpCheckPath req := &monitoringpb.UpdateUptimeCheckConfigRequest{ UpdateMask: &field_mask.FieldMask{ Paths: []string{"display_name", "http_check.path"}, }, UptimeCheckConfig: config, } config, err = client.UpdateUptimeCheckConfig(ctx, req) if err != nil { return nil, fmt.Errorf("UpdateUptimeCheckConfig: %w", err) } fmt.Fprintf(w, "Successfully updated %v", resourceName) return config, nil } // [END monitoring_uptime_check_update] // [START monitoring_uptime_check_delete] // delete is an example of deleting an uptime check. resourceName should be // of the form `projects/[PROJECT_ID]/uptimeCheckConfigs/[UPTIME_CHECK_ID]`. func delete(w io.Writer, resourceName string) error { ctx := context.Background() client, err := monitoring.NewUptimeCheckClient(ctx) if err != nil { return fmt.Errorf("NewUptimeCheckClient: %w", err) } defer client.Close() req := &monitoringpb.DeleteUptimeCheckConfigRequest{ Name: resourceName, } if err := client.DeleteUptimeCheckConfig(ctx, req); err != nil { return fmt.Errorf("DeleteUptimeCheckConfig: %w", err) } fmt.Fprintf(w, "Successfully deleted %q", resourceName) return nil } // [END monitoring_uptime_check_delete]