코드로 모니터링

본문은 최초로 발표되었다Checkly's Guides.
지난 몇 년 동안 인프라를 코드로 성명하는 추세가 점점 유행하면서 DevOps팀에 클라우드 인프라를 투명하게 관리하고 확장하는 방법을 제공했다.왜 우리가 모니터링을 관리하는 방식이 달라야 합니까?본고에서 우리는 이 점을 토론하고 이를 실제적인 예로 설명할 것이다. 즉, Checkly에서 코드로 모니터링을 하는 것이다.

코드로서의 인프라


역사적으로 IT 인프라는 모두 로컬과 클라우드에서 수동으로 배치되었다.분산된 작업 흐름, 투명도 부족, 확장성 문제 등 몇 가지 도전을 가져왔다.이러한 문제에 대응하기 위해 지난 몇 년 동안 인프라 시설인 코드(IaC) 패러다임으로 전환된 패러다임에서 대형 시스템은 프로필에서 코드로 성명되었다.
차세대 도구가 이미 이 용례에 서비스되었는데 그 중에서 가장 유명한 예는 HashiCorp Terraform이다.Terraform은 CLI 워크플로우를 제공하여 사용자가 최종 인프라 설정이 어떤 모양인지 지정하고 이 설정을 실현하는 데 필요한 모든 중간 절차를 책임질 수 있도록 한다.

공급업체의 생태계 때문에Terraform은 다양한 클라우드 공급업체에 인프라 시설을 제공할 수 있다. 각 공급업체는 공급업체의 API에 비추어 HCL라고 불리는 특정한 지역의 언어로 서로 다른 자원을 공개한다.

IaC 모니터링 방법


모니터링 설정은 프로비저닝 인프라와 동일한 문제를 일으킬 수 있습니다.최초 출시 단계나 개념 검증 단계를 넘어 여러 제품 및/또는 팀에 참여하고 모니터링 설정의 범위가 빠르게 확대되는 것을 보았을 때 이 점은 명백해졌다. 즉, 유지 보수 수요도 증가하고 있다는 것이다.
감시 코드는 IaC에서 학습하고 감시 설정을 응용 프로그램과 개발 작업 흐름에 더욱 가깝게 한다.어떻게 써요?모든 종류의 it 인프라와 같이 코드로 설명합니다.

왜 모니터링을 코드로 해야 합니까


수동 방식에서 코드 형식으로 감시할 때 어떤 이익을 얻을 수 있을까?주요 이점은 다음과 같습니다.
  • 용량 할당 시간이 단축되고 유지 보수가 간편해지므로 확장성이 향상됩니다.
  • 더 좋은 역사 기록과 문서: 프로필을 원본 코드 관리에 서명할 수 있습니다.
  • DevOps 팀에서 모니터링 설정의 가시성을 공유합니다(소유권 공유가 쉽습니다).
  • Checkly를 코드로 모니터링


    초기 사용자는 체크리 UI를 통해 체크, 그룹, 경고 채널 및 기타 리소스를 만드는 데 익숙해집니다.공식 Terraform provider는 수십 개, 수백 개, 수천 개의 자원을 만드는 것을 의미하든지 간에 자신의 활동 감시 설정이 어떤 모양인지 정확하게 설명하고 몇 초 안에 Terraform에서 설정할 수 있도록 한다.
    당신은 find the Checkly Terraform provider 공식 지형등록처에 등록할 수 있습니다.

    전자상거래 사이트 모니터링 - 코드로


    이 모든 것은 실천 중에 어떤 모양입니까?Delldemo e-commerce website을 위한 소형 모니터링 설정을 만들어 보겠습니다.

    Terraform 프로젝트 작성


    우리의 예시에서, 우리는 Playwright 스크립트를 사용하여 브라우저 검사를 만들 것이다. 이 스크립트들은 우리가 이전에 극작가 안내서의 일부분으로 작성한 것이다.
    우선 우리의 로그인 장면:
    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", "[email protected]");
      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-example && 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 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.
    
    ...
    

    첫 번째 브라우저 검사 만들기


    같은 파일에서, 처음 설명한 바로 아래에, 우리는 지금 하나하나 자원을 추가할 수 있다.그것들은 우리가 이전에 scripts 디렉터리에 저장한 극작가 스크립트를 바탕으로 브라우저 검사를 할 것이다.각 리소스의 모양은 다음과 같습니다.
    로그인 자원:
    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 plan을 통해 지형 계획을 생성할 수 있다.
    Terraform은 Checkly에서 모니터링 구성을 복제하는 데 필요한 모든 변경 사항을 결정합니다.이 과정에서 Checkly API 키를 요청받을 것입니다. 아래 계정 설정에서 찾을 수 있습니다.수표 아직 안 냈어요?Register a free account 매달 무료 수표를 받으세요!

    우리는 그것을 환경 변수로 공개하여 계속 복사해서 붙이는 것을 피할 수 있다. export TF_VAR_checkly_api_key=<YOUR_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.
    
    이제 우리는 마침내 terraform apply를 사용하여 우리의 변경 사항을 적용할 수 있게 되었다.명령 프롬프트에서 최종 확인을 요청받은 후 다음 확인 메시지를 받을 수 있습니다.
    ...
    
    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.
    
    Checkly 계정에 로그인하면 대시보드에 세 개의 검사가 채워져 있는 것을 볼 수 있습니다. 이 검사들은 곧 설정된 시간표에 따라 실행될 것입니다.

    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"
        }
      }
    }
    
    이제 우리는 다시 terraform plan를 실행하고 terraform apply를 실행하여 Checkly의 새로운 검사를 볼 수 있습니다.

    경계의


    현재 우리는 이미 검사를 마쳤기 때문에, 우리는 고장이 발생한 후 즉시 우리에게 통지할 수 있도록 경보를 설정하기를 희망한다.경보 채널은 검사처럼 자원으로 성명할 수 있다.다음을 main.tf 파일에 추가합니다.
    resource "checkly_alert_channel" "alert-email" {
      email {
        address = "<YOUR_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
      }
    
    }
    
    일반 terraform planterraform apply 순서에 따라 우리의 수표 계좌에 적용됩니다.

    우리는 이미 모니터링 코드 설정을 완전히 시작하고 실행했다.우리의 검사는 계획에 따라 진행될 것이며, 만약 어떤 문제가 발생하면 즉시 우리에게 통지할 것이다.API와 주요 웹 사이트 프로세스의 장애를 신속하게 파악하면 사용자에 대한 영향을 줄이고 더 좋은 제품 체험을 확보할 수 있습니다.
    이 설명서에 설명된 전체 설정은 Delldedicated repository에서 확인할 수 있습니다.

    설정 확장


    설정이 확대됨에 따라, 우리는 우리의 생활을 더욱 가볍게 하기 위해 다른 도구를 배치하기를 희망할 수도 있다.다음을 수행할 수 있습니다.
  • 기존 극작가의 극본과create multiple checks while declaring only one resource를 교체한다.

  • Group checks together 많은 문제를 더 잘 처리할 수 있습니다.

  • Use code snippets 코드의 중복을 피하고 유지보수를 줄인다.
  • 모니터링을 코드 구성으로 관리할 때 팀과 쉽게 협업할 수 있도록 업무 프로세스를 Terraform Cloud로 이동합니다.
  • 현수막 사진: "전망"은 던컨 로린슨-던컨이 창작했다.CC BY-NC 2.0에 따른 co 라이센스

    좋은 웹페이지 즐겨찾기