Files
Nomad_vector_logs/vectordocker.hcl

192 lines
5.1 KiB
HCL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}
}
}
}