Browse Source

Add distributed tracing wireup

davidfowl/ingress-changes
Ryan Nowak 7 years ago
parent
commit
5d3138f263
  1. 5
      src/Microsoft.Tye.Core/ExtensionContext.cs
  2. 9
      src/Microsoft.Tye.Core/HostOptions.cs
  3. 52
      src/Microsoft.Tye.Extensions/Zipkin/ZipkinExtension.cs
  4. 11
      src/Microsoft.Tye.Hosting/TyeHost.cs
  5. 4
      src/tye/ApplicationBuilderExtensions.cs
  6. 2
      src/tye/BuildHost.cs
  7. 2
      src/tye/GenerateHost.cs
  8. 2
      src/tye/Program.DeployCommand.cs
  9. 2
      src/tye/Program.PushCommand.cs
  10. 23
      src/tye/Program.RunCommand.cs

5
src/Microsoft.Tye.Core/ExtensionContext.cs

@ -6,15 +6,18 @@ namespace Microsoft.Tye
{ {
public sealed class ExtensionContext public sealed class ExtensionContext
{ {
public ExtensionContext(ApplicationBuilder application, OutputContext output, OperationKind operation) public ExtensionContext(ApplicationBuilder application, HostOptions? options, OutputContext output, OperationKind operation)
{ {
Application = application; Application = application;
Options = options;
Output = output; Output = output;
Operation = operation; Operation = operation;
} }
public ApplicationBuilder Application { get; } public ApplicationBuilder Application { get; }
public HostOptions? Options { get; }
public OutputContext Output { get; } public OutputContext Output { get; }
public OperationKind Operation { get; } public OperationKind Operation { get; }

9
src/Microsoft.Tye.Hosting/HostOptions.cs → src/Microsoft.Tye.Core/HostOptions.cs

@ -3,9 +3,8 @@
// See the LICENSE file in the project root for more information. // See the LICENSE file in the project root for more information.
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.Tye.Hosting.Diagnostics;
namespace Microsoft.Tye.Hosting namespace Microsoft.Tye
{ {
public class HostOptions public class HostOptions
{ {
@ -13,10 +12,14 @@ namespace Microsoft.Tye.Hosting
public List<string> Debug { get; } = new List<string>(); public List<string> Debug { get; } = new List<string>();
public DiagnosticOptions Diagnostics { get; } = new DiagnosticOptions(); public (string Key, string Value) DistributedTraceProvider { get; set; }
public bool Docker { get; set; } public bool Docker { get; set; }
public (string Key, string Value) LoggingProvider { get; set; }
public (string Key, string Value) MetricsProvider { get; set; }
public bool NoBuild { get; set; } public bool NoBuild { get; set; }
public int? Port { get; set; } public int? Port { get; set; }

52
src/Microsoft.Tye.Extensions/Zipkin/ZipkinExtension.cs

@ -14,27 +14,49 @@ namespace Microsoft.Tye.Extensions.Zipkin
{ {
public override Task ProcessAsync(ExtensionContext context, ExtensionConfiguration config) public override Task ProcessAsync(ExtensionContext context, ExtensionConfiguration config)
{ {
if (context.Application.Services.Any(s => s.Name == "zipkin"))
{
context.Output.WriteDebugLine("Zipkin service already configured. Skipping...");
return Task.CompletedTask;
}
if (context.Operation == ExtensionContext.OperationKind.LocalRun) if (context.Operation == ExtensionContext.OperationKind.LocalRun)
{ {
var service = new ContainerServiceBuilder("zipkin", "openzipkin/zipkin") if (context.Application.Services.Any(s => s.Name == "zipkin"))
{ {
Bindings = context.Output.WriteDebugLine("zipkin service already configured. Skipping...");
}
else
{
context.Output.WriteDebugLine("Injecting zipkin service...");
var service = new ContainerServiceBuilder("zipkin", "openzipkin/zipkin")
{ {
new BindingBuilder() Bindings =
{ {
Port = 9411, new BindingBuilder()
ContainerPort = 9411, {
Protocol = "http", Port = 9411,
ContainerPort = 9411,
Protocol = "http",
},
}, },
}, };
}; context.Application.Services.Add(service);
context.Application.Services.Add(service);
foreach (var s in context.Application.Services)
{
if (object.ReferenceEquals(s, service))
{
continue;
}
// make zipkin available as a dependency of everything.
if (!s.Dependencies.Contains(service.Name))
{
s.Dependencies.Add(service.Name);
}
}
}
if (context.Options!.DistributedTraceProvider.Key is null)
{
context.Options.DistributedTraceProvider = ("zipkin", "http://localhost:9411");
}
} }
return Task.CompletedTask; return Task.CompletedTask;

11
src/Microsoft.Tye.Hosting/TyeHost.cs

@ -248,10 +248,17 @@ namespace Microsoft.Tye.Hosting
private static AggregateApplicationProcessor CreateApplicationProcessor(ReplicaRegistry replicaRegistry, HostOptions options, Microsoft.Extensions.Logging.ILogger logger) private static AggregateApplicationProcessor CreateApplicationProcessor(ReplicaRegistry replicaRegistry, HostOptions options, Microsoft.Extensions.Logging.ILogger logger)
{ {
var diagnosticsCollector = new DiagnosticsCollector(logger, options.Diagnostics); var diagnostics = new DiagnosticOptions()
{
DistributedTraceProvider = options.DistributedTraceProvider,
LoggingProvider = options.LoggingProvider,
MetricsProvider = options.MetricsProvider,
};
var diagnosticsCollector = new DiagnosticsCollector(logger, diagnostics);
// Print out what providers were selected and their values // Print out what providers were selected and their values
options.Diagnostics.DumpDiagnostics(logger); diagnostics.DumpDiagnostics(logger);
var processors = new List<IApplicationProcessor> var processors = new List<IApplicationProcessor>
{ {

4
src/tye/ApplicationBuilderExtensions.cs

@ -14,7 +14,7 @@ namespace Microsoft.Tye
{ {
// For layering reasons this has to live in the `tye` project. We don't want to leak // For layering reasons this has to live in the `tye` project. We don't want to leak
// the extensions themselves into Tye.Core. // the extensions themselves into Tye.Core.
public static async Task ProcessExtensionsAsync(this ApplicationBuilder application, OutputContext output, ExtensionContext.OperationKind operation) public static async Task ProcessExtensionsAsync(this ApplicationBuilder application, HostOptions? options, OutputContext output, ExtensionContext.OperationKind operation)
{ {
foreach (var extensionConfig in application.Extensions) foreach (var extensionConfig in application.Extensions)
{ {
@ -23,7 +23,7 @@ namespace Microsoft.Tye
throw new CommandException($"Could not find the extension '{extensionConfig.Name}'."); throw new CommandException($"Could not find the extension '{extensionConfig.Name}'.");
} }
var context = new ExtensionContext(application, output, operation); var context = new ExtensionContext(application, options, output, operation);
await extension.ProcessAsync(context, extensionConfig); await extension.ProcessAsync(context, extensionConfig);
} }
} }

2
src/tye/BuildHost.cs

@ -25,7 +25,7 @@ namespace Microsoft.Tye
public static async Task ExecuteBuildAsync(OutputContext output, ApplicationBuilder application, string environment, bool interactive) public static async Task ExecuteBuildAsync(OutputContext output, ApplicationBuilder application, string environment, bool interactive)
{ {
await application.ProcessExtensionsAsync(output, ExtensionContext.OperationKind.Deploy); await application.ProcessExtensionsAsync(options: null, output, ExtensionContext.OperationKind.Deploy);
Program.ApplyRegistry(output, application, interactive, requireRegistry: false); Program.ApplyRegistry(output, application, interactive, requireRegistry: false);
var executor = new ApplicationExecutor(output) var executor = new ApplicationExecutor(output)

2
src/tye/GenerateHost.cs

@ -32,7 +32,7 @@ namespace Microsoft.Tye
public static async Task ExecuteGenerateAsync(OutputContext output, ApplicationBuilder application, string environment, bool interactive) public static async Task ExecuteGenerateAsync(OutputContext output, ApplicationBuilder application, string environment, bool interactive)
{ {
await application.ProcessExtensionsAsync(output, ExtensionContext.OperationKind.Deploy); await application.ProcessExtensionsAsync(options: null, output, ExtensionContext.OperationKind.Deploy);
Program.ApplyRegistry(output, application, interactive, requireRegistry: false); Program.ApplyRegistry(output, application, interactive, requireRegistry: false);
var executor = new ApplicationExecutor(output) var executor = new ApplicationExecutor(output)

2
src/tye/Program.DeployCommand.cs

@ -69,7 +69,7 @@ namespace Microsoft.Tye
throw new CommandException($"Cannot apply manifests because kubectl is not connected to a cluster."); throw new CommandException($"Cannot apply manifests because kubectl is not connected to a cluster.");
} }
await application.ProcessExtensionsAsync(output, ExtensionContext.OperationKind.Deploy); await application.ProcessExtensionsAsync(options: null, output, ExtensionContext.OperationKind.Deploy);
ApplyRegistry(output, application, interactive, requireRegistry: true); ApplyRegistry(output, application, interactive, requireRegistry: true);
var executor = new ApplicationExecutor(output) var executor = new ApplicationExecutor(output)

2
src/tye/Program.PushCommand.cs

@ -51,7 +51,7 @@ namespace Microsoft.Tye
private static async Task ExecutePushAsync(OutputContext output, ApplicationBuilder application, string environment, bool interactive, bool force) private static async Task ExecutePushAsync(OutputContext output, ApplicationBuilder application, string environment, bool interactive, bool force)
{ {
await application.ProcessExtensionsAsync(output, ExtensionContext.OperationKind.Deploy); await application.ProcessExtensionsAsync(options: null, output, ExtensionContext.OperationKind.Deploy);
ApplyRegistry(output, application, interactive, requireRegistry: true); ApplyRegistry(output, application, interactive, requireRegistry: true);
var executor = new ApplicationExecutor(output) var executor = new ApplicationExecutor(output)

23
src/tye/Program.RunCommand.cs

@ -92,13 +92,6 @@ namespace Microsoft.Tye
throw new CommandException($"No services found in \"{application.Source.Name}\""); throw new CommandException($"No services found in \"{application.Source.Name}\"");
} }
await application.ProcessExtensionsAsync(output, ExtensionContext.OperationKind.LocalRun);
InitializeThreadPoolSettings(application.Services.Count);
output.WriteInfoLine("Launching Tye Host...");
output.WriteInfoLine(string.Empty);
var options = new HostOptions() var options = new HostOptions()
{ {
Dashboard = args.Dashboard, Dashboard = args.Dashboard,
@ -106,15 +99,19 @@ namespace Microsoft.Tye
NoBuild = args.NoBuild, NoBuild = args.NoBuild,
Port = args.Port, Port = args.Port,
Diagnostics = DistributedTraceProvider = DiagnosticOptions.GetProvider(args.Dtrace),
{ LoggingProvider = DiagnosticOptions.GetProvider(args.Logs),
DistributedTraceProvider = DiagnosticOptions.GetProvider(args.Dtrace), MetricsProvider = DiagnosticOptions.GetProvider(args.Metrics),
LoggingProvider = DiagnosticOptions.GetProvider(args.Logs),
MetricsProvider = DiagnosticOptions.GetProvider(args.Metrics),
},
}; };
options.Debug.AddRange(args.Debug); options.Debug.AddRange(args.Debug);
await application.ProcessExtensionsAsync(options, output, ExtensionContext.OperationKind.LocalRun);
InitializeThreadPoolSettings(application.Services.Count);
output.WriteInfoLine("Launching Tye Host...");
output.WriteInfoLine(string.Empty);
await using var host = new TyeHost(application.ToHostingApplication(), options); await using var host = new TyeHost(application.ToHostingApplication(), options);
await host.RunAsync(); await host.RunAsync();
}); });

Loading…
Cancel
Save