Openflow 모니터링하기¶
이 항목에서는 Openflow의 상태를 모니터링하고 문제를 해결하는 방법에 대해 설명합니다.
Openflow 로그에 액세스하기¶
Snowflake는 Openflow 설정 시 구성한 이벤트 테이블로 Openflow 로그를 보냅니다.
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 배포의 고유 식별자입니다. |
- 리소스 특성의 예:
{ "application": "openflow", "cloud.service.provider": "aws", "k8s.container.name": "pg-dev-server", "k8s.container.restart_count": "0", "k8s.namespace.name": "runtime-pg-dev", "k8s.node.name": "ip-10-10-62-36.us-east-2.compute.internal", "k8s.pod.name": "pg-dev-0", "k8s.pod.start_time": "2025-04-25T22:14:29Z", "k8s.pod.uid": "94610175-1685-4c8f-b0a1-42898d1058e6", "k8s.statefulset.name": "pg-dev", "openflow.dataplane.id": "abeddb4f-95ae-45aa-95b1-b4752f30c64a" }
범위¶
이름 |
타입 |
설명 |
---|---|---|
이름 |
String |
메트릭의 공급자입니다. 다음 중 하나:
|
- 범위 예:
{ "name": "runtime" }
기록 유형¶
이 행이 나타내는 Openflow 원격 분석의 유형에 따라 다음 중 하나가 됩니다.
LOG
METRIC
Openflow는 TRACE 레코드를 수집하지 않지만, 이는 Snowflake Event Tables의 이 열에 유효한 유형이기도 합니다.
레코드¶
선택 사항입니다. 이 JSON 오브젝트는 이 행이 나타내는 메트릭 유형을 설명합니다.
이름 |
타입 |
설명 |
---|---|---|
메트릭 |
오브젝트 |
다음 두 필드를 포함합니다.
이름과 단위 값은 매우 다양합니다. 전체 목록은 아래의 애플리케이션 메트릭 섹션을 참조하세요. |
metric_type |
String |
다음 중 하나:
|
value_type |
String |
이 메트릭에 의해 생성된 값의 기본 유형입니다. 다음 중 하나:
|
aggregation_temporality |
String |
선택 사항입니다. 포드 CPU 시간 및 네트워크 IO와 같이 엄격하게 증가하고 이전 값에 의존하는 메트릭의 경우 누적으로 설정합니다. |
is_monotonic |
부울 |
선택 사항입니다. 누적 메트릭의 경우 시계열 내에서 엄격하게 증가하고 있음을 보여주는 데 적합합니다. |
- 레코드 예:
{ "metric": { "name": "connection.queued.duration.max", "unit": "millisecond" }, "metric_type": "gauge", "value_type": "INT" }
레코드 특성¶
로그¶
로그의 레코드 특성은 일반적으로 이 로그의 출처를 나타냅니다. 예를 들어, 이름이 `testruntime`인 Openflow Runtime의 로그는 다음과 같은 레코드 특성을 가질 수 있습니다.
{ "log.file.path": "/var/log/pods/runtime-testruntime_testruntime-0_66d80cdb-9484-40a4-bdba-f92eb0af14c7/testruntime-server/0.log", "log.iostream": "stdout", "logtag": "F" }
시스템 메트릭¶
CPU 사용량과 같은 시스템 메트릭은 일반적으로 레코드 속성을 설정하지 않으므로 이는 `null`이 됩니다.
Openflow Application 메트릭¶
애플리케이션 또는 ‘흐름’ 메트릭의 레코드 특성은 메트릭을 생성한 데이터 파이프라인의 구성 요소에 대한 세부 정보를 제공합니다. 이는 구성 요소의 유형에 따라 다릅니다. 애플리케이션 메트릭 섹션을 참조하세요.
{ "component": "PutSnowpipeStreaming", "execution.node": "ALL", "group.id": "c052f9d7-7f76-3013-a2c5-d3b064fa7326", "id": "c69e2913-22a9-36bb-a159-6a5ed1fb9d63", "name": "PutSnowpipeStreaming", "type": "processor" }
값¶
이 열에는 원격 분석의 원시 값이 포함됩니다. 메트릭의 경우 이는 숫자 값(정수 또는 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분 임계값을 조정합니다.
SELECT * FROM (
SELECT
resource_attributes:"openflow.dataplane.id" as Deployment_ID,
resource_attributes:"k8s.namespace.name" as Runtime_Key,
record_attributes:name as Connection_Name,
record_attributes:id as Connection_ID,
MAX(TO_NUMBER(value / 60 / 1000)) as Max_Queued_File_Minutes
FROM snowflake.telemetry.events
WHERE true
AND record_type = 'METRIC'
AND record:metric:name = 'connection.queued.duration.max'
AND timestamp > dateadd(minutes, -30, sysdate())
GROUP BY 1, 2, 3, 4
ORDER BY Max_Queued_File_Minutes DESC
) WHERE Max_Queued_File_Minutes > 30;
Openflow Runtimes에 대한 오류 로그 찾기¶
SELECT
timestamp,
Deployment_ID,
Runtime_Key,
parsed_log:level as log_level,
parsed_log:loggerName as logger,
parsed_log:formattedMessage as message,
parsed_log
FROM (
SELECT
timestamp,
resource_attributes:"openflow.dataplane.id" as Deployment_ID,
resource_attributes:"k8s.namespace.name" as Runtime_Key,
TRY_PARSE_JSON(value) as parsed_log
FROM snowflake.telemetry.events
WHERE true
AND timestamp > dateadd('minutes', -30, sysdate())
AND record_type = 'LOG'
AND resource_attributes:"k8s.namespace.name" like 'runtime-%'
ORDER BY timestamp DESC
) WHERE log_level = 'ERROR';
실행 중인 프로세서와 비실행 중인 프로세서 찾기¶
일부 흐름에서는 데이터를 적극적으로 처리하지 않더라도 모든 프로세서가 ‘실행 중’ 상태에 있을 것으로 예상합니다.
이 쿼리는 다음과 같이 실행 중이거나 다른 상태에 있는 프로세서를 찾는 데 도움이 됩니다.
중지됨
invalid
비활성화됨
SELECT
timestamp,
resource_attributes:"openflow.dataplane.id" as Deployment_ID,
resource_attributes:"k8s.namespace.name" as Runtime_Key,
record_attributes:component as Processor,
record_attributes:id as Processor_ID,
TO_NUMBER(value) as Running
FROM snowflake.telemetry.events
WHERE true
AND record:metric:name = 'processor.run.status.running'
AND record_type = 'METRIC'
AND timestamp > dateadd(minutes, -30, sysdate());
Openflow 런타임에 대한 높은 CPU 사용량 찾기¶
느린 데이터 흐름 또는 처리량 감소는 CPU의 병목 현상의 결과일 수 있습니다. Openflow Runtimes는 구성한 최소 및 최대 노드 수에 따라 자동으로 확장됩니다.
Openflow Runtime이 최대 노드 수를 사용하고 있지만 여전히 CPU 사용량이 높은 경우 다음을 고려하세요.
런타임에 할당된 최대 노드 수 늘리기
커넥터 또는 흐름 문제를 해결하여 병목 현상 식별하기
Snowsight 차트는 시간 경과에 따른 CPU 사용량에 대한 쿼리 결과를 시각화하는 쉬운 방법을 제공합니다.
SELECT
timestamp,
resource_attributes:"openflow.dataplane.id" as Deployment_ID,
resource_attributes:"k8s.namespace.name" as Runtime_Key,
resource_attributes:"k8s.pod.name" as Runtime_Pod,
TO_NUMBER(value, 10, 3) * 100 as CPU_Usage_Percentage
FROM snowflake.telemetry.events
WHERE true
AND timestamp > dateadd(minute, -30, sysdate())
AND record_type = 'METRIC'
AND record:metric:name ilike 'container.cpu.usage'
AND resource_attributes:"k8s.namespace.name" ilike 'runtime-%'
AND resource_attributes:"k8s.container.name" ilike '%-server'
ORDER BY timestamp desc, CPU_Usage_Percentage desc;