Добавить vectordocker.hcl

This commit is contained in:
2026-03-10 08:23:16 +03:00
parent a3a7668f6b
commit dd6b822968

192
vectordocker.hcl Normal file
View File

@@ -0,0 +1,192 @@
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
}
}
}
}