/// <summary> /// Runs a single instance of the dotnet-monitor image. /// </summary> /// <param name="imageData">The image data of the dotnet-monitor image.</param> /// <param name="noAuthentication">Set to true to disable dotnet-monitor authenication.</param> /// <param name="verifyContainerAsync">Callback to test some aspect of the container.</param> /// <param name="runArgsCallback">Allows for modifying the "docker run" args of the container.</param> private async Task VerifyMonitorAsync( MonitorImageData imageData, bool noAuthentication, Func <string, Task> verifyContainerAsync = null, Action <DockerRunArgsBuilder> runArgsCallback = null) { GetNames(imageData, out string monitorImageName, out string monitorContainerName); try { DockerRunArgsBuilder runArgsBuilder = DockerRunArgsBuilder.Create() .ExposePort(DefaultMetricsPort); if (null != runArgsCallback) { runArgsCallback(runArgsBuilder); } DockerHelper.Run( image: monitorImageName, name: monitorContainerName, command: GetMonitorAdditionalArgs(noAuthentication), detach: true, optionalRunArgs: runArgsBuilder.Build()); if (!Config.IsHttpVerificationDisabled) { // Verify metrics endpoint is accessible using HttpResponseMessage metricsMessage = await ImageScenarioVerifier.GetHttpResponseFromContainerAsync( monitorContainerName, DockerHelper, OutputHelper, DefaultMetricsPort, UrlPath_Metrics); string metricsContent = await metricsMessage.Content.ReadAsStringAsync(); // Metrics should not return any content if // no processes are detected. Assert.Equal(string.Empty, metricsContent); } if (null != verifyContainerAsync) { await verifyContainerAsync(monitorContainerName); } } finally { DockerHelper.DeleteContainer(monitorContainerName); } }
/// <summary> /// Suspends a dotnet runtime until it can connect to a diagnostic port listener /// at the specified endpoint name. /// </summary> public static DockerRunArgsBuilder RuntimeSuspend(this DockerRunArgsBuilder builder, string endpointName) { return(builder.EnvironmentVariable(EnvVar_DiagnosticPorts, $"{endpointName},suspend")); }
/// <summary> /// Sets the artifacts url with the port and exposes the port on the container. /// </summary> public static DockerRunArgsBuilder MonitorUrl(this DockerRunArgsBuilder builder, int port) { return(builder.ExposePort(port) .EnvironmentVariable(EnvVar_Urls, WildcardUrl(port))); }
/// <summary> /// Places dotnet-monitor into listen mode, allowing dotnet processes to connect /// to its diagnostic port listener. /// </summary> public static DockerRunArgsBuilder MonitorListen(this DockerRunArgsBuilder builder, string endpointName) { return(builder .EnvironmentVariable(EnvVar_DiagnosticPort_ConnectionMode, "Listen") .EnvironmentVariable(EnvVar_DiagnosticPort_EndpointName, endpointName)); }
/// <summary> /// Disables the metrics endpoint in dotnet-monitor. /// </summary> public static DockerRunArgsBuilder MonitorDisableMetrics(this DockerRunArgsBuilder builder) { return(builder.EnvironmentVariable(EnvVar_Metrics_Enabled, "false")); }
/// <summary> /// Runs a single instance of each of the dotnet-monitor and samples images. /// </summary> /// <param name="monitorImageData">The image data of the dotnet-monitor image.</param> /// <param name="shareTmpVolume">Set to true to mount the /tmp directory in both containers.</param> /// <param name="listenDiagPortVolume"> /// Set to true to have the monitor container listen with a diagnostic port listener /// for diagnostic connections from the samples container. /// </param> /// <param name="noAuthentication">Set to true to disable dotnet-monitor authenication.</param> /// <param name="verifyContainerAsync">Callback to test some aspect of the containers.</param> /// <param name="monitorRunArgsCallback">Allows for modifying the "docker run" args of the dotnet-monitor container.</param> /// <param name="sampleRunArgsCallback">Allows for modifying the "docker run" args of the samples container.</param> private async Task VerifyScenarioAsync( MonitorImageData monitorImageData, SampleImageData sampleImageData, bool shareTmpVolume, bool listenDiagPortVolume, bool noAuthentication, Func <string, string, Task> verifyContainerAsync, Action <DockerRunArgsBuilder> monitorRunArgsCallback = null, Action <DockerRunArgsBuilder> sampleRunArgsCallback = null) { GetNames(monitorImageData, out string monitorImageName, out string monitorContainerName); GetNames(sampleImageData, out string sampleImageName, out string sampleContainerName); DockerRunArgsBuilder monitorArgsBuilder = DockerRunArgsBuilder.Create() .MonitorUrl(DefaultArtifactsPort); DockerRunArgsBuilder sampleArgsBuilder = DockerRunArgsBuilder.Create() .ExposePort(DefaultHttpPort); string diagPortVolumeName = null; string tmpVolumeName = null; try { // Create a volume for the two containers to share the /tmp directory. if (shareTmpVolume) { tmpVolumeName = DockerHelper.CreateVolume(UniqueName("tmpvol")); monitorArgsBuilder.VolumeMount(tmpVolumeName, Directory_Tmp); sampleArgsBuilder.VolumeMount(tmpVolumeName, Directory_Tmp); } // Create a volume so that the dotnet-monitor container can provide a // diagnostic listening port to the samples container so that the samples // process can connect to the dotnet-monitor process. if (listenDiagPortVolume) { diagPortVolumeName = DockerHelper.CreateVolume(UniqueName("diagportvol")); monitorArgsBuilder.VolumeMount(diagPortVolumeName, Directory_Diag); monitorArgsBuilder.MonitorListen(File_DiagPort); sampleArgsBuilder.VolumeMount(diagPortVolumeName, Directory_Diag); sampleArgsBuilder.RuntimeSuspend(File_DiagPort); } // Allow modification of the "docker run" args of the monitor container if (null != monitorRunArgsCallback) { monitorRunArgsCallback(monitorArgsBuilder); } // Allow modification of the "docker run" args of the samples container if (null != sampleRunArgsCallback) { sampleRunArgsCallback(sampleArgsBuilder); } // Run the sample container DockerHelper.Run( image: sampleImageName, name: sampleContainerName, detach: true, optionalRunArgs: sampleArgsBuilder.Build()); // Run the dotnet-monitor container DockerHelper.Run( image: monitorImageName, name: monitorContainerName, command: GetMonitorAdditionalArgs(noAuthentication), detach: true, optionalRunArgs: monitorArgsBuilder.Build()); await verifyContainerAsync( monitorContainerName, sampleContainerName); } finally { DockerHelper.DeleteContainer(monitorContainerName); DockerHelper.DeleteContainer(sampleContainerName); if (!string.IsNullOrEmpty(diagPortVolumeName)) { DockerHelper.DeleteVolume(diagPortVolumeName); } if (!string.IsNullOrEmpty(tmpVolumeName)) { DockerHelper.DeleteVolume(tmpVolumeName); } } }