本文目录导读:

配置容器追踪存储(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
这个配置提供了一套完整的容器追踪存储方案,支持多种存储后端和追踪系统。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播