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"
    }
    
    Copy
  • 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"
    }
    
    Copy
  • 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;
Copy

로그에서 “원인” 예외 찾기

이러한 예외는 간헐적인 연결 문제, 데이터 비호환성 또는 관련 원인으로 인해 발생할 수 있습니다.

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;
Copy

실행 중이거나, 중지되었거나, 다른 상태에 있는 프로세서 찾기

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());
Copy

런타임에 대한 높은 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;
Copy

사용 가능한 메트릭

런타임에서 사용할 수 있는 메트릭

다음은 런타임에 사용할 수 있는 메트릭 목록입니다.

메트릭

단위

타입

설명

cores.load

백분율

게이지

런타임에 사용 가능한 모든 코어의 평균 로딩입니다. 최대 값은 가용성 있는 코어가 모두 사용 중일 때인 1입니다.

cores.available

CPU 코어

게이지

런타임에 사용 가능한 CPU 코어 수

storage.free

bytes

게이지

런타임에 저장소 유형별로 사용할 수 있는 무료 저장소의 양입니다. 다음의 세 가지 저장소 유형을 사용할 수 있습니다.

  • flowfile

  • 내용

  • 출처

RECORD_ATTRIBUTES 열에서 storage.type 메트릭을 볼 수 있습니다.

storage.used

bytes

게이지

저장소 유형별로 사용된 저장소의 양입니다. 다음의 세 가지 저장소 유형을 사용할 수 있습니다.

  • flowfile

  • 내용

  • 출처

RECORD_ATTRIBUTES 열에서 storage.type 메트릭을 볼 수 있습니다.

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;
Copy

커넥터에서 사용할 수 있는 메트릭

다음은 커넥터에 대해 사용 가능한 메트릭 목록입니다.

메트릭

단위

타입

설명

processgroup.bytes.received

bytes

게이지

소스에서 소비된 평균 바이트 수

processgroup.bytes.sent

bytes

게이지

대상에 기록된 평균 바이트 수

이벤트 테이블에서 이러한 메트릭을 쿼리하려면 Openflow 런타임 캔버스에서 프로세스 그룹 이름과 ID 를 찾은 다음 RECORD_ATTRIBUTES 열에서 필터링해야 합니다.