Openflow 모니터링하기¶
이 항목에서는 Openflow의 상태를 모니터링하고 문제를 해결하는 방법에 대해 설명합니다.
Openflow 로그에 액세스하기¶
Snowflake는 Openflow를 설정 할 때 구성한 이벤트 테이블로 Openflow 로그를 보냅니다. Snowflake는 이벤트 테이블 쿼리의 WHERE 절에 타임스탬프를 포함할 것을 권장합니다. 다양한 Snowflake 구성 요소에서 생성될 수 있는 데이터의 양 때문에 이 점이 특히 중요합니다. 필터를 적용하면 더 작은 데이터 하위 세트를 검색할 수 있으므로 쿼리 성능이 향상됩니다.
이벤트 테이블에는 다음과 같은 열이 포함되어 있으며, 이 열은 Openflow에서 Snowflake가 수집한 로그에 관한 유용한 정보를 제공합니다.
TIMESTAMP: Snowflake가 로그를 수집한 시점을 표시합니다.
RESOURCE_ATTRIBUTES: 로그 메시지를 생성한 Snowflake 서비스를 식별하는 JSON 오브젝트를 제공합니다. 예를 들어, Openflow에 대한 애플리케이션 및 데이터 플레인 ID 와 같은 세부 사항을 제공합니다.
{ "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" }
RECORD_ATTRIBUTES: Snowflake 서비스의 경우 오류 소스(표준 출력 또는 표준 오류)를 식별합니다.
{ "log.file.path": "/var/log/pods/runtime-pg-dev_pg-dev-0_94610175-1685-4c8f-b0a1-42898d1058e6/pg-dev-server/0.log", "log.iostream": "stdout", "logtag": "F" }
VALUE: 표준 출력과 표준 오류는 라인으로 나뉘며, 각 라인은 이벤트 테이블에 자체 레코드를 생성합니다.
"{\"timestamp\":1746655642080,\"nanoseconds\":80591397,\"level\":\"INFO\",\"threadName\":\"Clustering Tasks Thread-2\",\"loggerName\":\"org.apache.nifi.controller.cluster.ClusterProtocolHeartbeater\",\"formattedMessage\":\"Heartbeat created at 2025-05-07T22:07:22.071Z and sent to pg-dev-0.pg-dev.runtime-pg-dev.svc.cluster.local:8445 at 2025-05-07T22:07:22.080590784Z; determining Cluster Coordinator took 7 millis; DNS lookup for coordinator took 0 millis; connecting to coordinator took 0 millis; sending heartbeat took 1 millis; receiving first byte from response took 1 millis; receiving full response took 1 millis; total time was 9 millis\",\"throwable\":null}"
예¶
런타임에 대한 오류 수준 로그 찾기¶
SELECT
timestamp,
resource_attributes:"k8s.namespace.name" AS runtime_key,
parse_json(value::string):loggerName AS logger,
parse_json(value::string):formattedMessage AS log_value
FROM openflow.telemetry.EVENTS_<account-id>
WHERE true
AND timestamp < dateadd('days', -1, sysdate())
AND record_type = 'LOG'
AND resource_attributes:"k8s.namespace.name" LIKE 'runtime-%'
AND resource_attributes:"k8s.container.name" LIKE '%-server'
AND parse_json(value::string):level = 'ERROR'
ORDER BY timestamp desc
LIMIT 5;
로그에서 “원인” 예외 찾기¶
이러한 예외는 간헐적인 연결 문제, 데이터 비호환성 또는 관련 원인으로 인해 발생할 수 있습니다.
SELECT
timestamp,
RESOURCE_ATTRIBUTES:"k8s.namespace.name" AS Namespace,
RESOURCE_ATTRIBUTES:"k8s.pod.name" AS Pod,
RESOURCE_ATTRIBUTES:"k8s.container.name" AS Container,
value
FROM openflow.telemetry.EVENTS_<account-id>
WHERE true
AND record_type = 'LOG'
AND timestamp > dateadd(minute, -5, sysdate())
AND value LIKE '%Caused By%'
ORDER BY timestamp desc
LIMIT 10;
실행 중이거나, 중지되었거나, 다른 상태에 있는 프로세서 찾기¶
SELECT
timestamp,
RECORD_ATTRIBUTES:component AS Processor,
RECORD_ATTRIBUTES:id AS Processor_ID,
value AS Running
FROM openflow.telemetry.EVENTS_<account-id>
WHERE true
AND RECORD:metric:name = 'processor.run.status.running'
AND RECORD_TYPE='METRIC'
AND timestamp > dateadd(minute, -5, sysdate());
런타임에 대한 높은 CPU 사용량 찾기¶
느린 데이터 플로우 또는 처리량 감소는 CPU 의 병목 현상으로 인해 발생할 수 있습니다. 런타임은 구성한 최소 및 최대 노드 수에 따라 자동으로 확장되어야 합니다. 런타임이 최대 노드 수를 사용하고 있음에도 불구하고 CPU 사용률이 여전히 높다면, 런타임에 할당된 최대 노드 수를 늘리거나 커넥터 또는 흐름을 진단하십시오.
SELECT
timestamp,
RESOURCE_ATTRIBUTES:"k8s.namespace.name" AS Namespace,
RESOURCE_ATTRIBUTES:"k8s.pod.name" AS Pod,
RESOURCE_ATTRIBUTES:"k8s.container.name" AS Container,
value AS CPU_Usage
FROM openflow.telemetry.EVENTS_<account-id>
WHERE TIMESTAMP > dateadd(minute, -1, 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'
AND RESOURCE_ATTRIBUTES:"k8s.namespace.name" NOT IN ('runtime-infra', 'runtime-operator')
ORDER BY TIMESTAMP desc, CPU_Usage desc;
사용 가능한 메트릭¶
런타임에서 사용할 수 있는 메트릭¶
다음은 런타임에 사용할 수 있는 메트릭 목록입니다.
메트릭 |
단위 |
타입 |
설명 |
---|---|---|---|
cores.load |
백분율 |
게이지 |
런타임에 사용 가능한 모든 코어의 평균 로딩입니다. 최대 값은 가용성 있는 코어가 모두 사용 중일 때인 1입니다. |
cores.available |
CPU 코어 |
게이지 |
런타임에 사용 가능한 CPU 코어 수 |
storage.free |
bytes |
게이지 |
런타임에 저장소 유형별로 사용할 수 있는 무료 저장소의 양입니다. 다음의 세 가지 저장소 유형을 사용할 수 있습니다.
RECORD_ATTRIBUTES 열에서 |
storage.used |
bytes |
게이지 |
저장소 유형별로 사용된 저장소의 양입니다. 다음의 세 가지 저장소 유형을 사용할 수 있습니다.
RECORD_ATTRIBUTES 열에서 |
CPU 메트릭에 대한 샘플 쿼리¶
SELECT * from events
WHERE
1 = 1
AND record_type = 'METRIC'
AND resource_attributes:application = 'openflow'
AND record:metric.name IN ('cores.load', 'cores.available')
ORDER BY timestamp desc
LIMIT 1000;
커넥터에서 사용할 수 있는 메트릭¶
다음은 커넥터에 대해 사용 가능한 메트릭 목록입니다.
메트릭 |
단위 |
타입 |
설명 |
---|---|---|---|
processgroup.bytes.received |
bytes |
게이지 |
소스에서 소비된 평균 바이트 수 |
processgroup.bytes.sent |
bytes |
게이지 |
대상에 기록된 평균 바이트 수 |
이벤트 테이블에서 이러한 메트릭을 쿼리하려면 Openflow 런타임 캔버스에서 프로세스 그룹 이름과 ID 를 찾은 다음 RECORD_ATTRIBUTES
열에서 필터링해야 합니다.