코드로 모니터링
37871 단어 monitoringdevopstestingiac
지난 몇 년 동안 인프라를 코드로 성명하는 추세가 점점 유행하면서 DevOps팀에 클라우드 인프라를 투명하게 관리하고 확장하는 방법을 제공했다.왜 우리가 모니터링을 관리하는 방식이 달라야 합니까?본고에서 우리는 이 점을 토론하고 이를 실제적인 예로 설명할 것이다. 즉, Checkly에서 코드로 모니터링을 하는 것이다.
코드로서의 인프라
역사적으로 IT 인프라는 모두 로컬과 클라우드에서 수동으로 배치되었다.분산된 작업 흐름, 투명도 부족, 확장성 문제 등 몇 가지 도전을 가져왔다.이러한 문제에 대응하기 위해 지난 몇 년 동안 인프라 시설인 코드(IaC) 패러다임으로 전환된 패러다임에서 대형 시스템은 프로필에서 코드로 성명되었다.
차세대 도구가 이미 이 용례에 서비스되었는데 그 중에서 가장 유명한 예는 HashiCorp Terraform이다.Terraform은 CLI 워크플로우를 제공하여 사용자가 최종 인프라 설정이 어떤 모양인지 지정하고 이 설정을 실현하는 데 필요한 모든 중간 절차를 책임질 수 있도록 한다.
공급업체의 생태계 때문에Terraform은 다양한 클라우드 공급업체에 인프라 시설을 제공할 수 있다. 각 공급업체는 공급업체의 API에 비추어 HCL라고 불리는 특정한 지역의 언어로 서로 다른 자원을 공개한다.
IaC 모니터링 방법
모니터링 설정은 프로비저닝 인프라와 동일한 문제를 일으킬 수 있습니다.최초 출시 단계나 개념 검증 단계를 넘어 여러 제품 및/또는 팀에 참여하고 모니터링 설정의 범위가 빠르게 확대되는 것을 보았을 때 이 점은 명백해졌다. 즉, 유지 보수 수요도 증가하고 있다는 것이다.
감시 코드는 IaC에서 학습하고 감시 설정을 응용 프로그램과 개발 작업 흐름에 더욱 가깝게 한다.어떻게 써요?모든 종류의 it 인프라와 같이 코드로 설명합니다.
왜 모니터링을 코드로 해야 합니까
수동 방식에서 코드 형식으로 감시할 때 어떤 이익을 얻을 수 있을까?주요 이점은 다음과 같습니다.
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 plan
과 terraform apply
순서에 따라 우리의 수표 계좌에 적용됩니다.우리는 이미 모니터링 코드 설정을 완전히 시작하고 실행했다.우리의 검사는 계획에 따라 진행될 것이며, 만약 어떤 문제가 발생하면 즉시 우리에게 통지할 것이다.API와 주요 웹 사이트 프로세스의 장애를 신속하게 파악하면 사용자에 대한 영향을 줄이고 더 좋은 제품 체험을 확보할 수 있습니다.
이 설명서에 설명된 전체 설정은 Delldedicated repository에서 확인할 수 있습니다.
설정 확장
설정이 확대됨에 따라, 우리는 우리의 생활을 더욱 가볍게 하기 위해 다른 도구를 배치하기를 희망할 수도 있다.다음을 수행할 수 있습니다.
Group checks together 많은 문제를 더 잘 처리할 수 있습니다.
Use code snippets 코드의 중복을 피하고 유지보수를 줄인다.
Reference
이 문제에 관하여(코드로 모니터링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/checkly/monitoring-as-code-47bc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)