IBM i/AS400
IBM i/AS400 수집기는 IBM i Access ODBC Driver를 통해 원격으로 Db2 for i SQL Services에 접근하여, IBM i의 시스템, ASP, Job, Memory Pool, Subsystem, Job Queue, Message Queue 메트릭을 수집합니다.
테스트된 버전:
- IBM i 7.4
설정¶
사전 조건¶
ODBC 환경 설정¶
현재 수집기는 Linux AMD64 호스트에서만 실행을 지원합니다.
IBM i/AS400 수집기는 unixODBC를 통해 IBM i Access ODBC Driver를 로드합니다. 수집기가 실행되는 Linux 호스트에 이미 unixODBC가 설치되고 설정되어 있다면, 중복 설치 없이 바로 사용할 수 있습니다.
먼저 unixODBC와 그 설정 파일 위치를 확인합니다:
시스템에서 odbcinst를 찾지 못하면, 배포판에 맞게 unixODBC를 설치합니다:
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y unixodbc
# RHEL/Rocky Linux
sudo dnf install -y unixODBC
# SUSE Linux
sudo zypper install unixODBC
IBM i Access Client Solutions에서 수집기가 실행되는 플랫폼에 맞는 ACS Application Package를 다운로드하고, 패키지 안내에 따라 IBM i Access ODBC Driver를 설치합니다. AMD64 패키지를 선택해야 하며, 드라이버 및 동적 라이브러리의 아키텍처는 수집기 실행 환경과 반드시 일치해야 합니다.
설치 후 unixODBC가 IBM i Access ODBC Driver를 인식하는지 확인합니다:
기본 드라이버 이름은 IBM i Access ODBC Driver 64-bit입니다.
다음 명령으로 해당 드라이버를 확인할 수 있습니다:
드라이버가 자동 등록되지 않았다면, odbcinst -j에 표시된 위치에 따라
odbcinst.ini를 편집합니다. 설치 패키지에 따라 동적 라이브러리 경로가 다를 수 있으며, 일반적인 설정은 다음과 같습니다:
[IBM i Access ODBC Driver 64-bit]
Description=IBM i Access for Linux 64-bit ODBC Driver
Driver=/opt/ibm/iaccess/lib64/libcwbodbc.so
Setup=/opt/ibm/iaccess/lib64/libcwbodbcs.so
Threading=0
DontDLClose=1
UsageCount=1
드라이버 동적 라이브러리와 수집기의 ODBC 의존성이 정상적으로 로드되는지 확인합니다:
수집기 설정¶
DataKit 설치 디렉터리의 conf.d/samples 디렉터리로 이동하여 ibm_i.conf.sample을 복사한 뒤 ibm_i.conf로 이름을 바꿉니다. 예시는 다음과 같습니다:
[[inputs.external]]
daemon = true
name = "ibm_i"
cmd = "/usr/local/datakit/externals/ibm_i"
## 선거를 활성화하려면 true로 설정합니다.
election = true
args = [
"--interval", "60s",
"--host", "<ibm-i-host>",
"--username", "DKUSER",
## 선택 사항: odbcinst.ini에 등록된 IBM i Access ODBC 드라이버 이름.
# "--driver", "IBM i Access ODBC Driver 64-bit",
## 선택 사항: host/username/password/driver 대신 원시 ODBC 연결 문자열을 사용합니다.
# "--dsn", "Driver={IBM i Access ODBC Driver 64-bit};System=<ibm-i-host>;UID=DKUSER;PWD=<password>;",
## 선택 사항: 쿼리 및 타임아웃 설정.
# "--query-timeout", "30s",
# "--job-query-timeout", "240s",
# "--system-mq-query-timeout", "80s",
# "--severity-threshold", "50",
## 필요에 따라 이 인자를 반복해서 추가합니다.
## --query를 지정하지 않으면 모든 기본 쿼리가 활성화됩니다.
## 대규모 시스템에서는 기본 쿼리부터 시작하고, Job 상세 쿼리는
## 필요할 때만 활성화하는 것을 권장합니다.
# "--query", "disk_usage",
# "--query", "cpu_usage",
# "--query", "memory_info",
# "--query", "subsystem",
# "--query", "job_queue",
## 대상 부하를 줄이기 위해 message_queue_info를 선택한 큐로 제한합니다.
# "--message-queue", "QSYSOPR",
# "--message-queue", "QSYSMSG",
]
envs = [
"ENV_INPUT_IBM_I_PASSWORD=<password>",
"LD_LIBRARY_PATH=/opt/ibm/iaccess/lib64:$LD_LIBRARY_PATH",
]
[inputs.external.tags]
# some_tag = "some_value"
# more_tag = "some_other_value"
설정을 마치면 DataKit을 재시작하면 됩니다.
현재는 ConfigMap 방식으로 수집기 설정을 주입하여 수집기를 활성화할 수 있습니다.
또한 --dsn으로 완전한 ODBC connection string을 전달할 수 있습니다. --dsn을 설정하면 --host, --username, --password, --driver는 더 이상 연결 문자열 구성에 사용되지 않습니다:
비밀번호가 설정 파일이나 명령행에 노출되지 않도록, 환경 변수를 통해 비밀번호를 전달하는 것을 권장합니다:
envs = [
"ENV_INPUT_IBM_I_PASSWORD=<password>",
"LD_LIBRARY_PATH=/opt/ibm/iaccess/lib64:$LD_LIBRARY_PATH",
]
매개변수 설명¶
| 매개변수 | 설명 |
|---|---|
--dsn |
완전한 ODBC connection string, 설정 시 우선 사용 |
--driver |
IBM i Access ODBC Driver 이름, 기본값 IBM i Access ODBC Driver 64-bit |
--host |
IBM i 호스트 주소 |
--username |
IBM i 수집 계정 |
--password |
IBM i 수집 계정 비밀번호, 환경 변수 ENV_INPUT_IBM_I_PASSWORD 사용 권장 |
--interval |
메트릭 수집 간격, 기본값 60s; 모든 쿼리를 활성화할 경우 60s 이상 권장 |
--query-timeout |
일반 쿼리 타임아웃, 기본값 30s |
--job-query-timeout |
Job 쿼리 타임아웃, 기본값 240s |
--system-mq-query-timeout |
Message Queue 쿼리 타임아웃, 기본값 80s |
--query |
활성화할 쿼리 지정, 반복 설정 가능; 미설정 시 모든 기본 쿼리 활성화 |
--severity-threshold |
Message Queue 심각도 메시지 임계값, 기본값 50 |
--message-queue |
수집할 Message Queue 이름 제한, 반복 설정 가능 |
--metric-enabled |
메트릭 보고 여부, 기본값 true |
기본적으로 모든 쿼리가 활성화됩니다. Job 상세 쿼리는 Job별로 메트릭을 생성하므로, Job 수가 많은 IBM i 에서는 더 많은 시계열이 발생할 수 있습니다. 운영 환경에서는 먼저 기본 쿼리만 활성화하고, 부하를 확인한 뒤 필요한 경우에만 Job 상세를 활성화하는 것이 좋습니다.
message_queue_info는 기본적으로 모든 Message Queue를 조회합니다. 메시지 양이 많은 환경에서는
--message-queue로 관심 있는 큐만 제한하는 것이 좋습니다. 예를 들어 QSYSOPR, QSYSMSG와 같습니다.
--query는 다음 값을 지원합니다:
disk_usage
cpu_usage
jobq_job_status
active_job_status
job_memory_usage
memory_info
subsystem
job_queue
message_queue_info
메트릭¶
ibm_i¶
| 태그 및 필드 | 설명 |
|---|---|
| asp_number ( tag) |
ASP 번호. |
| host ( tag) |
IBM i 호스트 이름 또는 연결 주소. |
| job_active_status ( tag) |
활성 Job 상태. |
| job_id ( tag) |
IBM i Job 식별자. |
| job_name ( tag) |
IBM i Job 이름. |
| job_queue_library ( tag) |
Job queue 라이브러리. |
| job_queue_name ( tag) |
Job queue 이름. |
| job_queue_status ( tag) |
Job queue 상태. |
| job_status ( tag) |
IBM i Job 상태. |
| job_user ( tag) |
IBM i Job 사용자. |
| memory_pool_name ( tag) |
Job에서 사용하는 Memory pool 이름. |
| message_queue_library ( tag) |
Message queue 라이브러리. |
| message_queue_name ( tag) |
Message queue 이름. |
| partition_id ( tag) |
IBM i 파티션 ID. |
| pool_name ( tag) |
Memory pool 이름. |
| resource_name ( tag) |
디스크 리소스 이름. IBM i 7.3 이상에서 사용 가능. |
| serial_number ( tag) |
디스크 시리얼 번호. |
| subsystem_name ( tag) |
Subsystem 이름. |
| unit_number ( tag) |
디스크 유닛 번호. |
| unit_type ( tag) |
디스크 유닛 유형. |
| asp_io_requests_per_s | 초당 IO 요청 수. IBM i 7.3 이상에서 사용 가능. Type: float | (gauge) Unit: throughput,reqps Tagged by: asp_number, resource_name, serial_number, unit_number, unit_type |
| asp_percent_busy | 디스크 사용 중 비율. IBM i 7.3 이상에서 사용 가능. Type: float | (gauge) Unit: percent,percent Tagged by: asp_number, resource_name, serial_number, unit_number, unit_type |
| asp_percent_used | 디스크 유닛 사용 비율. Type: float | (gauge) Unit: percent,percent Tagged by: asp_number, serial_number, unit_number, unit_type |
| asp_unit_space_available | 사용 가능한 디스크 유닛 공간. Type: int | (gauge) Unit: digital,B Tagged by: asp_number, serial_number, unit_number, unit_type |
| asp_unit_storage_capacity | 디스크 유닛 용량. Type: int | (gauge) Unit: digital,B Tagged by: asp_number, serial_number, unit_number, unit_type |
| job_active_duration | 활성 Job 지속 시간. Type: float | (gauge) Unit: time,s Tagged by: job_active_status, job_id, job_name, job_status, job_user, subsystem_name |
| job_cpu_usage | Job CPU 사용량. Type: float | (gauge) Unit: percent,percent Tagged by: job_active_status, job_id, job_name, job_status, job_user, subsystem_name |
| job_cpu_usage_pct | Job CPU 사용률. Type: float | (gauge) Unit: percent,percent Tagged by: job_active_status, job_id, job_name, job_status, job_user, subsystem_name |
| job_queue_duration | Job queue에서 보낸 시간. Type: float | (gauge) Unit: time,s Tagged by: job_id, job_name, job_queue_library, job_queue_name, job_queue_status, job_status, job_user, subsystem_name |
| job_queue_held_size | 보류된 Job 수. Type: int | (gauge) Unit: count Tagged by: job_queue_name, job_queue_status, subsystem_name |
| job_queue_released_size | 해제된 Job 수. Type: int | (gauge) Unit: count Tagged by: job_queue_name, job_queue_status, subsystem_name |
| job_queue_scheduled_size | 예약된 Job 수. Type: int | (gauge) Unit: count Tagged by: job_queue_name, job_queue_status, subsystem_name |
| job_queue_size | Job queue의 전체 Job 수. Type: int | (gauge) Unit: count Tagged by: job_queue_name, job_queue_status, subsystem_name |
| job_status_value | Job 상태 표시값. 반환된 Job 레코드는 1로 설정됩니다. Type: int | (gauge) Unit: count Tagged by: job_active_status, job_id, job_name, job_queue_library, job_queue_name, job_queue_status, job_status, job_user, subsystem_name |
| job_temp_storage | Job가 사용하는 임시 저장소. Type: int | (gauge) Unit: digital,MB Tagged by: job_active_status, job_id, job_name, job_user, memory_pool_name, subsystem_name |
| message_queue_critical_size | 설정된 임계값보다 크거나 같은 심각도의 메시지 수. Type: int | (gauge) Unit: count Tagged by: message_queue_library, message_queue_name |
| message_queue_size | Message queue의 전체 메시지 수. Type: int | (gauge) Unit: count Tagged by: message_queue_library, message_queue_name |
| pool_defined_size | 정의된 pool 크기. Type: float | (gauge) Unit: digital,MB Tagged by: pool_name, subsystem_name |
| pool_reserved_size | 예약된 pool 크기. Type: float | (gauge) Unit: digital,MB Tagged by: pool_name, subsystem_name |
| pool_size | 현재 pool 크기. Type: float | (gauge) Unit: digital,MB Tagged by: pool_name, subsystem_name |
| subsystem_active | Subsystem이 활성 상태인지 여부입니다. 활성은 1입니다. Type: int | (gauge) Unit: count Tagged by: subsystem_name |
| subsystem_active_jobs | 현재 활성 Job 수. Type: int | (gauge) Unit: count Tagged by: subsystem_name |
| system_configured_cpus | 설정된 CPU 수. Type: float | (gauge) Unit: count Tagged by: partition_id |
| system_cpu_usage | 평균 CPU 사용률. Type: float | (gauge) Unit: percent,percent Tagged by: partition_id |
| system_current_cpu_capacity | 현재 CPU 용량. Type: float | (gauge) Unit: count Tagged by: partition_id |
| system_normalized_cpu_usage | 정규화된 CPU 사용률. Type: float | (gauge) Unit: percent,percent Tagged by: partition_id |
| system_shared_cpu_usage | 공유 CPU 사용률. Type: float | (gauge) Unit: percent,percent Tagged by: partition_id |
collector¶
| 태그 및 필드 | 설명 |
|---|---|
| instance ( tag) |
인스턴스의 서버 주소 |
| job ( tag) |
인스턴스의 서버 이름 |
| up | 마지막 수집 주기 동안 수집기가 대상에서 정상적으로 데이터를 수집했는지 여부입니다. 1은 true, 0은 false를 의미합니다. Type: int | (gauge) Unit: bool |
FAQ¶
ODBC를 어떻게 검증하나요?¶
ODBC를 먼저 독립적으로 검증하려면, odbcinst -j에 표시되는
odbc.ini에 테스트 DSN을 추가합니다:
그다음 다음 명령을 순서대로 실행합니다:
odbcinst -j
odbcinst -q -d
ldd /opt/ibm/iaccess/lib64/libcwbodbc.so
isql -v IBMI DKUSER '<password>'
드라이버가 등록되어 있고, 동적 라이브러리 의존성이 모두 충족되며, isql이 IBM i에 정상적으로 연결되는지 확인합니다.
IBM i 측에서 무엇을 확인해야 하나요?¶
IBM i에서는 TCP/IP와 Database Host Server가 실행 중이어야 합니다. 수집 계정은 IBM i에 로그인하고 Db2 for i SQL Services 쿼리를 실행할 권한이 있어야 합니다.
왜 메트릭이 없나요?¶
다음 항목을 확인하세요:
- DataKit 호스트가 unixODBC와 IBM i Access ODBC Driver를 로드할 수 있는지.
odbcinst -q -d에서 구성한 드라이버 이름이 표시되는지.isql이 수집 계정으로 IBM i에 연결되는지.- IBM i Database Host Server가 실행 중인지, 네트워크와 방화벽이 접근을 허용하는지.
- 수집 계정이 문서에 나열된 Db2 for i SQL Services에 접근할 권한이 있는지.
- [DataKit 설치 디렉터리]/externals/ibm_i.log에 연결 또는 쿼리 오류가 있는지.