Prometheus 커넥터

Prometheus 커넥터

Prometheus 커넥터는 Prometheus 메트릭을 Trino에서 테이블로 읽을 수 있게 해주는 커넥터예요.

출처: 문서

본문

Prometheus를 조회하는 메커니즘은 Prometheus HTTP API를 사용하는 거예요. 특히 모든 쿼리는 다음과 같은 형태의 Prometheus Instant 쿼리로 해석돼요: http://localhost:9090/api/v1/query?query=up[21d]&time=1568229904.000. 이 경우 up 메트릭은 Trino 쿼리 테이블 이름에서 가져오고, 21d는 쿼리의 기간(duration)이에요. Prometheus의 time 값은 TIMESTAMP 필드에 해당해요. Trino 쿼리는 TIMESTAMP 필드 사용을 필요에 따라 기간과 시간 값으로 변환해요. Trino 스플릿은 쿼리 범위를 대략 동일한 덩어리로 나누어 생성돼요.

요구 사항 (Requirements)

Prometheus를 조회하려면 다음이 필요해요.

  • Trino 코디네이터와 워커에서 Prometheus 서버까지의 네트워크 접근. 기본 포트는 9090이에요.
  • Prometheus 버전 2.15.1 이상.

설정 (Configuration)

Prometheus 커넥터를 example 카탈로그로 마운트하려면 etc/catalog/example.properties를 만들고 속성을 적절히 교체해요.

connector.name=prometheus
prometheus.uri=http://localhost:9090
prometheus.query.chunk.size.duration=1d
prometheus.max.query.range.duration=21d
prometheus.cache.ttl=30s
prometheus.bearer.token.file=/path/to/bearer/token/file
prometheus.read-timeout=10s

설정 속성 (Configuration properties)

다음 설정 속성을 사용할 수 있어요.

속성 이름 설명 기본값
prometheus.uri Prometheus 코디네이터 호스트를 찾을 위치. http://localhost:9090
prometheus.query.chunk.size.duration Prometheus에 보내는 각 쿼리의 기간. 대응하는 카탈로그 세션 속성은 query_chunk_size_duration. 1d
prometheus.max.query.range.duration Prometheus에 보내는 전체 쿼리의 너비. prometheus.query.chunk.size.duration 크기의 쿼리들로 나뉘어요. 대응하는 카탈로그 세션 속성은 max_query_range_duration. 21d
prometheus.cache.ttl 이 설정 파일의 값이 캐시되는 시간. 30s
prometheus.read-timeout Prometheus 쿼리가 타임아웃되기 전까지의 시간. 10s
prometheus.auth.user 기본 인증용 사용자 이름.
prometheus.auth.password 기본 인증용 비밀번호.
prometheus.auth.http.header.name 인증에 사용할 헤더의 이름. Authorization
prometheus.bearer.token.file Prometheus 접근에 필요한 경우 bearer 토큰을 담은 파일.
prometheus.case-insensitive-name-matching Prometheus 메트릭 이름을 대소문자 구분 없이 매칭. false
prometheus.http.additional-headers Prometheus 엔드포인트로 보낼 추가 헤더. 이 헤더들은 쉼표로 구분하고 :로 구분자 표기해야 해요. 예를 들어 header1:value1,header2:value2header1, header2 두 헤더를 각각 value1, value2 값으로 보내요. 헤더 이름이나 값 안의 쉼표(,)·콜론(:) 문자는 백슬래시(\)로 이스케이프해요.

Trino의 사용 가능한 힙을 소진하지 않기 (Not exhausting your Trino available heap)

prometheus.query.chunk.size.durationprometheus.max.query.range.duration은 Prometheus에서 너무 많은 데이터가 돌아오지 않도록 Trino를 보호하는 값이에요. 특히 prometheus.max.query.range.duration이 관심 대상이에요.

한동안 실행된 Prometheus 인스턴스에서 데이터 보존 설정에 따라 21d는 너무 클 수 있어요. 1h가 더 합리적인 설정일지도 몰라요. 1h의 경우 prometheus.query.chunk.size.duration10m으로 설정해 쿼리 창을 6개의 쿼리로 나누면, 각각을 Trino 스플릿에서 처리할 수 있어요.

주로 쿼리 발행자는 TIMESTAMPWHERE 절 제한을 활용해 상한과 하한을 설정해 비교적 작은 창을 정의하는 방식으로 Prometheus가 반환하는 데이터 양을 제한할 수 있어요. 예:

SELECT * FROM example.default.up WHERE TIMESTAMP > (NOW() - INTERVAL '10' second);

쿼리에 WHERE 절 제한이 없다면, 이 설정 값들이 무제한 쿼리로부터 보호하는 역할을 해요.

Bearer 토큰 인증 (Bearer token authentication)

Prometheus는 모든 쿼리에 Authorization 헤더를 요구하도록 설정할 수 있어요. prometheus.bearer.token.file의 값은 설정된 파일에서 bearer 토큰을 읽을 수 있게 해줘요. 이 파일은 선택 사항이며 Prometheus 설정이 요구하지 않는 한 필요 없어요. prometheus.auth.http.header.name으로 bearer 토큰에 커스텀 헤더 이름을 사용할 수 있어요. 기본값은 Authorization이에요.

타입 매핑 (Type mapping)

Trino와 Prometheus가 서로 지원하지 않는 타입을 각각 지원하기 때문에, 이 커넥터는 데이터를 읽을 때 일부 타입을 수정해요.

이 커넥터는 다음 표에 따라 Trino 타입으로 정의된 매핑을 가진 고정 컬럼을 반환해요.

Prometheus 컬럼 Trino 타입
labels MAP(VARCHAR,VARCHAR)
TIMESTAMP TIMESTAMP(3) WITH TIMEZONE
value DOUBLE

다른 타입은 지원하지 않아요.

다음 예제 쿼리 결과는 Prometheus up 메트릭이 Trino에서 어떻게 표현되는지 보여줘요.

SELECT * FROM example.default.up;
                        labels                         |           timestamp            | value
--------------------------------------------------------+--------------------------------+-------
{instance=localhost:9090, job=prometheus, __name__=up} | 2022-09-01 06:18:54.481 +09:00 |   1.0
{instance=localhost:9090, job=prometheus, __name__=up} | 2022-09-01 06:19:09.446 +09:00 |   1.0
(2 rows)

SQL 지원 (SQL support)

이 커넥터는 Prometheus의 데이터와 메타데이터에 접근하는 전역적으로 사용 가능한 문장과 읽기 연산 문장을 제공해요.

더 알아보기 (Learn more)

Prometheus 커넥터는 시계열 데이터를 다루는 커넥터예요. 다른 시계열 커넥터와 비교해 보려면 커넥터 목록을 참고해 보세요.