Вопрос или проблема
Я пытаюсь создать проверку времени безотказной работы в Google Cloud Platform, используя командную строку gcloud. Вот пример:
gcloud monitoring uptime create 'example uptime check' --resource-labels=host=...,project_id=... --resource-type=uptime-url --protocol=https --port=443 "--path=..." --request-method=get --validate-ssl=true --status-codes=200 --matcher-type=contains-string "--matcher-content=..." --period=5 --timeout=30 --user-labels=instance-group=production,instance-type=authentication,monitoring-type=uptime
В общем, это работает, т.е. проверка создается, и ошибки не сообщаются. Однако, мои пользовательские метки игнорируются без уведомлений.
Я считаю, что следую документации (https://cloud.google.com/sdk/gcloud/reference/monitoring/uptime/create) правильно:
--user-labels=[KEY=VALUE,…]
Список пар меток KEY=VALUE для добавления.
Ключи должны начинаться с маленькой буквы и содержать только дефисы (-),
подчеркивания (_), строчные буквы и цифры. Значения должны содержать только
дефисы (-), подчеркивания (_), строчные буквы и цифры.
Я успешно добавил очень похожие пользовательские метки к экземплярам вычислений, дискам и т.д.
Я также пытался добавить пользовательские метки к существующим проверкам времени работы через gcloud monitoring uptime update
, но это тоже не сработало.
Я смог воспроизвести это, и, похоже, это ошибка в gcloud sdk. Запуск с режимом отладки и log-http показывает, что CLI улавливает переданные пользователем метки, но не отправляет их в API мониторинга в облаке.
По состоянию на 30 января 2025 года с последней версией Google Cloud SDK 508.0.0. Вы можете подать заявку на ошибку здесь – https://cloud.google.com/sdk/docs/getting-support
Вот флаги, которые были захвачены корректно –
gcloud monitoring uptime create test-uptime --resource-labels=host=example.com,project_id=myproject --resource-type=uptime-url --protocol=https --port=443 --path=/status --request-method=get --validate-ssl=true --status-codes=200 --user-labels=environment=sandbox --period=15 --timeout=30 --log-http --verbosity=debug
DEBUG: Running [gcloud.monitoring.uptime.create] with arguments: [--log-http: "true", --path: "/status", --period: "15", --port: "443", --protocol: "https", --request-method: "get", --resource-labels: "OrderedDict([('host', 'example.com'), ('project_id', 'myproject')])", --resource-type: "uptime-url", --status-codes: "[200]", --timeout: "30", --user-labels: "OrderedDict([('environment', 'sandbox')])", --validate-ssl: "True", --verbosity: "debug", DISPLAY_NAME: "test-uptime"]
Но –log-http показывает, что userLabels не отправляются в Monitoring API –
-- body start --
{
"name": "projects/myproject/uptimeCheckConfigs/test-uptime-ABn9TbKDCj8",
"displayName": "test-uptime",
"monitoredResource": {
"type": "uptime_url",
"labels": {
"host": "example.com",
"project_id": "myproject"
}
},
"httpCheck": {
"useSsl": true,
"path": "/status",
"port": 443,
"validateSsl": true,
"requestMethod": "GET",
"acceptedResponseStatusCodes": [
{
"statusValue": 200
}
]
},
"period": "900s",
"timeout": "30s",
"checkerType": "STATIC_IP_CHECKERS"
}
Один из альтернативных вариантов – использовать curl или аналогичные инструменты для создания проверок времени работы, непосредственно обращаясь к API мониторинга в облаке. Вот простой пример скрипта оболочки,
#!/bin/bash
Project_id=your_gcp_project_id
url="https://monitoring.googleapis.com/v3/projects/$Project_id/uptimeCheckConfigs?alt=json"
body='{"displayName": "test-uptime", "httpCheck": {"acceptedResponseStatusCodes": [{"statusValue": 200}], "authInfo": {}, "contentType": "TYPE_UNSPECIFIED", "path": "/status", "port": 443, "requestMethod": "GET", "useSsl": true, "validateSsl": true}, "monitoredResource": {"labels": {"host": "example.com", "project_id": "$Project_id"}, "type": "uptime_url"}, "period": "900s", "timeout": "30s", "userLabels": {"environment": "sandbox"}}'
token="$(gcloud auth print-access-token)"
curl -i -X POST -H "content-type: application/json" -H "Authorization: Bearer $token" -d "${body}" $url
Ответ или решение
Создание проверки доступности с пользовательскими ярлыками на платформе Google Cloud через интерфейс командной строки gcloud может представлять собой сложную задачу из-за возможных ограничений и ошибок в SDK. Однако, чтобы обеспечить детальное понимание процесса и предложить решение, следуем методологии TEA (Теория, Пример, Применение).
Теория
В Google Cloud мониторинг представляет собой мощный инструмент для обеспечения доступности и производительности ваших решений. Проверки доступности (uptime checks) используются для мониторинга доступности и времени отклика ваших сервисов. Пользовательские ярлыки помогают добавлять дополнительные метаданные к проверкам, что упрощает их организацию и фильтрацию.
Согласно документации Google Cloud SDK, можно добавлять свои ярлыки с помощью флага --user-labels
, который принимает список пар ключ=значение. Однако в текущей версии SDK может возникнуть проблема: флаг корректно захватывается командной строкой, но не отправляется в API Monitoring, что лишает возможности хранения метаданных на уровне проверки доступности.
Пример
Рассмотрим пример команды, которая создаёт проверку доступности:
gcloud monitoring uptime create 'example uptime check' \
--resource-labels=host=example.com,project_id=myproject \
--resource-type=uptime-url \
--protocol=https \
--port=443 \
--path=/status \
--request-method=get \
--validate-ssl=true \
--status-codes=200 \
--matcher-type=contains-string \
--matcher-content='Success' \
--period=5 \
--timeout=30 \
--user-labels=instance-group=production,instance-type=authentication,monitoring-type=uptime \
--log-http \
--verbosity=debug
Применение
При запуске команды может возникнуть проблема, когда пользовательские ярлыки игнорируются, хотя вы, возможно, убедились, что они соответствуют всем требованиям синтаксиса. На текущий момент это может быть связано с известной ошибкой в SDK, и рекомендуется подать отчёт о ней через систему поддержки Google Cloud.
В качестве альтернативного решения, вы можете использовать прямые запросы к API Monitoring через такие инструменты, как curl
. Этот метод позволяет миновать ограничения SDK, отправляя составленный JSON запрос напрямую на сервер API.
Изложу пример сценария, который отправляет POST-запрос к API Monitoring:
#!/bin/bash
Project_id=your_gcp_project_id
url="https://monitoring.googleapis.com/v3/projects/$Project_id/uptimeCheckConfigs?alt=json"
body='{
"displayName": "test-uptime",
"httpCheck": {
"acceptedResponseStatusCodes": [{"statusValue": 200}],
"authInfo": {},
"contentType": "TYPE_UNSPECIFIED",
"path": "/status",
"port": 443,
"requestMethod": "GET",
"useSsl": true,
"validateSsl": true
},
"monitoredResource": {
"labels": {"host": "example.com", "project_id": "$Project_id"},
"type": "uptime_url"
},
"period": "900s",
"timeout": "30s",
"userLabels": {"environment": "sandbox"}
}'
token="$(gcloud auth print-access-token)"
curl -i -X POST -H "content-type: application/json" -H "Authorization: Bearer $token" -d "${body}" $url
Этот скрипт демонстрирует, как задавать параметры проверки доступности и добавлять пользовательские ярлыки через CURL-запрос. Главное — подготовить тело запроса body
в соответствии с требованиями API, где можно корректно передать userLabels
.
Заключение
Хотя проблемы могут возникнуть на уровне SDK, подход с использованием прямых запросов к API Monitoring является надежным и эффективным решением. Этот метод требует подчеркнутого внимания к формату запроса и аспектам авторизации. При использовании этого подхода вы получаете больше контроля над метаданными ваших проверок доступности и можете решать задачи мониторинга более гибко и разносторонне.