Как создать проверку работоспособности с пользовательскими метками с использованием Google Cloud CLI (gcloud)

Вопрос или проблема

Я пытаюсь создать проверку времени безотказной работы в 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 является надежным и эффективным решением. Этот метод требует подчеркнутого внимания к формату запроса и аспектам авторизации. При использовании этого подхода вы получаете больше контроля над метаданными ваших проверок доступности и можете решать задачи мониторинга более гибко и разносторонне.

Оцените материал
Добавить комментарий

Капча загружается...