# dotnetcore-trace-test **Repository Path**: baihr/dotnetcore-trace-test ## Basic Information - **Project Name**: dotnetcore-trace-test - **Description**: dotnetcore-trace-test - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-03 - **Last Updated**: 2026-06-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dotnetcore-trace-test ASP.NET Core 链路追踪测试应用,运行在 `http://0.0.0.0:5088`。 ## 功能 - `GET /health`:健康检查。 - `GET /slow`:固定延迟 3 秒的慢接口。 - `GET /oracle/ping`:使用 `Oracle.ManagedDataAccess.Client` 打开 Oracle 连接并执行测试 SQL。 - `FixedIntervalOracleWorker`:后台 while 循环任务,每 `Worker:IntervalSeconds` 秒执行一次 Oracle 探测。 ## 环境和依赖 ### .NET - 目标框架:`.NET 8`,项目文件中配置为 `net8.0`。 - 当前服务器验证版本:`.NET SDK 8.0.421`。 - 当前服务器运行时: - `Microsoft.NETCore.App 8.0.27` - `Microsoft.AspNetCore.App 8.0.27` - 默认 SDK 路径:`C:\dotnet\dotnet.exe`。 查看本机 .NET 版本: ```powershell C:\dotnet\dotnet.exe --version C:\dotnet\dotnet.exe --list-sdks C:\dotnet\dotnet.exe --list-runtimes ``` ### NuGet 依赖 项目依赖定义在 `dotnetcore-trace-test.csproj`: ```xml ``` 说明: - `Microsoft.NET.Sdk.Web`:ASP.NET Core Minimal API 应用所需 SDK。 - `Oracle.ManagedDataAccess.Core 23.26.200`:Oracle 官方托管驱动,代码中通过 `Oracle.ManagedDataAccess.Client` 命名空间使用。 - `System.Diagnostics.ActivitySource`:.NET 内置手动埋点 API,不需要额外安装 OpenTelemetry SDK NuGet 包。 ### 外部运行依赖 - Oracle 数据库:当前按 Oracle AI Database Free 26ai 准备,服务名示例为 `FREEPDB1.localdomain`。 - Oracle 监听端口:`1521`。 - Datadog Agent:应用默认把 trace 发到 `http://localhost:9529`,可通过 `DD_TRACE_AGENT_URL` 调整。 - Datadog .NET Tracer:需要在服务器安装 Datadog .NET tracer,启动时通过 `CORECLR_ENABLE_PROFILING=1` 启用自动注入。 当前 `start.bat` 中使用的关键 Datadog 环境变量: ```bat set CORECLR_ENABLE_PROFILING=1 set DD_SERVICE=dotnetcore-trace-test set DD_ENV=test set DD_VERSION=1.0.0 set DD_TRACE_AGENT_URL=http://localhost:9529 set DD_TRACE_OTEL_ENABLED=true ``` ## 手动埋点说明 HTTP 接口不需要手动埋点,Datadog .NET tracer 会自动采集请求 span 和 Oracle span。 后台 while 任务没有 HTTP 请求作为 trace 根节点,所以代码中只在 `FixedIntervalOracleWorker` 的每一轮循环外层创建一个手动 job span。Oracle 调用仍然交给 Datadog 自动埋点,最终 trace 结构类似: ```text fixed-interval-oracle-probe -> select sys_context('USERENV','CON_NAME') from dual -> Oracle driver spans ``` 启动时需要设置: ```bat set DD_TRACE_OTEL_ENABLED=true ``` 这样 Datadog tracer 才会把 .NET `System.Diagnostics.ActivitySource` 创建的手动 span 采集进去。 ## 构建和运行 以下命令默认项目位于 `C:\dotnetcore-trace-test`,.NET SDK 位于 `C:\dotnet\dotnet.exe`。 ### 还原依赖 ```powershell Set-Location C:\dotnetcore-trace-test C:\dotnet\dotnet.exe restore ``` ### 构建 ```powershell Set-Location C:\dotnetcore-trace-test C:\dotnet\dotnet.exe build -c Release ``` ### 直接运行源码 开发或临时验证时可以直接运行项目源码: ```powershell Set-Location C:\dotnetcore-trace-test C:\dotnet\dotnet.exe run -c Release ``` 如果需要同时验证 Datadog trace 采集,可以先设置 Datadog 环境变量: ```powershell $env:CORECLR_ENABLE_PROFILING = "1" $env:DD_SERVICE = "dotnetcore-trace-test" $env:DD_ENV = "test" $env:DD_VERSION = "1.0.0" $env:DD_TRACE_AGENT_URL = "http://localhost:9529" $env:DD_LOGS_INJECTION = "true" $env:DD_RUNTIME_METRICS_ENABLED = "true" $env:DD_TRACE_OTEL_ENABLED = "true" Set-Location C:\dotnetcore-trace-test C:\dotnet\dotnet.exe run -c Release ``` ### 发布 部署时先发布到 `C:\dotnetcore-trace-test\publish`: ```powershell Set-Location C:\dotnetcore-trace-test C:\dotnet\dotnet.exe publish -c Release -o C:\dotnetcore-trace-test\publish ``` 如果应用正在运行,发布前先停止,避免发布文件被占用: ```powershell C:\dotnetcore-trace-test\stop.bat Set-Location C:\dotnetcore-trace-test C:\dotnet\dotnet.exe publish -c Release -o C:\dotnetcore-trace-test\publish ``` ### 手动启动和停止 当前项目不使用计划任务开机启动。需要测试时手动启动: ```powershell C:\dotnetcore-trace-test\start.bat ``` 停止应用: ```powershell C:\dotnetcore-trace-test\stop.bat ``` 启动后可以用下面的命令验证: ```powershell Invoke-RestMethod http://127.0.0.1:5088/health Invoke-RestMethod http://127.0.0.1:5088/oracle/ping Invoke-RestMethod http://127.0.0.1:5088/slow ``` ## Oracle 连接串 推荐通过环境变量覆盖连接串,避免把真实密码提交到仓库: ```powershell $env:Oracle__ConnectionString = "User Id=TRACE_TEST;Password=;Data Source=localhost:1521/FREEPDB1.localdomain" C:\dotnet\dotnet.exe C:\dotnetcore-trace-test\publish\dotnetcore-trace-test.dll ``` ## Oracle AI Database Free 26ai 安装初始化 以下命令在 Windows 管理员 PowerShell 中执行。Oracle 官方下载页列出的 Windows 包名是 `oracle-ai-database-free-26ai-23.26.1.windows.x64.zip`,静默安装命令参考 Oracle Windows 安装指南。 ### 下载 ```powershell $WorkDir = "C:\oracle-free-install" $ZipPath = Join-Path $WorkDir "oracle-ai-database-free-26ai-23.26.1.windows.x64.zip" $DownloadUrl = "https://download.oracle.com/otn-pub/otn_software/db-free/oracle-ai-database-free-26ai-23.26.1.windows.x64.zip" New-Item -ItemType Directory -Force -Path $WorkDir | Out-Null Invoke-WebRequest -Uri $DownloadUrl -OutFile $ZipPath # 可选:校验 SHA256,官方页面当前值为 7c673e5f495c03c9cb7ad09b08886a95597f0db9893d727934e370f73b6aa8d0。 Get-FileHash -Algorithm SHA256 $ZipPath ``` ### 解压并修改静默安装响应文件 ```powershell $OracleAdminPassword = "" $InstallDir = "C:\app\Administrator\product\26ai" Expand-Archive -Path $ZipPath -DestinationPath $WorkDir -Force $RspPath = Join-Path $WorkDir "response\FREEInstall.rsp" $Rsp = Get-Content $RspPath $Rsp = $Rsp -replace "^INSTALLDIR=.*", "INSTALLDIR=$InstallDir" $Rsp = $Rsp -replace "^PASSWORD=.*", "PASSWORD=$OracleAdminPassword" $Rsp = $Rsp -replace "^LISTENER_PORT=.*", "LISTENER_PORT=1521" $Rsp = $Rsp -replace "^CHAR_SET=.*", "CHAR_SET=AL32UTF8" $Rsp = $Rsp -replace "^DB_DOMAIN=.*", "DB_DOMAIN=localdomain" $Rsp = $Rsp -replace "^SOFTWARE_ONLY=.*", "SOFTWARE_ONLY=FALSE" $Rsp = $Rsp -replace "^MODIFY_DIRECTORY_PERMISSIONS=.*", "MODIFY_DIRECTORY_PERMISSIONS=TRUE" Set-Content -Path $RspPath -Value $Rsp -Encoding ASCII ``` ### 静默安装 ```powershell Set-Location $WorkDir .\setup.exe /s /v"RSP_FILE=$RspPath" /v"/L*v $WorkDir\setup.log" /v"/qn" # 静默安装是异步执行的,可以通过日志确认完成状态。 Get-Content "$WorkDir\setup.log" -Tail 80 ``` 安装成功后,常见服务名如下;如果服务名不同,用 `Get-Service Oracle*` 查看实际名称。 ```powershell Get-Service Oracle* Start-Service OracleServiceFREE Start-Service OracleOraDB23Home1TNSListener ``` ### 初始化测试用户 ```powershell $OracleHome = "C:\app\Administrator\product\26ai\dbhomeFree" $SqlPlus = Join-Path $OracleHome "bin\sqlplus.exe" $OracleAdminPassword = "" $TraceUserPassword = "" $Sql = @" whenever sqlerror exit sql.sqlcode declare user_count number; begin select count(*) into user_count from dba_users where username = 'TRACE_TEST'; if user_count = 0 then execute immediate 'create user TRACE_TEST identified by "$TraceUserPassword"'; else execute immediate 'alter user TRACE_TEST identified by "$TraceUserPassword" account unlock'; end if; end; / grant create session to TRACE_TEST; exit "@ $Sql | & $SqlPlus -L "sys/$OracleAdminPassword@localhost:1521/FREEPDB1 as sysdba" ``` ### 验证连接并配置应用 ```powershell $TraceUserPassword = "" $ConnectionString = "User Id=TRACE_TEST;Password=$TraceUserPassword;Data Source=localhost:1521/FREEPDB1.localdomain" $env:Oracle__ConnectionString = $ConnectionString C:\dotnet\dotnet.exe C:\dotnetcore-trace-test\publish\dotnetcore-trace-test.dll ``` 应用启动后访问: ```powershell Invoke-RestMethod http://127.0.0.1:5088/health Invoke-RestMethod http://127.0.0.1:5088/oracle/ping Invoke-RestMethod http://127.0.0.1:5088/slow ``` ## 参考 - Oracle AI Database Free 26ai 下载页:https://www.oracle.com/database/free/get-started/ - Oracle AI Database Free 26ai Windows 安装指南:https://docs.oracle.com/en/database/oracle/oracle-database/26/xeinw/installing-oracle-database-xe.html