Skip to content

Commit

Permalink
[gh-1322] Update App Insights to use connection strings (except Conta…
Browse files Browse the repository at this point in the history
…iner Host)
  • Loading branch information
ashmind committed Jan 6, 2024
1 parent b07caad commit ed2623c
Show file tree
Hide file tree
Showing 54 changed files with 908 additions and 600 deletions.
104 changes: 52 additions & 52 deletions source/NetFramework/Server/App_Start/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,67 +14,67 @@

[assembly: OwinStartup(typeof(Startup), nameof(Startup.Configuration))]

namespace SharpLab.Server.Owin {
public class Startup {
public virtual void Configuration(IAppBuilder app) {
DotEnv.Load();
namespace SharpLab.Server.Owin;

var corsPolicyTask = Task.FromResult(new CorsPolicy {
AllowAnyHeader = true,
AllowAnyMethod = true,
AllowAnyOrigin = true,
PreflightMaxAge = (long)StartupHelper.CorsPreflightMaxAge.TotalMilliseconds
});
var corsOptions = new CorsOptions {
PolicyProvider = new CorsPolicyProvider {
PolicyResolver = r => corsPolicyTask
}
};
app.UseCors(corsOptions);
public class Startup {
public virtual void Configuration(IAppBuilder app) {
DotEnv.Load();

var container = CreateContainer();
app.MapMirrorSharp(
"/mirrorsharp",
StartupHelper.CreateMirrorSharpOptions(container),
StartupHelper.CreateMirrorSharpServices(container)
);
var corsPolicyTask = Task.FromResult(new CorsPolicy {
AllowAnyHeader = true,
AllowAnyMethod = true,
AllowAnyOrigin = true,
PreflightMaxAge = (long)StartupHelper.CorsPreflightMaxAge.TotalMilliseconds
});
var corsOptions = new CorsOptions {
PolicyProvider = new CorsPolicyProvider {
PolicyResolver = r => corsPolicyTask
}
};
app.UseCors(corsOptions);

app.Map("/status", a => a.Use((c, next) => {
c.Response.ContentType = "text/plain";
return c.Response.WriteAsync("OK");
}));
var container = CreateContainer();
app.MapMirrorSharp(
"/mirrorsharp",
StartupHelper.CreateMirrorSharpOptions(container),
StartupHelper.CreateMirrorSharpServices(container)
);

var monitor = container.Resolve<IMonitor>();
monitor.Event("Application Startup", null);
HostingEnvironment.RegisterObject(new ShutdownMonitor(monitor));
app.Map("/status", a => a.Use((c, next) => {
c.Response.ContentType = "text/plain";
return c.Response.WriteAsync("OK");
}));

app.UseAutofacLifetimeScopeInjector(container);
}
var monitor = container.Resolve<IMonitor>();
monitor.Event("Application Startup", null);
HostingEnvironment.RegisterObject(new ShutdownMonitor(monitor));

private IContainer CreateContainer() {
var builder = new ContainerBuilder();
StartupHelper.ConfigureContainer(builder);
return builder.Build();
}
app.UseAutofacLifetimeScopeInjector(container);
}

private class ShutdownMonitor : IRegisteredObject {
private readonly IMonitor _monitor;
private IContainer CreateContainer() {
var builder = new ContainerBuilder();
StartupHelper.ConfigureContainer(builder);
return builder.Build();
}

public ShutdownMonitor(IMonitor monitor) {
_monitor = monitor;
}
private class ShutdownMonitor : IRegisteredObject {
private readonly IMonitor _monitor;

public ShutdownMonitor(IMonitor monitor) {
_monitor = monitor;
}

public void Stop(bool immediate) {
if (immediate)
return;
try {
_monitor.Event("Application Shutdown", null, new Dictionary<string, string> {
{ "Reason", HostingEnvironment.ShutdownReason.ToString() }
});
}
catch (Exception ex) {
_monitor.Exception(ex, null);
}
public void Stop(bool immediate) {
if (immediate)
return;
try {
_monitor.Event("Application Shutdown", null, new Dictionary<string, string> {
{ "Reason", HostingEnvironment.ShutdownReason.ToString() }
});
}
catch (Exception ex) {
_monitor.Exception(ex, null);
}
}
}
Expand Down
6 changes: 6 additions & 0 deletions source/NetFramework/Server/Common/CommonModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ protected override void Load(ContainerBuilder builder) {
builder.RegisterType<ILAdapter>()
.As<ILanguageAdapter>()
.SingleInstance();

var webAppName = EnvironmentHelper.GetRequiredEnvironmentVariable("SHARPLAB_WEBAPP_NAME");
builder.RegisterType<FeatureTracker>()
.As<IFeatureTracker>()
.SingleInstance()
.WithParameter("webAppName", webAppName);
}

private void RegisterExternals(ContainerBuilder builder) {
Expand Down
10 changes: 10 additions & 0 deletions source/NetFramework/Server/Common/EnvironmentHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System;

namespace SharpLab.Server.Common;

public static class EnvironmentHelper {
public static string GetRequiredEnvironmentVariable(string name) {
return Environment.GetEnvironmentVariable(name)
?? throw new Exception($"Environment variable {name} was not found");
}
}
51 changes: 51 additions & 0 deletions source/NetFramework/Server/Common/FeatureTracker.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using SharpLab.Server.Monitoring;
using System.Collections.Generic;
using System.Linq;

namespace SharpLab.Server.Common;

public class FeatureTracker : IFeatureTracker {
private readonly IMetricMonitor _branchMonitor;
private readonly IReadOnlyDictionary<string, IMetricMonitor> _languageMetricMonitors;
private readonly IReadOnlyDictionary<string, IMetricMonitor> _targetMetricMonitors;
private readonly IMetricMonitor _optimizeDebugMonitor;
private readonly IMetricMonitor _optimizeReleaseMonitor;

public FeatureTracker(IMonitor monitor, string webAppName) {
_branchMonitor = monitor.MetricSlow("feature", $"Branch: {webAppName}");
_languageMetricMonitors = LanguageNames.All.ToDictionary(
name => name,
name => monitor.MetricSlow("feature", $"Language: {name}")
);
_targetMetricMonitors = TargetNames.All.ToDictionary(
name => name,
name => monitor.MetricSlow("feature", $"Target: {name}")
);

_optimizeDebugMonitor = monitor.MetricSlow("feature", "Optimize: Debug");
_optimizeReleaseMonitor = monitor.MetricSlow("feature", "Optimize: Release");
}

public void TrackBranch() {
_branchMonitor.Track(1);
}

public void TrackLanguage(string languageName) {
if (_languageMetricMonitors.TryGetValue(languageName, out var metricMonitor))
metricMonitor.Track(1);
}

public void TrackTarget(string targetName) {
if (_targetMetricMonitors.TryGetValue(targetName, out var metricMonitor))
metricMonitor.Track(1);
}

public void TrackOptimize(string? optimize) {
var monitor = optimize switch {
Optimize.Debug => _optimizeDebugMonitor,
Optimize.Release => _optimizeReleaseMonitor,
_ => null
};
monitor?.Track(1);
}
}
8 changes: 8 additions & 0 deletions source/NetFramework/Server/Common/IFeatureTracker.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace SharpLab.Server.Common;

public interface IFeatureTracker {
void TrackBranch();
void TrackLanguage(string languageName);
void TrackTarget(string targetName);
void TrackOptimize(string? optimize);
}
22 changes: 11 additions & 11 deletions source/NetFramework/Server/Common/ILanguageAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@
using MirrorSharp.Advanced;
using SharpLab.Server.Common.Internal;

namespace SharpLab.Server.Common {
public interface ILanguageAdapter {
string LanguageName { get; }
namespace SharpLab.Server.Common;

void SlowSetup(MirrorSharpOptions options);
void SetOptimize(IWorkSession session, string optimize);
void SetOptionsForTarget(IWorkSession session, string target);
public interface ILanguageAdapter {
string LanguageName { get; }

ImmutableArray<int> GetMethodParameterLines(IWorkSession session, int lineInMethod, int columnInMethod);
ImmutableArray<string?> GetCallArgumentIdentifiers(IWorkSession session, int callStartLine, int callStartColumn);
void SlowSetup(MirrorSharpOptions options);
void SetOptimize(IWorkSession session, string optimize);
void SetOptionsForTarget(IWorkSession session, string target);

// Note: in some cases this Task is never resolved (e.g. if VB is never used)
AssemblyReferenceDiscoveryTask AssemblyReferenceDiscoveryTask { get; }
}
ImmutableArray<int> GetMethodParameterLines(IWorkSession session, int lineInMethod, int columnInMethod);
ImmutableArray<string?> GetCallArgumentIdentifiers(IWorkSession session, int callStartLine, int callStartColumn);

// Note: in some cases this Task is never resolved (e.g. if VB is never used)
AssemblyReferenceDiscoveryTask AssemblyReferenceDiscoveryTask { get; }
}
5 changes: 5 additions & 0 deletions source/NetFramework/Server/Common/ISecretsClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
namespace SharpLab.Server.Common;

public interface ISecretsClient {
string GetSecret(string key);
}
19 changes: 12 additions & 7 deletions source/NetFramework/Server/Common/LanguageNames.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
using System.Collections.Immutable;
using CodeAnalysis = Microsoft.CodeAnalysis;

namespace SharpLab.Server.Common {
public class LanguageNames {
public const string CSharp = CodeAnalysis.LanguageNames.CSharp;
public const string VisualBasic = CodeAnalysis.LanguageNames.VisualBasic;
public const string FSharp = CodeAnalysis.LanguageNames.FSharp;
public const string IL = "IL";
}
namespace SharpLab.Server.Common;

public class LanguageNames {
public const string CSharp = CodeAnalysis.LanguageNames.CSharp;
public const string VisualBasic = CodeAnalysis.LanguageNames.VisualBasic;
public const string FSharp = CodeAnalysis.LanguageNames.FSharp;
public const string IL = "IL";

public static readonly ImmutableArray<string> All = ImmutableArray.Create(
CSharp, VisualBasic, FSharp, IL
);
}
Loading

0 comments on commit ed2623c

Please sign in to comment.