Ejemplo n.º 1
0
        public void SqlClientInstrumentationOptions_EnableConnectionLevelAttributes(
            bool enableConnectionLevelAttributes,
            string dataSource,
            string expectedServerHostName,
            string expectedServerIpAddress,
            string expectedInstanceName,
            string expectedPort)
        {
            var source   = new ActivitySource("sql-client-instrumentation");
            var activity = source.StartActivity("Test Sql Activity");
            var options  = new SqlClientInstrumentationOptions
            {
                EnableConnectionLevelAttributes = enableConnectionLevelAttributes,
            };

            options.AddConnectionLevelDetailsToActivity(dataSource, activity);

            if (!enableConnectionLevelAttributes)
            {
                Assert.Equal(expectedServerHostName, activity.GetTagValue(SemanticConventions.AttributePeerService));
            }
            else
            {
                Assert.Equal(expectedServerHostName, activity.GetTagValue(SemanticConventions.AttributeNetPeerName));
            }

            Assert.Equal(expectedServerIpAddress, activity.GetTagValue(SemanticConventions.AttributeNetPeerIp));
            Assert.Equal(expectedInstanceName, activity.GetTagValue(SemanticConventions.AttributeDbMsSqlInstanceName));
            Assert.Equal(expectedPort, activity.GetTagValue(SemanticConventions.AttributeNetPeerPort));
        }
        /// <summary>
        /// Enables the outgoing requests automatic data collection.
        /// </summary>
        /// <param name="builder">Trace builder to use.</param>
        /// <param name="configureHttpInstrumentationOptions">Http configuration options.</param>
        /// <param name="configureSqlInstrumentationOptions">Sql configuration options.</param>
        /// <returns>The instance of <see cref="TracerBuilder"/> to chain the calls.</returns>
        public static TracerBuilder AddDependencyInstrumentation(
            this TracerBuilder builder,
            Action <HttpClientInstrumentationOptions> configureHttpInstrumentationOptions = null,
            Action <SqlClientInstrumentationOptions> configureSqlInstrumentationOptions   = null)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            var httpOptions = new HttpClientInstrumentationOptions();

            configureHttpInstrumentationOptions?.Invoke(httpOptions);

            var sqlOptions = new SqlClientInstrumentationOptions();

            configureSqlInstrumentationOptions?.Invoke(sqlOptions);

            return(builder
                   .AddInstrumentation((t) => new AzureClientsInstrumentation(t))
                   .AddInstrumentation((t) => new AzurePipelineInstrumentation(t))
                   .AddInstrumentation((t) => new HttpClientInstrumentation(t, httpOptions))
                   .AddInstrumentation((t) => new HttpWebRequestInstrumentation(t, httpOptions))
                   .AddInstrumentation((t) => new SqlClientInstrumentation(t, sqlOptions)));
        }
        public void ParseDataSourceTests(
            string dataSource,
            string expectedServerHostName,
            string expectedServerIpAddress,
            string expectedInstanceName,
            string expectedPort)
        {
            var sqlConnectionDetails = SqlClientInstrumentationOptions.ParseDataSource(dataSource);

            Assert.NotNull(sqlConnectionDetails);
            Assert.Equal(expectedServerHostName, sqlConnectionDetails.ServerHostName);
            Assert.Equal(expectedServerIpAddress, sqlConnectionDetails.ServerIpAddress);
            Assert.Equal(expectedInstanceName, sqlConnectionDetails.InstanceName);
            Assert.Equal(expectedPort, sqlConnectionDetails.Port);
        }
        /// <summary>
        /// Enables SqlClient instrumentation.
        /// </summary>
        /// <param name="builder"><see cref="TracerProviderBuilder"/> being configured.</param>
        /// <param name="configureSqlClientInstrumentationOptions">SqlClient configuration options.</param>
        /// <returns>The instance of <see cref="TracerProviderBuilder"/> to chain the calls.</returns>
        public static TracerProviderBuilder AddSqlClientInstrumentation(
            this TracerProviderBuilder builder,
            Action <SqlClientInstrumentationOptions> configureSqlClientInstrumentationOptions = null)
        {
            Guard.ThrowIfNull(builder);

            var sqlOptions = new SqlClientInstrumentationOptions();

            configureSqlClientInstrumentationOptions?.Invoke(sqlOptions);

            builder.AddInstrumentation(() => new SqlClientInstrumentation(sqlOptions));
            builder.AddSource(SqlActivitySourceHelper.ActivitySourceName);

            return(builder);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Enables the outgoing requests automatic data collection for SqlClient.
        /// </summary>
        /// <param name="builder"><see cref="OpenTelemetryBuilder"/> being configured.</param>
        /// <param name="configureSqlClientInstrumentationOptions">SqlClient configuration options.</param>
        /// <returns>The instance of <see cref="OpenTelemetryBuilder"/> to chain the calls.</returns>
        public static OpenTelemetryBuilder AddSqlClientDependencyInstrumentation(
            this OpenTelemetryBuilder builder,
            Action <SqlClientInstrumentationOptions> configureSqlClientInstrumentationOptions)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            var sqlOptions = new SqlClientInstrumentationOptions();

            configureSqlClientInstrumentationOptions?.Invoke(sqlOptions);

            builder.AddInstrumentation((activitySource) => new SqlClientInstrumentation(activitySource, sqlOptions));

            return(builder);
        }
        /// <summary>
        /// Enables SqlClient instrumentation.
        /// </summary>
        /// <param name="builder"><see cref="TracerProviderBuilder"/> being configured.</param>
        /// <param name="configureSqlClientInstrumentationOptions">SqlClient configuration options.</param>
        /// <returns>The instance of <see cref="TracerProviderBuilder"/> to chain the calls.</returns>
        public static TracerProviderBuilder AddSqlClientInstrumentation(
            this TracerProviderBuilder builder,
            Action <SqlClientInstrumentationOptions> configureSqlClientInstrumentationOptions = null)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            var sqlOptions = new SqlClientInstrumentationOptions();

            configureSqlClientInstrumentationOptions?.Invoke(sqlOptions);

            builder.AddInstrumentation(() => new SqlClientInstrumentation(sqlOptions));
            builder.AddSource(SqlClientDiagnosticListener.ActivitySourceName);

            return(builder);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Enables the outgoing requests automatic data collection for SqlClient.
        /// </summary>
        /// <param name="builder"><see cref="OpenTelemetryBuilder"/> being configured.</param>
        /// <param name="configureSqlClientInstrumentationOptions">SqlClient configuration options.</param>
        /// <returns>The instance of <see cref="OpenTelemetryBuilder"/> to chain the calls.</returns>
        public static OpenTelemetryBuilder AddSqlClientDependencyInstrumentation(
            this OpenTelemetryBuilder builder,
            Action <SqlClientInstrumentationOptions> configureSqlClientInstrumentationOptions)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            // HttpClient is not instrumented with ActivitySource, hence
            // it'll have a default ActivitySource with name string.Empty.
            builder.AddActivitySource(string.Empty);
            var sqlOptions = new SqlClientInstrumentationOptions();

            configureSqlClientInstrumentationOptions?.Invoke(sqlOptions);

            builder.AddInstrumentation(() => new SqlClientInstrumentation(sqlOptions));

            return(builder);
        }
 public SqlEventSourceListener(SqlClientInstrumentationOptions options = null)
 {
     this.options = options ?? new SqlClientInstrumentationOptions();
 }
 public SqlClientDiagnosticListener(string sourceName, SqlClientInstrumentationOptions options)
     : base(sourceName)
 {
     this.options = options ?? new SqlClientInstrumentationOptions();
 }
Ejemplo n.º 10
0
        private static void VerifyActivityData(
            CommandType commandType,
            string commandText,
            bool captureText,
            bool isFailure,
            string dataSource,
            Activity activity,
            bool enableConnectionLevelAttributes = false)
        {
            Assert.Equal("master", activity.DisplayName);
            Assert.Equal(ActivityKind.Client, activity.Kind);
            Assert.Equal(SqlClientDiagnosticListener.MicrosoftSqlServerDatabaseSystemName, activity.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeDbSystem).Value);

            if (!enableConnectionLevelAttributes)
            {
                Assert.Equal(dataSource, activity.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributePeerService).Value);
            }
            else
            {
                var connectionDetails = SqlClientInstrumentationOptions.ParseDataSource(dataSource);

                if (!string.IsNullOrEmpty(connectionDetails.ServerHostName))
                {
                    Assert.Equal(connectionDetails.ServerHostName, activity.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeNetPeerName).Value);
                }
                else
                {
                    Assert.Equal(connectionDetails.ServerIpAddress, activity.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeNetPeerIp).Value);
                }

                if (!string.IsNullOrEmpty(connectionDetails.InstanceName))
                {
                    Assert.Equal(connectionDetails.InstanceName, activity.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeDbMsSqlInstanceName).Value);
                }

                if (!string.IsNullOrEmpty(connectionDetails.Port))
                {
                    Assert.Equal(connectionDetails.Port, activity.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeNetPeerPort).Value);
                }
            }

            Assert.Equal("master", activity.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeDbName).Value);
            Assert.Equal(commandType.ToString(), activity.Tags.FirstOrDefault(t => t.Key == SpanAttributeConstants.DatabaseStatementTypeKey).Value);
            if (commandType == CommandType.StoredProcedure)
            {
                if (captureText)
                {
                    Assert.Equal(commandText, activity.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeDbStatement).Value);
                }
                else
                {
                    Assert.DoesNotContain(activity.Tags, t => t.Key == SemanticConventions.AttributeDbStatement);
                }
            }

            if (!isFailure)
            {
                Assert.Equal("Ok", activity.Tags.FirstOrDefault(t => t.Key == SpanAttributeConstants.StatusCodeKey).Value);
            }
            else
            {
                Assert.Equal("Unknown", activity.Tags.FirstOrDefault(t => t.Key == SpanAttributeConstants.StatusCodeKey).Value);
                Assert.Contains(activity.Tags, t => t.Key == SpanAttributeConstants.StatusDescriptionKey);
            }
        }
        private static void VerifyActivityData(
            string commandText,
            bool captureText,
            bool isFailure,
            string dataSource,
            Activity activity,
            bool enableConnectionLevelAttributes = false)
        {
            Assert.Equal("master", activity.DisplayName);
            Assert.Equal(ActivityKind.Client, activity.Kind);
            Assert.Equal(SqlActivitySourceHelper.MicrosoftSqlServerDatabaseSystemName, activity.GetTagValue(SemanticConventions.AttributeDbSystem));

            if (!enableConnectionLevelAttributes)
            {
                Assert.Equal(dataSource, activity.GetTagValue(SemanticConventions.AttributePeerService));
            }
            else
            {
                var connectionDetails = SqlClientInstrumentationOptions.ParseDataSource(dataSource);

                if (!string.IsNullOrEmpty(connectionDetails.ServerHostName))
                {
                    Assert.Equal(connectionDetails.ServerHostName, activity.GetTagValue(SemanticConventions.AttributeNetPeerName));
                }
                else
                {
                    Assert.Equal(connectionDetails.ServerIpAddress, activity.GetTagValue(SemanticConventions.AttributeNetPeerIp));
                }

                if (!string.IsNullOrEmpty(connectionDetails.InstanceName))
                {
                    Assert.Equal(connectionDetails.InstanceName, activity.GetTagValue(SemanticConventions.AttributeDbMsSqlInstanceName));
                }

                if (!string.IsNullOrEmpty(connectionDetails.Port))
                {
                    Assert.Equal(connectionDetails.Port, activity.GetTagValue(SemanticConventions.AttributeNetPeerPort));
                }
            }

            Assert.Equal("master", activity.GetTagValue(SemanticConventions.AttributeDbName));

            // "db.statement_type" is never set by the SqlEventSource instrumentation
            Assert.Null(activity.GetTagValue(SpanAttributeConstants.DatabaseStatementTypeKey));
            if (captureText)
            {
                Assert.Equal(commandText, activity.GetTagValue(SemanticConventions.AttributeDbStatement));
            }
            else
            {
                Assert.Null(activity.GetTagValue(SemanticConventions.AttributeDbStatement));
            }

            if (!isFailure)
            {
                Assert.Equal(Status.Unset, activity.GetStatus());
            }
            else
            {
                var status = activity.GetStatus();
                Assert.Equal(Status.Error.StatusCode, status.StatusCode);
                Assert.NotNull(status.Description);
            }
        }
 public SqlClientDiagnosticListener(string sourceName, SqlClientInstrumentationOptions options, ActivitySourceAdapter activitySource)
     : base(sourceName, null)
 {
     this.options        = options ?? throw new ArgumentNullException(nameof(options));
     this.activitySource = activitySource;
 }
 public SqlClientDiagnosticListener(string sourceName, Tracer tracer, SqlClientInstrumentationOptions options)
     : base(sourceName, tracer)
 {
     this.options = options ?? throw new ArgumentNullException(nameof(options));
 }