192 lines
5.1 KiB
HCL
192 lines
5.1 KiB
HCL
job "vector-nm" {
|
||
datacenters = ["dc1"]
|
||
type = "service"
|
||
|
||
group "vector" {
|
||
|
||
# constraint {
|
||
# attribute = "${node.unique.name}"
|
||
# value = "felis"
|
||
# }
|
||
network {
|
||
port "vector-api" {
|
||
static = 8686
|
||
}
|
||
}
|
||
service {
|
||
name = "vector-api"
|
||
tags = [
|
||
"traefik.enable=true",
|
||
"traefik.http.routers.${NOMAD_JOB_NAME}.rule=Host(`vector-api.service.lan`)",
|
||
"traefik.http.routers.${NOMAD_JOB_NAME}.entrypoints=web",
|
||
"traefik.http.routers.${NOMAD_JOB_NAME}.tls=false",
|
||
"traefik.consulcatalog.connect=true"
|
||
]
|
||
port = "vector-api"
|
||
|
||
check {
|
||
name = "vector-api"
|
||
type = "http"
|
||
path = "/health"
|
||
interval = "50s"
|
||
timeout = "2s"
|
||
|
||
check_restart {
|
||
limit = 3
|
||
grace = "30s"
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
restart {
|
||
interval = "24h"
|
||
attempts = 1000
|
||
delay = "30s"
|
||
mode = "delay"
|
||
}
|
||
|
||
# Монтируем Docker-сокет с хоста
|
||
#volume "docker-sock" {
|
||
# type = "host"
|
||
# source = "docker-sock" # Убедитесь, что такой host volume определен на клиенте
|
||
# read_only = true
|
||
#}
|
||
|
||
|
||
task "vector-nomad" {
|
||
driver = "raw_exec"
|
||
|
||
template {
|
||
destination = "${NOMAD_TASK_DIR}/vector.yaml"
|
||
change_mode = "signal"
|
||
change_signal = "SIGHUP"
|
||
data = <<EOH
|
||
---
|
||
data_dir: "${NOMAD_ALLOC_DIR}/vector/data"
|
||
|
||
api:
|
||
enabled: true
|
||
address: "0.0.0.0:8686"
|
||
|
||
sources:
|
||
docker_logs:
|
||
type: docker_logs
|
||
include_containers: ["*"] # Собираем логи всех контейнеров
|
||
exclude_containers: [] # Можно исключить ненужные контейнеры
|
||
|
||
transforms:
|
||
# Добавляем метаданные Nomad к логам
|
||
add_nomad_metadata:
|
||
type: remap
|
||
inputs: ["docker_logs"]
|
||
source: |-
|
||
# Добавляем метаданные из переменных окружения Nomad
|
||
.nomad = {
|
||
"job_id": "${NOMAD_JOB_ID}",
|
||
"job_name": "${NOMAD_JOB_NAME}",
|
||
"task_name": "${NOMAD_TASK_NAME}",
|
||
"alloc_id": "${NOMAD_ALLOC_ID}",
|
||
"datacenter": "${NOMAD_DC}"
|
||
}
|
||
|
||
# 2. БЕЗОПАСНО парсим JSON, ЕСЛИ поле .message - строка
|
||
if is_string(.message) {
|
||
# Пытаемся распарсить. В случае ошибки parsed будет null, а err - описанием ошибки.
|
||
parsed, err = parse_json(.message)
|
||
|
||
if err == null {
|
||
# Если парсинг прошел успешно И результат - объект (не массив, не строка)
|
||
if is_object(parsed) {
|
||
# Используем "паникующий" merge! потому что мы УВЕРЕНЫ в типах на 100%
|
||
# . - это объект (весь лог), parsed - тоже объект (результат парсинга)
|
||
. = merge!(., parsed)
|
||
} else {
|
||
# Если внутри .message был валидный JSON, но это массив или строка,
|
||
# сохраняем его в отдельное поле, чтобы не сломать структуру.
|
||
.parsed_json = parsed
|
||
}
|
||
} else {
|
||
# Логируем ошибку парсинга (опционально, для отладки)
|
||
.parse_error = err
|
||
}
|
||
}
|
||
|
||
# 3. (Опционально) Удаляем временное поле с ошибкой, если оно пустое
|
||
if is_null(.parse_error) {
|
||
del(.parse_error)
|
||
}
|
||
|
||
sinks:
|
||
openobserve:
|
||
type: http
|
||
inputs:
|
||
- add_nomad_metadata
|
||
uri: http://opob.service.lan/api/default/default/_json
|
||
method: post
|
||
auth:
|
||
strategy: basic
|
||
user: root@bb.lan
|
||
password: SczfWK450qZ18ApY
|
||
compression: gzip
|
||
encoding:
|
||
codec: json
|
||
timestamp_format: rfc3339
|
||
healthcheck:
|
||
enabled: false
|
||
|
||
# Настройки запроса
|
||
request:
|
||
headers:
|
||
Content-Type: "application/json"
|
||
timeout_secs: 30
|
||
|
||
# Буферизация для надежности
|
||
buffer:
|
||
type: "disk"
|
||
max_size: 268435488 # 256 MB
|
||
when_full: "drop_newest"
|
||
|
||
console:
|
||
type: console
|
||
inputs:
|
||
- add_nomad_metadata
|
||
encoding:
|
||
codec: "json"
|
||
EOH
|
||
}
|
||
|
||
|
||
config {
|
||
command = "/bin/bash"
|
||
args = [
|
||
"-c",
|
||
<<EOF
|
||
set -e
|
||
|
||
WORKDIR="/opt/vector"
|
||
BIN="$WORKDIR/vector"
|
||
|
||
mkdir -p $WORKDIR
|
||
cd $WORKDIR
|
||
|
||
if [ ! -f "$BIN" ]; then
|
||
echo "Downloading weed from FTP..."
|
||
curl -o vector ftp://172.16.11.7/dist/vector/vector-0.53
|
||
chmod +x vector
|
||
fi
|
||
|
||
echo "Starting filer sync..."
|
||
exec $BIN -t 1 -c ${NOMAD_TASK_DIR}/vector.yaml
|
||
EOF
|
||
]
|
||
}
|
||
|
||
resources {
|
||
cpu = 300
|
||
memory = 256
|
||
}
|
||
}
|
||
}
|
||
} |