1、取下载OpenTelemetry-javaAgent的jar包
去官网下载java对应的agent.jar包,下载地址:https://opentelemetry.io/es/docs/zero-code/java/agent/getting-started/
2、idea开发工具上引入探针
-javaagent:/Users/yulei/Documents/package/opentelemetry/opentelemetry-javaagent.jar
-Dotel.service.name=应用名称
-Dotel.resource.attributes=deployment.environment=production,service.instance.id=webfunny_20251129_230724_sit
-Dotel.exporter.otlp.endpoint=http://xxx.webfunny.cn:4317
-Dotel.exporter.otlp.protocol=grpc
-Dotel.traces.exporter=otlp
-Dotel.metrics.exporter=none
-Dotel.logs.exporter=otlp
-Dotel.javaagent.logging.level=INFO
-Dotel.instrumentation.jvm-metrics.enabled=true
-Dotel.instrumentation.system-metrics.enabled=true
-Dotel.instrumentation.jdbc.enabled=true
-Dotel.instrumentation.spring-webmvc.enabled=true
-Dotel.instrumentation.http-client.enabled=true
在自己的java后端项目pom.xml中引入opentelemetry的相关jar
<!-- 添加 OpenTelemetry 相关依赖 -->
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.24.0</version>
</dependency>
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-instrumentation-annotations</artifactId>
<version>1.24.0</version>
</dependency>
如何上报错误信息到span中呢,在service层的方法行加个@WithSpan注解
@Slf4j
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class GearServiceImpl extends ServiceImpl<GearMapper, Gear> implements IGearService {
@Override
@WithSpan
public IPage<Gear> getGearPage(Gear gear, QueryRequest request) {
Page<CdkeyConfig> page = new Page<>(request.getPageNum(), request.getPageSize());
SortUtil.handlePageSort(request, page, "gear.type", FebsConstant.ORDER_ASC, false);
IPage<Gear> gearPage = this.baseMapper.getGearPage(page, gear);
return gearPage;
}
}
3、应用脚本引入探针
官网的引入方式:
java -javaagent:path/to/opentelemetry-javaagent.jar -Dotel.service.name=your-service-name -jar myapp.jar
javaagent:后面是opentelemetry-javaagent.jar的本地路径,
配置参数:
-Dotel.service.name=服务应用名称
webfunny接入的方式
#!/bin/bash
# 应用名称
prog="webfunny-manage"
# OpenTelemetry 配置
OTEL_SERVICE_NAME="java后端管理平台"
OTEL_RESOURCE_ATTRIBUTES="deployment.environment=production,service.instance.id=webfunny_20251218_224703_pro"
OTEL_EXPORTER_OTLP_ENDPOINT="http://xxx.webfunny.cn:4317"
OTEL_EXPORTER_OTLP_PROTOCOL="grpc"
OTEL_TRACES_EXPORTER="otlp"
OTEL_METRICS_EXPORTER="none"
OTEL_LOGS_EXPORTER="otlp"
OTEL_JAVAAGENT_LOGGING_LEVEL="INFO"
OTEL_INSTRUMENTATION_JVM_METRICS_ENABLED="true"
OTEL_INSTRUMENTATION_SYSTEM_METRICS_ENABLED="true"
OTEL_INSTRUMENTATION_JDBC_ENABLED="true"
OTEL_INSTRUMENTATION_SPRING_WEBMVC_ENABLED="true"
OTEL_INSTRUMENTATION_HTTP_CLIENT_ENABLED="true"
# Java 代理路径
OTEL_AGENT_JAR="/home/yulei/manage/opentelemetry-agent/opentelemetry-javaagent.jar"
# 检查 OpenTelemetry 代理是否存在
check_opentelemetry_agent() {
if [ ! -f "$OTEL_AGENT_JAR" ]; then
echo "错误: OpenTelemetry 代理文件不存在: $OTEL_AGENT_JAR"
echo "请确保已下载 opentelemetry-javaagent.jar 到指定位置"
exit 1
fi
echo "OpenTelemetry 代理文件存在"
}
start() {
now=$(date "+%Y%m%d%H%M%S")
# 检查 OpenTelemetry 代理
check_opentelemetry_agent
# 执行启动命令
exec java \
-javaagent:"$OTEL_AGENT_JAR" \
-Dotel.service.name="$OTEL_SERVICE_NAME" \
-Dotel.resource.attributes="$OTEL_RESOURCE_ATTRIBUTES" \
-Dotel.exporter.otlp.endpoint="$OTEL_EXPORTER_OTLP_ENDPOINT" \
-Dotel.exporter.otlp.protocol="$OTEL_EXPORTER_OTLP_PROTOCOL" \
-Dotel.traces.exporter="$OTEL_TRACES_EXPORTER" \
-Dotel.metrics.exporter="$OTEL_METRICS_EXPORTER" \
-Dotel.logs.exporter="$OTEL_LOGS_EXPORTER" \
-Dotel.javaagent.logging.level="$OTEL_JAVAAGENT_LOGGING_LEVEL" \
-Dotel.instrumentation.jvm-metrics.enabled="$OTEL_INSTRUMENTATION_JVM_METRICS_ENABLED" \
-Dotel.instrumentation.system-metrics.enabled="$OTEL_INSTRUMENTATION_SYSTEM_METRICS_ENABLED" \
-Dotel.instrumentation.jdbc.enabled="$OTEL_INSTRUMENTATION_JDBC_ENABLED" \
-Dotel.instrumentation.spring-webmvc.enabled="$OTEL_INSTRUMENTATION_SPRING_WEBMVC_ENABLED" \
-Dotel.instrumentation.http-client.enabled="$OTEL_INSTRUMENTATION_HTTP_CLIENT_ENABLED" \
-jar -Xms256M -Xmx256M \
webfunny_manage-2.0.jar >/dev/null 2>&1 &
# 保存进程ID
PID=$!
echo $PID > server.pid
# 等待进程启动
sleep 2
# 检查进程是否运行
if kill -0 $PID 2>/dev/null; then
echo "启动 $prog 成功 (PID: $PID)"
# 检查OpenTelemetry是否初始化成功
echo " 检查OpenTelemetry初始化..."
sleep 3
# 查看日志中是否有OpenTelemetry相关信息
if ps -p $PID > /dev/null; then
echo "进程运行正常"
echo " OpenTelemetry 监控已启用,数据将发送到: $OTEL_EXPORTER_OTLP_ENDPOINT"
else
echo "进程可能启动失败,请检查日志"
fi
else
echo "启动 $prog 失败"
rm -f server.pid
exit 1
fi
}
stop() {
if [ -f server.pid ]; then
PID=$(cat server.pid)
if kill -0 $PID 2>/dev/null; then
echo " 正在停止 $prog (PID: $PID)..."
kill $PID
sleep 2
if kill -0 $PID 2>/dev/null; then
echo "进程未正常停止,强制终止..."
kill -9 $PID
sleep 1
fi
echo "停止 $prog 完成"
else
echo "进程 $PID 未运行"
fi
rm -rf server.pid
else
echo "server.pid 文件不存在,$prog 可能未运行"
fi
}
status() {
if [ -f server.pid ]; then
PID=$(cat server.pid)
if kill -0 $PID 2>/dev/null; then
echo " 正在运行 (PID: $PID)"
# 显示进程信息
ps -p $PID -o pid,ppid,time,cmd
# 检查OpenTelemetry相关环境变量
echo ""
echo " OpenTelemetry 配置:"
cat /proc/$PID/environ 2>/dev/null | tr '\0' '\n' | grep -E "OTEL|JAVA_TOOL_OPTIONS" || echo "无法获取环境变量"
else
echo " 已停止 (PID 文件存在但进程未运行)"
rm -f server.pid
fi
else
echo " 未运行"
fi
}
restart() {
echo " 重新启动 $prog ..."
stop
sleep 2
start
}
4、查看上报数据
这样ApmSpaninfo表中就有对应错误信息了