Merge branch 'main' of github.com:alexmickelson/canvasManagement

This commit is contained in:
2024-01-03 10:36:11 -07:00
12 changed files with 168 additions and 44 deletions

View File

@@ -8,6 +8,10 @@
<PackageReference Include="BlazorMonaco" Version="3.0.0" />
<PackageReference Include="dotenv.net" Version="3.1.2" />
<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>
<PropertyGroup>

View File

@@ -1,7 +1,5 @@
@page "/"
@using CanvasModel.EnrollmentTerms
@using Management.Web.Shared.Course
@using Management.Web.Shared.Semester
@using CanvasModel.Courses
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@using LocalModels

View File

@@ -10,13 +10,14 @@ global using LocalModels;
global using Management.Planner;
global using Management.Web.Shared.Components;
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 Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
DotEnv.Load();
@@ -32,6 +33,42 @@ if (canvas_url == null)
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.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();

View File

@@ -2,8 +2,8 @@
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Error",
"Microsoft.AspNetCore": "Error"
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@@ -1,7 +1,7 @@
{
"Logging": {
"LogLevel": {
"Default": "Error",
"Default": "Trace",
"Microsoft.AspNetCore": "Warning"
}
},

View File

@@ -16,13 +16,22 @@ public class CoursePlanner
private readonly MyLogger<CoursePlanner> logger;
private readonly FileStorageManager fileStorageManager;
private readonly CanvasService canvas;
private readonly ILogger<CoursePlanner> _otherLogger;
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.fileStorageManager = fileStorageManager;
this.canvas = canvas;
_otherLogger = otherLogger;
_otherLogger.LogInformation("testing other logging");
}
private Timer? _debounceTimer;
@@ -34,7 +43,7 @@ public class CoursePlanner
get => _localCourse;
set
{
using var activity = DiagnosticsConfig.Source?.StartActivity("Loading Course");
if (value == null)
{
_localCourse = null;
@@ -110,6 +119,8 @@ public class CoursePlanner
IEnumerable<CanvasAssignmentGroup> canvasAssignmentGroups
)> LoadCanvasData()
{
using var activity = DiagnosticsConfig.Source.StartActivity("Loading Canvas Data to Course Planner");
LoadingCanvasData = true;
StateHasChanged?.Invoke();

View File

@@ -1,3 +1,4 @@
using System.Diagnostics;
using LocalModels;
using Management.Services;
using YamlDotNet.Serialization;
@@ -7,21 +8,24 @@ public class FileStorageManager
private readonly MyLogger<FileStorageManager> logger;
private readonly CourseMarkdownLoader _courseMarkdownLoader;
private readonly MarkdownCourseSaver _saveMarkdownCourse;
private readonly ILogger<FileStorageManager> _otherLogger;
private readonly string _basePath;
public FileStorageManager(
MyLogger<FileStorageManager> logger,
CourseMarkdownLoader courseMarkdownLoader,
MarkdownCourseSaver saveMarkdownCourse
MarkdownCourseSaver saveMarkdownCourse,
ILogger<FileStorageManager> otherLogger
)
{
using var activity = DiagnosticsConfig.Source.StartActivity("loading storage directory");
this.logger = logger;
_courseMarkdownLoader = courseMarkdownLoader;
_saveMarkdownCourse = saveMarkdownCourse;
_otherLogger = otherLogger;
_basePath = FileConfiguration.GetBasePath();
this.logger.Log("Using storage directory: " + _basePath);
}
public async Task SaveCourseAsync(LocalCourse course, LocalCourse? previouslyStoredCourse)
{
@@ -36,6 +40,7 @@ public class FileStorageManager
public async Task<IEnumerable<LocalCourse>> 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);
}

View File

@@ -1,17 +1,11 @@
using System.Threading.Tasks.Sources;
using LocalModels;
using Management.Services;
namespace Management.Services;
public class MarkdownCourseSaver
public class MarkdownCourseSaver(MyLogger<MarkdownCourseSaver> logger)
{
private readonly MyLogger<MarkdownCourseSaver> logger;
private readonly string _basePath;
public MarkdownCourseSaver(MyLogger<MarkdownCourseSaver> logger)
{
this.logger = logger;
_basePath = FileConfiguration.GetBasePath();
}
private readonly MyLogger<MarkdownCourseSaver> _logger = logger;
private readonly string _basePath = FileConfiguration.GetBasePath();
public async Task Save(LocalCourse course, LocalCourse? previouslyStoredCourse)
{
@@ -70,7 +64,7 @@ public class MarkdownCourseSaver
{
var markdownPath = quizzesDirectory + "/" + quiz.Name + ".md"; ;
var quizMarkdown = quiz.ToMarkdown();
logger.Log("saving quiz " + markdownPath);
_logger.Log("saving quiz " + markdownPath);
await File.WriteAllTextAsync(markdownPath, quizMarkdown);
}
}
@@ -94,7 +88,7 @@ public class MarkdownCourseSaver
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);
}
@@ -117,7 +111,7 @@ public class MarkdownCourseSaver
var assignmentMarkdown = assignment.ToMarkdown();
var filePath = assignmentsDirectory + "/" + assignment.Name + ".md";
logger.Log("saving assignment " + filePath);
_logger.Log("saving assignment " + filePath);
await File.WriteAllTextAsync(filePath, assignmentMarkdown);
}
}
@@ -141,7 +135,7 @@ public class MarkdownCourseSaver
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);
}
}

View File

@@ -5,22 +5,22 @@ namespace Management.Services;
public class MyLogger<T>
{
private readonly ILogger<T> baseLogger;
private readonly ILogger<T> _baseLogger;
public MyLogger(ILogger<T> baseLogger)
{
this.baseLogger = baseLogger;
this._baseLogger = baseLogger;
}
public void Log(
string message,
LogLevel logLevel = LogLevel.Information,
// LogLevel logLevel = LogLevel.Information,
[CallerMemberName] string memberName = ""
)
{
var finalMessage = $"[{typeof(T)}.{memberName}] {message}";
baseLogger.Log(logLevel, finalMessage);
_baseLogger.LogInformation(finalMessage);
Console.WriteLine(finalMessage);
}
@@ -32,7 +32,7 @@ public class MyLogger<T>
{
var finalMessage = $"[{typeof(T)}.{memberName}] {message}";
baseLogger.Log(logLevel, finalMessage);
_baseLogger.Log(logLevel, finalMessage);
Console.WriteLine(finalMessage);
}
public void Error(
@@ -43,7 +43,7 @@ public class MyLogger<T>
{
var finalMessage = $"ERROR: [{typeof(T)}.{memberName}] {message}";
baseLogger.Log(logLevel, finalMessage);
_baseLogger.Log(logLevel, finalMessage);
Console.WriteLine(finalMessage);
}
}

View File

@@ -16,3 +16,36 @@ services:
- ~/projects/faculty/1400/2024_spring_alex/modules:/app/storage/1400
- ~/projects/faculty/1405/2024_spring_alex/modules:/app/storage/1405
- ~/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

View 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: []