Browse Source

Fixed capturing startup errors in containers and processes (#209)

- Capture both stderr and stdout
- Run docker logs in a loop to capture the output for restarting containers.

Fixes #199
davidfowl/dependencies
David Fowler 7 years ago
committed by GitHub
parent
commit
ab48bfc3ba
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 19
      src/Microsoft.Tye.Hosting/DockerRunner.cs
  2. 2
      src/Microsoft.Tye.Hosting/Model/DockerStatus.cs
  3. 1
      src/Microsoft.Tye.Hosting/Model/V1/V1ReplicaStatus.cs
  4. 1
      src/Microsoft.Tye.Hosting/ProcessRunner.cs
  5. 1
      src/Microsoft.Tye.Hosting/TyeDashboardApi.cs

19
src/Microsoft.Tye.Hosting/DockerRunner.cs

@ -160,7 +160,8 @@ namespace Microsoft.Tye.Hosting
command, command,
throwOnError: false, throwOnError: false,
cancellationToken: dockerInfo.StoppingTokenSource.Token, cancellationToken: dockerInfo.StoppingTokenSource.Token,
outputDataReceived: data => service.Logs.OnNext($"[{replica}]: {data}")); outputDataReceived: data => service.Logs.OnNext($"[{replica}]: {data}"),
errorDataReceived: data => service.Logs.OnNext($"[{replica}]: {data}"));
if (result.ExitCode != 0) if (result.ExitCode != 0)
{ {
@ -194,14 +195,14 @@ namespace Microsoft.Tye.Hosting
_logger.LogInformation("Collecting docker logs for {ContainerName}.", replica); _logger.LogInformation("Collecting docker logs for {ContainerName}.", replica);
await ProcessUtil.RunAsync("docker", $"logs -f {containerId}", while (!dockerInfo.StoppingTokenSource.Token.IsCancellationRequested)
outputDataReceived: data => service.Logs.OnNext($"[{replica}]: {data}"), {
onStart: pid => await ProcessUtil.RunAsync("docker", $"logs -f {containerId}",
{ outputDataReceived: data => service.Logs.OnNext($"[{replica}]: {data}"),
status.DockerLogsPid = pid; errorDataReceived: data => service.Logs.OnNext($"[{replica}]: {data}"),
}, throwOnError: false,
throwOnError: false, cancellationToken: dockerInfo.StoppingTokenSource.Token);
cancellationToken: dockerInfo.StoppingTokenSource.Token); }
_logger.LogInformation("docker logs collection for {ContainerName} complete with exit code {ExitCode}", replica, result.ExitCode); _logger.LogInformation("docker logs collection for {ContainerName} complete with exit code {ExitCode}", replica, result.ExitCode);

2
src/Microsoft.Tye.Hosting/Model/DockerStatus.cs

@ -13,7 +13,5 @@ namespace Microsoft.Tye.Hosting.Model
public string? DockerCommand { get; set; } public string? DockerCommand { get; set; }
public string? ContainerId { get; set; } public string? ContainerId { get; set; }
public int? DockerLogsPid { get; set; }
} }
} }

1
src/Microsoft.Tye.Hosting/Model/V1/V1ReplicaStatus.cs

@ -14,7 +14,6 @@ namespace Microsoft.Tye.Hosting.Model.V1
public V1ReplicaType Type { get; set; } public V1ReplicaType Type { get; set; }
public string? DockerCommand { get; set; } public string? DockerCommand { get; set; }
public string? ContainerId { get; set; } public string? ContainerId { get; set; }
public int? DockerLogsPid { get; set; }
public string? Name { get; set; } public string? Name { get; set; }
public IEnumerable<int>? Ports { get; set; } public IEnumerable<int>? Ports { get; set; }
public int? ExitCode { get; set; } public int? ExitCode { get; set; }

1
src/Microsoft.Tye.Hosting/ProcessRunner.cs

@ -191,6 +191,7 @@ namespace Microsoft.Tye.Hosting
environmentVariables: environment, environmentVariables: environment,
workingDirectory: workingDirectory, workingDirectory: workingDirectory,
outputDataReceived: data => service.Logs.OnNext($"[{replica}]: {data}"), outputDataReceived: data => service.Logs.OnNext($"[{replica}]: {data}"),
errorDataReceived: data => service.Logs.OnNext($"[{replica}]: {data}"),
onStart: pid => onStart: pid =>
{ {
if (hasPorts) if (hasPorts)

1
src/Microsoft.Tye.Hosting/TyeDashboardApi.cs

@ -181,7 +181,6 @@ namespace Microsoft.Tye.Hosting
else if (replica.Value is DockerStatus dockerStatus) else if (replica.Value is DockerStatus dockerStatus)
{ {
replicaStatus.DockerCommand = dockerStatus.DockerCommand; replicaStatus.DockerCommand = dockerStatus.DockerCommand;
replicaStatus.DockerLogsPid = dockerStatus.DockerLogsPid;
replicaStatus.ContainerId = dockerStatus.ContainerId; replicaStatus.ContainerId = dockerStatus.ContainerId;
} }
} }

Loading…
Cancel
Save