Документацияbreadcrumb arrow Grafanabreadcrumb arrow Документация GlaberGraphbreadcrumb arrow Как кодbreadcrumb arrow Инфраструктура как кодbreadcrumb arrow Terraformbreadcrumb arrow Управление Fleet Management в Grafana Cloud с помощью Terraform

Управление Fleet Management в Grafana Cloud с помощью Terraform

Узнайте, как создавать коллекторы и конвейеры Grafana Fleet Management в Grafana Cloud с помощью Terraform. В этом руководстве показано, как создать политику доступа и токен для Fleet Management и Grafana Alloy, коллектор с удалёнными атрибутами, а также конвейер для профилирования Alloy.

Прежде чем начать

Прежде чем начать, убедитесь, что у вас есть следующее:

  • Учётная запись Grafana Cloud, как описано в разделе Get started
  • Установленный на вашем компьютере Terraform
  • Установленный на вашем компьютере Alloy
  • Права администратора в вашем экземпляре Grafana

Note

Все приведённые ниже файлы конфигурации Terraform следует сохранить в одном каталоге.

Настройка провайдера для Grafana Cloud

Эта конфигурация Terraform настраивает провайдер Grafana для обеспечения необходимой аутентификации при взаимодействии с Cloud API. grafana_cloud_stack (Data Source) используется для получения ID пользователя и URL вашего экземпляра.

  1. Создайте политику доступа и токен Grafana Cloud. Чтобы создать новые, обратитесь к разделу Grafana Cloud Access Policies. Добавьте ваш стек в список realms (realms). Области действия (scopes), необходимые для примеров в этом руководстве:

    • accesspolicies:read
    • accesspolicies:write
    • accesspolicies:delete
    • stacks:read
  2. Создайте файл с именем cloud-provider.tf и добавьте следующий блок кода:

    terraform
    terraform {
      required_providers {
        grafana = {
          source  = "grafana/grafana"
          version = ">= 3.19.0"
        }
      }
    }
    
    provider "grafana" {
      alias = "cloud"
    
      cloud_access_policy_token = "<CLOUD_ACCESS_POLICY_TOKEN>"
    }
    
    data "grafana_cloud_stack" "stack" {
      provider = grafana.cloud
    
      slug = "<STACK_SLUG>"
    }
  3. Замените следующие значения полей:

    • <CLOUD_ACCESS_POLICY_TOKEN> на токен политики доступа, созданный на первом шаге
    • <STACK_SLUG> на slug вашего стека, то есть поддомен, по которому доступен ваш экземпляр Grafana Cloud: https://<STACK_SLUG>.grafana.net

Создание политики доступа и токена для Fleet Management

Эта конфигурация Terraform создаёт следующее:

  1. Создайте файл с именем fm-access-policy.tf и добавьте следующий блок кода:

    terraform
    resource "grafana_cloud_access_policy" "fm_policy" {
      provider = grafana.cloud
    
      name   = "fleet-management-policy"
      region = data.grafana_cloud_stack.stack.region_slug
    
      scopes = [
        "fleet-management:read",
        "fleet-management:write"
      ]
    
      realm {
        type       = "stack"
        identifier = data.grafana_cloud_stack.stack.id
      }
    }
    
    resource "grafana_cloud_access_policy_token" "fm_token" {
      provider = grafana.cloud
    
      name             = "fleet-management-token"
      region           = grafana_cloud_access_policy.fm_policy.region
      access_policy_id = grafana_cloud_access_policy.fm_policy.policy_id
    }

Настройка провайдера для Fleet Management

Эта конфигурация Terraform настраивает провайдер Grafana для обеспечения необходимой аутентификации при взаимодействии с API Fleet Management.

  1. Создайте файл с именем fm-provider.tf и добавьте следующий блок кода:

    terraform
    locals {
      fm_id    = data.grafana_cloud_stack.stack.fleet_management_user_id
      fm_token = grafana_cloud_access_policy_token.fm_token.token
      fm_url   = data.grafana_cloud_stack.stack.fleet_management_url
    }
    
    provider "grafana" {
      alias = "fm"
    
      fleet_management_auth = "${local.fm_id}:${local.fm_token}"
      fleet_management_url  = local.fm_url
    }

Создание коллектора Fleet Management

Эта конфигурация Terraform создаёт коллектор с удалённым атрибутом, используя grafana_fleet_management_collector (Resource).

Эта конфигурация только предварительно регистрирует коллектор. Чтобы коллектор зарегистрировался в Fleet Management и ему были назначены удалённые атрибуты, необходимо выполнить шаг Запуск Alloy.

  1. Создайте файл с именем fm-collector.tf и добавьте следующий блок кода:

    terraform
    resource "grafana_fleet_management_collector" "fm_collector" {
      provider = grafana.fm
    
      id = "prod_collector"
      remote_attributes = {
        "env" = "PROD"
      }
      enabled = true
    }

Создание конвейера Fleet Management

Эта конфигурация Terraform создаёт конвейер для профилирования Alloy с сопоставителем (matcher) для коллектора, объявленного на предыдущем шаге, используя grafana_fleet_management_pipeline (Resource). Конвейер записывает профили в Grafana Cloud Profiles.

  1. Создайте файл с именем profiling.alloy.tftpl и добавьте следующее содержимое:

    Alloy
    // This pipeline scrapes pprof Go profiles from Alloy and sends them to Pyroscope.
    //
    // It requires the following environment variables to be set where Alloy is running:
    //   Required:
    //     * GCLOUD_RW_API_KEY: The Grafana Cloud API key with write access to Pyroscope.
    //   Optional:
    //     * ALLOY_ADDRESS: The address Alloy listens on. Defaults to 127.0.0.1:12345.
    pyroscope.scrape "alloy" {
        targets = [
            {
                "__address__" = coalesce(
                    sys.env("ALLOY_ADDRESS"),
                    "127.0.0.1:12345",
                ),
                "service_name" = "alloy",
            },
        ]
        forward_to = [pyroscope.write.grafana_cloud.receiver]
    
        profiling_config {
            profile.process_cpu {
                enabled = true
            }
    
            profile.memory {
                enabled = true
            }
    
            profile.mutex {
                enabled = true
            }
    
            profile.block {
                enabled = true
            }
    
            profile.goroutine {
                enabled = true
            }
        }
    }
    
    pyroscope.write "grafana_cloud" {
        endpoint {
            url = "${profiles_url}"
    
            basic_auth {
                username = "${profiles_id}"
                password = sys.env("GCLOUD_RW_API_KEY")
            }
        }
    }
  2. Создайте файл с именем fm-pipeline.tf и добавьте следующий блок кода:

    terraform
    locals {
      profiles_id  = data.grafana_cloud_stack.stack.profiles_user_id
      profiles_url = data.grafana_cloud_stack.stack.profiles_url
    }
    
    resource "grafana_fleet_management_pipeline" "pipeline" {
      provider = grafana.fm
    
      name = "profiling"
      contents = templatefile(
        "profiling.alloy.tftpl",
        {
          profiles_id  = local.profiles_id,
          profiles_url = local.profiles_url,
        },
      )
      matchers = [
        "env=\"PROD\""
      ]
      enabled = true
    }

Создание политики доступа и токена для Alloy

Эта конфигурация Terraform создаёт следующее:

  1. Создайте файл с именем alloy-access-policy.tf и добавьте следующий блок кода:

    terraform
    resource "grafana_cloud_access_policy" "alloy_policy" {
      provider = grafana.cloud
    
      name   = "alloy-policy"
      region = data.grafana_cloud_stack.stack.region_slug
    
      scopes = [
        "set:alloy-data-write"
      ]
    
      realm {
        type       = "stack"
        identifier = data.grafana_cloud_stack.stack.id
      }
    }
    
    resource "grafana_cloud_access_policy_token" "alloy_token" {
      provider = grafana.cloud
    
      name             = "alloy-token"
      region           = grafana_cloud_access_policy.alloy_policy.region
      access_policy_id = grafana_cloud_access_policy.alloy_policy.policy_id
    }
    
    output "alloy_token" {
      value     = grafana_cloud_access_policy_token.alloy_token.token
      sensitive = true
    }

Создание файла конфигурации для Alloy

Эта конфигурация Terraform создаёт файл конфигурации Alloy с блоком remotecfg для Fleet Management, используя local_file (Resource).

  1. Создайте файл с именем config.alloy.tftpl и добавьте следующее содержимое:

    Alloy
    remotecfg {
        id             = "${collector_id}"
        url            = "${fm_url}"
        poll_frequency = "60s"
    
        basic_auth {
            username = "${fm_id}"
            password = sys.env("GCLOUD_RW_API_KEY")
        }
    }
  2. Создайте файл с именем alloy-config.tf и добавьте следующий блок кода:

    terraform
    resource "local_file" "alloy_config" {
      filename = "<ALLOY_CONFIG_PATH>"
      content = templatefile(
        "config.alloy.tftpl",
        {
          collector_id = "prod_collector",
          fm_id        = local.fm_id,
          fm_url       = local.fm_url,
        },
      )
      directory_permission = "0644"
      file_permission      = "0644"
    }
  3. Замените следующие значения полей:

    • <ALLOY_CONFIG_PATH> на путь, по которому должен быть записан файл конфигурации Alloy, например config.alloy

Применение конфигурации Terraform

В терминале выполните следующие команды из каталога, в котором находятся все файлы конфигурации.

  1. Инициализируйте рабочий каталог, содержащий файлы конфигурации Terraform:

    shell
    terraform init
  2. Просмотрите изменения Terraform:

    shell
    terraform plan
  3. Примените конфигурацию:

    shell
    terraform apply

Запуск Alloy

Чтобы узнать, как запустить или перезапустить Alloy, обратитесь к разделу Run Grafana Alloy.

Note

Чтобы удалённая конфигурация из этого примера работала, в среде, где запущен Alloy, должна быть задана переменная GCLOUD_RW_API_KEY.

  1. Выполните следующую команду, чтобы просмотреть токен Alloy:

    shell
    terraform output -raw alloy_token
  2. Присвойте переменной среды GCLOUD_RW_API_KEY значение из первого шага.

  3. Запустите Alloy.

Проверка

После применения изменений в конфигурациях Terraform и запуска Alloy вы должны увидеть следующее:

  • Коллектор добавлен на вкладку Inventory tab в Fleet Management:

    Экран Inventory в интерфейсе Fleet Management в Grafana Cloud, где показано, что новый коллектор `prod_collector` зарегистрирован с атрибутом `env=PROD`, имеет статус healthy и был изменён несколько секунд назад.
  • Конвейер добавлен на вкладку Remote configuration tab в Fleet Management:

    Экран Remote configuration в интерфейсе Fleet Management в Grafana Cloud, где показано, что новый конвейер конфигурации `profiling` активен и был изменён несколько секунд назад.
  • Профили Alloy экспортируются в Grafana Cloud Profiles:

    Панель в Grafana Cloud, где показаны данные профилирования Alloy, включая графики загрузки CPU и памяти.

Итог

В этом руководстве вы создали политику доступа и токен для Fleet Management и Alloy, коллектор с удалёнными атрибутами и конвейер для профилирования Alloy — всё с помощью Terraform.

Чтобы узнать больше об управлении Grafana Cloud с помощью Terraform, обратитесь к документации провайдера Grafana.