Openstatus www.openstatus.dev

add queue for alerting (#1512)

authored by

Thibault Le Ouay and committed by
GitHub
a91baf52 eb9d4948

+144 -51
+57 -12
apps/checker/checker/update.go
··· 4 4 "bytes" 5 5 "context" 6 6 "encoding/json" 7 - "net/http" 7 + "fmt" 8 8 "os" 9 - "time" 10 9 11 10 "github.com/rs/zerolog/log" 11 + "google.golang.org/api/option" 12 + 13 + "cloud.google.com/go/auth" 14 + cloudtasks "cloud.google.com/go/cloudtasks/apiv2" 15 + taskspb "cloud.google.com/go/cloudtasks/apiv2/cloudtaskspb" 12 16 ) 13 17 14 18 type UpdateData struct { ··· 21 25 Latency int64 `json:"latency,omitempty"` 22 26 } 23 27 24 - func UpdateStatus(ctx context.Context, updateData UpdateData) { 28 + func UpdateStatus(ctx context.Context, updateData UpdateData) error { 29 + 25 30 url := "https://openstatus-workflows.fly.dev/updateStatus" 26 31 basic := "Basic " + os.Getenv("CRON_SECRET") 27 32 payloadBuf := new(bytes.Buffer) 28 33 34 + opts := &auth.Options2LO{ 35 + Email: os.Getenv("GCP_CLIENT_EMAIL"), 36 + PrivateKey: []byte(os.Getenv("GCP_PRIVATE_KEY")), 37 + Scopes: []string{ 38 + "https://www.googleapis.com/auth/cloud-platform", 39 + }, 40 + TokenURL: "https://oauth2.googleapis.com/token", 41 + } 42 + 43 + tp, err := auth.New2LOTokenProvider(opts) 44 + if err != nil { 45 + log.Ctx(ctx).Error().Err(err).Msg("error while creating token provider") 46 + return err 47 + } 48 + 49 + creds := auth.NewCredentials(&auth.CredentialsOptions{ 50 + TokenProvider: tp, 51 + }) 52 + 53 + client, err := cloudtasks.NewClient(ctx, option.WithAuthCredentials(creds)) 54 + if err != nil { 55 + log.Ctx(ctx).Error().Err(err).Msg("error while creating cloud tasks client") 56 + 57 + } 58 + defer client.Close() 59 + 29 60 if err := json.NewEncoder(payloadBuf).Encode(updateData); err != nil { 30 61 log.Ctx(ctx).Error().Err(err).Msg("error while updating status") 31 - return 62 + return err 32 63 } 33 - req, _ := http.NewRequestWithContext(ctx, http.MethodPost, url, payloadBuf) 34 - req.Header.Set("Authorization", basic) 35 - req.Header.Set("Content-Type", "application/json") 64 + projectID := os.Getenv("GCP_PROJECT_ID") 65 + queuePath := fmt.Sprintf("projects/%s/locations/europe-west1/queues/alerting", projectID) 66 + req := &taskspb.CreateTaskRequest{ 67 + Parent: queuePath, 68 + Task: &taskspb.Task{ 69 + // https://godoc.org/google.golang.org/genproto/googleapis/cloud/tasks/v2#HttpRequest 70 + MessageType: &taskspb.Task_HttpRequest{ 71 + HttpRequest: &taskspb.HttpRequest{ 72 + HttpMethod: taskspb.HttpMethod_POST, 73 + Url: url, 74 + Headers: map[string]string{"Authorization": basic, "Content-Type": "application/json"}, 75 + }, 76 + }, 77 + }, 78 + } 36 79 37 - client := &http.Client{Timeout: time.Second * 10} 38 - if _, err := client.Do(req); err != nil { 39 - log.Ctx(ctx).Error().Err(err).Msg("error while updating status") 80 + // Add a payload message if one is present. 81 + req.Task.GetHttpRequest().Body = payloadBuf.Bytes() 82 + 83 + _, err = client.CreateTask(ctx, req) 84 + if err != nil { 85 + return fmt.Errorf("cloudtasks.CreateTask: %w", err) 40 86 } 41 87 42 - defer req.Body.Close() 43 - // Should we add a retry mechanism here? 88 + return nil 44 89 }
+29 -13
apps/checker/go.mod
··· 8 8 github.com/google/uuid v1.6.0 9 9 github.com/rs/zerolog v1.32.0 10 10 github.com/stretchr/testify v1.10.0 11 - go.opentelemetry.io/otel v1.34.0 11 + go.opentelemetry.io/otel v1.36.0 12 12 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 13 - go.opentelemetry.io/otel/metric v1.34.0 14 - go.opentelemetry.io/otel/sdk v1.34.0 15 - go.opentelemetry.io/otel/sdk/metric v1.34.0 13 + go.opentelemetry.io/otel/metric v1.36.0 14 + go.opentelemetry.io/otel/sdk v1.36.0 15 + go.opentelemetry.io/otel/sdk/metric v1.36.0 16 16 google.golang.org/protobuf v1.36.10 17 17 ) 18 18 19 19 //replace github.com/openstatushq/openstatus/packages/proto => ./../../packages/proto 20 20 21 21 require ( 22 + cloud.google.com/go/auth v0.16.4 23 + cloud.google.com/go/cloudtasks v1.13.7 22 24 github.com/cenkalti/backoff/v4 v4.3.0 23 25 github.com/cenkalti/backoff/v5 v5.0.3 24 26 github.com/madflojo/tasks v1.2.1 27 + google.golang.org/api v0.247.0 25 28 ) 26 29 27 30 require ( 31 + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect 32 + cloud.google.com/go/compute/metadata v0.8.0 // indirect 33 + cloud.google.com/go/iam v1.5.2 // indirect 28 34 github.com/bytedance/sonic v1.11.3 // indirect 29 35 github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect 30 36 github.com/chenzhuoyu/iasm v0.9.1 // indirect 31 37 github.com/davecgh/go-spew v1.1.1 // indirect 38 + github.com/felixge/httpsnoop v1.0.4 // indirect 32 39 github.com/gabriel-vasile/mimetype v1.4.3 // indirect 33 40 github.com/gin-contrib/sse v0.1.0 // indirect 34 - github.com/go-logr/logr v1.4.2 // indirect 41 + github.com/go-logr/logr v1.4.3 // indirect 35 42 github.com/go-logr/stdr v1.2.2 // indirect 36 43 github.com/go-playground/locales v0.14.1 // indirect 37 44 github.com/go-playground/universal-translator v0.18.1 // indirect 38 45 github.com/go-playground/validator/v10 v10.19.0 // indirect 39 46 github.com/goccy/go-json v0.10.2 // indirect 47 + github.com/google/s2a-go v0.1.9 // indirect 48 + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect 49 + github.com/googleapis/gax-go/v2 v2.15.0 // indirect 40 50 github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect 41 51 github.com/json-iterator/go v1.1.12 // indirect 42 52 github.com/klauspost/cpuid/v2 v2.2.7 // indirect ··· 51 61 github.com/twitchyliquid64/golang-asm v0.15.1 // indirect 52 62 github.com/ugorji/go/codec v1.2.12 // indirect 53 63 go.opentelemetry.io/auto/sdk v1.1.0 // indirect 54 - go.opentelemetry.io/otel/trace v1.34.0 // indirect 64 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect 65 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect 66 + go.opentelemetry.io/otel/trace v1.36.0 // indirect 55 67 go.opentelemetry.io/proto/otlp v1.5.0 // indirect 56 68 golang.org/x/arch v0.7.0 // indirect 57 - golang.org/x/crypto v0.32.0 // indirect 58 - golang.org/x/net v0.34.0 // indirect 59 - golang.org/x/sys v0.29.0 // indirect 60 - golang.org/x/text v0.21.0 // indirect 61 - google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect 62 - google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect 63 - google.golang.org/grpc v1.69.4 // indirect 69 + golang.org/x/crypto v0.41.0 // indirect 70 + golang.org/x/net v0.43.0 // indirect 71 + golang.org/x/oauth2 v0.30.0 // indirect 72 + golang.org/x/sync v0.16.0 // indirect 73 + golang.org/x/sys v0.35.0 // indirect 74 + golang.org/x/text v0.28.0 // indirect 75 + golang.org/x/time v0.12.0 // indirect 76 + google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect 77 + google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c // indirect 78 + google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c // indirect 79 + google.golang.org/grpc v1.74.2 // indirect 64 80 gopkg.in/yaml.v3 v3.0.1 // indirect 65 81 )
+58 -26
apps/checker/go.sum
··· 1 + cloud.google.com/go/auth v0.16.4 h1:fXOAIQmkApVvcIn7Pc2+5J8QTMVbUGLscnSVNl11su8= 2 + cloud.google.com/go/auth v0.16.4/go.mod h1:j10ncYwjX/g3cdX7GpEzsdM+d+ZNsXAbb6qXA7p1Y5M= 3 + cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= 4 + cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= 5 + cloud.google.com/go/cloudtasks v1.13.7 h1:H2v8GEolNtMFfYzUpZBaZbydqU7drpyo99GtAgA+m4I= 6 + cloud.google.com/go/cloudtasks v1.13.7/go.mod h1:H0TThOUG+Ml34e2+ZtW6k6nt4i9KuH3nYAJ5mxh7OM4= 7 + cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcaobyVfZWqRLA= 8 + cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw= 9 + cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= 10 + cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= 1 11 connectrpc.com/connect v1.19.1 h1:R5M57z05+90EfEvCY1b7hBxDVOUl45PrtXtAV2fOC14= 2 12 connectrpc.com/connect v1.19.1/go.mod h1:tN20fjdGlewnSFeZxLKb0xwIZ6ozc3OQs2hTXy4du9w= 3 13 github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= ··· 19 29 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 20 30 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 21 31 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 32 + github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= 33 + github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= 22 34 github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= 23 35 github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= 24 36 github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= ··· 26 38 github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= 27 39 github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= 28 40 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 29 - github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= 30 - github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 41 + github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= 42 + github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 31 43 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= 32 44 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 33 45 github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= ··· 46 58 github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= 47 59 github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= 48 60 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 61 + github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= 62 + github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= 49 63 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 50 64 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 65 + github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= 66 + github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= 67 + github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= 68 + github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= 51 69 github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg= 52 70 github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ= 53 71 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= ··· 106 124 github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= 107 125 go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= 108 126 go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= 109 - go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= 110 - go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= 127 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= 128 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= 129 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= 130 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= 131 + go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= 132 + go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= 111 133 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA= 112 134 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac= 113 - go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= 114 - go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= 115 - go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= 116 - go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= 117 - go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= 118 - go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= 119 - go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= 120 - go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= 135 + go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= 136 + go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= 137 + go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= 138 + go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= 139 + go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= 140 + go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= 141 + go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= 142 + go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= 121 143 go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= 122 144 go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= 123 145 golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 124 146 golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= 125 147 golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= 126 - golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= 127 - golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= 128 - golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= 129 - golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= 148 + golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= 149 + golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= 150 + golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= 151 + golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= 152 + golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= 153 + golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= 154 + golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= 155 + golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= 130 156 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 131 157 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 132 158 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 133 159 golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 134 - golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= 135 - golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 136 - golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= 137 - golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 138 - google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= 139 - google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= 140 - google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= 141 - google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= 142 - google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= 143 - google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= 160 + golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= 161 + golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 162 + golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= 163 + golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= 164 + golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= 165 + golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= 166 + google.golang.org/api v0.247.0 h1:tSd/e0QrUlLsrwMKmkbQhYVa109qIintOls2Wh6bngc= 167 + google.golang.org/api v0.247.0/go.mod h1:r1qZOPmxXffXg6xS5uhx16Fa/UFY8QU/K4bfKrnvovM= 168 + google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= 169 + google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= 170 + google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c h1:AtEkQdl5b6zsybXcbz00j1LwNodDuH6hVifIaNqk7NQ= 171 + google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c/go.mod h1:ea2MjsO70ssTfCjiwHgI0ZFqcw45Ksuk2ckf9G468GA= 172 + google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c h1:qXWI/sQtv5UKboZ/zUk7h+mrf/lXORyI+n9DKDAusdg= 173 + google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo= 174 + google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4= 175 + google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM= 144 176 google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= 145 177 google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= 146 178 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=