본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Fly.io의 메트릭

원문 보기 위키 갱신

이 문서는 Fly.io 플랫폼에 내장된 완전 관리형 메트릭 솔루션을 설명해요. 관리형 Prometheus(VictoriaMetrics 기반)와 Grafana 대시보드, 내장 메트릭, 커스텀 메트릭까지, Fly 앱을 쉽게 모니터링할 수 있는 방법을 제공해요. Prometheus에 익숙하다면 바로 쿼리하고 대시보드를 만들어 볼 수 있어요.

출처: 문서

본문

Fly.io 플랫폼에는 Fly 앱을 쉽게 모니터링할 수 있도록 완전 관리형 메트릭 솔루션이 포함되어 있어요. 다음 구성 요소를 포함해요:

  • Fly.io의 Prometheus: 관리형 Prometheus 호환 시계열 스토리지
  • 대시보드: 모든 내장 메트릭의 상세 시각화를 제공하는 관리형 Grafana
  • 내장 메트릭: 배포하는 모든 Fly 앱에서 자동으로 전송되는 메트릭
  • 커스텀 메트릭: 추가 커스터마이즈를 위해 Fly 앱에서 더 많은 메트릭을 노출

Fly.io의 Prometheus

Prometheus는 메트릭을 효율적으로 저장하고 쿼리하는 데 사용되는 인기 있는 오픈소스 모니터링 시스템으로, 다양한 시스템과 호환되는 안정적인 HTTP 쿼리 API를 갖추고 있어요.

Fly.io의 Prometheus는 VictoriaMetrics를 기반으로 한 완전 관리형 서비스예요. 대부분의 일반적인 Prometheus 쿼리 API 엔드포인트를 지원해요:

remote read (/api/v1/read) 원격 스토리지 통합은 지원되지 않아요.

MetricsQL

Prometheus 쿼리는 일반적으로 PromQL 쿼리 언어를 기반으로 해요. Fly.io의 Prometheus 쿼리는 VictoriaMetrics의 MetricsQL을 사용해요. 이는 PromQL 위에 사용자 경험 문제를 고치고 유용한 기능과 함수를 추가한 하위 호환 쿼리 언어예요.

주요 기능:

  • 더 나은 rate()와 increase() 함수로 바로 작동해요. irate 우회책이나 Grafana의 마법의 $__rate_interval 선택기를 모든 쿼리에 붙일 필요가 없어요. 사실 대괄호를 완전히 생략해도 MetricsQL이 올바르게 처리해요.
  • drop_common_labels, label_set 같은 라벨 조작 함수가 훨씬 더 많아요.
  • topk_avg는 전체 시리즈 범위(개별 포인트가 아닌)에 걸쳐 평균한 상위 k 시계열과, 나머지 모든 시리즈의 합을 "other" 라벨로 반환해요. 잠재적으로 많은 수의 시리즈 중에서 작고 필터링된 보기를 제공하는 데 유용해요.

쿼리하기

다음 엔드포인트로 쿼리를 보낼 수 있어요:

https://api.fly.io/prometheus/<org-slug>/

Fly Access Token으로 인증해야 해요. 토큰 유형에 따라 헤더는 Bearer 형식(Authorization: Bearer ***) 또는 FlyV1 형식(Authorization: FlyV1 ***)을 사용해요. 자신의 조직에 범위가 지정된 시리즈만 쿼리할 수 있어요.

수동으로

조직 slug 찾기

조직을 나열하고, org slug를 찾아 로컬 변수로 설정해 보아요.

flyctl orgs list
ORG_SLUG=[org-slug]

액세스 토큰 얻기

TOKEN=$(flyctl auth token)

테스트해 보세요!

curl https://api.fly.io/prometheus/$ORG_SLUG/api/v1/query \
  --data-urlencode 'query=sum(increase(fly_edge_http_responses_count)) by (app, status)' \
  -H "Authorization: Bearer ***"

보존, 비용 및 제한

Fly.io의 Prometheus는 약 15일 동안 메트릭 데이터를 보존하며 운영 모니터링을 위한 것입니다. 더 긴 보존이 필요하다면 자신만의 모니터링 스택을 실행해 보아요. Fly.io의 User Apps 관찰성 가이드는 준비된 스택을 배포해 주거나, Fly.io 엔드포인트에서 자신의 Prometheus 설치로 페더레이션(federate)할 수 있어요.

현재 관리형 Prometheus와 Grafana에 대한 추가 요금은 없어요. 향후 가격이 바뀔 수 있으며, Fly.io가 사전에 통지할 거예요.

알아두어야 할 몇 가지 실용적인 제한이 있어요:

  • 앱의 메트릭 엔드포인트 응답을 16MB로 제한하고 더 큰 것은 버려요.
  • 매우 높은 카디널리티의 커스텀 메트릭은 버릴 수 있어요.

대시보드

더 고급 메트릭 모니터링을 위해 대시보드를 사용해 복잡한 Prometheus 쿼리를 정리하고 시각화할 수 있어요.

Fly.io 대시보드의 Metrics 탭은 Prometheus에 저장된 내장 메트릭을 사용해 Fly 앱의 개요를 제공해요.

관리형 Grafana

Grafana는 데이터 소스에 대한 쿼리를 동적이고 재사용 가능한 대시보드로 구성할 수 있게 해 주는 인기 있는 오픈소스 데이터 시각화 웹 애플리케이션이에요.

우리는 fly-metrics.net에서 관리형 Grafana 인스턴스를 제공하며, 여러분의 Prometheus 데이터 소스와 전체 내장 메트릭을 다루는 상세 대시보드가 미리 구성되어 있어요.

Explore 패널을 사용해 미리 구성된 Prometheus 데이터 소스에 대해 임시(ad-hoc) 쿼리를 실행하거나, 추가 커스터마이즈 또는 커스텀 메트릭 시각화를 위해 추가 대시보드를 만들거나 가져올 수도 있어요.

화면 왼쪽 아래의 사용자 아이콘 아래에 있는 "Switch organization" 링크를 클릭해 Fly.io 조직 사이를 전환할 수 있어요.

외부 또는 셀프 호스팅 Grafana

기존 Grafana 설치로 Prometheus 엔드포인트를 구성하거나, Fly.io에서 하나 호스팅할 수도 있어요. 어느 쪽이든 아래처럼 설정할 수 있어요:

  1. Prometheus 데이터 소스 추가 (Settings -> Data Sources -> Add data source -> Prometheus)
  2. 다음으로 폼을 채워요:
  • HTTP -> URL: https://api.fly.io/prometheus/<org-slug>/
  • Custom HTTP Headers -> + Add Header:
    • Header: Authorization
    • Value: FlyV1 <token> (fly tokens create로 만든 토큰용)
    • Value: Bearer <token> (flyctl auth token의 토큰에만 해당)

설정 완료예요.

우리는 Fly.io 대시보드를 외부 Grafana 인스턴스에서 사용할 수 있도록 Grafana.com에 공개해요. 설치하려면 나열된 ID로 대시보드를 가져오기만 하면 돼요. 대시보드 변경에 기여하고 싶다면 저장소를 만들었어요.

알림(Alerting)

Fly.io는 메트릭에 대한 내장 알림을 포함하고 있지 않아요. 그래서 Prometheus 엔드포인트에 대해 알림을 직접 설정해야 해요. 두 가지 흔한 접근 방식:

  • Grafana 알림: Fly.io Prometheus 데이터 소스를 Grafana 인스턴스에 연결한 뒤((External or self-hosted Grafana](#external-or-self-hosted-grafana) 섹션 참고), 데이터 소스에 대한 쿼리에 Grafana 알림 규칙을 만들고 이메일, Slack, PagerDuty 같은 연락처 지점으로 알림을 보내요.
  • Prometheus와 Alertmanager: Fly.io 엔드포인트에서 페더레이션하는 자신만의 Prometheus를 실행하고 Alertmanager를 사용해 알림을 보내요.

이미 Grafana나 Prometheus를 실행하고 있지 않다면, Fly.io의 User Apps 관찰성 가이드가 알림을 만들 수 있는 준비된 스택(VictoriaMetrics와 Grafana)을 배포해 줘요.

내장 메트릭

Fly 앱은 많은 내장 메트릭을 자동으로 게시해요.

다르게 표시되지 않는 한 메트릭 유형은 모두 Gauges예요.

이름이 _count로 끝나는 메트릭은 모두 Counters예요.

기본 이름이 <name>인 Histogram 메트릭은 여러 시리즈를 노출해요:

  • <name>_bucket{le}
  • <name>_sum
  • <name>_count

표준 라벨

게시된 모든 시리즈는 다음 라벨을 포함해요:

  • app: 앱 이름
  • region: Fly.io 리전
  • host: 4자리 호스트 ID (소문자 16진수)
  • instance: 앱 인스턴스 ID (fly_edge_와 fly_volume_를 제외한 모든 시리즈)

앱이 같은 라벨로 커스텀 메트릭을 노출하면 그 값은 덮어써져요.

프록시 시리즈

TCP 기반 핸들러(HTTP, TLS 또는 순수 TCP)를 사용하는 모든 앱은 edge와 app 프록시 메트릭을 게시해요:

라벨:

  • proxy_id: "blue" 또는 "green" (프록시가 재시작/업데이트될 때 뒤집혀요)

Edge - fly_edge_

fly_edge_http_responses_count{status}
fly_edge_http_response_time_seconds{status} (Histogram)
fly_edge_tcp_connects_count
fly_edge_tcp_disconnects_count
fly_edge_data_out (Counter, bytes)
fly_edge_data_in (Counter, bytes)
fly_edge_tls_handshake_errors{servername} (Counter)
fly_edge_tls_handshake_time_seconds{version} (Histogram)

App - fly_app_

fly_app_concurrency
fly_app_http_responses_count{status}
fly_app_http_response_time_seconds{status} (Histogram)
fly_app_connect_time_seconds (Histogram)
fly_app_tcp_connects_count
fly_app_tcp_disconnects_count

인스턴스 시리즈 - fly_instance_

앱 VM의 /proc 파일 시스템에서 파생돼요.

fly_instance_up = 1은 VM이 올바르게 보고하고 있음을 나타내요.

인스턴스 종료 - fly_instance_exit_

인스턴스 종료에 대한 정보예요. 이 메트릭들은 인스턴스가 왜 종료되는지 이해하는 데 도움을 주며 알림과 디버깅에 사용할 수 있어요.

  • fly_instance_exit_code: 인스턴스가 종료될 때 메인 프로세스의 종료 코드예요. 0은 일반적으로 정상 종료를 나타내고, 0이 아닌 값은 오류나 비정상 종료를 나타내요.
  • fly_instance_exit_oom: 인스턴스가 메모리 부족(OOM)으로 종료되었는지 나타내는 불리언 플래그(0 또는 1)예요. 1은 메모리 한도를 초과해 인스턴스가 종료되었음을 의미해요.
  • fly_instance_exit_vm_code: VM 수준의 종료 코드로, 애플리케이션 종료 코드와 다를 수 있어요. 애플리케이션 수준의 실패와 VM 수준의 문제를 구분하는 데 도움이 돼요.

인스턴스 메모리 - fly_instance_memory_

/proc/meminfo에서 파생돼요. 모든 단위는 bytes예요.

fly_instance_memory_mem_total
fly_instance_memory_mem_free
fly_instance_memory_mem_available
fly_instance_memory_buffers
fly_instance_memory_cached
fly_instance_memory_swap_cached
fly_instance_memory_active
fly_instance_memory_inactive
fly_instance_memory_swap_total
fly_instance_memory_swap_free
fly_instance_memory_dirty
fly_instance_memory_writeback
fly_instance_memory_slab
fly_instance_memory_shmem
fly_instance_memory_vmalloc_total
fly_instance_memory_vmalloc_used
fly_instance_memory_vmalloc_chunk

인스턴스 로드 및 CPU

  • load_average는 /proc/loadavg (getloadavg)에서 파생돼요. "시스템 로드 평균"으로, 시스템 실행 대기열의 프로세스 수를 측정하며 샘플은 1, 5, 15 minutes에 걸친 평균을 나타내요.

  • cpu는 /proc/stat에서 파생되고, 각 CPU(cpu_id)가 다른 종류의 작업(mode. user, nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice 중 하나일 수 있음)에 보낸 시간을 세요. 시간 단위는 센티초(0.01초)의 'clock ticks'예요.

다음 CPU 메트릭은 CPU 성능과 관련돼요:

  • cpu_baseline은 CPU 유형과 vCPU 수에서 계산된 CPU 수의 베이스라인 할당량(quota)이에요.
  • cpu_balance는 누적된 CPU 버스트 잔액을 clock ticks(센티초)로 나타내요.
  • cpu_throttle은 cgroup cpu.stat의 throttled_time 필드에서 파생되고, 할당량을 소진한 후 CPU가 조절(throttle)된 시간을 'clock ticks'(센티초)로 세요.
fly_instance_load_average{minutes}
fly_instance_cpu{cpu_id, mode} (Counter, centiseconds)
fly_instance_cpu_baseline (CPUs)
fly_instance_cpu_balance (centiseconds)
fly_instance_cpu_throttle (Counter, centiseconds)

인스턴스 디스크 - fly_instance_disk_

/proc/diskstats의 필드 1-11에서 파생된 카운터예요. time_ 시리즈의 단위는 밀리초이고, sectors_의 단위는 512바이트 섹터예요.

라벨:

  • device: 임시 VM 루트 디스크(vdb)와 마운트된 모든 볼륨(vdc)에 대해 게시돼요.
fly_instance_disk_reads_completed
fly_instance_disk_reads_merged
fly_instance_disk_sectors_read
fly_instance_disk_time_reading
fly_instance_disk_writes_completed
fly_instance_disk_writes_merged
fly_instance_disk_sectors_written
fly_instance_disk_time_writing
fly_instance_disk_io_in_progress
fly_instance_disk_time_io
fly_instance_disk_time_io_weighted

인스턴스 네트워킹 - fly_instance_net_

/proc/net/dev에서 파생된 카운터예요.

라벨:

  • device: 인터페이스 이름으로, eth0 또는 dummy0(무시)예요.
fly_instance_net_recv_bytes
fly_instance_net_recv_packets
fly_instance_net_recv_errs
fly_instance_net_recv_drop
fly_instance_net_recv_fifo
fly_instance_net_recv_frame
fly_instance_net_recv_compressed
fly_instance_net_recv_multicast
fly_instance_net_sent_bytes
fly_instance_net_sent_packets
fly_instance_net_sent_errs
fly_instance_net_sent_drop
fly_instance_net_sent_fifo
fly_instance_net_sent_colls
fly_instance_net_sent_carrier
fly_instance_net_sent_compressed

인스턴스 파일 디스크립터 - fly_instance_filefd_

/proc/sys/fs/file-nr에서 파생된, 할당된 그리고 최대 허용된 파일 디스크립터에 대한 정보예요.

fly_instance_filefd_allocated
fly_instance_filefd_maximum

인스턴스 파일시스템 - fly_instance_filesystem_

VFS 파일 시스템 정보에서 파생된 파일시스템 메트릭이에요.

라벨:

  • mount: 마운트 포인트 이름으로, /와 Volumes를 사용한다면 fly.toml의 목적지 이름이에요.
fly_instance_filesystem_blocks
fly_instance_filesystem_block_size
fly_instance_filesystem_blocks_free
fly_instance_filesystem_blocks_avail

볼륨 - fly_volume_

라벨:

  • id: 볼륨 ID

조직의 어떤 앱에 Volumes를 사용하고 있다면, 볼륨의 thin LV의 LSize와 Data%에서 파생된 이 시리즈를 쿼리할 수 있어요.

fly_volume_size_bytes
fly_volume_used_pct (0-100)

Postgres - pg_

Fly.io에 호스팅된 Postgres 데이터베이스가 있다면, 다음 시리즈를 postgres_exporter를 통해 자동으로 얻어요:

pg_stat_activity_count
pg_stat_activity_max_tx_duration
pg_stat_archiver_archived_count
pg_stat_archiver_failed_count
pg_stat_bgwriter_buffers_alloc
pg_stat_bgwriter_buffers_backend_fsync
pg_stat_bgwriter_buffers_backend
pg_stat_bgwriter_buffers_checkpoint
pg_stat_bgwriter_buffers_clean
pg_stat_bgwriter_checkpoint_sync_time
pg_stat_bgwriter_checkpoint_write_time
pg_stat_bgwriter_checkpoints_req
pg_stat_bgwriter_checkpoints_timed
pg_stat_bgwriter_maxwritten_clean
pg_stat_bgwriter_stats_reset
pg_stat_database_blk_read_time
pg_stat_database_blk_write_time
pg_stat_database_blks_hit
pg_stat_database_blks_read
pg_stat_database_conflicts_confl_bufferpin
pg_stat_database_conflicts_confl_deadlock
pg_stat_database_conflicts_confl_lock
pg_stat_database_conflicts_confl_snapshot
pg_stat_database_conflicts_confl_tablespace
pg_stat_database_conflicts
pg_stat_database_deadlocks
pg_stat_database_numbackends
pg_stat_database_stats_reset
pg_stat_database_tup_deleted
pg_stat_database_tup_fetched
pg_stat_database_tup_inserted
pg_stat_database_tup_returned
pg_stat_database_tup_updated
pg_stat_database_xact_commit
pg_stat_database_xact_rollback
pg_stat_replication_pg_current_wal_lsn_bytes
pg_stat_replication_pg_wal_lsn_diff
pg_stat_replication_reply_time
pg_replication_lag
pg_database_size_bytes

커스텀 메트릭

내장 메트릭을 넘어 더 커스터마이즈하려면, Fly 앱이 우리가 15초마다 자동으로 스크랩해 Prometheus로 보낼 메트릭 엔드포인트를 노출할 수 있어요.

구성

애플리케이션의 fly.toml에 [metrics] 섹션을 추가해 보아요:

[metrics]
port = 9091
path = "/metrics" # default for most prometheus exporters

앱이 여러 프로세스를 사용한다면 각각 자체 processes 세트를 가진 여러 [[metrics]] 섹션을 추가할 수 있어요:

[[metrics]]
port = 9394
path = "/metrics"
processes = ["web"]

[[metrics]]
port = 9113
path = "/metrics"
processes = ["proxy"]

계측(Instrumentation)

앱을 계측하고 0.0.0.0에서 메트릭을 노출해 보아요.

지원되는 클라이언트 라이브러리가 많고, Prometheus 형식의 메트릭을 반환하는 기성 exporters도 많아요.

인증

Prometheus API에 인증하는 방법은 토큰에 부여하려는 접근 수준에 따라 몇 가지로 나뉘어요.

Fly Access Token

앞선 예시처럼 전체 액세스 토큰은 flyctl auth token으로 생성한 뒤 Authorization 헤더에서 bearer 토큰으로 전달할 수 있어요. 헤더는 다음과 같아 보여요:

Authorization: Bearer ***

Fly 조직 제한 또는 읽기 전용 토큰

이런 종류의 토큰 또는 "macaroon"은 단일 조직으로 범위를 제한하거나 읽기 작업만 허용하도록 구성할 수 있어요. 계정 아래의 모든 조직에 접근 권한을 부여하는 완전한 읽기-쓰기 토큰을 사용하는 것보다 더 안전할 수 있어요.

토큰 생성

조직 제한 토큰을 만들어 보아요:

fly tokens create org -o THE_ORGANIZATION

읽기 전용 조직 제한 토큰을 만들어 보아요:

fly tokens create readonly

생성되면 이 토큰은 이렇게 생겼어요: FlyV1 fm2_lJPECAAAAAAAAC7txBAzYI6PRWhHLT...(a lot of base64-encoded text).

토큰 사용

토큰 유형에 따라 올바른 스킴을 사용해요:

  • Bearer <token> → flyctl auth token용.
  • FlyV1 <token> → fly tokens create로 만든 모든 토큰용.

fly tokens create로 만든 토큰의 예시:

Authorization: FlyV1 fm2_lJ.....(a lot of base64-encoded text)

더 알아보기 (Learn more)