diff --git a/Management.Test/Markdown/RubricMarkdownTests.cs b/Management.Test/Markdown/RubricMarkdownTests.cs index 6e0ae95..5c52504 100644 --- a/Management.Test/Markdown/RubricMarkdownTests.cs +++ b/Management.Test/Markdown/RubricMarkdownTests.cs @@ -2,6 +2,7 @@ using LocalModels; public class RubricMarkdownTests { + [Test] public void TestCanParseOneItem() { @@ -15,6 +16,7 @@ public class RubricMarkdownTests rubric.First().Label.Should().Be("this is the task"); rubric.First().Points.Should().Be(2); } + [Test] public void TestCanParseMultipleItems() { @@ -29,6 +31,7 @@ public class RubricMarkdownTests rubric.ElementAt(1).Label.Should().Be("this is the other task"); rubric.ElementAt(1).Points.Should().Be(3); } + [Test] public void TestCanParseSinglePoint() { @@ -41,6 +44,7 @@ public class RubricMarkdownTests rubric.First().Label.Should().Be("this is the task"); rubric.First().Points.Should().Be(1); } + [Test] public void TestCanParseSingleExtraCredit_LowerCase() { diff --git a/Management.Web/ConfigurationSetup.cs b/Management.Web/ConfigurationSetup.cs new file mode 100644 index 0000000..33a9c28 --- /dev/null +++ b/Management.Web/ConfigurationSetup.cs @@ -0,0 +1,14 @@ +public static class ConfigurationSetup +{ + public static void Canvas(WebApplicationBuilder builder) + { + var canvas_token = builder.Configuration["CANVAS_TOKEN"] ?? throw new Exception("CANVAS_TOKEN is null"); + + var canvas_url = builder.Configuration["CANVAS_URL"]; + if (canvas_url == null) + { + Console.WriteLine("CANVAS_URL is null, defaulting to https://snow.instructure.com"); + builder.Configuration["CANVAS_URL"] = "https://snow.instructure.com"; + } + } +} \ No newline at end of file diff --git a/Management.Web/CustomConsoleExporter.cs b/Management.Web/CustomConsoleExporter.cs new file mode 100644 index 0000000..2f232b5 --- /dev/null +++ b/Management.Web/CustomConsoleExporter.cs @@ -0,0 +1,20 @@ +using System.Diagnostics; +using OpenTelemetry; + +public class CustomConsoleExporter : BaseExporter +{ + public override ExportResult Export(in Batch batch) + { + using var scope = SuppressInstrumentationScope.Begin(); + + foreach (var activity in batch) + { + string[] ignoreOperations = [ + "Microsoft.AspNetCore.Hosting.HttpRequestIn", + ]; + if (!ignoreOperations.Contains(activity.OperationName)) + Console.WriteLine($"{activity.OperationName}: {activity.DisplayName}"); + } + return ExportResult.Success; + } +} \ No newline at end of file diff --git a/Management.Web/Program.cs b/Management.Web/Program.cs index 0760424..aa7a823 100644 --- a/Management.Web/Program.cs +++ b/Management.Web/Program.cs @@ -18,37 +18,30 @@ using OpenTelemetry.Logs; using OpenTelemetry.Metrics; using OpenTelemetry.Resources; using OpenTelemetry.Trace; +using OpenTelemetry; DotEnv.Load(); var builder = WebApplication.CreateBuilder(args); -var canvas_token = builder.Configuration["CANVAS_TOKEN"]; -if (canvas_token == null) - throw new Exception("CANVAS_TOKEN is null"); -var canvas_url = builder.Configuration["CANVAS_URL"]; -if (canvas_url == null) -{ - Console.WriteLine("CANVAS_URL is null, defaulting to https://snow.instructure.com"); - builder.Configuration["CANVAS_URL"] = "https://snow.instructure.com"; -} +ConfigurationSetup.Canvas(builder); 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.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)) @@ -59,15 +52,16 @@ builder.Services.AddOpenTelemetry() o.Endpoint = new Uri("http://localhost:4317/"); }) .AddAspNetCoreInstrumentation() - .AddConsoleExporter() - ); -// .WithMetrics(metrics => metrics -// .AddOtlpExporter(o => { -// o.Endpoint = new Uri("http://localhost:4317/"); -// }) -// .AddAspNetCoreInstrumentation() -// .AddConsoleExporter() -// ); + .AddProcessor(new BatchActivityExportProcessor(new CustomConsoleExporter())) + ) + .WithMetrics(metrics => metrics + .AddOtlpExporter(o => + { + o.Endpoint = new Uri("http://localhost:4317/"); + } + ) + .AddAspNetCoreInstrumentation() +); // Add services to the container. builder.Services.AddRazorPages(); @@ -133,3 +127,4 @@ foreach (var address in addresses) } app.WaitForShutdown(); + diff --git a/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor b/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor index 1b2d518..f39b278 100644 --- a/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor +++ b/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor @@ -34,6 +34,9 @@ private string name { get; set; } = String.Empty; private bool addingAssignmentToCanvas = false; private bool deletingAssignmentFromCanvas = false; + private bool showHelp = false; + + private void toggleHelp() => showHelp = !showHelp; private void submitHandler() { @@ -157,9 +160,6 @@ deletingAssignmentFromCanvas = false; StateHasChanged(); } - - - private bool showHelp { get; set; } = false; }
@@ -170,7 +170,7 @@
@if (assignmentContext.Assignment != null) { - @* *@ + }
@@ -182,7 +182,7 @@
} - diff --git a/Management.Web/Shared/Components/AssignmentForm/AssignmentMarkdownEditor.razor b/Management.Web/Shared/Components/AssignmentForm/AssignmentMarkdownEditor.razor index c5775e0..a2d672d 100644 --- a/Management.Web/Shared/Components/AssignmentForm/AssignmentMarkdownEditor.razor +++ b/Management.Web/Shared/Components/AssignmentForm/AssignmentMarkdownEditor.razor @@ -1,4 +1,5 @@ @using Markdig +@using Shared.Components.AssignmentForm @inject CoursePlanner planner @inject AssignmentEditorContext assignmentContext @@ -64,48 +65,59 @@ private MarkupString preview { get => (MarkupString)Markdown.ToHtml(assignmentContext?.Assignment?.Description ?? ""); } private string HelpText() { - var groupNames = string.Join(", " , planner.LocalCourse?.Settings.AssignmentGroups.Select(g => g.Name)); + var groupNames = string.Join("\n- " , planner.LocalCourse?.Settings.AssignmentGroups.Select(g => g.Name) ?? []); return $@" SubmissionTypes: - {AssignmentSubmissionType.ONLINE_TEXT_ENTRY} - {AssignmentSubmissionType.ONLINE_UPLOAD} Assignment Group Names: -{groupNames} +- {groupNames} "; } } -@if(assignmentContext.Assignment != null && planner.LocalCourse != null) -{ -
-
- - +
+ @if(ShowHelp) + { +
+
+        @HelpText()
+      
-
- @if (error != null) - { -

Error: @error

- } + } - -
Due At: @assignmentContext.Assignment.DueAt
-
Lock At: @assignmentContext.Assignment.LockAt
-
Assignment Group Name @assignmentContext.Assignment.LocalAssignmentGroupName
-
Submission Types
-
    - @foreach(var t in assignmentContext.Assignment.SubmissionTypes) - { -
  • @t
  • - } -
-
-
- @(preview) + @if(assignmentContext.Assignment != null && planner.LocalCourse != null) + { +
+
+ + +
+
+ @if (error != null) + { +

Error: @error

+ } + + +
Due At: @assignmentContext.Assignment.DueAt
+
Lock At: @assignmentContext.Assignment.LockAt
+
Assignment Group Name @assignmentContext.Assignment.LocalAssignmentGroupName
+
Submission Types
+
    + @foreach(var t in assignmentContext.Assignment.SubmissionTypes) + { +
  • @t
  • + } +
+
+
+ @(preview) +
+
+
-
-
-
-} \ No newline at end of file + } +
\ No newline at end of file diff --git a/Management.Web/Shared/Module/Assignment/AssignmentListItem.razor b/Management.Web/Shared/Module/Assignment/AssignmentListItem.razor index 4cf7b7c..e60f12c 100644 --- a/Management.Web/Shared/Module/Assignment/AssignmentListItem.razor +++ b/Management.Web/Shared/Module/Assignment/AssignmentListItem.razor @@ -98,12 +98,17 @@
- @if(existsInCanvas && NeedsToBeUpdatedInCanvas) + @if( + planner.LocalCourse != null + && existsInCanvas + && NeedsToBeUpdatedInCanvas + && assignmentInCanvas != null + ) {
@Assignment.GetUpdateReason( - (CanvasAssignment)assignmentInCanvas, - Assignment.GetCanvasAssignmentGroupId(planner.LocalCourse.Settings.AssignmentGroups)) + (CanvasAssignment)assignmentInCanvas, + Assignment.GetCanvasAssignmentGroupId(planner.LocalCourse.Settings.AssignmentGroups))
} @if(!existsInCanvas) diff --git a/Management.Web/appsettings.Development.json b/Management.Web/appsettings.Development.json index f042c67..253cd2d 100644 --- a/Management.Web/appsettings.Development.json +++ b/Management.Web/appsettings.Development.json @@ -2,7 +2,7 @@ "DetailedErrors": true, "Logging": { "LogLevel": { - "Default": "Information", + "Default": "Error", "Microsoft.AspNetCore": "Warning" } } diff --git a/Management.Web/appsettings.json b/Management.Web/appsettings.json index d9e88ac..04986a1 100644 --- a/Management.Web/appsettings.json +++ b/Management.Web/appsettings.json @@ -1,7 +1,7 @@ { "Logging": { "LogLevel": { - "Default": "Trace", + "Default": "Error", "Microsoft.AspNetCore": "Warning" } }, diff --git a/Management/Models/Local/Assignment/AssignemntParseExceptions.cs b/Management/Models/Local/Assignment/AssignemntParseExceptions.cs new file mode 100644 index 0000000..bb54163 --- /dev/null +++ b/Management/Models/Local/Assignment/AssignemntParseExceptions.cs @@ -0,0 +1,10 @@ + +namespace LocalModels; +public class RubricMarkdownParseException : Exception +{ + public RubricMarkdownParseException(string message) : base(message) { } +} +public class AssignmentMarkdownParseException : Exception +{ + public AssignmentMarkdownParseException(string message) : base(message) { } +} \ No newline at end of file diff --git a/Management/Models/Local/Assignment/LocalAssignment.cs b/Management/Models/Local/Assignment/LocalAssignment.cs index 919920e..0c484a1 100644 --- a/Management/Models/Local/Assignment/LocalAssignment.cs +++ b/Management/Models/Local/Assignment/LocalAssignment.cs @@ -40,7 +40,6 @@ public record LocalAssignment public string GetDescriptionHtml() { var rubricHtml = GetRubricHtml(); - return Markdig.Markdown.ToHtml(Description) + "
" + rubricHtml; } @@ -49,170 +48,8 @@ public record LocalAssignment .FirstOrDefault(g => g.Name == LocalAssignmentGroupName)? .CanvasId; - - public string ToYaml() - { - var serializer = new SerializerBuilder().DisableAliases().Build(); - var yaml = serializer.Serialize(this); - return yaml; - } - - public static LocalAssignment ParseMarkdown(string input) - { - var settingsString = input.Split("---")[0]; - var (name, localAssignmentGroupName, submissionTypes, dueAt, lockAt) = parseSettings(settingsString); - - var description = input.Split("---\n")[1].Split("## Rubric")[0]; - - var rubricString = input.Split("## Rubric\n")[1]; - var rubric = ParseRubricMarkdown(rubricString); - return new LocalAssignment() - { - Name = name.Trim(), - LocalAssignmentGroupName = localAssignmentGroupName.Trim(), - SubmissionTypes = submissionTypes, - DueAt = dueAt, - LockAt = lockAt, - Rubric = rubric, - Description = description.Trim() - }; - } - - private static (string name, string assignmentGroupName, List submissionTypes, DateTime dueAt, DateTime? lockAt) parseSettings(string input) - { - var name = extractLabelValue(input, "Name"); - var rawLockAt = extractLabelValue(input, "LockAt"); - var rawDueAt = extractLabelValue(input, "DueAt"); - var localAssignmentGroupName = extractLabelValue(input, "AssignmentGroupName"); - var submissionTypes = parseSubmissionTypes(input); - - DateTime? lockAt = DateTime.TryParse(rawLockAt, out DateTime parsedLockAt) - ? parsedLockAt - : null; - var dueAt = DateTime.TryParse(rawDueAt, out DateTime parsedDueAt) - ? parsedDueAt - : throw new QuizMarkdownParseException($"Error with DueAt: {rawDueAt}"); - - return (name, localAssignmentGroupName, submissionTypes, dueAt, lockAt); - - - } - - private static List parseSubmissionTypes(string input) - { - input = input.Replace("\r\n", "\n"); - List submissionTypes = new List(); - - // Define a regular expression pattern to match the bulleted list items - string startOfTypePattern = @"- (.+)"; - Regex regex = new Regex(startOfTypePattern); - - var words = input.Split("SubmissionTypes:"); - var inputAfterSubmissionTypes = words[1]; - - string[] lines = inputAfterSubmissionTypes.Split("\n", StringSplitOptions.RemoveEmptyEntries); - - foreach (string line in lines) - { - string trimmedLine = line.Trim(); - Match match = regex.Match(trimmedLine); - - if (!match.Success) - break; - - string type = match.Groups[1].Value.Trim(); - submissionTypes.Add(type); - } - - return submissionTypes; - } - - static string extractLabelValue(string input, string label) - { - string pattern = $@"{label}: (.*?)\n"; - Match match = Regex.Match(input, pattern); - - if (match.Success) - { - return match.Groups[1].Value; - } - - return string.Empty; - } - - public string ToMarkdown() - { - var settingsMarkdown = settingsToMarkdown(); - var rubricMarkdown = RubricToMarkdown(); - var assignmentMarkdown = - settingsMarkdown + "\n" - + "---\n\n" - + Description + "\n\n" - + "## Rubric\n\n" - + rubricMarkdown; - - return assignmentMarkdown; - } - - public string RubricToMarkdown() - { - var builder = new StringBuilder(); - foreach (var item in Rubric) - { - var pointLabel = item.Points > 1 ? "pts" : "pt"; - builder.Append($"- {item.Points}{pointLabel}: {item.Label}" + "\n"); - } - return builder.ToString(); - } - - private string settingsToMarkdown() - { - var builder = new StringBuilder(); - builder.Append($"Name: {Name}" + "\n"); - builder.Append($"LockAt: {LockAt}" + "\n"); - builder.Append($"DueAt: {DueAt}" + "\n"); - builder.Append($"AssignmentGroupName: {LocalAssignmentGroupName}" + "\n"); - builder.Append($"SubmissionTypes:" + "\n"); - foreach (var submissionType in SubmissionTypes) - { - builder.Append($"- {submissionType}" + "\n"); - } - return builder.ToString(); - } - - public static IEnumerable ParseRubricMarkdown(string rawMarkdown) - { - if (rawMarkdown.Trim() == string.Empty) - return []; - var lines = rawMarkdown.Trim().Split("\n"); - var items = lines.Select(parseIndividualRubricItemMarkdown).ToArray(); - return items; - } - - private static RubricItem parseIndividualRubricItemMarkdown(string rawMarkdown) - { - var pointsPattern = @"\s*-\s*(\d+)\s*pt(s)?:"; - var match = Regex.Match(rawMarkdown, pointsPattern); - if (!match.Success) - throw new RubricMarkdownParseException($"points not found: {rawMarkdown}"); - - var points = int.Parse(match.Groups[1].Value); - - var label = string.Join(": ", rawMarkdown.Split(": ").Skip(1)); - - return new RubricItem() - { - Points = points, - Label = label - }; - } + public string ToMarkdown() => this.AssignmentToMarkdown(); + public string RubricToMarkdown() => this.AssignmentRubricToMarkdown(); + public static LocalAssignment ParseMarkdown(string input) => LocalAssignmentMarkdownParser.ParseMarkdown(input); + public static IEnumerable ParseRubricMarkdown(string rawMarkdown) => LocalAssignmentMarkdownParser.ParseRubricMarkdown(rawMarkdown); } - -public class RubricMarkdownParseException : Exception -{ - public RubricMarkdownParseException(string message) : base(message) { } -} -public class AssignmentMarkdownParseException : Exception -{ - public AssignmentMarkdownParseException(string message) : base(message) { } -} \ No newline at end of file diff --git a/Management/Models/Local/Assignment/LocalAssignmentMarkdownCreator.cs b/Management/Models/Local/Assignment/LocalAssignmentMarkdownCreator.cs new file mode 100644 index 0000000..a3f23a1 --- /dev/null +++ b/Management/Models/Local/Assignment/LocalAssignmentMarkdownCreator.cs @@ -0,0 +1,50 @@ +using System.Text; +using LocalModels; + +namespace LocalModels; +public static class LocalAssignmentMarkdownCreator +{ + + + public static string AssignmentToMarkdown(this LocalAssignment assignment) + { + var settingsMarkdown = assignment.settingsToMarkdown(); + var rubricMarkdown = assignment.RubricToMarkdown(); + var assignmentMarkdown = + settingsMarkdown + "\n" + + "---\n\n" + + assignment.Description + "\n\n" + + "## Rubric\n\n" + + rubricMarkdown; + + return assignmentMarkdown; + } + + public static string AssignmentRubricToMarkdown(this LocalAssignment assignment) + { + var builder = new StringBuilder(); + foreach (var item in assignment.Rubric) + { + var pointLabel = item.Points > 1 ? "pts" : "pt"; + builder.Append($"- {item.Points}{pointLabel}: {item.Label}" + "\n"); + } + return builder.ToString(); + } + + private static string settingsToMarkdown(this LocalAssignment assignment) + { + var printableDueDate = assignment.DueAt.ToString().Replace('\u202F', ' '); + var printableLockAt = assignment.LockAt?.ToString().Replace('\u202F', ' ') ?? ""; + var builder = new StringBuilder(); + builder.Append($"Name: {assignment.Name}" + "\n"); + builder.Append($"LockAt: {printableLockAt}" + "\n"); + builder.Append($"DueAt: {printableDueDate}" + "\n"); + builder.Append($"AssignmentGroupName: {assignment.LocalAssignmentGroupName}" + "\n"); + builder.Append($"SubmissionTypes:" + "\n"); + foreach (var submissionType in assignment.SubmissionTypes) + { + builder.Append($"- {submissionType}" + "\n"); + } + return builder.ToString(); + } +} \ No newline at end of file diff --git a/Management/Models/Local/Assignment/LocalAssignmentMarkdownParser.cs b/Management/Models/Local/Assignment/LocalAssignmentMarkdownParser.cs new file mode 100644 index 0000000..e9f5ad8 --- /dev/null +++ b/Management/Models/Local/Assignment/LocalAssignmentMarkdownParser.cs @@ -0,0 +1,120 @@ + + +using System.Text.RegularExpressions; + +namespace LocalModels; +public static class LocalAssignmentMarkdownParser +{ + + public static LocalAssignment ParseMarkdown(string input) + { + var settingsString = input.Split("---")[0]; + var (name, localAssignmentGroupName, submissionTypes, dueAt, lockAt) = parseSettings(settingsString); + + var description = input.Split("---\n")[1].Split("## Rubric")[0]; + + var rubricString = input.Split("## Rubric\n")[1]; + var rubric = ParseRubricMarkdown(rubricString); + return new LocalAssignment() + { + Name = name.Trim(), + LocalAssignmentGroupName = localAssignmentGroupName.Trim(), + SubmissionTypes = submissionTypes, + DueAt = dueAt, + LockAt = lockAt, + Rubric = rubric, + Description = description.Trim() + }; + } + + private static (string name, string assignmentGroupName, List submissionTypes, DateTime dueAt, DateTime? lockAt) parseSettings(string input) + { + var name = extractLabelValue(input, "Name"); + var rawLockAt = extractLabelValue(input, "LockAt"); + var rawDueAt = extractLabelValue(input, "DueAt"); + var localAssignmentGroupName = extractLabelValue(input, "AssignmentGroupName"); + var submissionTypes = parseSubmissionTypes(input); + + DateTime? lockAt = DateTime.TryParse(rawLockAt, out DateTime parsedLockAt) + ? parsedLockAt + : null; + var dueAt = DateTime.TryParse(rawDueAt, out DateTime parsedDueAt) + ? parsedDueAt + : throw new QuizMarkdownParseException($"Error with DueAt: {rawDueAt}"); + + return (name, localAssignmentGroupName, submissionTypes, dueAt, lockAt); + + + } + + private static List parseSubmissionTypes(string input) + { + input = input.Replace("\r\n", "\n"); + List submissionTypes = []; + + // Define a regular expression pattern to match the bulleted list items + string startOfTypePattern = @"- (.+)"; + Regex regex = new(startOfTypePattern); + + var words = input.Split("SubmissionTypes:"); + var inputAfterSubmissionTypes = words[1]; + + string[] lines = inputAfterSubmissionTypes.Split("\n", StringSplitOptions.RemoveEmptyEntries); + + foreach (string line in lines) + { + string trimmedLine = line.Trim(); + Match match = regex.Match(trimmedLine); + + if (!match.Success) + break; + + string type = match.Groups[1].Value.Trim(); + submissionTypes.Add(type); + } + + return submissionTypes; + } + + private static string extractLabelValue(string input, string label) + { + string pattern = $@"{label}: (.*?)\n"; + Match match = Regex.Match(input, pattern); + + if (match.Success) + { + return match.Groups[1].Value; + } + + return string.Empty; + } + + + public static IEnumerable ParseRubricMarkdown(string rawMarkdown) + { + if (rawMarkdown.Trim() == string.Empty) + return []; + var lines = rawMarkdown.Trim().Split("\n"); + var items = lines.Select(parseIndividualRubricItemMarkdown).ToArray(); + return items; + } + + private static RubricItem parseIndividualRubricItemMarkdown(string rawMarkdown) + { + var pointsPattern = @"\s*-\s*(\d+)\s*pt(s)?:"; + var match = Regex.Match(rawMarkdown, pointsPattern); + if (!match.Success) + throw new RubricMarkdownParseException($"points not found: {rawMarkdown}"); + + var points = int.Parse(match.Groups[1].Value); + + var label = string.Join(": ", rawMarkdown.Split(": ").Skip(1)); + + return new RubricItem() + { + Points = points, + Label = label + }; + } + +} \ No newline at end of file diff --git a/build.sh b/build.sh index 9e527e2..4ba4225 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ MAJOR_VERSION="1" -MINOR_VERSION="3" +MINOR_VERSION="4" VERSION="$MAJOR_VERSION.$MINOR_VERSION" dotnet publish Management.Web/ \ diff --git a/docker-compose.yml b/docker-compose.yml index 028b34d..c4b9c3c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,6 +16,7 @@ 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 + - ~/projects/faculty/3840_Telemetry/2024Spring_alex/modules:/app/storage/telemetry_and_operations collector: image: otel/opentelemetry-collector-contrib @@ -30,22 +31,12 @@ services: - 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 diff --git a/ops/local-dev/docker-compose.yml b/ops/local-dev/docker-compose.yml new file mode 100644 index 0000000..2a4c5f4 --- /dev/null +++ b/ops/local-dev/docker-compose.yml @@ -0,0 +1,23 @@ +services: + collector: + image: otel/opentelemetry-collector-contrib + volumes: + - ../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 + + 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 + ports: + - 9411:9411 + # command: --logging.level.zipkin2=DEBUG