Telegraf 에이전트 타임스탬프를 InfluxDB 설치 서버 시간에 맞추기
본 설정은 환경에 따라 다르게 동작할 수 있으므로, 실제 적용 전 반드시 테스트 환경에서 충분히 검증한 후 아래의 고려사항을 확인하고 적용하시기 바랍니다.
적용 전 고려사항
InfluxDB 서버 응답 문제
InfluxDB 서버로부터 응답이 없거나 네트워크 연결이 불안정한 경우,
timestamp.sh
스크립트가 올바른 타임스탬프를 받아오지 못할 수 있습니다.이 경우 Starlark processor는 이전에 저장된 전역 타임스탬프 값을 계속 사용할 수 있어, 데이터의 타임스탬프가 실제 서버 시간과 불일치할 수 있습니다.
네트워크 지연 및 타임아웃
네트워크 상태에 따라 응답이 지연되면, 스크립트 실행 시 타임아웃에 도달하여 타임스탬프 값이 누락되거나 잘못 전달될 수 있습니다.
서버 시간 불일치
InfluxDB 설치 서버의 시스템 시간이 예상과 다를 경우, 수집된 타임스탬프가 실제 시간과 차이가 발생할 수 있습니다.
다른 플러그인과의 충돌
Starlark processor가 모든 metric의 타임스탬프를 덮어쓰므로, 다른 입력 또는 처리 플러그인에서 설정한 타임스탬프 정보와 충돌이 발생할 수 있습니다.
파일 구성
1. timestamp.sh
#!/bin/bash
timestamp=$(curl -I {URL}:8086/ping 2>/dev/null | grep Date: | sed 's/Date: //g')
epoch=$(date -d "$timestamp" +%s)
epoch_ns=$(($epoch * 1000000000))
echo $epoch_ns
수정할 내용
{URL}: InfluxDB 서버의 주소를 입력합니다.
동작 과정
curl -I {URL}:8086/ping
명령으로 InfluxDB 서버의 ping 응답 헤더에서Date
정보를 추출합니다.date -d "$timestamp" +%s
를 통해 해당 날짜를 Unix 시간(초 단위)으로 변환합니다.초 단위 값을 10억(1,000,000,000)과 곱해 나노초 단위로 변환합니다.
2. telegraf.conf
[[outputs.influxdb]]
urls = [ "http://{URL}:8086" ]
database = "Default"
retention_policy = "autogen"
write_consistency = "any"
namedrop = [ "timestamp" ]
[[inputs.exec]]
commands = [ "{Timestamp File Direcotry}" ]
timeout = "5s"
data_format = "value"
data_type = "integer"
name_override = "timestamp"
[[processors.starlark]]
source = '''
state = {"global_timestamp":None}
def apply(metric):
if metric.name == "timestamp" and "value" in metric.fields:
state["global_timestamp"] = metric.fields["value"]
if state["global_timestamp"] != None:
metric.time = state["global_timestamp"]
return metric
'''
수정할 내용
{URL}: InfluxDB 서버의 주소를 입력합니다.
{Timestamp File Path}:
timestamp.sh
파일의 경로를 입력합니다.
설명
Telegraf의 입력, 처리, 출력 플러그인을 정의하여, InfluxDB에 데이터를 전송하기 전 타임스탬프를 동기화합니다.
Telegraf 설정 실행 순서
Telegraf 설정을 위와 같이 하였을 때, 아래와 같은 순서로 설정된 플러그인들을 실행합니다.
1. Input Plugins (데이터 수집)
예시에서는 [[inputs.exec]] 플러그인이 timestamp.sh 스크립트를 실행해 timestamp measurement로 데이터를 수집합니다.
2. Processors (수집된 데이터 처리)
[[processors.starlark]] 플러그인은 모든 metric에 대해 apply(metric) 함수를 실행해, timestamp measurement에서 가져온 값을 각 metric의 time 필드로 설정합니다.
3. Output Plugins (처리된 데이터를 출력)
[[outputs.influxdb]] 플러그인은 데이터를 InfluxDB로 전송합니다.
단, namedrop 설정에 의해 timestamp measurement는 제외됩니다.
유의사항
1. exec 플러그인의 수집 Measurement
name_override = "timestamp"
설정에 따라, 데이터는 timestamp라는 measurement 이름으로 수집됩니다.이 설정이 없다면 기본적으로 실행된 명령어 (timestamp.sh)의 이름에서 파생된 measurement 이름이 사용됩니다.
2. def apply(metric) 함수 실행되는 시점
def apply(metric)
함수는 Telegraf에서[[processors.starlark]]
플러그인이 활성화된 상태로 실행될 때, 각 metric(즉, Telegraf가 수집한 개별 데이터 포인트)에 대해 호출됩니다.
3. metric.time은 예약어
metric.time
은 Telegraf의 Starlark processor에서 제공하는 예약 필드입니다.이 필드는 개별 metric의 타임스탬프를 나타냅니다.