本文目录导读:

配置容器追踪存储(Container Tracing Storage)的 Shell 脚本通常涉及以下几个关键方面,具体取决于你使用的容器运行时(如 Docker、Podman)和追踪后端(如 Jaeger、OpenTelemetry Collector、Zipkin)。
以下是一个通用的 Shell 脚本配置示例,涵盖 Docker 和 Podman 环境下的容器追踪存储配置。
基础环境准备脚本
#!/bin/bash
# 容器追踪存储配置脚本
# 适用于 Docker 和 Podman 环境
set -euo pipefail
# 配置变量
TRACE_BACKEND="${TRACE_BACKEND:-jaeger}" # jaeger, zipkin, otel
STORAGE_TYPE="${STORAGE_TYPE:-elasticsearch}" # elasticsearch, cassandra, kafka
DATA_DIR="${DATA_DIR:-/data/tracing}"
NETWORK_NAME="${NETWORK_NAME:-tracing-net}"
echo "=== 容器追踪存储配置开始 ==="
# 创建数据目录
setup_directories() {
echo "创建数据目录..."
mkdir -p "${DATA_DIR}"/{storage,logs,config}
chmod 755 "${DATA_DIR}"
}
# 创建 Docker 网络
create_network() {
echo "创建容器网络..."
if ! docker network ls | grep -q "${NETWORK_NAME}"; then
docker network create "${NETWORK_NAME}"
echo "网络 ${NETWORK_NAME} 创建成功"
else
echo "网络 ${NETWORK_NAME} 已存在"
fi
}
# 配置 Jaeger 追踪存储
setup_jaeger_storage() {
echo "配置 Jaeger 追踪存储..."
case "${STORAGE_TYPE}" in
elasticsearch)
echo "启动 Elasticsearch..."
docker run -d --name elasticsearch \
--network "${NETWORK_NAME}" \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-v "${DATA_DIR}/storage:/usr/share/elasticsearch/data" \
-p 9200:9200 \
elasticsearch:7.17.0
echo "启动 Jaeger 收集器 (Elasticsearch 后端)..."
docker run -d --name jaeger-collector \
--network "${NETWORK_NAME}" \
-e "SPAN_STORAGE_TYPE=elasticsearch" \
-e "ES_SERVER_URLS=http://elasticsearch:9200" \
-p 14250:14250 \
-p 14268:14268 \
-p 14269:14269 \
jaegertracing/jaeger-collector:1.39
echo "启动 Jaeger 查询服务..."
docker run -d --name jaeger-query \
--network "${NETWORK_NAME}" \
-e "SPAN_STORAGE_TYPE=elasticsearch" \
-e "ES_SERVER_URLS=http://elasticsearch:9200" \
-p 16686:16686 \
-p 16687:16687 \
jaegertracing/jaeger-query:1.39
echo "启动 Jaeger Agent..."
docker run -d --name jaeger-agent \
--network "${NETWORK_NAME}" \
-e "REPORTER_GRPC_HOST_PORT=jaeger-collector:14250" \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
jaegertracing/jaeger-agent:1.39
;;
cassandra)
echo "启动 Cassandra..."
docker run -d --name cassandra \
--network "${NETWORK_NAME}" \
-v "${DATA_DIR}/storage:/var/lib/cassandra" \
-p 9042:9042 \
cassandra:4.0
echo "启动 Jaeger 收集器 (Cassandra 后端)..."
docker run -d --name jaeger-collector \
--network "${NETWORK_NAME}" \
-e "SPAN_STORAGE_TYPE=cassandra" \
-e "CASSANDRA_SERVERS=cassandra:9042" \
-p 14250:14250 \
-p 14268:14268 \
jaegertracing/jaeger-collector:1.39
;;
kafka)
echo "启动 Kafka + Zookeeper..."
docker run -d --name zookeeper \
--network "${NETWORK_NAME}" \
-e "ZOOKEEPER_CLIENT_PORT=2181" \
confluentinc/cp-zookeeper:7.0.0
docker run -d --name kafka \
--network "${NETWORK_NAME}" \
-e "KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181" \
-e "KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092" \
-p 9092:9092 \
confluentinc/cp-kafka:7.0.0
echo "启动 Jaeger 收集器 (Kafka 后端)..."
docker run -d --name jaeger-collector \
--network "${NETWORK_NAME}" \
-e "SPAN_STORAGE_TYPE=kafka" \
-e "KAFKA_BROKERS=kafka:9092" \
-p 14250:14250 \
-p 14268:14268 \
jaegertracing/jaeger-collector:1.39
;;
esac
}
# 配置 Zipkin 存储
setup_zipkin_storage() {
echo "配置 Zipkin 追踪存储..."
docker run -d --name zipkin \
--network "${NETWORK_NAME}" \
-e "STORAGE_TYPE=elasticsearch" \
-e "ES_HOSTS=http://elasticsearch:9200" \
-v "${DATA_DIR}/storage:/data" \
-p 9411:9411 \
openzipkin/zipkin:2.23
}
# 配置 OpenTelemetry Collector
setup_otel_collector() {
echo "配置 OpenTelemetry Collector..."
cat > "${DATA_DIR}/config/otel-collector-config.yaml" <<EOF
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
exporters:
jaeger:
endpoint: jaeger-collector:14250
tls:
insecure: true
logging:
loglevel: debug
service:
pipelines:
traces:
receivers: [otlp]
exporters: [jaeger, logging]
EOF
docker run -d --name otel-collector \
--network "${NETWORK_NAME}" \
-v "${DATA_DIR}/config/otel-collector-config.yaml:/etc/otel-collector-config.yaml" \
-p 4317:4317 \
-p 4318:4318 \
otel/opentelemetry-collector:0.55.0
}
# 检查容器健康状态
check_health() {
echo "检查服务健康状态..."
sleep 10 # 等待服务启动
local services=("elasticsearch" "jaeger-collector" "jaeger-query" "zipkin")
for service in "${services[@]}"; do
if docker ps --format '{{.Names}}' | grep -q "^${service}$"; then
echo "${service}: 运行中"
else
echo "${service}: 未运行 (警告)"
fi
done
}
# 主执行流程
main() {
echo "开始配置容器追踪存储..."
echo "追踪后端: ${TRACE_BACKEND}"
echo "存储类型: ${STORAGE_TYPE}"
echo "数据目录: ${DATA_DIR}"
setup_directories
create_network
case "${TRACE_BACKEND}" in
jaeger)
setup_jaeger_storage
;;
zipkin)
setup_zipkin_storage
;;
otel)
setup_jaeger_storage # 需要 Jaeger 作为后端
setup_otel_collector
;;
*)
echo "不支持的追踪后端: ${TRACE_BACKEND}"
exit 1
;;
esac
check_health
echo ""
echo "=== 配置完成 ==="
echo "Jaeger UI: http://localhost:16686"
echo "Zipkin UI: http://localhost:9411"
echo "Elasticsearch: http://localhost:9200"
}
# 执行主函数
main
使用示例
# 1. 使用 Elasticsearch 作为 Jaeger 存储后端 chmod +x setup-tracing-storage.sh ./setup-tracing-storage.sh # 2. 使用自定义环境变量 TRACE_BACKEND=zipkin STORAGE_TYPE=elasticsearch DATA_DIR=/custom/path ./setup-tracing-storage.sh # 3. 使用 OpenTelemetry Collector TRACE_BACKEND=otel ./setup-tracing-storage.sh
清理脚本
#!/bin/bash
# cleanup-tracing.sh - 清理追踪存储容器
set -euo pipefail
echo "清理追踪存储容器..."
# 停止并移除相关容器
containers=(
"jaeger-collector"
"jaeger-query"
"jaeger-agent"
"elasticsearch"
"zipkin"
"otel-collector"
"cassandra"
"zookeeper"
"kafka"
)
for container in "${containers[@]}"; do
if docker ps -a --format '{{.Names}}' | grep -q "^${container}$"; then
echo "停止并移除 ${container}..."
docker stop "${container}" 2>/dev/null || true
docker rm "${container}" 2>/dev/null || true
fi
done
# 移除网络
if docker network ls | grep -q "tracing-net"; then
echo "移除 tracing-net 网络..."
docker network rm tracing-net 2>/dev/null || true
fi
echo "清理完成"
高级配置选项
1 持久化配置
# 配置文件存储
CONFIG_DIR="${DATA_DIR}/config"
mkdir -p "${CONFIG_DIR}"
# 生成 Jaeger 配置文件
cat > "${CONFIG_DIR}/jaeger-config.yaml" <<EOF
collector:
zipkin:
http-port: 9411
otlp:
grpc-port: 4317
http-port: 4318
storage:
type: elasticsearch
options:
es:
server-urls: http://elasticsearch:9200
index-prefix: jaeger
EOF
2 资源限制配置
# 添加资源限制
docker run -d --name elasticsearch \
--memory="2g" \
--cpus="1.0" \
--ulimit nofile=65535:65535 \
--ulimit memlock=-1 \
...其余参数...
监控和告警脚本
#!/bin/bash
# monitor-tracing.sh - 监控追踪存储状态
check_endpoint() {
local url=$1
local name=$2
if curl -s -o /dev/null -w "%{http_code}" "${url}" | grep -q "200"; then
echo "${name}: 健康"
else
echo "${name}: 异常 (警告)"
fi
}
while true; do
echo "=== $(date) ==="
check_endpoint "http://localhost:16686/api/services" "Jaeger"
check_endpoint "http://localhost:9411/api/v2/services" "Zipkin"
check_endpoint "http://localhost:9200/_cluster/health" "Elasticsearch"
sleep 300
done
这个配置提供了一套完整的容器追踪存储方案,支持多种存储后端和追踪系统。