public void GetMetricMeasurements_ReturnsExpected()
        {
            var opts          = new MetricsEndpointOptions();
            var stats         = new OpenCensusStats();
            var tagsComponent = new TagsComponent();
            var tagger        = tagsComponent.Tagger;
            var ep            = new MetricsEndpoint(opts, stats);

            IMeasureDouble testMeasure = MeasureDouble.Create("test.total", "test", MeasureUnit.Bytes);

            SetupTestView(stats, Sum.Create(), testMeasure, "test.test1");

            ITagContext context1 = tagger
                                   .EmptyBuilder
                                   .Put(TagKey.Create("a"), TagValue.Create("v1"))
                                   .Put(TagKey.Create("b"), TagValue.Create("v1"))
                                   .Put(TagKey.Create("c"), TagValue.Create("v1"))
                                   .Build();

            ITagContext context2 = tagger
                                   .EmptyBuilder
                                   .Put(TagKey.Create("a"), TagValue.Create("v1"))
                                   .Build();

            ITagContext context3 = tagger
                                   .EmptyBuilder
                                   .Put(TagKey.Create("b"), TagValue.Create("v1"))
                                   .Build();

            ITagContext context4 = tagger
                                   .EmptyBuilder
                                   .Put(TagKey.Create("c"), TagValue.Create("v1"))
                                   .Build();

            long allKeyssum = 0;

            for (int i = 0; i < 10; i++)
            {
                allKeyssum = allKeyssum + i;
                stats.StatsRecorder.NewMeasureMap().Put(testMeasure, i).Record(context1);
            }

            long asum = 0;

            for (int i = 0; i < 10; i++)
            {
                asum = asum + i;
                stats.StatsRecorder.NewMeasureMap().Put(testMeasure, i).Record(context2);
            }

            long bsum = 0;

            for (int i = 0; i < 10; i++)
            {
                bsum = bsum + i;
                stats.StatsRecorder.NewMeasureMap().Put(testMeasure, i).Record(context3);
            }

            long csum = 0;

            for (int i = 0; i < 10; i++)
            {
                csum = csum + i;
                stats.StatsRecorder.NewMeasureMap().Put(testMeasure, i).Record(context4);
            }

            var alltags = new List <KeyValuePair <string, string> >()
            {
                new KeyValuePair <string, string>("a", "v1"),
                new KeyValuePair <string, string>("b", "v1"),
                new KeyValuePair <string, string>("c", "v1")
            };

            var viewData = stats.ViewManager.GetView(ViewName.Create("test.test1"));
            var result   = ep.GetMetricMeasurements(viewData, alltags);

            Assert.NotNull(result);
            Assert.Single(result);
            var sample = result[0];

            Assert.Equal(allKeyssum, sample.Value);
            Assert.Equal(MetricStatistic.TOTAL, sample.Statistic);

            var atags = new List <KeyValuePair <string, string> >()
            {
                new KeyValuePair <string, string>("a", "v1"),
            };

            result = ep.GetMetricMeasurements(viewData, atags);
            Assert.NotNull(result);
            Assert.Single(result);
            sample = result[0];
            Assert.Equal(allKeyssum + asum, sample.Value);
            Assert.Equal(MetricStatistic.TOTAL, sample.Statistic);

            var btags = new List <KeyValuePair <string, string> >()
            {
                new KeyValuePair <string, string>("b", "v1"),
            };

            result = ep.GetMetricMeasurements(viewData, btags);
            Assert.NotNull(result);
            Assert.Single(result);
            sample = result[0];
            Assert.Equal(allKeyssum + bsum, sample.Value);
            Assert.Equal(MetricStatistic.TOTAL, sample.Statistic);

            var ctags = new List <KeyValuePair <string, string> >()
            {
                new KeyValuePair <string, string>("c", "v1"),
            };

            result = ep.GetMetricMeasurements(viewData, ctags);
            Assert.NotNull(result);
            Assert.Single(result);
            sample = result[0];
            Assert.Equal(allKeyssum + csum, sample.Value);
            Assert.Equal(MetricStatistic.TOTAL, sample.Statistic);

            var abtags = new List <KeyValuePair <string, string> >()
            {
                new KeyValuePair <string, string>("a", "v1"),
                new KeyValuePair <string, string>("b", "v1"),
            };

            result = ep.GetMetricMeasurements(viewData, abtags);
            Assert.NotNull(result);
            Assert.Single(result);
            sample = result[0];
            Assert.Equal(allKeyssum, sample.Value);
            Assert.Equal(MetricStatistic.TOTAL, sample.Statistic);

            var actags = new List <KeyValuePair <string, string> >()
            {
                new KeyValuePair <string, string>("a", "v1"),
                new KeyValuePair <string, string>("c", "v1"),
            };

            result = ep.GetMetricMeasurements(viewData, actags);
            Assert.NotNull(result);
            Assert.Single(result);
            sample = result[0];
            Assert.Equal(allKeyssum, sample.Value);
            Assert.Equal(MetricStatistic.TOTAL, sample.Statistic);

            var bctags = new List <KeyValuePair <string, string> >()
            {
                new KeyValuePair <string, string>("b", "v1"),
                new KeyValuePair <string, string>("c", "v1"),
            };

            result = ep.GetMetricMeasurements(viewData, bctags);
            Assert.NotNull(result);
            Assert.Single(result);
            sample = result[0];
            Assert.Equal(allKeyssum, sample.Value);
            Assert.Equal(MetricStatistic.TOTAL, sample.Statistic);
        }
 public abstract ITagContextBuilder ToBuilder(ITagContext tags);
 public override byte[] ToByteArray(ITagContext tags)
 {
     return(state.Internal == TaggingState.DISABLED
         ? EMPTY_BYTE_ARRAY
         : SerializationUtils.SerializeBinary(tags));
 }
Ejemplo n.º 4
0
 public override ITagContextBuilder ToBuilder(ITagContext tags)
 {
     return(this.state.Internal == TaggingState.DISABLED
         ? NoopTagContextBuilder.Instance
         : ToTagContextBuilder(tags));
 }
 /// <summary>
 /// Record double stats with the given tags.
 /// </summary>
 /// <param name="context">The <see cref="ITagContext"/>.</param>
 /// <param name="value">The value.</param>
 /// <param name="timestamp">The time of recording.</param>
 internal abstract void Record(ITagContext context, double value, DateTimeOffset timestamp);
Ejemplo n.º 6
0
 public override ITagContextBuilder ToBuilder(ITagContext tags)
 {
     return(state.Internal == TaggingState.DISABLED
         ? NoopTagContextBuilder.INSTANCE
         : ToTagContextBuilder(tags));
 }
Ejemplo n.º 7
0
        public void Main2()
        {
            var statsComponent = new StatsComponent();
            var viewManager    = statsComponent.ViewManager;
            var statsRecorder  = statsComponent.StatsRecorder;
            var tagsComponent  = new TagsComponent();
            var tagger         = tagsComponent.Tagger;

            ITagKey FRONTEND_KEY            = TagKey.Create("my.org/keys/frontend");
            ITagKey FRONTEND_OS_KEY         = TagKey.Create("my.org/keys/frontend/os");
            ITagKey FRONTEND_OS_VERSION_KEY = TagKey.Create("my.org/keys/frontend/os/version");

            IMeasureLong VIDEO_SIZE = MeasureLong.Create("my.org/measure/video_size", "size of processed videos", "MBy");

            IViewName VIDEO_SIZE_VIEW_NAME = ViewName.Create("my.org/views/video_size_byfrontend");
            IView     VIDEO_SIZE_VIEW      = View.Create(
                VIDEO_SIZE_VIEW_NAME,
                "processed video size over time",
                VIDEO_SIZE,
                Distribution.Create(BucketBoundaries.Create(new List <double>()
            {
                0.0, 256.0, 65536.0
            })),
                new List <ITagKey>()
            {
                FRONTEND_KEY, FRONTEND_OS_KEY, FRONTEND_OS_VERSION_KEY
            });


            viewManager.RegisterView(VIDEO_SIZE_VIEW);


            ITagContext context1 = tagger
                                   .EmptyBuilder
                                   .Put(FRONTEND_KEY, TagValue.Create("front1"))
                                   .Put(FRONTEND_OS_KEY, TagValue.Create("windows"))
                                   .Build();
            ITagContext context2 = tagger
                                   .EmptyBuilder
                                   .Put(FRONTEND_KEY, TagValue.Create("front2"))
                                   .Put(FRONTEND_OS_VERSION_KEY, TagValue.Create("1.1.1"))
                                   .Build();

            long sum = 0;

            for (int i = 0; i < 10; i++)
            {
                sum = sum + (25648 * i);
                if (i % 2 == 0)
                {
                    statsRecorder.NewMeasureMap().Put(VIDEO_SIZE, 25648 * i).Record(context1);
                }
                else
                {
                    statsRecorder.NewMeasureMap().Put(VIDEO_SIZE, 25648 * i).Record(context2);
                }
            }

            IViewData videoSizeView  = viewManager.GetView(VIDEO_SIZE_VIEW_NAME);
            var       viewDataAggMap = videoSizeView.AggregationMap.ToList();
            var       view           = viewManager.AllExportedViews.ToList()[0];

            for (int i = 0; i < view.Columns.Count; i++)
            {
                output.WriteLine(view.Columns[i] + "=" + GetTagValues(i, viewDataAggMap));
            }

            var keys = new List <ITagValue>()
            {
                TagValue.Create("1.1.1")
            };

            var results = videoSizeView.AggregationMap.Where((kvp) =>
            {
                foreach (var key in keys)
                {
                    if (!kvp.Key.Values.Contains(key))
                    {
                        return(false);
                    }
                }
                return(true);
            });

            output.WriteLine(videoSizeView.ToString());

            output.WriteLine(sum.ToString());
        }
 public abstract byte[] ToByteArray(ITagContext tags);
Ejemplo n.º 9
0
 public OpenTelemetryCollectorLogger(IStatsRecorder statsRecorder, ITagger tagger, ITagContext defaultTags = null)
 {
     this.statsRecorder = statsRecorder;
     this.tagger        = tagger;
     this.defaultTags   = defaultTags ?? TagContext.Empty;
 }
Ejemplo n.º 10
0
 public TagUow(ITagContext context, IRepositoryProvider repositoryProvider) : base(context, repositoryProvider)
 {
 }
Ejemplo n.º 11
0
 public abstract IDisposable WithTagContext(ITagContext tags);
Ejemplo n.º 12
0
 public override byte[] ToByteArray(ITagContext tags)
 {
     return(SerializationUtils.SerializeBinary(tags));
 }
Ejemplo n.º 13
0
 public override IDisposable WithTagContext(ITagContext tags)
 {
     return(CurrentTagContextUtils.WithTagContext(ToTagContext(tags)));
 }
Ejemplo n.º 14
0
 public override ITagContextBuilder ToBuilder(ITagContext tags)
 {
     return(ToTagContextBuilder(tags));
 }
 internal static IScope WithTagContext(ITagContext tags)
 {
     return(new WithTagContextScope(tags));
 }
Ejemplo n.º 16
0
 /// <inheritdoc/>
 public void Record(IEnumerable <IMeasurement> measurements, ITagContext tagContext, SpanContext spanContext)
 {
 }
 public WithTagContextScope(ITagContext tags)
 {
     origContext = AsyncLocalContext.CurrentTagContext;
     AsyncLocalContext.CurrentTagContext = tags;
 }
Ejemplo n.º 18
0
 public StatsEvent(StatsManager statsManager, ITagContext tags, IEnumerable <IMeasurement> stats)
 {
     this.statsManager = statsManager;
     this.tags         = tags;
     this.stats        = stats;
 }
Ejemplo n.º 19
0
 public static ICollection <ITag> TagContextToList(ITagContext tags)
 {
     return(tags.ToList());
 }
Ejemplo n.º 20
0
 public override void Record(ITagContext tags)
 {
     statsManager.Record(tags, builder.Build());
 }
Ejemplo n.º 21
0
        public void Main()
        {
            var statsComponent = new StatsComponent();
            var viewManager    = statsComponent.ViewManager;
            var statsRecorder  = statsComponent.StatsRecorder;
            var tagsComponent  = new TagsComponent();
            var tagger         = tagsComponent.Tagger;

            ITagKey FRONTEND_KEY            = TagKey.Create("my.org/keys/frontend");
            ITagKey FRONTEND_OS_KEY         = TagKey.Create("my.org/keys/frontend/os");
            ITagKey FRONTEND_OS_VERSION_KEY = TagKey.Create("my.org/keys/frontend/os/version");

            IMeasureLong VIDEO_SIZE = MeasureLong.Create("my.org/measure/video_size", "size of processed videos", "MBy");

            IViewName VIDEO_SIZE_BY_FRONTEND_VIEW_NAME = ViewName.Create("my.org/views/video_size_byfrontend");
            IView     VIDEO_SIZE_BY_FRONTEND_VIEW      = View.Create(
                VIDEO_SIZE_BY_FRONTEND_VIEW_NAME,
                "processed video size over time",
                VIDEO_SIZE,
                Distribution.Create(BucketBoundaries.Create(new List <double>()
            {
                0.0, 256.0, 65536.0
            })),
                new List <ITagKey>()
            {
                FRONTEND_KEY
            });

            IViewName VIDEO_SIZE_ALL_VIEW_NAME = ViewName.Create("my.org/views/video_size_all");
            IView     VIDEO_SIZE_VIEW_ALL      = View.Create(
                VIDEO_SIZE_ALL_VIEW_NAME,
                "processed video size over time",
                VIDEO_SIZE,
                Distribution.Create(BucketBoundaries.Create(new List <double>()
            {
                0.0, 256.0, 65536.0
            })),
                new List <ITagKey>()
            {
            });


            IViewName VIDEO_SIZE_TOTAL_VIEW_NAME = ViewName.Create("my.org/views/video_size_total");
            IView     VIDEO_SIZE_TOTAL           = View.Create(
                VIDEO_SIZE_TOTAL_VIEW_NAME,
                "total video size over time",
                VIDEO_SIZE,
                Sum.Create(),
                new List <ITagKey>()
            {
                FRONTEND_KEY
            });

            IViewName VIDEOS_PROCESSED_VIEW_NAME = ViewName.Create("my.org/views/videos_processed");
            IView     VIDEOS_PROCESSED           = View.Create(
                VIDEOS_PROCESSED_VIEW_NAME,
                "total video processed",
                VIDEO_SIZE,
                Count.Create(),
                new List <ITagKey>()
            {
                FRONTEND_KEY
            });

            viewManager.RegisterView(VIDEO_SIZE_VIEW_ALL);
            viewManager.RegisterView(VIDEO_SIZE_BY_FRONTEND_VIEW);
            viewManager.RegisterView(VIDEO_SIZE_TOTAL);
            viewManager.RegisterView(VIDEOS_PROCESSED);

            ITagContext context1 = tagger
                                   .EmptyBuilder
                                   .Put(FRONTEND_KEY, TagValue.Create("front1"))
                                   .Build();
            ITagContext context2 = tagger
                                   .EmptyBuilder
                                   .Put(FRONTEND_KEY, TagValue.Create("front2"))
                                   .Build();

            long sum = 0;

            for (int i = 0; i < 10; i++)
            {
                sum = sum + (25648 * i);
                if (i % 2 == 0)
                {
                    statsRecorder.NewMeasureMap().Put(VIDEO_SIZE, 25648 * i).Record(context1);
                }
                else
                {
                    statsRecorder.NewMeasureMap().Put(VIDEO_SIZE, 25648 * i).Record(context2);
                }
            }

            IViewData viewDataByFrontend = viewManager.GetView(VIDEO_SIZE_BY_FRONTEND_VIEW_NAME);
            var       viewDataAggMap     = viewDataByFrontend.AggregationMap.ToList();

            output.WriteLine(viewDataByFrontend.ToString());

            IViewData viewDataAll       = viewManager.GetView(VIDEO_SIZE_ALL_VIEW_NAME);
            var       viewDataAggMapAll = viewDataAll.AggregationMap.ToList();

            output.WriteLine(viewDataAll.ToString());

            IViewData viewData1       = viewManager.GetView(VIDEO_SIZE_TOTAL_VIEW_NAME);
            var       viewData1AggMap = viewData1.AggregationMap.ToList();

            output.WriteLine(viewData1.ToString());

            IViewData viewData2       = viewManager.GetView(VIDEOS_PROCESSED_VIEW_NAME);
            var       viewData2AggMap = viewData2.AggregationMap.ToList();

            output.WriteLine(viewData2.ToString());

            output.WriteLine(sum.ToString());
        }
Ejemplo n.º 22
0
 public abstract void Record(ITagContext tags);
Ejemplo n.º 23
0
 public override IScope WithTagContext(ITagContext tags)
 {
     return(this.state.Internal == TaggingState.DISABLED
         ? NoopScope.Instance
         : CurrentTagContextUtils.WithTagContext(ToTagContext(tags)));
 }
Ejemplo n.º 24
0
        public void CreateMetrics_DistributionAgg_ReturnsExpected()
        {
            var opts          = new CloudFoundryForwarderOptions();
            var stats         = new OpenCensusStats();
            var tagsComponent = new TagsComponent();
            var tagger        = tagsComponent.Tagger;
            var ep            = new MicrometerMetricWriter(opts, stats);

            IMeasureDouble testMeasure = MeasureDouble.Create("test.total", "test", MeasureUnit.Seconds);

            SetupTestView(stats, Distribution.Create(BucketBoundaries.Create(new List <double>()
            {
                0.0, 1.0, 5.0, 10.0, 100.0
            })), testMeasure, "test.test1");

            ITagContext context1 = tagger
                                   .EmptyBuilder
                                   .Put(TagKey.Create("a"), TagValue.Create("v1"))
                                   .Put(TagKey.Create("b"), TagValue.Create("v1"))
                                   .Put(TagKey.Create("c"), TagValue.Create("v1"))
                                   .Build();

            long allKeyssum = 0;

            for (int i = 0; i < 10; i++)
            {
                allKeyssum = allKeyssum + i;
                stats.StatsRecorder.NewMeasureMap().Put(testMeasure, i).Record(context1);
            }

            var viewData = stats.ViewManager.GetView(ViewName.Create("test.test1"));

            Assert.NotNull(viewData);
            var aggMap = viewData.AggregationMap;

            Assert.Single(aggMap);

            var tagValues = aggMap.Keys.Single();
            var data      = aggMap.Values.Single();

            Assert.NotNull(tagValues);
            Assert.NotNull(data);

            var result = ep.CreateMetrics(viewData, data, tagValues, 1L);

            Assert.NotNull(result);
            Assert.Equal(4, result.Count);

            var metric = result[0];

            Assert.Equal("test.test1", metric.Name);
            Assert.Equal(1L, metric.Timestamp);
            Assert.Equal("gauge", metric.Type);
            Assert.Equal("count", metric.Unit);
            Assert.Equal(10, metric.Value);
            var tags = metric.Tags;

            Assert.Equal("count", tags["statistic"]);
            Assert.Equal("v1", tags["a"]);
            Assert.Equal("v1", tags["b"]);
            Assert.Equal("v1", tags["c"]);

            metric = result[1];
            Assert.Equal("test.test1", metric.Name);
            Assert.Equal(1L, metric.Timestamp);
            Assert.Equal("gauge", metric.Type);
            Assert.Equal("seconds", metric.Unit);
            Assert.Equal((double)allKeyssum / 10.0, metric.Value);
            tags = metric.Tags;
            Assert.Equal("mean", tags["statistic"]);
            Assert.Equal("v1", tags["a"]);
            Assert.Equal("v1", tags["b"]);
            Assert.Equal("v1", tags["c"]);

            metric = result[2];
            Assert.Equal("test.test1", metric.Name);
            Assert.Equal(1L, metric.Timestamp);
            Assert.Equal("gauge", metric.Type);
            Assert.Equal("seconds", metric.Unit);
            Assert.Equal(9, metric.Value);
            tags = metric.Tags;
            Assert.Equal("max", tags["statistic"]);
            Assert.Equal("v1", tags["a"]);
            Assert.Equal("v1", tags["b"]);
            Assert.Equal("v1", tags["c"]);

            metric = result[3];
            Assert.Equal("test.test1", metric.Name);
            Assert.Equal(1L, metric.Timestamp);
            Assert.Equal("gauge", metric.Type);
            Assert.Equal("seconds", metric.Unit);
            Assert.Equal(allKeyssum, metric.Value);
            tags = metric.Tags;
            Assert.Equal("totalTime", tags["statistic"]);
            Assert.Equal("v1", tags["a"]);
            Assert.Equal("v1", tags["b"]);
            Assert.Equal("v1", tags["c"]);
        }
 /// <summary>
 /// Record long stats with the given tags.
 /// </summary>
 /// <param name="tagContext">The <see cref="ITagContext"/>.</param>
 /// <param name="value">The value.</param>
 /// <param name="timestamp">The time of recording.</param>
 internal void Record(ITagContext tagContext, long value, DateTimeOffset timestamp)
 {
     // TODO(songya): shall we check for precision loss here?
     this.Record(tagContext, (double)value, timestamp);
 }
Ejemplo n.º 26
0
 /** Record double stats with the given tags. */
 internal abstract void Record(ITagContext context, double value, ITimestamp timestamp);
Ejemplo n.º 27
0
 public abstract IScope WithTagContext(ITagContext tags);
Ejemplo n.º 28
0
 /** Record long stats with the given tags. */
 internal void Record(ITagContext tags, long value, ITimestamp timestamp)
 {
     // TODO(songya): shall we check for precision loss here?
     Record(tags, (double)value, timestamp);
 }
Ejemplo n.º 29
0
 public static ICollection <DistributedContextEntry> TagContextToList(ITagContext tags)
 {
     return(tags.ToList());
 }
Ejemplo n.º 30
0
        public OpenTelemetryCollectorLogger(IStatsRecorder statsRecorder, ITagger tagger, ITagContext defaultTags = null)
        {
            this.statsRecorder = statsRecorder;
            this.tagger        = tagger;
            // configure defaultTags included as default tag
            this.defaultTags = defaultTags ?? TagContext.Empty;
            if (this.defaultTags != TagContext.Empty)
            {
                foreach (var tag in defaultTags)
                {
                    TagKeys.Add(tag.Key);
                }
            }

            // Create Views
            var buildServiceDefinitionView = View.Create(
                name: ViewName.Create(BuildServiceDefinitionName),
                description: "Build ServiceDefinition elapsed time(ms)",
                measure: BuildServiceDefinition,
                aggregation: Sum.Create(),
                columns: TagKeys);
            var unaryRequestCountView = View.Create(
                name: ViewName.Create(UnaryRequestCountName),
                description: "Request count for Unary request.",
                measure: UnaryRequestCount,
                aggregation: Sum.Create(),
                columns: TagKeys);
            var unaryResponseSizeView = View.Create(
                name: ViewName.Create(UnaryResponseSizeName),
                description: "Response size for Unary response.",
                measure: UnaryResponseSize,
                aggregation: Sum.Create(),
                columns: TagKeys);
            var unaryErrorCountView = View.Create(
                name: ViewName.Create(UnaryErrorCountName),
                description: "Error count for Unary request.",
                measure: UnaryErrorCount,
                aggregation: Sum.Create(),
                columns: TagKeys);
            var unaryElapsedView = View.Create(
                name: ViewName.Create(UnaryElapsedName),
                description: "Elapsed time for Unary request.",
                measure: UnaryElapsed,
                aggregation: Sum.Create(),
                columns: TagKeys);
            var streamingHubErrorCountView = View.Create(
                name: ViewName.Create(StreamingHubErrorCountName),
                description: "Error count for Streaminghub request.",
                measure: StreamingHubErrorCount,
                aggregation: Sum.Create(),
                columns: TagKeys);
            var streamingHubElapsedView = View.Create(
                name: ViewName.Create(StreamingHubElapsedName),
                description: "Elapsed time for Streaminghub request.",
                measure: StreamingHubElapsed,
                aggregation: Sum.Create(),
                columns: TagKeys);
            var streamingHubRequestCountView = View.Create(
                name: ViewName.Create(StreamingHubRequestCountName),
                description: "Request count for Streaminghub request.",
                measure: StreamingHubRequestCount,
                aggregation: Sum.Create(),
                columns: TagKeys);
            var streamingHubResponseSizeView = View.Create(
                name: ViewName.Create(StreamingHubResponseSizeName),
                description: "Response size for Streaminghub request.",
                measure: StreamingHubResponseSize,
                aggregation: Sum.Create(),
                columns: TagKeys);
            var connectCountView = View.Create(
                name: ViewName.Create(ConnectCountName),
                description: "Connect count for Streaminghub request. ConnectCount - DisconnectCount = current connect count. (successfully disconnected)",
                measure: ConnectCount,
                aggregation: Sum.Create(),
                columns: TagKeys);
            var disconnectCountView = View.Create(
                name: ViewName.Create(DisconnectCountName),
                description: "Disconnect count for Streaminghub request. ConnectCount - DisconnectCount = current connect count. (successfully disconnected)",
                measure: DisconnectCount,
                aggregation: Sum.Create(),
                columns: TagKeys);

            // Register Views
            Stats.ViewManager.RegisterView(buildServiceDefinitionView);
            Stats.ViewManager.RegisterView(unaryRequestCountView);
            Stats.ViewManager.RegisterView(unaryResponseSizeView);
            Stats.ViewManager.RegisterView(unaryErrorCountView);
            Stats.ViewManager.RegisterView(unaryElapsedView);
            Stats.ViewManager.RegisterView(connectCountView);
            Stats.ViewManager.RegisterView(disconnectCountView);
            Stats.ViewManager.RegisterView(streamingHubRequestCountView);
            Stats.ViewManager.RegisterView(streamingHubResponseSizeView);
            Stats.ViewManager.RegisterView(streamingHubErrorCountView);
            Stats.ViewManager.RegisterView(streamingHubElapsedView);
        }