Esempio n. 1
0
        public void GrpcInputTests_CantStopWhileStopped()
        {
            // ARRANGE
            int port  = Common.GetPort();
            var input = new GrpcInput("localhost", port, null);

            // ACT
            input.Stop();

            // ASSERT
        }
Esempio n. 2
0
        public async Task GrpcInputTests_StopsAndRestarts()
        {
            // ARRANGE
            int         instancesReceived = 0;
            InstanceMsg receivedInstance  = null;

            int port  = Common.GetPort();
            var input = new GrpcInput("localhost", port, instance =>
            {
                instancesReceived++;
                receivedInstance = instance;
            });

            input.Start();

            Assert.IsTrue(SpinWait.SpinUntil(() => input.IsRunning, GrpcInputTests.DefaultTimeout));

            var grpcWriter = new GrpcWriter(port);

            var request = new HandleTraceSpanRequest();

            request.Instances.Add(new InstanceMsg()
            {
                SourceName = "SourceName1"
            });

            await grpcWriter.Write(request).ConfigureAwait(false);

            Common.AssertIsTrueEventually(
                () => input.GetStats().InstancesReceived == 1 && instancesReceived == 1 &&
                receivedInstance.SourceName == "SourceName1", GrpcInputTests.DefaultTimeout);

            // ACT
            input.Stop();

            Common.AssertIsTrueEventually(
                () => !input.IsRunning && input.GetStats().InstancesReceived == 1 && instancesReceived == 1 &&
                receivedInstance.SourceName == "SourceName1", GrpcInputTests.DefaultTimeout);

            input.Start();

            Assert.IsTrue(SpinWait.SpinUntil(() => input.IsRunning, GrpcInputTests.DefaultTimeout));

            grpcWriter = new GrpcWriter(port);
            request.Instances.Single().SourceName = "SourceName2";
            await grpcWriter.Write(request).ConfigureAwait(false);

            // ASSERT
            Common.AssertIsTrueEventually(
                () => input.IsRunning && input.GetStats().InstancesReceived == 1 && instancesReceived == 2 &&
                receivedInstance.SourceName == "SourceName2", GrpcInputTests.DefaultTimeout);
        }
Esempio n. 3
0
        public void GrpcInputTests_CantStartWhileRunning()
        {
            // ARRANGE
            int port  = Common.GetPort();
            var input = new GrpcInput("localhost", port, null);

            input.Start();

            Assert.IsTrue(SpinWait.SpinUntil(() => input.IsRunning, GrpcInputTests.DefaultTimeout));

            // ACT
            input.Start();

            // ASSERT
        }
Esempio n. 4
0
        public void GrpcInputTests_ReceivesDataFromMultipleClients()
        {
            // ARRANGE
            int         instancesReceived = 0;
            InstanceMsg receivedInstance  = null;

            int port  = Common.GetPort();
            var input = new GrpcInput("localhost", port, instance =>
            {
                Interlocked.Increment(ref instancesReceived);
                receivedInstance = instance;
            });

            input.Start();
            Assert.IsTrue(SpinWait.SpinUntil(() => input.IsRunning, GrpcInputTests.DefaultTimeout));

            // ACT
            var request = new HandleTraceSpanRequest();

            request.Instances.Add(new InstanceMsg()
            {
                SourceName = "SourceName1"
            });

            Parallel.For(0, 1000, new ParallelOptions()
            {
                MaxDegreeOfParallelism = 1000
            }, async i =>
            {
                var grpcWriter = new GrpcWriter(port);

                await grpcWriter.Write(request).ConfigureAwait(false);
            });

            // ASSERT
            Common.AssertIsTrueEventually(
                () => input.GetStats().InstancesReceived == 1000 && instancesReceived == 1000, GrpcInputTests.DefaultTimeout);

            input.Stop();
            Assert.IsTrue(SpinWait.SpinUntil(() => !input.IsRunning, GrpcInputTests.DefaultTimeout));
        }
Esempio n. 5
0
        public Library(string configuration)
        {
            this.config = new Configuration(configuration);

            Diagnostics.LogInfo(
                FormattableString.Invariant($"Loaded configuration. {Environment.NewLine}{configuration}"));

            this.telemetryGenerator = new TelemetryGenerator(this.config.Watchlist_Namespaces, this.config.Watchlist_IgnoredNamespaces);

            try
            {
                var activeConfiguration = TelemetryConfiguration.Active;
                activeConfiguration.InstrumentationKey = this.config.InstrumentationKey;

                var    channel = new ServerTelemetryChannel();
                string telemetryChannelEndpoint = this.config.Endpoints_TelemetryChannelEndpoint;
                if (!string.IsNullOrWhiteSpace(telemetryChannelEndpoint))
                {
                    channel.EndpointAddress = telemetryChannelEndpoint;
                }
                channel.Initialize(activeConfiguration);
                activeConfiguration.TelemetryChannel = channel;

                var builder = activeConfiguration.DefaultTelemetrySink.TelemetryProcessorChainBuilder;

                QuickPulseTelemetryProcessor processor = null;
                builder.Use((next) =>
                {
                    processor = new QuickPulseTelemetryProcessor(next);
                    return(processor);
                });

                if (this.config.AdaptiveSampling_Enabled == true)
                {
                    builder.UseAdaptiveSampling(this.config.AdaptiveSampling_MaxOtherItemsPerSecond ?? 5, excludedTypes: "Event");
                    builder.UseAdaptiveSampling(this.config.AdaptiveSampling_MaxEventsPerSecond ?? 5, includedTypes: "Event");
                }

                builder.Build();

                var quickPulseModule = new QuickPulseTelemetryModule()
                {
                    AuthenticationApiKey = this.config.LiveMetricsStreamAuthenticationApiKey
                };
                string quickPulseServiceEndpoint = this.config.Endpoints_QuickPulseServiceEndpoint;
                if (!string.IsNullOrWhiteSpace(quickPulseServiceEndpoint))
                {
                    quickPulseModule.QuickPulseServiceEndpoint = quickPulseServiceEndpoint;
                }

                quickPulseModule.Initialize(activeConfiguration);
                quickPulseModule.RegisterTelemetryProcessor(processor);

                this.telemetryClient = this.telemetryClient ?? new TelemetryClient(activeConfiguration);
            }
            catch (Exception e)
            {
                Diagnostics.LogError(
                    FormattableString.Invariant($"Could not initialize AI SDK. {e.ToString()}"));

                throw new InvalidOperationException(
                          FormattableString.Invariant($"Could not initialize AI SDK. {e.ToString()}"), e);
            }

            try
            {
                if (this.config.Port.HasValue)
                {
                    this.istioMixerInput = new GrpcInput(this.config.Host, this.config.Port.Value, this.OnDataReceived);

                    Diagnostics.LogInfo(
                        FormattableString.Invariant($"We will listen for Istio's Mixer data on {this.config.Host}:{this.config.Port}"));
                }
                else
                {
                    Diagnostics.LogInfo(
                        FormattableString.Invariant($"We will not listen for Istio's Mixer data, configuration is insufficient."));
                }
            }
            catch (Exception e)
            {
                Diagnostics.LogError(
                    FormattableString.Invariant($"Could not create the gRPC Istio Mixer channel. {e.ToString()}"));

                throw new InvalidOperationException(
                          FormattableString.Invariant($"Could not create the gRPC Istio Mixer channel. {e.ToString()}"), e);
            }
        }