Terraform으로 로그 상관관계(log correlation) 구성
Terraform으로 로그 상관관계(log correlation) 구성
Knowledge Graph의 로그 구성(log configurations)을 사용하면 로그 데이터를 어떻게 쿼리하고 엔티티와 상관시키는지 정의할 수 있어요. span과 trace에 대한 데이터 소스, 엔티티 매칭 규칙, 라벨 매핑, 필터링 옵션을 지정할 수 있어요.
Knowledge Graph UI에서 로그 상관관계를 구성하는 방법에 대한 자세한 내용은 로그 상관관계 구성 문서를 참고하세요.
출처: 문서
본문
기본 로그 구성
log-configs.tf라는 파일을 만들고 다음 내용을 추가하세요:
# Basic log configuration for services
resource "grafana_asserts_log_config" "production" {
provider = grafana.asserts
name = "production"
priority = 1000
default_config = false
data_source_uid = "grafanacloud-logs"
error_label = "error"
match {
property = "asserts_entity_type"
op = "EQUALS"
values = ["Service"]
}
match {
property = "environment"
op = "EQUALS"
values = ["production", "staging"]
}
entity_property_to_log_label_mapping = {
"otel_namespace" = "service_namespace"
"otel_service" = "service_name"
"environment" = "env"
"site" = "region"
}
filter_by_span_id = true
filter_by_trace_id = true
}
여러 매치 규칙이 있는 로그 구성
여러 엔티티 매칭 기준으로 로그 상관관계를 구성하세요:
# Development environment log configuration
resource "grafana_asserts_log_config" "development" {
provider = grafana.asserts
name = "development"
priority = 2000
default_config = true
data_source_uid = "elasticsearch-dev"
error_label = "error"
match {
property = "asserts_entity_type"
op = "EQUALS"
values = ["Service"]
}
match {
property = "environment"
op = "EQUALS"
values = ["development", "testing"]
}
match {
property = "site"
op = "EQUALS"
values = ["us-east-1"]
}
match {
property = "service"
op = "EQUALS"
values = ["api"]
}
entity_property_to_log_label_mapping = {
"otel_namespace" = "service_namespace"
"otel_service" = "service_name"
"environment" = "env"
"site" = "region"
"service" = "app"
}
filter_by_span_id = true
filter_by_trace_id = true
}
최소 로그 구성
모든 엔티티에 대한 최소 구성 만들기:
# Minimal configuration for all entities
resource "grafana_asserts_log_config" "minimal" {
provider = grafana.asserts
name = "minimal"
priority = 3000
default_config = false
data_source_uid = "loki-minimal"
match {
property = "asserts_entity_type"
op = "IS_NOT_NULL"
values = []
}
}
복잡한 매치 규칙이 있는 고급 로그 구성
여러 연산과 고급 매치 규칙으로 로그를 구성하세요:
# Advanced configuration with multiple operations
resource "grafana_asserts_log_config" "advanced" {
provider = grafana.asserts
name = "advanced"
priority = 1500
default_config = false
data_source_uid = "loki-advanced"
error_label = "level"
match {
property = "service_type"
op = "CONTAINS"
values = ["web", "api"]
}
match {
property = "environment"
op = "NOT_EQUALS"
values = ["test"]
}
match {
property = "team"
op = "IS_NOT_NULL"
values = []
}
entity_property_to_log_label_mapping = {
"service_type" = "type"
"team" = "owner"
"environment" = "env"
"version" = "app_version"
}
filter_by_span_id = true
filter_by_trace_id = false
}
리소스 참조
grafana_asserts_log_config
Grafana API를 통해 Knowledge Graph 로그 구성을 관리해요.
인자(Arguments)
| 이름 | 유형 | 필수 | 설명 |
|---|---|---|---|
| name | string | Yes | 로그 구성의 이름. 이 필드는 불변(immutable)이며 변경 시 재생성을 강제해요. |
| priority | number | Yes | 로그 구성의 우선순위. 우선순위가 높은 구성이 먼저 평가돼요. |
| default_config | bool | Yes | 기본 구성인지 여부. 기본 구성은 삭제할 수 없어요. |
| data_source_uid | string | Yes | 쿼리할 DataSource UID(예: Loki 인스턴스). |
| match | list(object) | No | 엔티티 속성에 대한 매치 규칙 목록. 자세한 내용은 match 블록을 참고하세요. |
| error_label | string | No | 오류 로그를 식별하는 데 사용되는 라벨 이름. |
| entity_property_to_log_label_mapping | map(string) | No | 상관관계를 위한 엔티티 속성과 로그 라벨 간 매핑. |
| filter_by_span_id | bool | No | 분산 추적 상관관계를 위해 span ID로 로그를 필터링할지 여부. |
| filter_by_trace_id | bool | No | 분산 추적 상관관계를 위해 trace ID로 로그를 필터링할지 여부. |
Match 블록
각 match 블록은 다음을 지원해요:
| 이름 | 유형 | 필수 | 설명 |
|---|---|---|---|
| property | string | Yes | 매칭할 엔티티 속성. |
| op | string | Yes | 매칭에 사용할 연산. 다음 중 하나: EQUALS, NOT_EQUALS, CONTAINS, DOES_NOT_CONTAIN, IS_NULL, IS_NOT_NULL. |
| values | list(string) | Yes | 매칭할 값. IS_NULL 및 IS_NOT_NULL 연산에서는 비어 있을 수 있어요. |
예시
resource "grafana_asserts_log_config" "example" {
provider = grafana.asserts
name = "example-logs"
priority = 1000
default_config = false
data_source_uid = "loki-prod"
error_label = "level"
match {
property = "asserts_entity_type"
op = "EQUALS"
values = ["Service", "Pod"]
}
entity_property_to_log_label_mapping = {
"service" = "app"
"namespace" = "k8s_namespace"
"environment" = "env"
}
filter_by_span_id = true
filter_by_trace_id = true
}
모범 사례
Terraform으로 로그 상관관계를 구성할 때 다음 모범 사례를 고려하세요.
우선순위 관리
- 더 구체적인 구성에 더 낮은 우선순위 번호를 할당하세요.
- 우선순위가 높은 구성이 먼저 평가돼요.
- 서로 다른 구성 유형에 대해 일관된 우선순위 범위를 사용하세요.
- 우선순위 할당의 근거를 문서화하세요.
데이터 소스 구성
- 데이터 소스 UID가 실제 Loki 또는 로그 집계 시스템과 일치하는지 확인하세요.
- 구성을 적용하기 전에 데이터 소스 연결을 테스트하세요.
- 로그 구성의 목적을 나타내는 설명적인 이름을 사용하세요.
- 환경마다 별도의 데이터 소스를 사용하는 것을 고려하세요.
라벨 매핑 전략
- 모든 로그 구성에서 엔티티 속성을 일관되게 매핑하세요.
- 로깅 표준과 일치하는 의미 있는 로그 라벨 이름을 사용하세요.
- 구성 주석에 매핑 관계를 문서화하세요.
- 매핑된 라벨이 로그 데이터에 존재하는지 확인하세요.
매치 규칙 설계
- 광범위한 매치 규칙으로 시작하고 필요에 따라 다듬으세요.
- 엔티티 모델에 존재하는 구체적인 속성 이름을 사용하세요.
- 배포 전에 샘플 데이터로 매치 규칙을 테스트하세요.
- 정밀한 엔티티 타기팅을 위해 여러 매치 규칙을 결합하세요.
분산 추적 통합
- OpenTelemetry를 사용할 때
filter_by_span_id와filter_by_trace_id를 활성화하세요. - 로그에 적절한 trace 및 span ID 라벨이 포함되어 있는지 확인하세요.
- 로깅 인프라 전반에 걸쳐 trace ID에 일관된 라벨 이름을 사용하세요.
- 예상대로 작동하는지 trace 상관관계를 테스트하세요.
검증
Terraform 구성을 적용한 후 다음을 확인하세요:
- 로그 구성이 Knowledge Graph 인스턴스에 생성되었는지.
- 구성이 Knowledge Graph UI의 Observability > Configuration > Logs 아래에 나타나는지.
- 엔티티에서 드릴다운할 때 로그 상관관계가 작동하는지.
- 라벨 매핑이 엔티티 속성을 로그 라벨로 올바르게 변환하는지.
- 매치 규칙이 엔티티를 올바르게 필터링하는지.
- 분산 추적에 대해 trace 및 span ID 필터링이 작동하는지.