private void StartItem(ItemConfigurationEntity item, string name, string type) { var dbNames = server.GetDatabaseNames().Where(_ => _.StartsWith(item.Prefix + "__" + name)).ToList(); foreach (var dbName in dbNames) { var dbb = server.GetDatabase(dbName); var colNames = dbb.GetCollectionNames().Where(n => !n.Contains("system.") && !n.Contains("$") && !n.Contains("___")).ToList(); foreach (var colName in colNames) { foreach (var agg in item.AggregateSpans) { var aggcollectionname = string.Format("{0}___{1}", colName, agg.Key); try { while (!dbb.CollectionExists(aggcollectionname)) { var options = CollectionOptions .SetCapped(true) .SetAutoIndexId(false) .SetMaxSize(1024 * 1024 * 10) .SetMaxDocuments(100000); dbb.CreateCollection(aggcollectionname, options); Thread.Sleep(200); } } catch (Exception ex) { ex.Handle("聚合器创建表失败:" + aggcollectionname); continue; } var key = string.Format("{0}.{1}.{2}", dbName, colName, agg.Key); if (!timers.ContainsKey(key)) { var timer = new Timer(state => { var a = state as Tuple<string, string, string, TimeSpan>; if (a != null) { try { var db = server.GetDatabase(a.Item1); var collection = db.GetCollection(a.Item2); var aggcollection = db.GetCollection(a.Item3); var aggstart = aggcollection.FindAll().SetLimit(1).SetSortOrder(SortBy.Descending("$natural")).FirstOrDefault(); DateTime? startTime = null; if (aggstart != null) { startTime = aggstart["_id"].AsDateTime.ToLocalTime(); } else { var start = collection.FindAll().SetLimit(1).SetSortOrder(SortBy.Ascending("$natural")).FirstOrDefault(); if (start != null) { startTime = start["_id"].AsDateTime.ToLocalTime(); } } if (startTime != null) { var endTime = startTime.Value.Add(a.Item4); while (endTime < DateTime.Now) { var query = Query.LT("_id", endTime).GTE(startTime); var data = collection.Find(query).ToList(); object v = 0; if (data.Count > 0) { Func<BsonDocument, long> func = b => { if (b["V"].IsInt64) return b["V"].AsInt64; if (b["V"].IsInt32) return b["V"].AsInt32; else return 0; }; switch (type) { case "Min": v = data.Select(func).Min(); break; case "Max": v = data.Select(func).Max(); break; case "Avg": v = Convert.ToInt32(data.Select(func).Average()); break; case "Sum": v = data.Select(func).Sum(); break; default: break; } } var doc = new BsonDocument().Add("V", BsonValue.Create(v)); doc.SetDocumentId(endTime.ToUniversalTime()); aggcollection.Insert(doc); startTime = endTime; endTime += a.Item4; } } } catch (Exception ex) { ex.Handle(string.Format("{3} PerformanceAggregator出错:{0} {1} {2}", dbName, colName, agg.Key, config.Name)); } } }, new Tuple<string, string, string, TimeSpan>(dbName, colName, aggcollectionname, agg.Value), TimeSpan.Zero, agg.Value); timers.Add(key, timer); LocalLoggingService.Info(string.Format("{3} PerformanceAggregator成功初始化:{0} {1} {2}", dbName, colName, agg.Key, config.Name)); } } } } }
internal GeneralPerformanceAggregator(ItemConfigurationEntity config) { this.config = config; }
private void StartItem(ItemConfigurationEntity item, string name, string type) { var dbNames = server.GetDatabaseNames().Where(_ => _.StartsWith(item.Prefix + "__" + name)).ToList(); foreach (var dbName in dbNames) { var dbb = server.GetDatabase(dbName); var colNames = dbb.GetCollectionNames().Where(n => !n.Contains("system.") && !n.Contains("$") && !n.Contains("___")).ToList(); foreach (var colName in colNames) { foreach (var agg in item.AggregateSpans) { var aggcollectionname = string.Format("{0}___{1}", colName, agg.Key); try { while (!dbb.CollectionExists(aggcollectionname)) { var options = CollectionOptions .SetCapped(true) .SetAutoIndexId(false) .SetMaxSize(1024 * 1024 * 10) .SetMaxDocuments(100000); dbb.CreateCollection(aggcollectionname, options); Thread.Sleep(200); } } catch (Exception ex) { ex.Handle("聚合器创建表失败:" + aggcollectionname); continue; } var key = string.Format("{0}.{1}.{2}", dbName, colName, agg.Key); if (!timers.ContainsKey(key)) { var timer = new Timer(state => { var a = state as Tuple <string, string, string, TimeSpan>; if (a != null) { try { var db = server.GetDatabase(a.Item1); var collection = db.GetCollection(a.Item2); var aggcollection = db.GetCollection(a.Item3); var aggstart = aggcollection.FindAll().SetLimit(1).SetSortOrder(SortBy.Descending("$natural")).FirstOrDefault(); DateTime?startTime = null; if (aggstart != null) { startTime = aggstart["_id"].AsDateTime.ToLocalTime(); } else { var start = collection.FindAll().SetLimit(1).SetSortOrder(SortBy.Ascending("$natural")).FirstOrDefault(); if (start != null) { startTime = start["_id"].AsDateTime.ToLocalTime(); } } if (startTime != null) { var endTime = startTime.Value.Add(a.Item4); while (endTime < DateTime.Now) { var query = Query.LT("_id", endTime).GTE(startTime); var data = collection.Find(query).ToList(); object v = 0; if (data.Count > 0) { Func <BsonDocument, long> func = b => { if (b["V"].IsInt64) { return(b["V"].AsInt64); } if (b["V"].IsInt32) { return(b["V"].AsInt32); } else { return(0); } }; switch (type) { case "Min": v = data.Select(func).Min(); break; case "Max": v = data.Select(func).Max(); break; case "Avg": v = Convert.ToInt32(data.Select(func).Average()); break; case "Sum": v = data.Select(func).Sum(); break; default: break; } } var doc = new BsonDocument().Add("V", BsonValue.Create(v)); doc.SetDocumentId(endTime.ToUniversalTime()); aggcollection.Insert(doc); startTime = endTime; endTime += a.Item4; } } } catch (Exception ex) { ex.Handle(string.Format("{3} PerformanceAggregator出错:{0} {1} {2}", dbName, colName, agg.Key, config.Name)); } } }, new Tuple <string, string, string, TimeSpan>(dbName, colName, aggcollectionname, agg.Value), TimeSpan.Zero, agg.Value); timers.Add(key, timer); LocalLoggingService.Info(string.Format("{3} PerformanceAggregator成功初始化:{0} {1} {2}", dbName, colName, agg.Key, config.Name)); } } } } }
internal GreneralPerformanceCollector(ItemConfigurationEntity config) { this.config = config; }