internal static ThreadStaticStorage GetStorage() { if (storage == null) { storage = new ThreadStaticStorage(); } return(storage); }
internal IAggregator[] FindMetricAggregators(ReadOnlySpan <KeyValuePair <string, object> > tags) { int len = tags.Length; if (len == 0) { if (this.tag0Metrics == null) { this.tag0Metrics = this.MapToMetrics(AggregatorStore.EmptySeqKey, AggregatorStore.EmptySeqValue); } return(this.tag0Metrics); } var storage = ThreadStaticStorage.GetStorage(); storage.SplitToKeysAndValues(tags, out var tagKey, out var tagValue); if (len > 1) { Array.Sort <string, object>(tagKey, tagValue); } IAggregator[] metrics; lock (this.lockKeyValue2MetricAggs) { string[] seqKey = null; // GetOrAdd by TagKey at 1st Level of 2-level dictionary structure. // Get back a Dictionary of [ Values x Metrics[] ]. if (!this.keyValue2MetricAggs.TryGetValue(tagKey, out var value2metrics)) { // Note: We are using storage from ThreadStatic, so need to make a deep copy for Dictionary storage. seqKey = new string[len]; tagKey.CopyTo(seqKey, 0); value2metrics = new Dictionary <object[], IAggregator[]>(new ObjectArrayEqualityComparer()); this.keyValue2MetricAggs.Add(seqKey, value2metrics); } // GetOrAdd by TagValue at 2st Level of 2-level dictionary structure. // Get back Metrics[]. if (!value2metrics.TryGetValue(tagValue, out metrics)) { // Note: We are using storage from ThreadStatic, so need to make a deep copy for Dictionary storage. if (seqKey == null) { seqKey = new string[len]; tagKey.CopyTo(seqKey, 0); } var seqVal = new object[len]; tagValue.CopyTo(seqVal, 0); metrics = this.MapToMetrics(seqKey, seqVal); value2metrics.Add(seqVal, metrics); } } return(metrics); }