Openflow 모니터링하기¶
이 항목에서는 Openflow의 상태를 모니터링하고 문제를 해결하는 방법에 대해 설명합니다.
Openflow 로그에 액세스하기¶
Snowflake sends Openflow logs to the event table you configured when you set up Openflow (BYOC | Snowflake deployment).
Snowflake에서는 이벤트 테이블 쿼리의 WHERE 절에 타임스탬프를 포함하는 것을 권장합니다. 이는 다양한 Snowflake 구성 요소에서 생성되는 잠재적인 데이터 볼륨 때문에 특히 중요합니다. 필터를 적용하면 더 작은 데이터 하위 세트를 검색할 수 있으므로 쿼리 성능이 향상됩니다.
Openflow의 원격 분석을 빠르게 시작하려면 아래의 예제 쿼리 섹션을 참조하세요.
Openflow 원격 분석 스키마¶
이벤트 테이블 열에 대한 정보는 이벤트 테이블 열 섹션을 참조하십시오.
다음 섹션에서는 Openflow가 이벤트 테이블에서 원격 분석을 구조화하는 방법에 대해 설명합니다.
리소스 특성¶
Openflow에서 설정한 이벤트 메타데이터를 설명합니다. 다른 유형의 리소스 속성에 대한 일반적인 정보는 이벤트 테이블 열 설명서의 RESOURCE_ATTRIBUTES 열 섹션을 참조하세요.
이름 |
타입 |
설명 |
|---|---|---|
애플리케이션 |
String |
고정 값 |
cloud.service.provider |
String |
|
container.id |
String |
컨테이너의 고유 식별자 |
container.image.name |
String |
컨테이너 이미지의 정규화된 이름입니다. Openflow Runtime 컨테이너에는 로컬 컨테이너 레지스트리 경로가 포함됩니다. 예: |
container.image.tag |
String |
컨테이너 이미지의 버전 |
k8s.container.name |
String |
K8 컨테이너의 이름입니다. Openflow Runtime 컨테이너는 ‘런타임 키’로 시작하여 예를 들어, 런타임 키가 postgresql-cdc인 ‘PostgreSQL CDC’라는 이름의 Openflow Runtime은 다음과 같은 컨테이너 이름을 갖습니다.
|
k8s.container.restart_count |
숫자 문자열 |
이 컨테이너가 생성된 이후 다시 시작된 횟수입니다. |
k8s.namespace.name |
String |
Openflow 런타임의 경우 |
k8s.node.name |
String |
포드 및 컨테이너를 호스팅하는 EKS 노드의 내부 도메인 이름 또는 EKS 노드 자체입니다. 예: ip-10-12-13-144.us-west-2.compute.internal |
k8s.pod.name |
String |
K8 포드의 이름입니다. Openflow Runtime 포드는 ‘런타임 키’로 시작하여 각 포드 복제본의 숫자 식별자로 끝납니다. 이 수는 0에서 인덱싱된 런타임에 대해 설정된 ‘최대 노드 수’까지 증가할 수 있습니다. 예를 들어, 이름이 ‘PostgreSQL CDC’이고 런타임 키가 postgresql-cdc이며 3개의 노드가 있는 Openflow Runtime의 포드 이름은 다음과 같습니다.
|
k8s.pod.start_time |
ISO 8601 날짜 문자열 |
포드가 시작된 타임스탬프 |
k8s.pod.uid |
UUID 문자열 |
클러스터 내 포드의 고유 식별자 |
openflow.dataplane.id |
UUID 문자열 |
Snowflake Openflow UI에서 배포 > 세부 정보 보기를 통해 표시된 ‘ID’와 일치하는 Openflow 배포의 고유 식별자입니다. |
- 리소스 특성의 예:
범위¶
이름 |
타입 |
설명 |
|---|---|---|
이름 |
String |
메트릭의 공급자입니다. 다음 중 하나:
|
- 범위 예:
기록 유형¶
이 행이 나타내는 Openflow 원격 분석의 유형에 따라 다음 중 하나가 됩니다.
LOG
METRIC
Openflow는 TRACE 레코드를 수집하지 않지만, 이는 Snowflake Event Tables의 이 열에 유효한 유형이기도 합니다.
레코드¶
선택 사항입니다. 이 JSON 오브젝트는 이 행이 나타내는 메트릭 유형을 설명합니다.
이름 |
타입 |
설명 |
|---|---|---|
메트릭 |
오브젝트 |
다음 두 필드를 포함합니다.
이름과 단위 값은 매우 다양합니다. 전체 목록은 아래의 애플리케이션 메트릭 섹션을 참조하세요. |
metric_type |
String |
다음 중 하나:
|
value_type |
String |
이 메트릭에 의해 생성된 값의 기본 유형입니다. 다음 중 하나:
|
aggregation_temporality |
String |
선택 사항입니다. 포드 CPU 시간 및 네트워크 IO와 같이 엄격하게 증가하고 이전 값에 의존하는 메트릭의 경우 누적으로 설정합니다. |
is_monotonic |
부울 |
선택 사항입니다. 누적 메트릭의 경우 시계열 내에서 엄격하게 증가하고 있음을 보여주는 데 적합합니다. |
- 레코드 예:
레코드 특성¶
로그¶
로그의 레코드 특성은 일반적으로 이 로그의 출처를 나타냅니다. 예를 들어, 이름이 `testruntime`인 Openflow Runtime의 로그는 다음과 같은 레코드 특성을 가질 수 있습니다.
시스템 메트릭¶
CPU 사용량과 같은 시스템 메트릭은 일반적으로 레코드 속성을 설정하지 않으므로 이는 `null`이 됩니다.
Openflow Application 메트릭¶
애플리케이션 또는 ‘흐름’ 메트릭의 레코드 특성은 메트릭을 생성한 데이터 파이프라인의 구성 요소에 대한 세부 정보를 제공합니다. 이는 구성 요소의 유형에 따라 다릅니다. 애플리케이션 메트릭 섹션을 참조하세요.
값¶
이 열에는 원격 분석의 원시 값이 포함됩니다. 메트릭의 경우 이는 숫자 값(정수 또는 double)입니다. 로그의 경우 반정형 문자열 값 또는 올바른 형식의 JSON문자열입니다.
Openflow 런타임 로그¶
Openflow Runtimes는 대부분의 로그를 JSON으로 전송하므로 Snowflake의 /sql-reference/functions/try_parse_json`을 `VALUE 열에 적용하여 이 값을 다음과 같은 구조화된 필드로 더 세분화할 수 있습니다.
이름 |
타입 |
설명 |
|---|---|---|
formattedMessage |
String |
런타임 로거에서 송신한 실제 로그 메시지입니다. |
level |
String |
다음 중 하나:
|
loggerName |
String |
로거의 정규화된 클래스 이름입니다. Openflow 프로세서는 일반적으로 `com.snowflake.openflow.runtime.processors`로 시작하는 로거 이름을 사용합니다. 이는 특정 프로세서, 컨트롤러 서비스 또는 번들 라이브러리에 대한 로그를 보는 데 유용합니다. |
nanoseconds |
Integer |
이 로그 메시지가 생성된 나노초 수준의 시간으로, 밀리초부터 시작합니다. 예를 들어, 나노초 값 111222333은 타임스탬프 값 1749180210111에 해당하며, 나노초의 맨 왼쪽 3자리는 타임스탬프의 맨 오른쪽 3자리와 일치할 수 있습니다. |
threadName |
String |
이 호출을 처리하는 스레드의 이름입니다. 예: |
throwable |
JSON 오브젝트 |
이 로그 메시지에 대한 예외 또는 스택 추적이 없는 경우 `null`입니다. 그렇지 않으면 스택 추적을 필드가 있는 JSON 문자열로 기록합니다.
|
타임스탬프 |
Integer |
이 로그 메시지가 생성된 시간으로, UNIX 에포크 이후 밀리초로 표시됩니다. 예를 들어, 1749180210044는 로그가 2025-06-05 03:23:30.044 UTC에 생성되었음을 나타냅니다. |
애플리케이션 메트릭¶
참고
다음 목록에는 Openflow Runtimes에 사용할 수 있는 모든 애플리케이션 메트릭이 나와 있습니다. 런타임은 Snowflake 이벤트 테이블에 유지하기 위해 Openflow Connector와 관련된 메트릭의 하위 세트만 내보냅니다.
Snowflake의 OpenTelemetry 보고 작업은 일부 또는 모든 메트릭을 OTLP 대상으로 보낼 수 있습니다.
연결 메트릭¶
메트릭 이름 |
단위 |
설명 |
|---|---|---|
connection.input.bytes |
bytes |
항목 입력의 크기 |
connection.input.count |
항목 |
항목 수 입력 |
connection.output.bytes |
bytes |
항목 출력 크기 |
connection.output.count |
항목 |
항목 수 출력 |
connection.queued.bytes |
bytes |
큐에 대기 중인 항목의 크기 |
connection.queued.bytes.max |
bytes |
큐에 대기 중인 항목의 최대 크기 |
connection.queued.count |
항목 |
큐에 대기 중인 항목 수 |
connection.queued.count.max |
항목 |
큐에 대기 중인 최대 항목 수 |
connection.queued.duration.total |
밀리초 |
큐에 대기 중인 항목의 총 기간 |
connection.queued.duration.max |
밀리초 |
큐에 대기 중인 항목의 최대 기간 |
connection.backpressure.threshold.bytes |
bytes |
역압을 적용하기 전에 이 연결에서 큐에 대기할 수 있는 데이터의 최대 크기(바이트)입니다. |
connection.backpressure.threshold.objects |
항목 |
이 연결에서 역압을 적용하기 전에 큐에 대기할 수 있는, 구성된 최대 FlowFiles 수입니다. |
connection.loadbalance.status.load_balance_not_configured |
바이너리, 0 또는 1 |
연결에 구성된 로드 밸런싱 설정이 없는 경우 1입니다. 그렇지 않으면 0입니다. |
connection.loadbalance.status.load_balance_active |
바이너리, 0 또는 1 |
연결이 클러스터 전체에서 로드 밸런싱되는 경우 1입니다. 그렇지 않으면 0입니다. |
connection.loadbalance.status.load_balance_inactive |
바이너리, 0 또는 1 |
연결이 클러스터 전체에서 로드 밸런싱되지 않는 경우 1입니다. 그렇지 않으면 0입니다. |
연결 레코드 특성¶
각 연결 메트릭에는 다음 레코드 특성이 포함됩니다.
속성 |
설명 |
|---|---|
id |
연결의 고유 식별자 |
이름 |
사용자에게 표시되는 연결의 이름 |
유형 |
고정 값 |
source.id |
이 연결에 FlowFiles를 전송하는 구성 요소의 고유 식별자 |
source.name |
이 연결에 FlowFiles를 전송하는 구성 요소의 사용자에게 표시되는 이름 |
destination.id |
이 연결에서 FlowFiles를 수신하는 구성 요소의 고유 식별자 |
destination.name |
이 연결에서 FlowFiles를 수신하는 구성 요소의 사용자에게 표시되는 이름 |
group.id |
이 연결을 포함하는 프로세스 그룹의 고유 식별자 |
입력 및 출력 포트 메트릭¶
입력 포트와 출력 포트는 기술적으로 두 가지 별개 유형의 구성 요소입니다. 일관성을 위해 입력 및 출력 포트의 메트릭과 속성은 동일하며, 입력 포트인지 출력 포트인지를 나타내는 type 특성은 예외입니다.
메트릭 이름 |
단위 |
설명 |
|---|---|---|
port.thread.count.active |
스레드 |
활성 스레드 수 |
port.bytes.received |
bytes |
수신된 바이트 수 |
port.bytes.sent |
bytes |
전송된 바이트 수 |
port.flowfiles.received |
flowfiles |
수신된 FlowFiles 수 |
port.flowfiles.sent |
flowfiles |
전송된 FlowFiles 수 |
port.input.bytes |
bytes |
항목 입력의 크기 |
port.input.count |
항목 |
항목 수 입력 |
port.output.bytes |
bytes |
항목 출력 크기 |
port.output.count |
항목 |
항목 수 출력 |
입력 및 출력 포트 레코드 특성¶
각 포트 메트릭에는 다음 레코드 특성이 포함됩니다.
속성 |
설명 |
|---|---|
id |
포트의 고유 식별자 |
이름 |
사용자에게 표시되는 포트의 이름 |
유형 |
|
group.id |
이 포트를 포함하는 프로세스 그룹의 고유 식별자 |
프로세스 그룹 메트릭¶
메트릭 이름 |
단위 |
설명 |
|---|---|---|
processgroup.thread.count.active |
스레드 |
활성 스레드 수 |
processgroup.thread.count.stateless |
스레드 |
상태 비저장 스레드 수 |
processgroup.thread.count.terminated |
스레드 |
종료된 스레드 수 |
processgroup.bytes.read |
bytes |
읽은 바이트 수 |
processgroup.bytes.received |
bytes |
수신된 바이트 수 |
processgroup.bytes.transferred |
bytes |
전송된 바이트 수 |
processgroup.bytes.sent |
bytes |
전송된 바이트 수 |
processgroup.bytes.written |
bytes |
작성한 바이트 수 |
processgroup.flowfiles.received |
flowfiles |
수신된 FlowFiles 수 |
processgroup.flowfiles.sent |
flowfiles |
전송된 FlowFiles 수 |
processgroup.flowfiles.transferred |
flowfiles |
전송된 FlowFiles 수 |
processgroup.input.count |
항목 |
항목 입력 수 |
processgroup.input.content.size |
bytes |
항목 입력의 크기 |
processgroup.output.count |
항목 |
항목 출력 수 |
processgroup.output.content.size |
bytes |
항목 출력 크기 |
processgroup.queued.count |
항목 |
큐에 대기 중인 항목 수 |
processgroup.queued.content.size |
bytes |
큐에 대기 중인 항목의 크기 |
processgroup.time.processing |
nanoseconds |
처리에 소요된 시간 |
프로세스 그룹 레코드 특성¶
각 프로세스 그룹 메트릭에는 다음 레코드 특성이 포함됩니다.
속성 |
설명 |
|---|---|
id |
프로세스 그룹의 고유 식별자 |
이름 |
사용자에게 표시되는 프로세스 그룹의 이름 |
유형 |
고정 값 |
tree.level |
흐름의 루트 프로세스 그룹을 기준으로 한 프로세스 그룹의 깊이입니다. 흐름의 최상위 수준에 있는 프로세스 그룹에는 1의 tree.level이 있습니다. |
프로세서 메트릭¶
메트릭 이름 |
단위 |
설명 |
|---|---|---|
processor.thread.count.active |
스레드 |
활성 스레드 수 |
processor.thread.count.terminated |
스레드 |
종료된 스레드 수 |
processor.time.lineage.average |
나노초 |
평균 계보 기간 |
processor.invocations |
호출 |
호출 수 |
processor.bytes.read |
바이트 |
읽은 바이트 수 |
processor.bytes.received |
바이트 |
수신된 바이트 수 |
processor.bytes.sent |
바이트 |
전송된 바이트 수 |
processor.bytes.written |
바이트 |
작성한 바이트 수 |
processor.flowfiles.received |
flowfiles |
수신된 FlowFiles 수 |
processor.flowfiles.removed |
flowfiles |
제거된 FlowFiles 수 |
processor.flowfiles.sent |
flowfiles |
전송된 FlowFiles 수 |
processor.input.count |
항목 |
항목 입력 수 |
processor.input.content.size |
bytes |
항목 입력의 크기 |
processor.output.count |
항목 |
항목 출력 수 |
processor.output.content.size |
바이트 |
항목 출력 크기 |
processor.time.processing |
나노초 |
처리에 소요된 시간 |
processor.run.status.running |
바이너리, 0 또는 1 |
실행 중인 경우 1, 그렇지 않은 경우 0 |
processor.run.status.stopped |
바이너리, 0 또는 1 |
중지된 경우 1, 그렇지 않은 경우 0 |
processor.run.status.validating |
바이너리, 0 또는 1 |
유효성 검사 중인 경우 1, 그렇지 않은 경우 0 |
processor.run.status.invalid |
바이너리, 0 또는 1 |
유효하지 않은 경우 1, 그렇지 않은 경우 0 |
processor.run.status.disabled |
바이너리, 0 또는 1 |
비활성화된 경우 1, 그렇지 않은 경우 0 |
processor.counter |
카운트 |
카운터의 값 |
프로세서 레코드 특성¶
각 프로세서 메트릭에는 다음 레코드 특성이 포함됩니다.
속성 |
설명 |
|---|---|
id |
프로세서의 고유 식별자 |
이름 |
사용자에게 표시되고 사용자가 편집할 수 있는 프로세서의 이름 |
유형 |
고정 값 |
구성 요소 |
변경할 수 없는 프로세서의 클래스 이름입니다. |
execution.node |
이 프로세서가 실행되도록 구성된 방식에 따라 |
group.id |
이 프로세서를 포함하는 프로세스 그룹의 고유 식별자 |
카운터의 추가 특성¶
위의 표준 프로세서 특성 외에도, `processor.counter`메트릭에는 다음이 포함됩니다.
속성 |
설명 |
|---|---|
유형 |
고정 값 |
카운터 |
카운터의 사용자 또는 시스템 생성 이름 |
원격 프로세스 그룹 메트릭¶
메트릭 이름 |
단위 |
설명 |
|---|---|---|
remoteprocessgroup.thread.count.active |
스레드 |
활성 스레드 수 |
remoteprocessgroup.remote.port.count.active |
포트 |
활성 원격 포트 수 |
remoteprocessgroup.remote.port.count.inactive |
포트 |
비활성 원격 포트 수 |
remoteprocessgroup.duration.lineage.average |
nanoseconds |
평균 계보 기간 |
remoteprocessgroup.refresh.age |
밀리초 |
마지막 새로 고침 이후의 시간 |
remoteprocessgroup.received.count |
항목 |
수신된 항목 수 |
remoteprocessgroup.received.content.size |
bytes |
수신된 항목 크기 |
remoteprocessgroup.sent.count |
항목 |
전송된 항목 수 |
remoteprocessgroup.sent.content.size |
bytes |
전송된 항목 크기 |
remoteprocessgroup.transmission.status.transmitting |
바이너리, 0 또는 1 |
원격 프로세스 그룹이 전송 중인 경우 1입니다. 그렇지 않으면 0입니다. |
remoteprocessgroup.transmission.status.nottransmitting |
바이너리, 0 또는 1 |
원격 프로세스 그룹이 전송 중인 경우 0입니다. 그렇지 않은 경우 1입니다. |
원격 프로세스 그룹 레코드 특성¶
각 원격 프로세스 그룹 메트릭에는 다음 레코드 특성이 포함됩니다.
속성 |
설명 |
|---|---|
id |
원격 프로세스 그룹의 고유 식별자 |
이름 |
사용자에게 표시되는 원격 프로세스 그룹의 이름 |
group.id |
이 원격 프로세스 그룹을 포함하는 프로세스 그룹의 고유 식별자 |
authorization.issue |
원격 프로세스 그룹에 액세스하는 데 사용되는 인증 |
target.uri |
원격 프로세스 그룹의 URI |
유형 |
고정 값 |
JVM 메트릭¶
메트릭 이름 |
단위 |
설명 |
|---|---|---|
jvm.memory.heap.used |
bytes |
JVM 힙의 오브젝트가 현재 점유하고 있는 메모리의 양 |
jvm.memory.heap.committed |
bytes |
JVM 힙에서 사용할 수 있도록 보장되는 메모리의 양 |
jvm.memory.heap.max |
bytes |
JVM 힙에 할당된 최대 메모리 양 |
jvm.memory.heap.init |
bytes |
JVM 힙에 할당된 초기 메모리 양 |
jvm.memory.heap.usage |
백분율 |
JVM 힙 사용량 |
jvm.memory.non-heap.usage |
백분율 |
JVM 비힙 사용량 |
jvm.memory.total.init |
bytes |
JVM에 할당된 초기 메모리 양 |
jvm.memory.total.used |
bytes |
JVM에서 사용하는 현재 메모리 양 |
jvm.memory.total.max |
bytes |
JVM에서 사용할 수 있는 최대 메모리 양 |
jvm.memory.total.committed |
bytes |
JVM에서 사용할 수 있도록 보장되는 메모리 양 |
jvm.threads.count |
스레드 |
라이브 스레드 수 |
jvm.threads.deadlocks |
스레드 |
JVM 스레드 교착 상태 |
jvm.threads.daemon.count |
스레드 |
라이브 데몬 스레드 수 |
jvm.uptime |
초 |
JVM 프로세스가 실행된 시간(초) |
jvm.file.descriptor.usage |
백분율 |
현재 사용 중인 사용 가능한 파일 설명자의 백분율입니다. |
jvm.gc.G1-Concurrent-GC.runs |
실행 |
G1 Concurrent Garbage Collection이 실행된 총 횟수 |
jvm.gc.G1-Concurrent-GC.time |
밀리초 |
G1 Concurrent Garbage Collection이 실행된 총 시간 |
jvm.gc.G1-Young-Generation.runs |
실행 |
G1 Young Generation이 실행된 총 횟수 |
jvm.gc.G1-Young-Generation.time |
밀리초 |
G1 Young Generation이 실행된 총 시간 |
jvm.gc.G1-Old-Generation.runs |
실행 |
G1 이전 세대가 실행된 총 횟수 |
jvm.gc.G1-Old-Generation.time |
밀리초 |
G1 이전 세대가 실행된 총 시간 |
JVM 레코드 특성¶
JVM 메트릭은 레코드 특성을 제공하지 않습니다.
CPU 메트릭¶
메트릭 이름 |
단위 |
설명 |
|---|---|---|
cores.available |
코어 |
런타임에 사용 가능한 코어 수 |
cores.load |
백분율 |
시스템 로드 평균 또는 사용할 수 없는 경우 -1 |
CPU 레코드 특성¶
속성 |
설명 |
|---|---|
id |
고정 값 |
이름 |
운영 체제의 이름 |
아키텍처 |
운영 체제의 아키텍처 |
버전 |
운영 체제 버전 |
저장소 메트릭¶
메트릭 이름 |
단위 |
설명 |
|---|---|---|
storage.free |
bytes |
지정된 리포지토리의 사용 가능한 저장소 양 |
storage.used |
bytes |
지정된 리포지토리에 대해 사용된 저장소의 양 |
저장소 레코드 특성¶
속성 |
설명 |
|---|---|
id |
저장소 리포지토리의 고유 식별자 |
이름 |
ID와 동일하며 일관성을 위해 제공됨 |
storage.type |
|
예제 쿼리¶
다음 쿼리는 Openflow 원격 분석을 시작하는 데 도움이 되는 예입니다.
모든 쿼리는 Openflow가 `SNOWFLAKE.TELEMETRY.EVENTS`의 기본 이벤트 테이블에 원격 분석을 보내도록 구성되어 있다고 가정합니다. Snowflake 계정 또는 Openflow 배포가 다른 이벤트 테이블로 구성된 경우 `SNOWFLAKE.TELEMETRY.EVENTS`가 표시되는 위치에서 해당 테이블 이름을 대체합니다.
중단된 FlowFiles 찾기¶
이 쿼리는 일부 임계값을 초과하여 큐에 대기 중인 FlowFiles 연결을 반환하며, 이는 해당 연결이 중단되어 개입이 필요할 수 있음을 나타냅니다. 사용 사례에 따라 필요한 경우 30분 임계값을 조정합니다.
Openflow Runtimes에 대한 오류 로그 찾기¶
실행 중인 프로세서와 비실행 중인 프로세서 찾기¶
일부 흐름에서는 데이터를 적극적으로 처리하지 않더라도 모든 프로세서가 ‘실행 중’ 상태에 있을 것으로 예상합니다.
이 쿼리는 다음과 같이 실행 중이거나 다른 상태에 있는 프로세서를 찾는 데 도움이 됩니다.
중지됨
invalid
비활성화됨
Openflow 런타임에 대한 높은 CPU 사용량 찾기¶
느린 데이터 흐름 또는 처리량 감소는 CPU의 병목 현상의 결과일 수 있습니다. Openflow Runtimes는 구성한 최소 및 최대 노드 수에 따라 자동으로 확장됩니다.
Openflow Runtime이 최대 노드 수를 사용하고 있지만 여전히 CPU 사용량이 높은 경우 다음을 고려하세요.
런타임에 할당된 최대 노드 수 늘리기
커넥터 또는 흐름 문제를 해결하여 병목 현상 식별하기
Snowsight 차트는 시간 경과에 따른 CPU 사용량에 대한 쿼리 결과를 시각화하는 쉬운 방법을 제공합니다.