Beispiel #1
0
        public void OnHasActivityStarted()
        {
            // Arrange
            System.Diagnostics.Activity.Current = null;
            LayoutRenderer.Register("activity", typeof(ActivityTraceLayoutRenderer));
            LayoutRenderer.Register("onhasactivity", typeof(OnHasActivityTraceLayoutRendererWrapper));
            var logFactory = new LogFactory();
            var logConfig  = new LoggingConfiguration(logFactory);
            var memTarget  = new NLog.Targets.MemoryTarget("memory");

            logConfig.AddRuleForAllLevels(memTarget);
            memTarget.Layout         = "${message} ${onhasactivity:inner=${activity:operationName}}";
            logFactory.Configuration = logConfig;
            var logger = logFactory.GetLogger(nameof(OnHasActivityNotActive));

            // Act
            var activity = new System.Diagnostics.Activity("World");

            try
            {
                activity.Start();
                logger.Info("Hello");

                // Assert
                Assert.NotNull(System.Diagnostics.Activity.Current);
                Assert.Single(memTarget.Logs);
                Assert.Equal("Hello World", memTarget.Logs[0]);
            }
            finally
            {
                activity.Stop();
            }
        }
        /// <summary>
        /// Called before a message is dispatched to any consumers. Sets the <see cref="MassTransitContext"/>.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="context"></param>
        /// <returns></returns>
        public Task PreConsume <T>(ConsumeContext <T> context) where T : class
        {
            var parentActivityId = context.Headers?.Get(Constants.ActivityIdHeader, string.Empty);
            var activity         = new System.Diagnostics.Activity(Constants.ConsumeActivityName);

            if (!string.IsNullOrEmpty(parentActivityId))
            {
                activity.SetParentId(parentActivityId);
            }

            var baggage = context.Headers?.Get <IEnumerable <KeyValuePair <string, string> > >(Constants.BaggageHeader);

            if (baggage?.Any() ?? false)
            {
                foreach (var item in baggage)
                {
                    activity.AddBaggage(item.Key, item.Value);
                }
            }

            activity.Start();
            _tracer?.StartSpanFromActivity(Constants.SpanConsumeOperationNamePrefix, activity, SpanKind.Consumer);

            return(Task.CompletedTask);
        }
Beispiel #3
0
        public async Task Activity_StartedBeforeHttpCall_ReturnsMatchingActivity()
        {
            // Arrange
            var activity = new System.Diagnostics.Activity("Tests");

            activity.Start();
            var expectedCorrelationId = activity.RootId;

            var testEndpointUrl = @$ "{WebFixture.BaseUrl}/api/mock";

            using var client = _fixture.HttpClientFactory.CreateClient();

            //Act
            var response = await client.GetAsync(testEndpointUrl);

            var responseBody = await response.Content.ReadAsStringAsync();

            activity.Stop();

            var actualCorrelationId = GetPropertyValue(responseBody, "correlationId");
            var actualTraceId       = GetPropertyValue(responseBody, "traceId");
            var actualSpanId        = GetPropertyValue(responseBody, "spanId");
            var actualOperationName = GetPropertyValue(responseBody, "operationName");

            // Assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            Assert.Equal(expectedCorrelationId, actualCorrelationId);
            Assert.False(string.IsNullOrWhiteSpace(actualTraceId));
            Assert.False(string.IsNullOrWhiteSpace(actualSpanId));
            Assert.False(string.IsNullOrWhiteSpace(actualOperationName));
        }
Beispiel #4
0
        public async Task Activity_TenantInBaggage_TenantAccessorReturnsTenantId()
        {
            // Arrange
            var busControl = _serviceProvider.GetRequiredService <IBusControl>();

            busControl.Start();

            var tenantId = "7";
            var activity = new System.Diagnostics.Activity("producer");

            activity.AddBaggage(Constants.TenantIdBaggageKey, tenantId);
            activity.Start();
            var expectedActivityRoot = activity.RootId;

            var messageId = Guid.NewGuid();

            // Act
            await busControl.Publish(new MockMessage { Id = messageId });

            await Task.Delay(500);

            // Assert
            Assert.Contains(messageId, State.Messages.Keys);
            Assert.Equal(expectedActivityRoot, State.Messages[messageId].CorrelationId);
            Assert.Single(State.Messages[messageId].TenantIds);
            Assert.Equal(tenantId, State.Messages[messageId].TenantIds.First());
        }
Beispiel #5
0
        public void HomeErrorReturnsActivityId()
        {
            var controller = new HomeController();
            var a          = new System.Diagnostics.Activity("dummy activity");

            a.Start();
            var result = controller.Error() as ViewResult;

            a.Stop();
            Assert.AreEqual(a.Id, result.ViewData["requestId"]);
        }
Beispiel #6
0
        public void ActivityAccessor_ActivityStopped_ShouldStillReturnNewActivity()
        {
            var activity = new System.Diagnostics.Activity("Tests");

            activity.Start();
            var initialCorrelationId = activity.RootId;

            activity.Stop();

            // Act
            var correlationId = _fixture.ActivityContextAccessor.CorrelationId;

            // Assert
            Assert.NotEmpty(correlationId);
            Assert.NotEqual(initialCorrelationId, correlationId);
        }
Beispiel #7
0
        public void ActivityAccessor_Activity_ReturnsCorrelationId()
        {
            // Arrange
            var activity = new System.Diagnostics.Activity("Tests");

            activity.Start();

            var expectedCorrelationId = activity.RootId;

            // Act
            var actualCorrelationId = _fixture.ActivityContextAccessor.CorrelationId;

            activity.Stop();

            // Assert
            Assert.Equal(expectedCorrelationId, actualCorrelationId);
        }
Beispiel #8
0
        private async Task RunAsync(IServiceProvider scopeServiceProvider, CancellationToken cancellationToken)
        {
            var messageRepository = scopeServiceProvider.GetRequiredService <IMessageRepository>();

            var processType = await messageRepository.GetProcessType(_settings.ProcessType);

            if (processType == null)
            {
                throw new Exception($"No process type found for '{_settings.ProcessType}'.");
            }

            var isProcessActive = processType.IsActive;

            if (!isProcessActive)
            {
                _logger.LogWarning($"Process type {_settings.ProcessType} is not active.");
            }

            // Check if process active
            while (isProcessActive)
            {
                var requestActivity = new System.Diagnostics.Activity($"{ _settings.ProcessType }_Run");
                requestActivity.Start();
                var requestOperation = _telemetryClient.StartOperation <RequestTelemetry>(requestActivity);

                // Check if message(s) to process and is active​
                var message = await CheckMessageToProcess(processType.ProcessTypeId, messageRepository);

                if (message != null)
                {
                    // Process message
                    await ProcessMessage(message, processType, messageRepository);
                }
                else
                {
                    await Task.Delay(_settings.CheckUpdateTime, cancellationToken);
                }

                isProcessActive = await CheckProcessActive(_settings.ProcessType, messageRepository);

                _telemetryClient.StopOperation(requestOperation);
            }
        }
Beispiel #9
0
        public async Task Activity_StartedAndAddedToContext_ReturnsActivityId()
        {
            // Arrange
            var busControl = _serviceProvider.GetRequiredService <IBusControl>();

            busControl.Start();

            var messageId = Guid.NewGuid();
            var activity  = new System.Diagnostics.Activity("producer");

            activity.Start();
            var expectedActivityRoot = activity.RootId;

            // Act
            await busControl.Publish(new MockMessage { Id = messageId });

            await Task.Delay(500);

            // Assert
            Assert.Contains(messageId, State.Messages.Keys);
            Assert.Equal(expectedActivityRoot, State.Messages[messageId].CorrelationId);
        }
Beispiel #10
0
        /// <summary>
        /// Invoke Grain call context.
        /// </summary>
        /// <param name="context">The <see cref="IOutgoingGrainCallContext"/>.</param>
        /// <returns>A <see cref="Task"/>.</returns>
        public async Task Invoke(IIncomingGrainCallContext context)
        {
            var activity = new System.Diagnostics.Activity(OrleansDistributedTracingConstants.IncomingGrainFilterActivityName);

            if (RequestContext.Get(Constants.ActivityHeader) is string traceId)
            {
                activity.SetParentId(traceId);
            }

            if (RequestContext.Get(Constants.BaggageHeader) is IEnumerable <KeyValuePair <string, string> > baggage)
            {
                foreach (var item in baggage)
                {
                    activity.AddBaggage(item.Key, item.Value);
                }
            }

            activity.Start();

            await context.Invoke();

            activity.Stop();
        }