Рубрики
Uncategorized

Мониторинг-как-код

Эта статья изначально появилась в руководствах Coughty. Тенденция объявления инфраструктуры в качестве кода … помечена мониторингом, дежоптом, тестированием, IAC.

Эта статья изначально появилась в Рекомендации Cource .

Тенденция декларирования инфраструктуры в качестве кода затрагивала пару за последние несколько лет, предлагая способы развлечении команд прозрачно управлять и масштабировать облачную инфраструктуру. Почему, как мы можем управлять мониторингом быть любым другим? В этой статье мы обращаемся к этой точке и иллюстрируем его практическим примером мониторинга-кода.

Инфраструктура — как-код

Исторически ИТ-инфраструктура была предоставлена вручную, как на помещении, так и в облаке. Это представило несколько задач, в том числе фрагментированных рабочих процессов, отсутствие прозрачности и проблем масштабируемости. В ответ на эти проблемы последние несколько лет наблюдали сдвиг на парадигму AS-CODE (IAC) инфраструктуры, в которой крупномасштабные системы объявлены в файлах конфигурации в качестве кода.

Новое поколение инструментов появилось для обслуживания этого примера, наиболее заметным примером которого является Hashicorp Terraform Отказ Terraform предоставляет рабочую процессу CLI, позволяющую пользователям указывать то, как должна выглядеть окончательная настройка инфраструктуры, а затем позаботится обо всех промежуточных шагах, необходимых для туда.

Террафору можно использовать для обеспечения положения инфраструктуры на многих различных облачных поставщиков благодаря своей экосистеме поставщика: каждый провайдер отображает карты API поставщика, подвергая различные ресурсы на конкретном языке домена, известный как HCl .

Мониторинг пути

Настройка мониторинга может представить некоторые из тех же проблем, что и обеспечивая инфраструктуру. Это становится очевидным, когда мы продвигаемся мимо начальной развертывания или доказательства концепции и на борту нескольких продуктов и/или команд, и посмотреть наш мониторинг, быстро растут по объему — наряду с его потребностями в обслуживании.

Мониторинг-вспомогательный код учится из IAC и приближает ваш мониторинг Config Bearer к вашему приложению и рабочих процессах разработки. Как? Имея его также объявленные в качестве кода, как вы, как вы, как вы, подобные с любыми видом ИТ-инфраструктуры.

Почему мониторинг-как-код

Что делает один выигрыш при переходе из руководства к подходу для мониторинга-кода? Основные преимущества находятся:

  1. Лучшая масштабируемость благодаря более быстрому обеспечению и упрощению обслуживания.
  2. Лучшая история и документация: Config файлы могут быть проверены в контроль источника.
  3. Общий мониторинг настроек видимости (и проще общую собственность) в командах DEVOPS.

Мониторинг — как-код с проверкой

Пользователи, которые только что начали, будут знакомы с созданием проверок, групп, каналов оповещения и другими ресурсами через контрольную интерфейс. Официальный поставщик Terraform позволяет им вместо того, что следует точно использовать их активную настройку мониторинга, и оказалось, что она оказывала его на террафоре всего за несколько секунд — независимо от того, значит ли это создавать десятки, сотни или тысячи ресурсов.

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

Мониторинг веб-сайта электронной коммерции — как код

Как это все выглядит на практике? Давайте выясним, создав небольшую настройку мониторинга для нашего Демо-сайт электронной коммерции .

Настройка нашего проекта Terraform

Для нашего примера мы будем создавать проверки браузера, используя Драматург Скрипты, которые мы ранее написали как часть нашего драматурга.

Сначала будет наш сценарий входа:

const { chromium } = require("playwright");

(async () => {

  // launch the browser and open a new page
  const browser = await chromium.launch();
  const page = await browser.newPage();

  // navigate to our target web page
  await page.goto("https://danube-webshop.herokuapp.com/");

  // click on the login button and go through the login procedure
  await page.click("#login");
  await page.type("#n-email", "user@email.com");
  await page.type("#n-password2", "supersecure1");
  await page.click("#goto-signin-btn");

  // wait until the login confirmation message is shown
  await page.waitForSelector("#login-message", { visible: true });

  // close the browser and terminate the session
  await browser.close();
})();

… Тогда наш поиск сценарий …

const { chromium } = require("playwright");
const assert = require("chai").assert;

(async () => {

  // launch the browser and open a new page
  const browser = await chromium.launch();
  const page = await browser.newPage();

  const bookList = [
    "The Foreigner",
    "The Transformation",
    "For Whom the Ball Tells",
    "Baiting for Robot",
  ];

  // navigate to our target web page
  await page.goto("https://danube-webshop.herokuapp.com/");

  // search for keyword
  await page.click(".topbar > input");
  await page.type(".topbar > input", "for");
  await page.click("#button-search");
  await page.waitForSelector(
    ".shop-content > ul > .preview:nth-child(1) > .preview-title"
  );

  // halt immediately if results do not equal expected number
  let resultsNumber = (await page.$$(".preview-title")).length;
  assert.equal(resultsNumber, bookList.length);

  // remove every element found from the original array...
  for (i = 0; i < resultsNumber; i++) {
    const resultTitle = await page.$eval(
      `.preview:nth-child(${i + 1}) > .preview-title`,
      (e) => e.innerText
    );

    const index = bookList.indexOf(resultTitle);
    bookList.splice(index, 1);
  }

  // ...then assert that the original array is now empty
  assert.equal(bookList.length, 0);

  // close the browser and terminate the session
  await browser.close();
})();

… и, наконец, наш сценарий заказа.

const { chromium } = require("playwright");

(async () => {

  // launch the browser and open a new page
  const browser = await chromium.launch();
  const page = await browser.newPage();

  const navigationPromise = page.waitForNavigation();

  // navigate to our target web page
  await page.goto("https://danube-webshop.herokuapp.com/");

  // add the first item to the cart
  await page.click(`.preview:nth-child(1) > .preview-author`);
  await page.click(".detail-wrapper > .call-to-action");
  await page.click("#logo");

  // wait until navigation is complete
  await navigationPromise;

  // navigate to cart and proceed
  await page.click("#cart");
  await page.click(".cart > .call-to-action");
  await page.click("#s-name");

  // fill out checkout info
  await page.type("#s-name", "Max");
  await page.type("#s-surname", "Mustermann");
  await page.type("#s-address", "Charlottenstr. 57");
  await page.type("#s-zipcode", "10117");
  await page.type("#s-city", "Berlin");
  await page.type("#s-company", "Firma GmbH");
  await page.click(".checkout > form");
  await page.click("#asap");

  // confirm checkout
  await page.click(".checkout > .call-to-action");

  // wait until the order confirmation message is shown
  await page.waitForSelector("#order-confirmation", { visible: true });

  // close the browser and terminate the session
  await browser.close();
})();

Давайте начнем, создавая совершенно новую папку:

MKDIR Checkly-Terraform — Пример && CD $ _

Чтобы сохранить вещи легко, мы создаем подкаталог …

MKDIR Scripts

… и скопируйте все наши сценарии сверху в отдельные файлы, например login.js Отказ

Далее, мы хотим создать наши main.tf Файл и включите основную конфигурацию следующим образом:

variable "checkly_api_key" {}

terraform {
  required_providers {
    checkly = {
      source = "checkly/checkly"
      version = "0.8.1"
    }
  }
}

provider "checkly" {
  api_key = var.checkly_api_key
}

Мы готовы инициализировать наш проект и проведите проверку проверки проверки Terraform для нас. Это достигается бегом:

Terraform Init.

Через несколько секунд вы должны увидеть подобное сообщение следующим:

ragog@macpro learn-terraform % terraform init

Initializing the backend...

Initializing provider plugins...
- Finding checkly/checkly versions matching "0.8.1"...
- Installing checkly/checkly v0.8.1...
- Installed checkly/checkly v0.8.1 (signed by a HashiCorp partner, key ID 4E5AC4D95E185A57)

...

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

...

Создание наших первых проверок браузера

В том же файле, прямо под нашими начальными инструкциями, теперь мы можем добавить ресурсы один за другим. Они будут проверки браузера на основе сценариев драматурга, которые мы ранее сохранены в Скрипты каталог. Вот что может выглядеть каждый ресурс:

Ресурс входа:

resource "checkly_check" "login" {

  name                      = "Login E2E"
  type                      = "BROWSER"
  activated                 = true
  should_fail               = false
  frequency                 = 10
  double_check              = true
  ssl_check                 = false
  use_global_alert_settings = true
  locations = [
    "us-west-1",
    "eu-central-1"
  ]

    script = file("${path.module}/scripts/login.js")

}

Поиск ресурса:

resource "checkly_check" "search" {

  name                      = "Search E2E"
  type                      = "BROWSER"
  activated                 = true
  should_fail               = false
  frequency                 = 15
  double_check              = true
  ssl_check                 = false
  use_global_alert_settings = true
  locations = [
    "us-west-1",
    "eu-central-1"
  ]

    script = file("${path.module}/scripts/search.js")

}

Ресурс проверки:

resource "checkly_check" "checkout" {

  name                      = "Checkout E2E"
  type                      = "BROWSER"
  activated                 = true
  should_fail               = false
  frequency                 = 60
  double_check              = true
  ssl_check                 = false
  use_global_alert_settings = true
  locations = [
    "us-west-1",
    "eu-central-1"
  ]

    script = file("${path.module}/scripts/checkout.js")

}

Теперь, когда наш проект Terraform был инициализирован, и мы добавили некоторые ресурсы, мы можем создать план террафора, запустив План террафора Отказ

Terraform определит все необходимые изменения, которые необходимо выполнить для проверки нашей конфигурации мониторинга. При этом нас попросят наш контрольный ключ API, который мы можем найти под нашими настройками нашей учетной записи, как показано ниже. Еще не на проверке? Зарегистрируйте бесплатную учетную запись И наслаждайтесь бесплатными ежемесячными чеками!

Мы можем разоблачить это как переменную среды, чтобы избежать необходимости скопировать ее все время: Экспорт tf_var_checkly_api_key = Отказ

ragog@macpro learn-terraform % terraform plan

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # checkly_check.checkout will be created
  + resource "checkly_check" "checkout" {
      + activated                 = true
      + degraded_response_time    = 15000
      + double_check              = true
      + frequency                 = 60
      + id                        = (known after apply)
      + locations                 = [
          + "eu-central-1",
          + "us-west-1",
        ]
      + max_response_time         = 30000
      + name                      = "Checkout E2E"
      + script                    = <<-EOT
            const { chromium } = require("playwright");

            ...

Plan: 3 to add, 0 to change, 0 to destroy.

Теперь мы можем наконец применить наши изменения с Террафом применяется Отказ Мы можем попросить одно окончательное подтверждение в командной строке, после чего нам приветствуем следующее сообщение подтверждения:

...

checkly_check.checkout: Creating...
checkly_check.login: Creating...
checkly_check.search: Creating...
checkly_check.checkout: Creation complete after 3s [id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]
checkly_check.login: Creation complete after 3s [id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]
checkly_check.search: Creation complete after 4s [id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

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

Мониторинг правильности и производительности API

Проверки браузера теперь должны держать нас в курсе о состоянии наших ключевых потоков веб-сайта. А как насчет наших API? Составляют ли они составляют основу нашего сервиса или их потребляются непосредственно клиентом, нам нужно обеспечить работу наших конечных точек, как и ожидалось. Это легко достигается путем настройки API Проверить ресурсы:

resource "checkly_check" "webstore-list-books" {
  name                      = "list-books"
  type                      = "API"
  activated                 = true
  should_fail               = false
  frequency                 = 1
  double_check              = true
  ssl_check                 = true
  use_global_alert_settings = true
  degraded_response_time    = 5000
  max_response_time         = 10000

  locations = [
    "eu-central-1",
    "us-west-1"
  ]

  request {
    url              = "https://danube-webshop.herokuapp.com/api/books"
    follow_redirects = true
    assertion {
      source     = "STATUS_CODE"
      comparison = "EQUALS"
      target     = "200"
    }
    assertion {
      source     = "JSON_BODY"
      property   = "$.length"
      comparison = "EQUALS"
      target     = "30"
    }
  }
}

Теперь мы можем еще раз запустить План террафора следуют Террафом применяется Для проверки нового проверки проверки:

Оповещение

Теперь, когда у нас находятся наши проверки, мы хотим настроить оповещение, чтобы гарантировать, что мы проинформируем, как только пройдет неудача. Оповещенные каналы могут быть объявлены как ресурсы, такие как проверки. Давайте добавим следующее на наш main.tf файл:

resource "checkly_alert_channel" "alert-email" {
  email {
    address = ""
  }
  send_recovery = true 
  send_failure = true
  send_degraded = false
}

Мы устанавливаем вещи, чтобы мы предупредили, когда наш чек начинает не удавать, а также когда он восстанавливает. Но нам все еще нужно решить, какие проверки подпишутся на этот канал, и поэтому сможет вызвать оповещения. Это делается путем добавления следующего внутреннего декларации ресурсов каждой проверки, например.:

resource "checkly_check" "login" {

  name                      = "Login E2E"
  type                      = "BROWSER"
  activated                 = true
  should_fail               = false
  frequency                 = 10
  double_check              = true
  ssl_check                 = false
  use_global_alert_settings = true
  locations = [
    "us-west-1",
    "eu-central-1"
  ]

    script = file("${path.module}/scripts/login.js")

  alert_channel_subscription {
    channel_id = checkly_alert_channel.alert-email.id
    activated  = true
  }

}

Проходить через обычный План террафора и Террафом применяется Последовательность будет применять изменения на нашем контрольном счете:

Теперь мы полностью работаем и работаем с нашим мониторингом. Наши чеки будут работать по расписанию, информируя нас быстро, если что бы пойти не так. Быстро узнать о неудачах на нашем API и ключевых потоках веб-сайта позволят нам быстро реагировать и смягчить влияние на наших пользователей, обеспечивая лучший опыт работы с нашим продуктом.

Вы можете найти полную настройку, описанную в этом руководстве по нашему Выделенный репозиторий Отказ

Расширение нашей настройки

По мере расширения нашей настройки мы можем захотеть развернуть дополнительные инструменты для проще нашей жизни. Мы могли бы:

  1. Итайте для существующих сценариев драматурга и Создайте несколько проверок при объявлении только одного ресурса Отказ
  2. Группа проверяет вместе Чтобы лучше справиться с ними в больших количествах.
  3. Использовать фрагменты кода Чтобы избежать дублирования кода и уменьшить обслуживание.
  4. Переместите свой рабочий процесс в Террафору облако Чтобы легко сотрудничать с вашей командой при управлении конфигурацией вашего мониторинга.

Изображение баннера: «Электрическая сетка» Duncan Rawlinson — Duncan.co лицензируется под CC By-NC 2.0

Оригинал: «https://dev.to/checkly/monitoring-as-code-47bc»