Terraform으로 임계값(thresholds) 구성

Terraform으로 임계값(thresholds) 구성

Knowledge Graph의 임계값 구성(threshold configurations)을 사용하면 요청(request), 리소스(resource), 상태(health) 단언(assertion)에 대한 사용자 지정 임계값을 정의할 수 있어요. 이러한 구성은 서비스와 인프라 모니터링을 위한 특정 한계와 조건을 설정하는 데 도움이 돼요.

Knowledge Graph UI에서 임계값을 관리하는 방법에 대한 자세한 내용은 임계값 관리 문서를 참고하세요.

출처: 문서

본문

기본 임계값 구성

thresholds.tf라는 파일을 만들고 다음 내용을 추가하세요:

# Basic threshold configuration with all three types
resource "grafana_asserts_thresholds" "basic" {
  provider = grafana.asserts

  request_thresholds = [{
    entity_name     = "payment-service"
    assertion_name  = "ErrorRatioBreach"
    request_type    = "inbound"
    request_context = "/charge"
    value           = 0.01
  }]

  resource_thresholds = [{
    assertion_name = "Saturation"
    resource_type  = "container"
    container_name = "worker"
    source         = "metrics"
    severity       = "warning"
    value          = 75
  }]

  health_thresholds = [{
    assertion_name = "ServiceDown"
    expression     = "up{job=\"payment-service\"} == 0"
    entity_type    = "Service"
  }]
}

요청 임계값 구성

서로 다른 서비스 요청 유형과 컨텍스트에 대한 임계값을 구성하세요:

# Multiple request thresholds for different services
resource "grafana_asserts_thresholds" "request_thresholds" {
  provider = grafana.asserts

  request_thresholds = [
    {
      entity_name     = "api-service"
      assertion_name  = "ErrorRatioBreach"
      request_type    = "inbound"
      request_context = "/api/v1/users"
      value           = 0.02
    },
    {
      entity_name     = "api-service"
      assertion_name  = "LatencyP99ErrorBuildup"
      request_type    = "inbound"
      request_context = "/api/v1/orders"
      value           = 500
    },
    {
      entity_name     = "payment-gateway"
      assertion_name  = "RequestRateAnomaly"
      request_type    = "outbound"
      request_context = "/payment/process"
      value           = 1000
    }
  ]
}

리소스 임계값 구성

다양한 심각도 수준에 대한 리소스 임계값을 정의하세요:

# Resource thresholds for different severity levels
resource "grafana_asserts_thresholds" "resource_thresholds" {
  provider = grafana.asserts

  resource_thresholds = [
    {
      assertion_name = "Saturation"
      resource_type  = "container"
      container_name = "web-server"
      source         = "metrics"
      severity       = "warning"
      value          = 75
    },
    {
      assertion_name = "Saturation"
      resource_type  = "container"
      container_name = "web-server"
      source         = "metrics"
      severity       = "critical"
      value          = 90
    },
    {
      assertion_name = "ResourceRateBreach"
      resource_type  = "Pod"
      container_name = "database"
      source         = "logs"
      severity       = "warning"
      value          = 80
    }
  ]
}

상태 임계값 구성

Prometheus 표현식으로 상태 검사를 구성하세요:

# Health thresholds with Prometheus expressions
resource "grafana_asserts_thresholds" "health_thresholds" {
  provider = grafana.asserts

  health_thresholds = [
    {
      assertion_name = "ServiceDown"
      expression     = "up{job=\"api-service\"} == 0"
      entity_type    = "Service"
    },
    {
      assertion_name = "DatabaseConnectivity"
      expression     = "db_connection_pool_active / db_connection_pool_max > 0.9"
      entity_type    = "Service"
    }
  ]
}

포괄적인 임계값 구성

프로덕션 환경에 대한 포괄적인 임계값을 정의하세요:

# Production environment with comprehensive thresholds
resource "grafana_asserts_thresholds" "production" {
  provider = grafana.asserts

  request_thresholds = [
    {
      entity_name     = "frontend"
      assertion_name  = "ErrorRatioBreach"
      request_type    = "inbound"
      request_context = "/"
      value           = 0.005
    },
    {
      entity_name     = "backend-api"
      assertion_name  = "LatencyP99ErrorBuildup"
      request_type    = "inbound"
      request_context = "/api"
      value           = 200
    }
  ]

  resource_thresholds = [
    {
      assertion_name = "Saturation"
      resource_type  = "container"
      container_name = "frontend"
      source         = "metrics"
      severity       = "warning"
      value          = 70
    },
    {
      assertion_name = "Saturation"
      resource_type  = "container"
      container_name = "backend-api"
      source         = "metrics"
      severity       = "critical"
      value          = 85
    }
  ]

  health_thresholds = [
    {
      assertion_name = "ServiceDown"
      expression     = "up{job=\"frontend\"} == 0"
      entity_type    = "Service"
    },
    {
      assertion_name = "BackendServiceDown"
      expression     = "up{job=\"backend-api\"} == 0"
      entity_type    = "Service"
    }
  ]
}

리소스 참조

grafana_asserts_thresholds

Grafana API를 통해 Knowledge Graph 임계값 구성을 관리해요. 이 리소스를 사용하면 요청, 리소스, 상태 단언에 대한 사용자 지정 임계값을 정의할 수 있어요.

인자(Arguments)

이름 유형 필수 설명
request_thresholds list(object) No 요청 임계값 구성 목록. 자세한 내용은 request thresholds 블록을 참고하세요.
resource_thresholds list(object) No 리소스 임계값 구성 목록. 자세한 내용은 resource thresholds 블록을 참고하세요.
health_thresholds list(object) No 상태 임계값 구성 목록. 자세한 내용은 health thresholds 블록을 참고하세요.

Request thresholds 블록

각 request_thresholds 블록은 다음을 지원해요:

이름 유형 필수 설명
entity_name string Yes 임계값을 적용할 엔티티의 이름.
assertion_name string Yes 구성할 단언의 이름.
request_type string Yes 요청의 유형(inbound, outbound).
request_context string Yes 임계값을 적용할 요청 컨텍스트 또는 경로.
value number Yes 임계값.

Resource thresholds 블록

각 resource_thresholds 블록은 다음을 지원해요:

이름 유형 필수 설명
assertion_name string Yes 구성할 단언의 이름.
resource_type string Yes 리소스의 유형(container, Pod, node).
container_name string Yes 임계값을 적용할 컨테이너의 이름.
source string Yes 메트릭의 소스(metrics, logs).
severity string Yes 심각도 수준(warning, critical).
value number Yes 임계값.

Health thresholds 블록

각 health_thresholds 블록은 다음을 지원해요:

이름 유형 필수 설명
assertion_name string Yes 구성할 단언의 이름.
expression string Yes 상태 검사를 위한 Prometheus 표현식.
entity_type string Yes 상태 임계값의 엔티티 유형(예: Service, Pod, Namespace, Volume).
alert_category string No 상태 임계값에 대한 선택적 알림 범주 라벨.

예시

resource "grafana_asserts_thresholds" "example" {
  provider = grafana.asserts

  request_thresholds = [{
    entity_name     = "api-service"
    assertion_name  = "ErrorRatioBreach"
    request_type    = "inbound"
    request_context = "/api/v1/users"
    value           = 0.02
  }]

  resource_thresholds = [{
    assertion_name = "Saturation"
    resource_type  = "container"
    container_name = "web-server"
    source         = "metrics"
    severity       = "warning"
    value          = 75
  }]

  health_thresholds = [{
    assertion_name = "ServiceDown"
    expression     = "up{job=\"api-service\"} == 0"
    entity_type    = "Service"
  }]
}

모범 사례

Terraform으로 임계값을 구성할 때 다음 모범 사례를 고려하세요.

임계값 구성 관리

  • 서비스 수준 목표(SLO)에 따라 적절한 임계값을 설정하세요.
  • 서로 다른 심각도 수준(warning, critical)을 사용해 에스컬레이션 경로를 만드세요.
  • 프로덕션 외 환경에서 먼저 임계값 구성을 테스트하세요.
  • 임계값 효과를 모니터링하고 실제 성능 데이터에 따라 값을 조정하세요.

요청 임계값 모범 사례

  • 사용자 대면 중요 엔드포인트에 대한 요청 임계값을 구성하세요.
  • 서로 다른 요청 유형(inbound 대 outbound)에 대해 서로 다른 임계값을 설정하세요.
  • 특정 API 경로에 대한 임계값을 설정할 때 요청 컨텍스트를 고려하세요.
  • 서비스 저하를 조기에 감지하려면 오류 비율 임계값을 사용하세요.
  • 현실적인 임계값을 설정하려면 과거 성능 데이터를 검토하세요.

리소스 임계값 모범 사례

  • 인프라 용량에 따라 리소스 임계값을 설정하세요.
  • 마이크로서비스 아키텍처에는 컨테이너별 임계값을 사용하세요.
  • 점진적 에스컬레이션을 위해 warning과 critical 임계값을 모두 구성하세요.
  • 현실적인 임계값을 설정하려면 리소스 사용률 패턴을 모니터링하세요.
  • 리소스 사용량의 계절적 또는 주기적 패턴을 고려하세요.

상태 임계값 모범 사례

  • 서비스 상태를 정확히 반영하는 Prometheus 표현식을 사용하세요.
  • 적용하기 전에 상태 검사 표현식을 독립적으로 테스트하세요.
  • 중요 종속성과 외부 서비스에 대한 상태 임계값을 설정하세요.
  • 복잡한 상태 검사를 위해 복합 표현식을 사용하세요.
  • 표현식이 과도한 부하 없이 효율적으로 수행되도록 하세요.

값 선택 지침

  • 보수적으로 시작하고 실제 성능에 따라 조정하세요.
  • 비율 기반 메트릭에는 백분율(0-1 범위)을 사용하세요.
  • 지연 시간 임계값에는 밀리초를 사용하세요.
  • 특정 임계값의 근거를 문서화하세요.
  • 시스템 변화에 따라 임계값을 정기적으로 검토하고 업데이트하세요.

검증

Terraform 구성을 적용한 후 다음을 확인하세요:

  • 임계값 구성이 Knowledge Graph 인스턴스에 적용되었는지.
  • 구성이 Knowledge Graph UI의 Observability > Rules > Threshold 아래에 나타나는지.
  • 요청 임계값이 지정된 서비스의 위반을 올바르게 식별하는지.
  • 리소스 임계값이 적절한 심각도 수준에서 트리거되는지.
  • 상태 임계값이 서비스 상태를 정확히 반영하는지.
  • 임계값이 SLO 약정과 일치하는지.

관련 문서

더 알아보기 (Learn more)