mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-25 23:28:33 -06:00
Merge branch 'main' of github.com:alexmickelson/canvasManagement
This commit is contained in:
@@ -8,6 +8,10 @@
|
|||||||
<PackageReference Include="BlazorMonaco" Version="3.0.0" />
|
<PackageReference Include="BlazorMonaco" Version="3.0.0" />
|
||||||
<PackageReference Include="dotenv.net" Version="3.1.2" />
|
<PackageReference Include="dotenv.net" Version="3.1.2" />
|
||||||
<PackageReference Include="Markdig" Version="0.31.0" />
|
<PackageReference Include="Markdig" Version="0.31.0" />
|
||||||
|
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.7.0" />
|
||||||
|
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.7.0" />
|
||||||
|
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.7.0" />
|
||||||
|
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.7.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
@page "/"
|
@page "/"
|
||||||
@using CanvasModel.EnrollmentTerms
|
@using CanvasModel.EnrollmentTerms
|
||||||
@using Management.Web.Shared.Course
|
|
||||||
@using Management.Web.Shared.Semester
|
|
||||||
@using CanvasModel.Courses
|
@using CanvasModel.Courses
|
||||||
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
|
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
|
||||||
@using LocalModels
|
@using LocalModels
|
||||||
|
|||||||
@@ -10,13 +10,14 @@ global using LocalModels;
|
|||||||
global using Management.Planner;
|
global using Management.Planner;
|
||||||
global using Management.Web.Shared.Components;
|
global using Management.Web.Shared.Components;
|
||||||
global using Management.Web.Shared;
|
global using Management.Web.Shared;
|
||||||
global using Management.Web.Shared.Components.Forms;
|
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Components;
|
|
||||||
using Microsoft.AspNetCore.Components.Web;
|
|
||||||
using dotenv.net;
|
using dotenv.net;
|
||||||
using Microsoft.AspNetCore.Hosting.Server;
|
using Microsoft.AspNetCore.Hosting.Server;
|
||||||
using Microsoft.AspNetCore.Hosting.Server.Features;
|
using Microsoft.AspNetCore.Hosting.Server.Features;
|
||||||
|
using OpenTelemetry.Logs;
|
||||||
|
using OpenTelemetry.Metrics;
|
||||||
|
using OpenTelemetry.Resources;
|
||||||
|
using OpenTelemetry.Trace;
|
||||||
|
|
||||||
DotEnv.Load();
|
DotEnv.Load();
|
||||||
|
|
||||||
@@ -32,6 +33,42 @@ if (canvas_url == null)
|
|||||||
Environment.SetEnvironmentVariable("CANVAS_URL", "https://snow.instructure.com");
|
Environment.SetEnvironmentVariable("CANVAS_URL", "https://snow.instructure.com");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const string serviceName = "canvas-management";
|
||||||
|
|
||||||
|
// builder.Logging.AddOpenTelemetry(options =>
|
||||||
|
// {
|
||||||
|
// options
|
||||||
|
// .SetResourceBuilder(
|
||||||
|
// ResourceBuilder
|
||||||
|
// .CreateDefault()
|
||||||
|
// .AddService(serviceName)
|
||||||
|
// )
|
||||||
|
// .AddOtlpExporter(o =>
|
||||||
|
// {
|
||||||
|
// o.Endpoint = new Uri("http://localhost:4317/");
|
||||||
|
// })
|
||||||
|
// .AddConsoleExporter();
|
||||||
|
// });
|
||||||
|
|
||||||
|
builder.Services.AddOpenTelemetry()
|
||||||
|
.ConfigureResource(resource => resource.AddService(serviceName))
|
||||||
|
.WithTracing(tracing => tracing
|
||||||
|
.AddSource(DiagnosticsConfig.SourceName)
|
||||||
|
.AddOtlpExporter(o =>
|
||||||
|
{
|
||||||
|
o.Endpoint = new Uri("http://localhost:4317/");
|
||||||
|
})
|
||||||
|
.AddAspNetCoreInstrumentation()
|
||||||
|
.AddConsoleExporter()
|
||||||
|
);
|
||||||
|
// .WithMetrics(metrics => metrics
|
||||||
|
// .AddOtlpExporter(o => {
|
||||||
|
// o.Endpoint = new Uri("http://localhost:4317/");
|
||||||
|
// })
|
||||||
|
// .AddAspNetCoreInstrumentation()
|
||||||
|
// .AddConsoleExporter()
|
||||||
|
// );
|
||||||
|
|
||||||
// Add services to the container.
|
// Add services to the container.
|
||||||
builder.Services.AddRazorPages();
|
builder.Services.AddRazorPages();
|
||||||
builder.Services.AddServerSideBlazor();
|
builder.Services.AddServerSideBlazor();
|
||||||
@@ -59,7 +96,7 @@ builder.Services.AddScoped<DragContainer>();
|
|||||||
|
|
||||||
builder.Services.AddSignalR(e =>
|
builder.Services.AddSignalR(e =>
|
||||||
{
|
{
|
||||||
e.MaximumReceiveMessageSize = 102400000;
|
e.MaximumReceiveMessageSize = 102400000;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@@ -90,7 +127,7 @@ var addresses = app.Services.GetService<IServer>()?.Features.Get<IServerAddresse
|
|||||||
|
|
||||||
foreach (var address in addresses)
|
foreach (var address in addresses)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Running at: " + address);
|
Console.WriteLine("Running at: " + address);
|
||||||
}
|
}
|
||||||
|
|
||||||
app.WaitForShutdown();
|
app.WaitForShutdown();
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
"DetailedErrors": true,
|
"DetailedErrors": true,
|
||||||
"Logging": {
|
"Logging": {
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Error",
|
"Default": "Information",
|
||||||
"Microsoft.AspNetCore": "Error"
|
"Microsoft.AspNetCore": "Warning"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"Logging": {
|
"Logging": {
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Error",
|
"Default": "Trace",
|
||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -16,13 +16,22 @@ public class CoursePlanner
|
|||||||
private readonly MyLogger<CoursePlanner> logger;
|
private readonly MyLogger<CoursePlanner> logger;
|
||||||
private readonly FileStorageManager fileStorageManager;
|
private readonly FileStorageManager fileStorageManager;
|
||||||
private readonly CanvasService canvas;
|
private readonly CanvasService canvas;
|
||||||
|
private readonly ILogger<CoursePlanner> _otherLogger;
|
||||||
|
|
||||||
public bool LoadingCanvasData { get; internal set; } = false;
|
public bool LoadingCanvasData { get; internal set; } = false;
|
||||||
|
|
||||||
public CoursePlanner(MyLogger<CoursePlanner> logger, FileStorageManager fileStorageManager, CanvasService canvas)
|
public CoursePlanner(
|
||||||
|
MyLogger<CoursePlanner> logger,
|
||||||
|
FileStorageManager fileStorageManager,
|
||||||
|
CanvasService canvas,
|
||||||
|
ILogger<CoursePlanner> otherLogger
|
||||||
|
)
|
||||||
{
|
{
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.fileStorageManager = fileStorageManager;
|
this.fileStorageManager = fileStorageManager;
|
||||||
this.canvas = canvas;
|
this.canvas = canvas;
|
||||||
|
_otherLogger = otherLogger;
|
||||||
|
_otherLogger.LogInformation("testing other logging");
|
||||||
}
|
}
|
||||||
|
|
||||||
private Timer? _debounceTimer;
|
private Timer? _debounceTimer;
|
||||||
@@ -34,7 +43,7 @@ public class CoursePlanner
|
|||||||
get => _localCourse;
|
get => _localCourse;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
|
using var activity = DiagnosticsConfig.Source?.StartActivity("Loading Course");
|
||||||
if (value == null)
|
if (value == null)
|
||||||
{
|
{
|
||||||
_localCourse = null;
|
_localCourse = null;
|
||||||
@@ -110,6 +119,8 @@ public class CoursePlanner
|
|||||||
IEnumerable<CanvasAssignmentGroup> canvasAssignmentGroups
|
IEnumerable<CanvasAssignmentGroup> canvasAssignmentGroups
|
||||||
)> LoadCanvasData()
|
)> LoadCanvasData()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
using var activity = DiagnosticsConfig.Source.StartActivity("Loading Canvas Data to Course Planner");
|
||||||
LoadingCanvasData = true;
|
LoadingCanvasData = true;
|
||||||
StateHasChanged?.Invoke();
|
StateHasChanged?.Invoke();
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
using LocalModels;
|
using LocalModels;
|
||||||
using Management.Services;
|
using Management.Services;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
@@ -7,21 +8,24 @@ public class FileStorageManager
|
|||||||
private readonly MyLogger<FileStorageManager> logger;
|
private readonly MyLogger<FileStorageManager> logger;
|
||||||
private readonly CourseMarkdownLoader _courseMarkdownLoader;
|
private readonly CourseMarkdownLoader _courseMarkdownLoader;
|
||||||
private readonly MarkdownCourseSaver _saveMarkdownCourse;
|
private readonly MarkdownCourseSaver _saveMarkdownCourse;
|
||||||
|
private readonly ILogger<FileStorageManager> _otherLogger;
|
||||||
private readonly string _basePath;
|
private readonly string _basePath;
|
||||||
|
|
||||||
public FileStorageManager(
|
public FileStorageManager(
|
||||||
MyLogger<FileStorageManager> logger,
|
MyLogger<FileStorageManager> logger,
|
||||||
CourseMarkdownLoader courseMarkdownLoader,
|
CourseMarkdownLoader courseMarkdownLoader,
|
||||||
MarkdownCourseSaver saveMarkdownCourse
|
MarkdownCourseSaver saveMarkdownCourse,
|
||||||
|
ILogger<FileStorageManager> otherLogger
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
using var activity = DiagnosticsConfig.Source.StartActivity("loading storage directory");
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
_courseMarkdownLoader = courseMarkdownLoader;
|
_courseMarkdownLoader = courseMarkdownLoader;
|
||||||
_saveMarkdownCourse = saveMarkdownCourse;
|
_saveMarkdownCourse = saveMarkdownCourse;
|
||||||
|
_otherLogger = otherLogger;
|
||||||
_basePath = FileConfiguration.GetBasePath();
|
_basePath = FileConfiguration.GetBasePath();
|
||||||
|
|
||||||
this.logger.Log("Using storage directory: " + _basePath);
|
this.logger.Log("Using storage directory: " + _basePath);
|
||||||
|
|
||||||
}
|
}
|
||||||
public async Task SaveCourseAsync(LocalCourse course, LocalCourse? previouslyStoredCourse)
|
public async Task SaveCourseAsync(LocalCourse course, LocalCourse? previouslyStoredCourse)
|
||||||
{
|
{
|
||||||
@@ -36,6 +40,7 @@ public class FileStorageManager
|
|||||||
|
|
||||||
public async Task<IEnumerable<LocalCourse>> LoadSavedMarkdownCourses()
|
public async Task<IEnumerable<LocalCourse>> LoadSavedMarkdownCourses()
|
||||||
{
|
{
|
||||||
|
|
||||||
return await _courseMarkdownLoader.LoadSavedMarkdownCourses();
|
return await _courseMarkdownLoader.LoadSavedMarkdownCourses();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,3 +56,10 @@ public class FileStorageManager
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static class DiagnosticsConfig
|
||||||
|
{
|
||||||
|
public const string SourceName = "canvas-management-source";
|
||||||
|
public static ActivitySource Source = new ActivitySource(SourceName);
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,17 +1,11 @@
|
|||||||
using System.Threading.Tasks.Sources;
|
using System.Threading.Tasks.Sources;
|
||||||
using LocalModels;
|
using LocalModels;
|
||||||
using Management.Services;
|
namespace Management.Services;
|
||||||
|
|
||||||
public class MarkdownCourseSaver
|
public class MarkdownCourseSaver(MyLogger<MarkdownCourseSaver> logger)
|
||||||
{
|
{
|
||||||
private readonly MyLogger<MarkdownCourseSaver> logger;
|
private readonly MyLogger<MarkdownCourseSaver> _logger = logger;
|
||||||
private readonly string _basePath;
|
private readonly string _basePath = FileConfiguration.GetBasePath();
|
||||||
|
|
||||||
public MarkdownCourseSaver(MyLogger<MarkdownCourseSaver> logger)
|
|
||||||
{
|
|
||||||
this.logger = logger;
|
|
||||||
_basePath = FileConfiguration.GetBasePath();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task Save(LocalCourse course, LocalCourse? previouslyStoredCourse)
|
public async Task Save(LocalCourse course, LocalCourse? previouslyStoredCourse)
|
||||||
{
|
{
|
||||||
@@ -70,7 +64,7 @@ public class MarkdownCourseSaver
|
|||||||
{
|
{
|
||||||
var markdownPath = quizzesDirectory + "/" + quiz.Name + ".md"; ;
|
var markdownPath = quizzesDirectory + "/" + quiz.Name + ".md"; ;
|
||||||
var quizMarkdown = quiz.ToMarkdown();
|
var quizMarkdown = quiz.ToMarkdown();
|
||||||
logger.Log("saving quiz " + markdownPath);
|
_logger.Log("saving quiz " + markdownPath);
|
||||||
await File.WriteAllTextAsync(markdownPath, quizMarkdown);
|
await File.WriteAllTextAsync(markdownPath, quizMarkdown);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -94,7 +88,7 @@ public class MarkdownCourseSaver
|
|||||||
|
|
||||||
foreach (var file in filesToDelete)
|
foreach (var file in filesToDelete)
|
||||||
{
|
{
|
||||||
logger.Log($"removing old quiz, it has probably been renamed {file}");
|
_logger.Log($"removing old quiz, it has probably been renamed {file}");
|
||||||
File.Delete(file);
|
File.Delete(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,7 +111,7 @@ public class MarkdownCourseSaver
|
|||||||
var assignmentMarkdown = assignment.ToMarkdown();
|
var assignmentMarkdown = assignment.ToMarkdown();
|
||||||
|
|
||||||
var filePath = assignmentsDirectory + "/" + assignment.Name + ".md";
|
var filePath = assignmentsDirectory + "/" + assignment.Name + ".md";
|
||||||
logger.Log("saving assignment " + filePath);
|
_logger.Log("saving assignment " + filePath);
|
||||||
await File.WriteAllTextAsync(filePath, assignmentMarkdown);
|
await File.WriteAllTextAsync(filePath, assignmentMarkdown);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -141,7 +135,7 @@ public class MarkdownCourseSaver
|
|||||||
|
|
||||||
foreach (var file in filesToDelete)
|
foreach (var file in filesToDelete)
|
||||||
{
|
{
|
||||||
logger.Log($"removing old assignment, it has probably been renamed {file}");
|
_logger.Log($"removing old assignment, it has probably been renamed {file}");
|
||||||
File.Delete(file);
|
File.Delete(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,22 +5,22 @@ namespace Management.Services;
|
|||||||
|
|
||||||
public class MyLogger<T>
|
public class MyLogger<T>
|
||||||
{
|
{
|
||||||
private readonly ILogger<T> baseLogger;
|
private readonly ILogger<T> _baseLogger;
|
||||||
|
|
||||||
public MyLogger(ILogger<T> baseLogger)
|
public MyLogger(ILogger<T> baseLogger)
|
||||||
{
|
{
|
||||||
this.baseLogger = baseLogger;
|
this._baseLogger = baseLogger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Log(
|
public void Log(
|
||||||
string message,
|
string message,
|
||||||
LogLevel logLevel = LogLevel.Information,
|
// LogLevel logLevel = LogLevel.Information,
|
||||||
[CallerMemberName] string memberName = ""
|
[CallerMemberName] string memberName = ""
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var finalMessage = $"[{typeof(T)}.{memberName}] {message}";
|
var finalMessage = $"[{typeof(T)}.{memberName}] {message}";
|
||||||
|
|
||||||
baseLogger.Log(logLevel, finalMessage);
|
_baseLogger.LogInformation(finalMessage);
|
||||||
Console.WriteLine(finalMessage);
|
Console.WriteLine(finalMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ public class MyLogger<T>
|
|||||||
{
|
{
|
||||||
var finalMessage = $"[{typeof(T)}.{memberName}] {message}";
|
var finalMessage = $"[{typeof(T)}.{memberName}] {message}";
|
||||||
|
|
||||||
baseLogger.Log(logLevel, finalMessage);
|
_baseLogger.Log(logLevel, finalMessage);
|
||||||
Console.WriteLine(finalMessage);
|
Console.WriteLine(finalMessage);
|
||||||
}
|
}
|
||||||
public void Error(
|
public void Error(
|
||||||
@@ -43,7 +43,7 @@ public class MyLogger<T>
|
|||||||
{
|
{
|
||||||
var finalMessage = $"ERROR: [{typeof(T)}.{memberName}] {message}";
|
var finalMessage = $"ERROR: [{typeof(T)}.{memberName}] {message}";
|
||||||
|
|
||||||
baseLogger.Log(logLevel, finalMessage);
|
_baseLogger.Log(logLevel, finalMessage);
|
||||||
Console.WriteLine(finalMessage);
|
Console.WriteLine(finalMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -16,3 +16,36 @@ services:
|
|||||||
- ~/projects/faculty/1400/2024_spring_alex/modules:/app/storage/1400
|
- ~/projects/faculty/1400/2024_spring_alex/modules:/app/storage/1400
|
||||||
- ~/projects/faculty/1405/2024_spring_alex/modules:/app/storage/1405
|
- ~/projects/faculty/1405/2024_spring_alex/modules:/app/storage/1405
|
||||||
- ~/projects/faculty/4620_Distributed/2024Spring/modules:/app/storage/distributed
|
- ~/projects/faculty/4620_Distributed/2024Spring/modules:/app/storage/distributed
|
||||||
|
|
||||||
|
collector:
|
||||||
|
image: otel/opentelemetry-collector-contrib
|
||||||
|
volumes:
|
||||||
|
- ./ops/otel-collector-config.yml:/etc/otelcol-contrib/config.yaml
|
||||||
|
ports:
|
||||||
|
- 1888:1888 # pprof extension
|
||||||
|
- 8888:8888 # Prometheus metrics exposed by the Collector
|
||||||
|
- 8889:8889 # Prometheus exporter metrics
|
||||||
|
- 13133:13133 # health_check extension
|
||||||
|
- 4317:4317 # OTLP gRPC receiver
|
||||||
|
- 4318:4318 # OTLP http receiver
|
||||||
|
- 55679:55679 # zpages extension
|
||||||
|
|
||||||
|
# The zipkin process services the UI, and also exposes a POST endpoint that
|
||||||
|
# instrumentation can send trace data to.
|
||||||
|
zipkin:
|
||||||
|
image: ghcr.io/openzipkin/zipkin-slim
|
||||||
|
container_name: zipkin
|
||||||
|
# Environment settings are defined here https://github.com/openzipkin/zipkin/blob/master/zipkin-server/README.md#environment-variables
|
||||||
|
environment:
|
||||||
|
- STORAGE_TYPE=mem
|
||||||
|
# Point the zipkin at the storage backend
|
||||||
|
# - MYSQL_HOST=mysql
|
||||||
|
# Uncomment to enable self-tracing
|
||||||
|
# - SELF_TRACING_ENABLED=true
|
||||||
|
# Uncomment to increase heap size
|
||||||
|
# - JAVA_OPTS=-Xms128m -Xmx128m -XX:+ExitOnOutOfMemoryError
|
||||||
|
ports:
|
||||||
|
# Port used for the Zipkin UI and HTTP Api
|
||||||
|
- 9411:9411
|
||||||
|
# Uncomment to enable debug logging
|
||||||
|
# command: --logging.level.zipkin2=DEBUG
|
||||||
|
|||||||
35
ops/otel-collector-config.yml
Normal file
35
ops/otel-collector-config.yml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
http:
|
||||||
|
|
||||||
|
processors:
|
||||||
|
batch:
|
||||||
|
|
||||||
|
exporters:
|
||||||
|
# otlp:
|
||||||
|
# endpoint: otelcol:4317
|
||||||
|
zipkin:
|
||||||
|
endpoint: http://zipkin:9411/api/v2/spans
|
||||||
|
|
||||||
|
extensions:
|
||||||
|
health_check:
|
||||||
|
pprof:
|
||||||
|
zpages:
|
||||||
|
|
||||||
|
service:
|
||||||
|
extensions: [health_check, pprof, zpages]
|
||||||
|
pipelines:
|
||||||
|
traces:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [zipkin]
|
||||||
|
# metrics:
|
||||||
|
# receivers: []
|
||||||
|
# processors: [batch]
|
||||||
|
# exporters: []
|
||||||
|
# logs:
|
||||||
|
# receivers: []
|
||||||
|
# processors: [batch]
|
||||||
|
# exporters: []
|
||||||
Reference in New Issue
Block a user