接入 OpenTelemetry 1.17.0,覆盖 HTTP、HttpClient、.NET Runtime 和数据库链路。

新增 EF Core 数据库拦截器,记录耗时、失败数、慢查询数、TraceId、查询标签和 SQL 哈希;默认不记录完整 SQL及参数。
未配置 OTLP Collector 时不启动 SDK,避免无收益的性能开销。
为课表的作息、课程、灵活课程、考试、实验等六类查询增加稳定标签。
增加可配置的 500ms 慢查询阈值,以及生产环境变量示例。
README 补充 MySQL 慢查询与 EXPLAIN ANALYZE 操作规范。
This commit is contained in:
2026-07-31 08:24:27 +08:00 Unverified
parent a369b4fe02
commit ca7148ab61
9 changed files with 489 additions and 1 deletions
@@ -28,6 +28,7 @@ public sealed class TimetableDataService(AppDbContext db)
allowUnpublishedPlan,
cancellationToken);
var slots = await db.ScheduleTimeSlots.AsNoTracking()
.TagWith("Timetable.LoadTimeSlots")
.Where(x => x.AcademicTermId == term.Id && x.IsEnabled)
.OrderBy(x => x.PeriodNumber)
.Select(x => new TimetableSlotDto(
@@ -76,6 +77,7 @@ public sealed class TimetableDataService(AppDbContext db)
}
entries = await source
.TagWith("Timetable.LoadScheduleEntries")
.OrderBy(x => x.DayOfWeek)
.ThenBy(x => x.StartPeriod)
.ThenBy(x => x.TeachingTask!.Course!.Code)
@@ -283,6 +285,7 @@ public sealed class TimetableDataService(AppDbContext db)
}
return await source
.TagWith("Timetable.LoadFlexibleCourses")
.OrderBy(x => x.Course!.Code)
.ThenBy(x => x.TaskNumber)
.Select(x => new FlexibleCourseDto(
@@ -326,6 +329,7 @@ public sealed class TimetableDataService(AppDbContext db)
legacyQuery, resourceType, resourceId, studentId);
var legacySessions = await legacyQuery
.TagWith("Timetable.LoadLegacyExamEntries")
.OrderBy(x => x.ExamDate)
.ThenBy(x => x.StartPeriod)
.Select(x => new ExamSessionProjection(
@@ -416,6 +420,7 @@ public sealed class TimetableDataService(AppDbContext db)
db,
studentId.Value);
var sessions = await db.ExperimentSessions.AsNoTracking()
.TagWith("Timetable.LoadExperimentEntries")
.AsSplitQuery()
.Where(x =>
x.ExperimentProject!.TeachingTask!.AcademicTermId == term.Id &&