Usar a API: recomendações

Esta página explica como visualizar e gerenciar recomendações no Recommender usando comandos gcloud ou a API REST.

Uma interação de recomendação típica com a API Recommender é:

Somente as recomendações recuperadas por meio da API podem ser usadas para interagir por meio dela ou do BigQuery Export.

Para informações sobre como alterar o estado das recomendações no Console do Google Cloud, consulte a documentação da Central de recomendações ou a recommender adequada.

Definir o projeto padrão

Defina o projeto padrão, caso ainda não tenha feito isso:

gcloud config set project PROJECT_ID

onde PROJECT_ID é o código de seu projeto.

Definir as variáveis de ambiente

Defina variáveis de ambiente para interações do Recommender:

PROJECT=TARGET_PROJECT_ID
LOCATION=LOCATION_ID
RECOMMENDER=RECOMMENDER_ID

em que:

  • TARGET_PROJECT_ID é o projeto cujas recomendações você quer listar. Pode ser um projeto diferente do atual.

    • Para comandos gcloud, use o código do projeto
    • Para solicitações de API, você pode usar o número ou o ID do projeto. O número do projeto é recomendado.

    O número do projeto é retornado nas respostas dos comandos de API e gcloud.

  • LOCATION_ID é o local do Google Cloud em que os recursos associados às recomendações estão localizados (por exemplo, global ou us-central1-a).

  • RECOMMENDER_ID é o ID de recomendação totalmente qualificado (por exemplo, google.compute.instance.MachineTypeRecommender).

Consulte Recomendadores para ver uma tabela de links para informações sobre cada recomendação, incluindo locais compatíveis e códigos de recomendações.

Definir permissões

Você precisa ter permissões para acessar as recomendações no projeto de destino.

  • Solicitantes que incluem um projeto de faturamento na solicitação. O projeto usado na solicitação precisa estar em situação regular, e o usuário precisa ter um papel no projeto que contenha a permissão serviceusage.services.use. O papel Consumidor do Service Usage tem a permissão necessária.
  • Cada recomendador requer permissões específicas. Consulte Recomendadores para ver uma tabela de links para informações sobre cada recomendador, incluindo as permissões necessárias.

Listar recomendações

Conforme mostrado na guia gcloud Beta, é possível listar todas as recomendações do seu projeto sem precisar especificar um local e um recomendador. Esse recurso está em pré-lançamento.

Para usar o recurso de GA, é preciso especificar um projeto, um local e um recomendador. Para mais detalhes, consulte a guia gcloud.

gcloud Beta

Digite o seguinte:

gcloud beta recommender recommendations list \
    --project=${PROJECT} \
    --format=FORMAT

em que FORMAT é um formato de saída compatível com gcloud, como json.

Por exemplo:

gcloud beta recommender recommendations list \
    --project=example-project \
    --format=json

gcloud

Digite o seguinte:

gcloud recommender recommendations list \
    --project=${PROJECT} \
    --location=${LOCATION} \
    --recommender=${RECOMMENDER} \
    --format=FORMAT

em que FORMAT é um formato de saída gcloud compatível (por exemplo, json).

Por exemplo:

gcloud recommender recommendations list \
    --project=example-project \
    --location=us-central1-a \
    --recommender=google.compute.instance.MachineTypeRecommender \
    --format=json

REST

Digite o seguinte:

curl \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    -H "x-goog-user-project: ${PROJECT}" \
    "https://recommender.googleapis.com/v1/projects/${PROJECT}/locations/${LOCATION}/recommenders/${RECOMMENDER}/recommendations"

Por exemplo:

curl \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    -H "x-goog-user-project: example-project" \
    "https://recommender.googleapis.com/v1/projects/example-project/locations/us-central1-a/recommenders/google.compute.instance.MachineTypeRecommender/recommendations"

Essa operação gera as recomendações atuais de dimensionamento de instâncias de VM no projeto de destino como uma lista de entidades Recommendation no formato especificado.

A resposta será semelhante a:

[
  {
    "content": {
      "operationGroups": [
        {
          "operations": [
            {
              "action": "test",
              "path": "/machineType",
              "resource": "//compute.googleapis.com/projects/example-project/zones/us-central1-a/instances/instance-1",
              "resourceType": "compute.googleapis.com/Instance",
              "valueMatcher": {
                "matchesPattern": ".*zones/us-central1-a/machineTypes/n1-standard-4"
              }
            },
            {
              "action": "replace",
              "path": "/machineType",
              "resource": "//compute.googleapis.com/projects/example-project/zones/us-central1-a/instances/instance-1",
              "resourceType": "compute.googleapis.com/Instance",
              "value": "zones/us-central1-a/machineTypes/custom-2-5120"
            }
          ]
        }
      ]
    },
    "description": "Save cost by changing machine type from n1-standard-4 to custom-2-5120.",
    "etag": "\"280b34810bba8a1a\"",
    "lastRefreshTime": "2019-06-28T06:49:21Z",
    "name": "projects/32428390823/locations/us-central1-a/recommenders/google.compute.instance.MachineTypeRecommender/recommendations/a523ff7e-ed03-4143-a3a5-5b396b99cba9",
    "primaryImpact": { ... },
    "stateInfo": {
      "state": "ACTIVE"
    },
    "recommenderSubtype": "CHANGE_MACHINE_TYPE"
  }
]

Observe que as recomendações retornadas incluem os seguintes campos:

  • Um campo name no seguinte formato:

    projects/PROJECT_ID/locations/LOCATION/recommenders/RECOMMENDER_ID/recommendations/RECOMMENDATION_ID

    em que RECOMMENDATION_ID identifica exclusivamente a recomendação

  • Um campo etag associado ao estado de recomendação atual.

Quando você faz referência a uma recomendação usando comandos Google Cloud CLI ou chamadas de API REST subsequentes, faz referência ao código da recomendação e à etag, o que garante que qualquer operação seja realizada somente se a recomendação não tiver sido modificada desde a última vez em que foi recuperada.

Marcar uma recomendação como declarada ou dispensada

Você pode marcar uma recomendação como reivindicada para indicar que pretende aplicar as alterações recomendadas ao recurso associado. Quando uma recomendação é reivindicada, seu nome de usuário é atribuído como o ator da recomendação, e o Recomendador não atualiza a recomendação com o conteúdo mais recente.

É possível marcar uma recomendação como dispensada para indicar que você não pretende aplicar as alterações recomendadas ao recurso associado ou que não quer continuar vendo a recomendação. Quando uma recomendação for dispensada, ela não aparecerá mais como ATIVA. O recomendador pode continuar atualizando a recomendação com conteúdo mais recente.

Para marcar uma recomendação como declarada ou dispensada, siga estas etapas:

gcloud

Digite o seguinte:

gcloud recommender recommendations STATE_CHANGE \
    RECOMMENDATION_ID \
    --project=${PROJECT} \
    --location=${LOCATION} \
    --recommender=${RECOMMENDER} \
    --etag=etag \
    --state-metadata=STATE_METADATA
    --format=FORMAT

Em que:

  • STATE_CHANGE é o status que você quer marcar para uma recomendação. Os valores válidos são:
    • mark-claimed para marcar a recomendação como declarada.
    • mark-dismissed para marcar a recomendação como dispensada.
  • RECOMMENDATION_ID é o código de uma recomendação que você recuperou de uma chamada anterior para listar recomendações
  • etag é a etag retornada que representa o estado da recomendação.
  • STATE_METADATA é um metadado opcional sobre a operação. Especifique os metadados como uma lista separada por vírgulas de pares KEY=VALUE. Essa opção está disponível quando você marca uma recomendação como reivindicada, bem-sucedida ou com falha.

Por exemplo:

gcloud recommender recommendations mark-claimed \
    a523ff7e-ed03-4143-a3a5-5b396b99cba9 \
    --project=example-project \
    --location=us-central1-a \
    --recommender=google.compute.instance.MachineTypeRecommender \
    --etag='"280b34810bba8a1a"' \
    --state-metadata=priority=high,tracking_number=12345
    --format=json

REST

Digite o seguinte:

curl -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    -H "x-goog-user-project: ${PROJECT}" \
    --data-binary @- \
    https://recommender.googleapis.com/v1/projects/${PROJECT}/locations/${LOCATION}/recommenders/${RECOMMENDER}/recommendations/RECOMMENDATION_ID:STATE_CHANGE \
<< EOM
{
  "etag": "etag",
  "stateMetadata": STATE_METADATA
}
EOM

em que:

  • STATE_CHANGE é o status que você quer marcar para uma recomendação. Os valores válidos são:
    • mark-claimed para marcar a recomendação como declarada.
    • mark-dismissed para marcar a recomendação como dispensada.
  • RECOMMENDATION_ID é o código de uma recomendação que você recuperou de uma chamada anterior para listar recomendações
  • etag é a etag retornada que representa o estado da recomendação.
  • STATE_METADATA é um campo opcional com metadados adicionais sobre a operação. Especifique os metadados como pares de key:value. Esse campo está disponível quando você marca uma recomendação como reivindicada, bem-sucedida ou falha.

Por exemplo:

curl -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    -H "x-goog-user-project: example-project" \
    --data-binary @- \
    https://recommender.googleapis.com/v1/projects/example-project/locations/us-central1-a/recommenders/google.compute.instance.MachineTypeRecommender/recommendations/8f20d509-83d2-45d2-8152-1b8d5d7d5831:markClaimed \
<< EOM
{
  "etag": "\"280b34810bba8a1a\""
  "stateMetadata": {
    "priority" : "high",
    "tracking_number": "12345"
  }
}
EOM

Essa operação retorna a entidade Recommendation no formato especificado depois que a operação ocorreu.

A resposta será semelhante a:

{
  "content": {
    "operationGroups": [ ... ]
  },
  "description": "Save cost by changing machine type from n1-standard-4 to custom-2-5120.",
  "etag": "\"5e3a63cccf1e0964\"",
  "lastRefreshTime": "2019-06-28T06:49:21Z",
  "name": "projects/32428390823/locations/us-central1-a/recommenders/google.compute.instance.MachineTypeRecommender/recommendations/a523ff7e-ed03-4143-a3a5-5b396b99cba9",
  "primaryImpact": { ... },
  "stateInfo": {
    "state": "CLAIMED"
  }
}

Observe que o valor do campo state foi alterado para CLAIMED.

Como aplicar recomendações

Depois de marcar uma recomendação como reivindicada, é possível aplicá-la usando comandos gcloud ou chamadas da API REST específicas do tipo de recurso.

Por exemplo, para alterar o tamanho de uma instância de VM em resposta a uma recomendação do recomendador de dimensionamento da instância de VM, use o Compute Engine gcloud comandos ou chamadas para o Compute Engine API REST.

Ao executar essas operações, você identifica o recurso de destino usando o valor do campo resource na matriz OperationsGroup na entidade Recommendation retornada. Esse campo está no seguinte formato:

//API_NAME/RESOURCE_PATH

Por exemplo:

//compute.googleapis.com/projects/example-project/zones/us-central1-a/instances/instance-1"

Como alterar o estado de uma recomendação

Depois de aplicar uma recomendação, você poderá marcá-la como concluída ou com falha.

Para marcar uma recomendação como bem-sucedida:

gcloud

Digite o seguinte:

gcloud recommender recommendations STATE_CHANGE \
    RECOMMENDATION_ID \
    --project=${PROJECT} \
    --location=${LOCATION} \
    --recommender=${RECOMMENDER} \
    --etag=etag \
    --state-metadata=priority=high,tracking_number=12345
    --format=FORMAT

Onde

  • STATE_CHANGE é a alteração que você quer fazer em uma recomendação. Os valores válidos são:
    • mark-succeeded para marcar a recomendação como bem-sucedida.
    • mark-failed para marcar a recomendação como reprovada.
  • STATE_METADATA são metadados opcionais sobre a operação. Especifique os metadados como uma lista separada por pares de pares KEY=VALUE. Essa opção está disponível quando você marca uma recomendação como reivindicada, bem-sucedida ou com falha.

Por exemplo:

gcloud recommender recommendations mark-succeeded \
    a523ff7e-ed03-4143-a3a5-5b396b99cba9 \
    --project=example-project \
    --location=us-central1-a \
    --recommender=google.compute.instance.MachineTypeRecommender \
    --etag='"5e3a63cccf1e0964"' \
    --state-metadata=priority=high,tracking_number=12345
    --format=json

REST

Digite o seguinte

curl -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    -H "x-goog-user-project: ${PROJECT}" \
    --data-binary @- \
    https://recommender.googleapis.com/v1/projects/${PROJECT}/locations/${LOCATION}/recommenders/${RECOMMENDER}/recommendations/RECOMMENDATION_ID:STATE_CHANGE \
<< EOM
{
  "etag": "etag"
  "stateMetadata": STATE_METADATA
}
EOM

em que:

  • RECOMMENDATION_ID é o código de uma recomendação que você recuperou de uma chamada anterior para listar recomendações
  • STATE_CHANGE é a alteração que você quer fazer em uma recomendação. Os valores válidos são:
    • markSucceeded para marcar a recomendação como bem-sucedida.
    • markFailed para marcar a recomendação como reprovada.
  • etag é a etag retornada que representa o estado da recomendação.
  • STATE_METADATA é um campo opcional com metadados adicionais sobre a operação. Especifique os metadados como pares de key:value. Esse campo está disponível quando você marca uma recomendação como reivindicada, bem-sucedida ou falha.

Por exemplo:

curl -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    -H "x-goog-user-project: example-project" \
    --data-binary @- \
    https://recommender.googleapis.com/v1/projects/example-project/locations/us-central1-a/recommenders/google.compute.instance.MachineTypeRecommender/recommendations/8f20d509-83d2-45d2-8152-1b8d5d7d5831:markSucceeded \
<< EOM
{
  "etag": "\"280b34810bba8a1a\""
  "stateMetadata": {
    "priority" : "high",
    "tracking_number": "12345"
  }
}
EOM

Essa operação retorna a entidade Recommendation no formato especificado depois que a operação ocorreu.

A resposta será semelhante a:

{
  "content": {
    "operationGroups": [ ... ]
  },
  "description": "Save cost by changing machine type from n1-standard-4 to custom-2-5120.",
  "etag": "\"5e3a63cccf1e053c\"",
  "lastRefreshTime": "2019-06-28T06:49:21Z",
  "name": "projects/32428390823/locations/us-central1-a/recommenders/google.compute.instance.MachineTypeRecommender/recommendations/a523ff7e-ed03-4143-a3a5-5b396b99cba9",
  "primaryImpact": { ... },
  "stateInfo": {
    "state": "SUCCEEDED",
    "stateMetadata": {
      "priority" : "high",
      "tracking_number": "12345"
    }
  }
}

Observe que o valor do campo state foi alterado para SUCCEEDED.