• 로그인지금 시작하기

사용자의 편의를 위해 제공되는 기계 번역입니다.

영문본과 번역본이 일치하지 않는 경우 영문본이 우선합니다. 보다 자세한 내용은 이 페이지를 방문하시기 바랍니다.

문제 신고

종합 모니터링 모범 사례 가이드

종합 모니터링을 사용하면 최종 사용자에게 영향을 미치기 전에 앱을 모니터링 및 테스트하고 문제를 해결할 수 있습니다. 다음은 이 기능을 최대한 활용할 수 있는 5가지 팁입니다.

1. 합성 모니터 선택

합성 모니터는 웹 사이트의 성능을 측정하고 로드 시간, 가동 시간 및 평균 다운로드 크기에 대한 집계 수치를 캡처하는 가상 브라우저입니다. 또한 다운타임 사고 및 각 페이지 리소스에 대한 자세한 통계에 액세스할 수 있습니다.

모니터링하려는 대상과 수행 방법에 따라 선택할 수 있는 7가지 유형의 합성 모니터 가 있습니다. 예를 들어, 단계 모니터 는 코드를 작성하지 않고 기본적으로 스크립트 브라우저로 작동하는 것을 생성하는 좋은 방법입니다. 합성 모니터의 자동화된 관리를 찾고 있다면 NerdGraph API 를 사용하여 API 호출을 통해 합성 모니터를 생성, 업데이트 및 삭제할 수 있습니다.

합성 모니터 추가

  1. 모니터를 추가하려면 one.newrelic.com > Synthetics 로 이동하십시오. ( EU 기반 계정 이 있는 경우 one.eu.newrelic.com 으로 이동합니다.) 모니터 만들기 를 클릭합니다.
  1. 모니터 유형을 선택한 다음 모든 필수 필드를 채우십시오.

  2. 태그를 추가하거나 기간을 변경하거나 다른 런타임 버전 을 선택할 수 있습니다. ping 및 단순 브라우저 모니터의 경우 유효성 검사 문자열을 추가할 수 있습니다. 고급 옵션을 사용하여 다음 유형의 응답 유효성 검사에 대한 하위 문자열 모니터링을 활성화할 수 있습니다.

    • SSL을 확인하십시오(ping 및 단순 브라우저용). 이 옵션은 SSL 인증서 체인의 유효성을 확인합니다. 다음 구문을 실행하여 복제할 수 있습니다.

      bash
      $
      openssl s_client -servername <var>{YOUR_HOSTNAME}</var> -connect <var>{YOUR_HOSTNAME</var>}:443 -CApath /etc/ssl/certs > /dev/null
    • HEAD 요청을 우회합니다(핑 모니터용). 이 옵션은 기본 HEAD 요청을 건너뛰고 대신 ping 검사와 함께 GET 동사를 사용합니다. HEAD 요청이 실패하면 GET 요청이 항상 발생합니다.

    • 리디렉션은 실패입니다(ping의 경우). Redirect is Failure 이(가) 활성화되었을 때 리디렉션 결과가 발생하면 합성 모니터는 리디렉션을 따르고 결과 URL을 확인하는 대신 이를 실패로 분류합니다.

  3. 모니터를 실행할 위치를 선택하십시오. 가양성을 피하기 위해 최소 3개의 위치를 선택하는 것이 좋습니다. 다시 말해, 적어도 하나의 위치가 성공적인 결과를 반환하면 끝점이 작동 중이어야 하고 경고 트리거를 피할 수 있습니다.

  4. 모니터 유형에 따라 모니터 저장 , 유효성 검사 또는 스크립트 쓰기 중 하나를 선택하라는 메시지가 표시됩니다.

  5. 요약 페이지 에서 받은 결과를 확인하세요.

2. 합성 모니터에 대한 요약 페이지 보기

요약 페이지에서 합성 모니터의 상태에 대한 정보를 볼 수 있습니다. 경고를 트리거한 활성 인시던트를 생성한 경우 이 모니터에 대한 위험 경고를 클릭하여 새 탭에서 엽니다. 페이지 상단에서 모든 모니터에 대한 경고 정책 관리를 클릭하면 모니터에 대한 모든 경고 정책에 액세스할 수도 있습니다.

3. 애플리케이션 성능에 대한 개요 보기

웹 서비스가 제자리에 있고 예상대로 작동하며 오류가 없는지 확인하려면 애플리케이션 성능 결과에 지속적으로 액세스해야 합니다. 종합 모니터링은 선택한 각 위치에 대해 웹 애플리케이션에서 자동화된 테스트를 수행하여 이러한 유형의 보증을 제공합니다. 합성 모니터는 다운타임 인스턴스("위반"이라고 함)를 기록하고 각 페이지 리소스에 대한 집계된 숫자, 결과 및 자세한 통계를 수집합니다.

실패한 모니터를 빠르게 검색하기 위해 합성 모니터 페이지의 색인을 사용하여 열린 위반이 있는 모니터, 24시간 동안의 성공률, 실패한 위치 수, 모니터 기간 및 모니터 유형을 확인할 수 있습니다.모니터를 클릭하면 특정 모니터가 실패한 위치, 실패한 이유(마지막 오류 메시지, 오류 응답 코드, 도메인별 기간)를 평가하기 위한 정보가 제공되는 요약 페이지 로 이동합니다. 더 나아가 시간 경과에 따른 애플리케이션 성능에 대한 더 깊은 통찰력을 제공합니다.

탐색기에서 모니터 보기

4. 개별 모니터 결과 보기

전 세계 여러 곳에서 액세스하는 웹 앱의 성능을 확인해야 합니다. 결과 페이지는 개발에서 프로덕션에 이르기까지 모든 것이 사용자 경험에 어떻게 영향을 미치는지 보여줍니다. 나열된 항목을 정렬하여 문제 영역이나 비정상적인 결과를 더 잘 식별할 수 있습니다. 위치별로 필터링하여 다른 위치의 모니터 성능을 비교하십시오. (아래의 '네트워크 타이밍' 그래프는 특정 기간 동안의 웹페이지 성능에 대한 스냅샷을 제공합니다.) 이렇게 하려면 다음을 수행합니다.

  1. one.newrelic.com > Synthetics 으로 이동합니다.
  2. 모니터 탭에서 모니터를 선택합니다.
  3. 모니터 를 클릭한 다음 결과 를 클릭합니다.

결과는 모니터링되는 모든 위치에 대해 가장 느린 페이지 로드에 대한 최신 보기를 제공합니다.

5. 각 리소스의 로드 시간 영향 이해

합성 리소스 페이지는 웹사이트의 다양한 구성요소(예: CSS, JavaScript, 이미지, HTML 등)가 전체 로드에 어떤 영향을 미치는지 보여줍니다. 런타임에 수집된 세부 메트릭을 드릴하고, 타사 리소스가 소비한 시간에 대한 성능 정보를 찾고, 각 리소스에 대한 HTTP 응답 코드를 식별할 수 있습니다. 이렇게 하려면 다음을 수행합니다.

  1. one.newrelic.com 으로 이동, 그런 다음 합성 을 클릭합니다.
  2. 모니터 드롭다운 메뉴에서 모니터를 선택합니다.
  3. 모니터 를 클릭한 다음 리소스 를 클릭합니다.

6. 스크립팅된 브라우저 테스트 구성 및 개발

스크립팅된 브라우저를 사용하여 Selenium JavaScript Webdriver 바인딩으로 복잡한 모니터링 워크플로를 구축할 수 있습니다. 예를 들어, 애플리케이션에 로그인하고 특정 링크로 이동한 다음 페이지 요소가 로드되고 주장을 추가할 때까지 기다릴 수 있습니다. 이렇게 하려면 다음을 수행합니다.

  1. one.newrelic.com > Synthetics 으로 이동합니다.
  2. 모니터 유형(예: 스크립트 브라우저)을 선택하십시오.
  3. 모니터의 이름과 세부정보를 입력합니다(예: sitename.com 스크립트 브라우저).
  4. 모니터를 실행할 위치를 선택하십시오(예: 뭄바이, 서울, 콜럼버스 및 몬트리올).
  5. 모니터가 실행되는 빈도에 대한 빈도를 선택하십시오(예: 5분).
  6. 성과 위반이 발생할 때 팀에 알리도록 알림 방법을 설정합니다.
  7. 이제 스크립트를 작성할 준비가 되었습니다. (아래는 newrelic.com의 성능을 테스트하고 특정 요소가 로드되었는지 확인하는 예제 스크립트입니다.)
/**
* Script Name: scripted browser - next gen runtime
* Author: New Relic
* Version: 1.1
* Purpose: best practices example
* Reference: https://docs.newrelic.com/docs/synthetics/synthetic-monitoring/scripting-monitors/synthetic-scripted-browser-reference-monitor-versions-chrome-100/
*/
// -------------------- CONSTANTS
const SCRIPT_NAME = "scripted browser - next gen runtime" // name to record in script log
const DEFAULT_TIMEOUT = 10000 // default is 10 seconds to locate page
const PAGE_LOAD_TIMEOUT = 60000 // fail early to prevent long duration timeouts
const USER_AGENT = "default" // set the user agent for Chrome
const PROTOCOL = "https://" // set the protocol
const USERNAME = "" // username:
const PASSWORD = "" // password@
const DOMAIN = "newrelic.com" // your domain
const PATH = "" // /path/to/page
const CHECK = "All your telemetry in one secure cloud." // text to match on page
const AUTH = USERNAME + PASSWORD
const FULL_URL = PROTOCOL + AUTH + DOMAIN + PATH
// -------------------- CONFIGURATION
var assert = require("assert")
// script-wide timeout (ms) for functions: waitForAndFindElement and waitForPendingRequests
// better to fail early if it is expected to take less time than the DEFAULT_TIMEOUT
// in order to release the heavy worker thread on the minion for the next job
$webDriver.manage().setTimeouts({pageLoad: DEFAULT_TIMEOUT}) // sets element load timeout
$webDriver.manage().setTimeouts({pageLoad: PAGE_LOAD_TIMEOUT}) // sets page load timeout
// -------------------- VARIABLES
var By = $selenium.By
var loc = {
main: By.id("main-content"),
nav: By.className("js-header-site-nav"),
telemetry: By.xpath("//*[@id='main-content']/article/div[5]/div[2]/div/div[1]/a/div/div/div[2]"),
tools: [
{ service: 'apm', selector: By.xpath("//*[@id='tab-21882']/div/span[2]") },
{ service: 'infra', selector: By.xpath("//*[@id='tab-22578']/div/span[2]") },
{ service: 'k8s', selector: By.xpath("//*[@id='tab-22579']/div/span[2]") },
{ service: 'logs', selector: By.xpath("//*[@id='tab-22580']/div/span[2]") },
{ service: 'errors', selector: By.xpath("//*[@id='tab-22581']/div/span[2]") },
{ service: 'browser', selector: By.xpath("//*[@id='tab-22582']/div/span[2]") },
{ service: 'mobile', selector: By.xpath("//*[@id='tab-22583']/div/span[2]") },
{ service: 'synthetics', selector: By.xpath("//*[@id='tab-22584']/div/span[2]") },
{ service: 'npm', selector: By.xpath("//*[@id='tab-22585']/div/span[2]") },
{ service: 'codestream', selector: By.xpath("//*[@id='tab-22586']/div/span[2]") }
]
}
// -------------------- FUNCTIONS
// for backwards compatibility with legacy runtimes
async function waitForAndFindElement(locator, timeout) {
const webElement = await $webDriver.wait(
$selenium.until.elementLocated(locator),
timeout,
"Timed-out waiting for element to be located using: " + locator
)
await $webDriver.wait(
$selenium.until.elementIsVisible(webElement),
timeout,
"Timed-out waiting for element to be visible using ${element}"
)
return await $webDriver.findElement(locator)
}
// -------------------- START OF SCRIPT
console.log("Starting synthetics script: " + SCRIPT_NAME)
console.log("Default timeout is set to " + DEFAULT_TIMEOUT / 1000 + " seconds")
console.log("URI: " + FULL_URL)
// Setting user agent is not then-able, so we do this first (if defined and not default)
if (USER_AGENT && 0 !== USER_AGENT.trim().length && USER_AGENT != "default") {
$headers.add("User-Agent", USER_AGENT)
console.log("Setting User-Agent to " + USER_AGENT)
}
// Step 1
// if an error happens at any step, script execution is halted and a failed result is returned
console.log("1. first step")
await $webDriver.get(FULL_URL)
// Step 2
// verify id for main has loaded
console.log("2. waitForAndFindElement: ", loc.main.value)
await waitForAndFindElement(loc.main, DEFAULT_TIMEOUT)
// Step 3
// verify site nav has loaded
console.log("3. waitForAndFindElement: ", loc.nav.value)
await waitForAndFindElement(loc.nav, DEFAULT_TIMEOUT)
// Step 4
console.log("4. findElement: ", loc.telemetry.value)
const element = await $webDriver.findElement(loc.telemetry, DEFAULT_TIMEOUT)
// Step 5
console.log("5. getText")
const text = await element.getText()
// Step 6
console.log("6. assert.equal: " + text + " == " + CHECK)
assert.equal(text, CHECK, "validation text not found")
// Step 7 (if assert is equal)
console.log("7. verify tools:")
loc.tools.forEach(async function (nr, i, arr) {
let n = i+1
try{
// verify each asset has loaded
console.log(" " + n + ". " + nr.service)
await $webDriver.findElement(nr.selector, DEFAULT_TIMEOUT)
}catch(exception){
console.error("Failure in Step 7." + n)
throw err
}
})
Copyright © 2022 New Relic Inc.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.