public void OnWriteCommand(string name, object payload)
        {
            switch (name)
            {
            case "Microsoft.Data.SqlClient.WriteCommandBefore":
            {
                commandTimestampContext.Value = Stopwatch.GetTimestamp();
            }
            break;

            case "Microsoft.Data.SqlClient.WriteCommandAfter":
            {
                long ticks       = Stopwatch.GetTimestamp() - commandTimestampContext.Value;
                var  timeElapsed = TimeSpan.FromMilliseconds(((double)ticks / Stopwatch.Frequency) * 1000);
                PrometheusCounters.SqlCommandsDuration.Observe(timeElapsed.TotalSeconds);
            }
            break;

            case "Microsoft.Data.SqlClient.WriteCommandError":
            {
                if (commandException.TryFetch(payload, out var sqlException))
                {
                    if (commandExceptionNumber.TryFetch(sqlException, out var errorCode))
                    {
                        PrometheusCounters.SqlCommandsErrors.WithLabels(errorCode.ToString()).Inc();
                    }
                }
            }
            break;
            }
        }
        public void OnWriteTransactionRollback(string name, object payload)
        {
            switch (name)
            {
            case "Microsoft.Data.SqlClient.WriteTransactionRollbackBefore":
            {
            }
            break;

            case "Microsoft.Data.SqlClient.WriteTransactionRollbackAfter":
            {
                PrometheusCounters.DbTransactionsRollbackCount.Inc();
            }
            break;

            case "Microsoft.Data.SqlClient.WriteTransactionRollbackError":
            {
                if (rollbackException.TryFetch(payload, out var sqlException))
                {
                    if (rollbackExceptionNumber.TryFetch(sqlException, out var errorCode))
                    {
                        PrometheusCounters.DbTransactionsErrors.WithLabels(errorCode.ToString()).Inc();
                    }
                }
            }
            break;
            }
        }
        public void OnWriteConnectionOpen(string name, object payload)
        {
            switch (name)
            {
            case "Microsoft.Data.SqlClient.WriteConnectionOpenBefore":
            {
            }
            break;

            case "Microsoft.Data.SqlClient.WriteConnectionOpenAfter":
            {
                PrometheusCounters.DbConnectionsOpenTotal.Inc();
            }
            break;

            case "Microsoft.Data.SqlClient.WriteConnectionOpenError":
            {
                if (connectionException.TryFetch(payload, out var sqlException))
                {
                    if (connectionExceptionNumber.TryFetch(sqlException, out var errorCode))
                    {
                        PrometheusCounters.DbConnectionsErrors.WithLabels(errorCode.ToString()).Inc();
                    }
                }
            }
            break;
            }
        }
        public void FetchValidProperty()
        {
            var activity = new Activity("test");
            var fetch    = new PropertyFetcher <string>("DisplayName");

            Assert.True(fetch.TryFetch(activity, out string result));
            Assert.Equal(activity.DisplayName, result);
        }
        public void FetchInvalidProperty()
        {
            var activity = new Activity("test");
            var fetch    = new PropertyFetcher <string>("DisplayName2");

            Assert.False(fetch.TryFetch(activity, out string result));

            var fetchInt = new PropertyFetcher <int>("DisplayName2");

            Assert.False(fetchInt.TryFetch(activity, out int resultInt));

            Assert.Equal(default, result);
        public override void OnCustom(string name, Activity activity, object payload)
        {
            switch (name)
            {
            case "EasyCaching.WriteSetCacheBefore":
            {
                if (setBeforeOperationFetcher.TryFetch(payload, out var timestampBefore))
                {
                    this.writeSetLocal.Value = timestampBefore;
                }
            }
            break;

            case "EasyCaching.WriteSetCacheAfter":
            {
                var timestampBefore = this.writeSetLocal.Value;

                if (setAfterOperationFetcher.TryFetch(payload, out var timestampAfter))
                {
                    var elapsed = TimeSpan.FromTicks(timestampAfter - timestampBefore).TotalSeconds;

                    if (elapsed == 0)
                    {
                        return;
                    }

                    PrometheusCounters.EasyCachingOperationDuration.WithLabels("set").Observe(elapsed);
                }
            }
            break;

            case "EasyCaching.WriteGetCacheBefore":
            {
                if (getBeforeOperationFetcher.TryFetch(payload, out var timestampBefore))
                {
                    this.writeGetLocal.Value = timestampBefore;
                }
            }
            break;

            case "EasyCaching.WriteGetCacheAfter":
            {
                var timestampBefore = this.writeGetLocal.Value;

                if (getAfterOperationFetcher.TryFetch(payload, out var timeStampAfter))
                {
                    var elapsed = TimeSpan.FromTicks(timeStampAfter - timestampBefore).TotalSeconds;

                    if (elapsed == 0)
                    {
                        return;
                    }

                    PrometheusCounters.EasyCachingOperationDuration.WithLabels("get").Observe(elapsed);
                }
            }
            break;

            case "EasyCaching.WriteRemoveCacheBefore":
            {
                if (removeBeforeOperationFetcher.TryFetch(payload, out var timestampBefore))
                {
                    this.writeRemoveLocal.Value = timestampBefore;
                }
            }
            break;

            case "EasyCaching.WriteRemoveCacheAfter":
            {
                var timestampBefore = this.writeRemoveLocal.Value;

                if (removeAfterOperationFetcher.TryFetch(payload, out var timeStampAfter))
                {
                    var elapsed = TimeSpan.FromTicks(timeStampAfter - timestampBefore).TotalSeconds;

                    if (elapsed == 0)
                    {
                        return;
                    }

                    PrometheusCounters.EasyCachingOperationDuration.WithLabels("remove").Observe(elapsed);
                }
            }
            break;
            }
        }