InfluxDB의 Task(예약 작업), 다운샘플링, 알림(Alert) 설정을 정리합니다.

Task (예약 작업)

Task는 Flux 스크립트를 주기적으로 실행하는 예약 작업입니다.
다운샘플링, 데이터 변환, 알림 등에 활용됩니다.

Task 생성

웹 UI에서 생성

InfluxDB 웹 UI → Tasks → Create Task

Flux 스크립트로 생성

option task = {
    name: "downsample_cpu_hourly",
    every: 1h,
    offset: 5m    // 데이터 지연 고려 (5분 후 실행)
}

from(bucket: "raw_metrics")
  |> range(start: -task.every)
  |> filter(fn: (r) => r._measurement == "cpu")
  |> aggregateWindow(every: 1h, fn: mean, createEmpty: false)
  |> to(bucket: "downsampled_metrics", org: "myorg")

Task 옵션

옵션 설명 예시
name 작업 이름 "downsample_cpu"
every 실행 간격 1h, 5m, 1d
cron Cron 표현식 "0 * * * *" (매시 정각)
offset 실행 지연 5m (데이터 도착 대기)

다운샘플링 (Downsampling)

원본 데이터를 요약하여 저장 공간을 절약하고 장기 조회 성능을 향상시킵니다.

전략 예시

보존 기간 해상도 버킷
7일 원본 (10초) raw_metrics
30일 5분 평균 metrics_5m
1년 1시간 평균 metrics_1h
무기한 1일 평균 metrics_1d

다운샘플링 Task 예시

// 5분 평균으로 다운샘플링
option task = { name: "downsample_5m", every: 5m, offset: 30s }

from(bucket: "raw_metrics")
  |> range(start: -task.every)
  |> filter(fn: (r) => r._measurement == "cpu" or r._measurement == "memory")
  |> aggregateWindow(every: 5m, fn: mean, createEmpty: false)
  |> to(bucket: "metrics_5m", org: "myorg")
// 1시간 평균 + 최대값 다운샘플링
option task = { name: "downsample_1h", every: 1h, offset: 5m }

data = from(bucket: "metrics_5m")
  |> range(start: -task.every)
  |> filter(fn: (r) => r._measurement == "cpu")

// 평균
data |> aggregateWindow(every: 1h, fn: mean) |> to(bucket: "metrics_1h_avg")

// 최대값
data |> aggregateWindow(every: 1h, fn: max) |> to(bucket: "metrics_1h_max")

알림 (Alert / Check)

InfluxDB 2.x는 내장 알림 기능을 제공합니다.

구성 요소

구성 요소 설명
Check 데이터를 주기적으로 확인하고 상태 판단
Notification Rule 상태 변경 시 알림 전송 규칙
Notification Endpoint 알림 수신 대상 (Slack, Email, PagerDuty 등)

Check 종류

종류 설명
Threshold Check 임계값 기반 (값 > 90이면 CRIT)
Deadman Check 데이터 미수신 감지 (10분간 데이터 없으면 알림)

Threshold Check 예시 (Flux)

import "influxdata/influxdb/monitor"

option task = { name: "cpu_alert", every: 1m }

data = from(bucket: "mybucket")
  |> range(start: -5m)
  |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_user")
  |> aggregateWindow(every: 1m, fn: mean)

data
  |> monitor.check(
      crit: (r) => r._value > 90.0,
      warn: (r) => r._value > 70.0,
      info: (r) => r._value > 50.0,
      ok: (r) => r._value <= 50.0,
      messageFn: (r) => "CPU 사용률: ${string(v: r._value)}% on ${r.host}"
  )

Deadman Check (데이터 미수신 감지)

import "influxdata/influxdb/monitor"

option task = { name: "deadman_check", every: 5m }

from(bucket: "mybucket")
  |> range(start: -10m)
  |> filter(fn: (r) => r._measurement == "heartbeat")
  |> monitor.deadman(t: -5m)

Notification Endpoint 설정

Slack

influx notification-endpoint create \
  --name slack-alerts \
  --type slack \
  --url "https://hooks.slack.com/services/T00/B00/xxx"

Webhook (범용)

influx notification-endpoint create \
  --name webhook-alerts \
  --type http \
  --url "https://myapp.com/webhook/alerts" \
  --method POST

Task 관리

# Task 목록
influx task list

# Task 실행 이력
influx task log list --task-id <task-id>

# Task 비활성화/활성화
influx task update --id <task-id> --status inactive
influx task update --id <task-id> --status active

# Task 삭제
influx task delete --id <task-id>

# 수동 실행
influx task retry-failed --id <task-id>

관련된 글 (influxdb > lecture-influxdb)