aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/UserStatistics/WebStatsModule.cs
diff options
context:
space:
mode:
authorTeravus Ovares2009-01-05 18:35:50 +0000
committerTeravus Ovares2009-01-05 18:35:50 +0000
commit0cd0a9bdb10b76142776d72855fccbf72b74709f (patch)
treea1b56f6742757ea7facee3e0cfe87ef35b2c2993 /OpenSim/Region/UserStatistics/WebStatsModule.cs
parent* Add the actual tests from http://opensimulator.org/mantis/view.php?id=2950 (diff)
downloadopensim-SC-0cd0a9bdb10b76142776d72855fccbf72b74709f.zip
opensim-SC-0cd0a9bdb10b76142776d72855fccbf72b74709f.tar.gz
opensim-SC-0cd0a9bdb10b76142776d72855fccbf72b74709f.tar.bz2
opensim-SC-0cd0a9bdb10b76142776d72855fccbf72b74709f.tar.xz
* Resolve a few bugs in the Stats Collector
** Update limiter logic reversed * Resolve a few bugs in the Viewer Stats collector ** Catch the logoff ViewerStats post (darn those caps deregistrations) ** Check the type of the correct map when checking * Resolve a leak in Prototype_distributor ** .Close, .Dispose()!
Diffstat (limited to 'OpenSim/Region/UserStatistics/WebStatsModule.cs')
-rw-r--r--OpenSim/Region/UserStatistics/WebStatsModule.cs174
1 files changed, 115 insertions, 59 deletions
diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs
index da9149e..705e77f 100644
--- a/OpenSim/Region/UserStatistics/WebStatsModule.cs
+++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs
@@ -114,6 +114,7 @@ namespace OpenSim.Region.UserStatistics
114 reports.Add("activelogajax.ajax", ajLogLines); 114 reports.Add("activelogajax.ajax", ajLogLines);
115 115
116 scene.CommsManager.HttpServer.AddHTTPHandler("/SStats/", HandleStatsRequest); 116 scene.CommsManager.HttpServer.AddHTTPHandler("/SStats/", HandleStatsRequest);
117 scene.CommsManager.HttpServer.AddHTTPHandler("/CAPS/VS/", HandleUnknownCAPSRequest);
117 118
118 119
119 } 120 }
@@ -135,7 +136,7 @@ namespace OpenSim.Region.UserStatistics
135 { 136 {
136 // Ignore the update if there's a report running right now 137 // Ignore the update if there's a report running right now
137 // ignore the update if there hasn't been a hit in 30 seconds. 138 // ignore the update if there hasn't been a hit in 30 seconds.
138 if (concurrencyCounter > 0 && System.Environment.TickCount - lastHit < 30000) 139 if (concurrencyCounter > 0 || System.Environment.TickCount - lastHit > 30000)
139 return; 140 return;
140 141
141 if ((updateLogCounter++ % updateLogMod) == 0) 142 if ((updateLogCounter++ % updateLogMod) == 0)
@@ -156,6 +157,20 @@ namespace OpenSim.Region.UserStatistics
156 157
157 } 158 }
158 } 159 }
160 public Hashtable HandleUnknownCAPSRequest(Hashtable request)
161 {
162 string regpath = request["uri"].ToString();
163 int response_code = 200;
164 string contenttype = "text/html";
165 UpdateUserStats(ParseViewerStats(request["body"].ToString(), UUID.Zero), dbConn);
166 Hashtable responsedata = new Hashtable();
167
168 responsedata["int_response_code"] = response_code;
169 responsedata["content_type"] = contenttype;
170 responsedata["keepalive"] = false;
171 responsedata["str_response_string"] = string.Empty;
172 return responsedata;
173 }
159 174
160 public Hashtable HandleStatsRequest(Hashtable request) 175 public Hashtable HandleStatsRequest(Hashtable request)
161 { 176 {
@@ -285,7 +300,7 @@ namespace OpenSim.Region.UserStatistics
285 300
286 public void OnDeRegisterCaps(UUID agentID, Caps caps) 301 public void OnDeRegisterCaps(UUID agentID, Caps caps)
287 { 302 {
288 303
289 } 304 }
290 305
291 protected virtual void AddHandlers() 306 protected virtual void AddHandlers()
@@ -338,16 +353,7 @@ namespace OpenSim.Region.UserStatistics
338 353
339 public void OnMakeChildAgent(ScenePresence agent) 354 public void OnMakeChildAgent(ScenePresence agent)
340 { 355 {
341 lock (m_sessions) 356
342 {
343 if (m_sessions.ContainsKey(agent.UUID))
344 {
345 if (m_sessions[agent.UUID].region_id == GetRegionUUIDFromHandle(agent.RegionHandle))
346 {
347 m_sessions.Remove(agent.UUID);
348 }
349 }
350 }
351 } 357 }
352 358
353 359
@@ -426,61 +432,109 @@ namespace OpenSim.Region.UserStatistics
426 public string ViewerStatsReport(string request, string path, string param, 432 public string ViewerStatsReport(string request, string path, string param,
427 UUID agentID, Caps caps) 433 UUID agentID, Caps caps)
428 { 434 {
429 m_log.Debug(request); 435 //m_log.Debug(request);
430 UserSessionID uid; 436
431 UserSessionData usd; 437 UpdateUserStats(ParseViewerStats(request,agentID), dbConn);
438
439 return String.Empty;
440 }
432 441
442 public UserSessionID ParseViewerStats(string request, UUID agentID)
443 {
444 UserSessionID uid = new UserSessionID();
445 UserSessionData usd;
446 OSD message = OSDParser.DeserializeLLSDXml(request);
447 OSDMap mmap;
433 lock (m_sessions) 448 lock (m_sessions)
434 { 449 {
435 if (!m_sessions.ContainsKey(agentID)) 450 if (agentID != UUID.Zero)
436 { 451 {
437 m_log.Warn("[VS]: no session for stat disclosure"); 452
438 return string.Empty; 453 if (!m_sessions.ContainsKey(agentID))
454 {
455 m_log.Warn("[VS]: no session for stat disclosure");
456 return new UserSessionID();
457 }
458 uid = m_sessions[agentID];
439 } 459 }
440 uid = m_sessions[agentID]; 460 else
441 } 461 {
462 // parse through the beginning to locate the session
463 if (message.Type != OSDType.Map)
464 return new UserSessionID();
442 465
466 mmap = (OSDMap)message;
467 {
468 UUID sessionID = mmap["session_id"].AsUUID();
469
470 if (sessionID == UUID.Zero)
471 return new UserSessionID();
472
473
474 // search through each session looking for the owner
475 foreach (UUID usersessionid in m_sessions.Keys)
476 {
477 // got it!
478 if (m_sessions[usersessionid].session_id == sessionID)
479 {
480 agentID = usersessionid;
481 uid = m_sessions[usersessionid];
482 break;
483 }
484
485 }
486
487 // can't find a session
488 if (agentID == UUID.Zero)
489 {
490 return new UserSessionID();
491 }
492 }
493 }
494 }
495
443 usd = uid.session_data; 496 usd = uid.session_data;
444 497
445 OSD message = OSDParser.DeserializeLLSDXml(request); 498
499
446 if (message.Type != OSDType.Map) 500 if (message.Type != OSDType.Map)
447 return String.Empty; 501 return new UserSessionID();
448 502
449 OSDMap mmap = (OSDMap) message; 503 mmap = (OSDMap)message;
450 { 504 {
451 if (mmap["agent"].Type != OSDType.Map) 505 if (mmap["agent"].Type != OSDType.Map)
452 return String.Empty; 506 return new UserSessionID();
453 OSDMap agent_map = (OSDMap) mmap["agent"]; 507 OSDMap agent_map = (OSDMap)mmap["agent"];
454 usd.agent_id = agentID; 508 usd.agent_id = agentID;
455 usd.name_f = uid.name_f; 509 usd.name_f = uid.name_f;
456 usd.name_l = uid.name_l; 510 usd.name_l = uid.name_l;
457 usd.region_id = uid.region_id; 511 usd.region_id = uid.region_id;
458 usd.a_language = agent_map["language"].AsString(); 512 usd.a_language = agent_map["language"].AsString();
459 usd.mem_use = (float) agent_map["mem_use"].AsReal(); 513 usd.mem_use = (float)agent_map["mem_use"].AsReal();
460 usd.meters_traveled = (float) agent_map["meters_traveled"].AsReal(); 514 usd.meters_traveled = (float)agent_map["meters_traveled"].AsReal();
461 usd.regions_visited = agent_map["regions_visited"].AsInteger(); 515 usd.regions_visited = agent_map["regions_visited"].AsInteger();
462 usd.run_time = (float) agent_map["run_time"].AsReal(); 516 usd.run_time = (float)agent_map["run_time"].AsReal();
463 usd.start_time = (float) agent_map["start_time"].AsReal(); 517 usd.start_time = (float)agent_map["start_time"].AsReal();
464 usd.client_version = agent_map["version"].AsString(); 518 usd.client_version = agent_map["version"].AsString();
465 519
466 UserSessionUtil.UpdateMultiItems(ref usd, agent_map["agents_in_view"].AsInteger(), 520 UserSessionUtil.UpdateMultiItems(ref usd, agent_map["agents_in_view"].AsInteger(),
467 (float) agent_map["ping"].AsReal(), 521 (float)agent_map["ping"].AsReal(),
468 (float) agent_map["sim_fps"].AsReal(), 522 (float)agent_map["sim_fps"].AsReal(),
469 (float) agent_map["fps"].AsReal()); 523 (float)agent_map["fps"].AsReal());
470 524
471 if (mmap["downloads"].Type != OSDType.Map) 525 if (mmap["downloads"].Type != OSDType.Map)
472 return String.Empty; 526 return new UserSessionID();
473 OSDMap downloads_map = (OSDMap) mmap["downloads"]; 527 OSDMap downloads_map = (OSDMap)mmap["downloads"];
474 usd.d_object_kb = (float) downloads_map["object_kbytes"].AsReal(); 528 usd.d_object_kb = (float)downloads_map["object_kbytes"].AsReal();
475 usd.d_texture_kb = (float) downloads_map["texture_kbytes"].AsReal(); 529 usd.d_texture_kb = (float)downloads_map["texture_kbytes"].AsReal();
476 usd.d_world_kb = (float) downloads_map["workd_kbytes"].AsReal(); 530 usd.d_world_kb = (float)downloads_map["workd_kbytes"].AsReal();
477 531
478 532
479 usd.session_id = mmap["session_id"].AsUUID(); 533 usd.session_id = mmap["session_id"].AsUUID();
480 534
481 if (mmap["system"].Type != OSDType.Map) 535 if (mmap["system"].Type != OSDType.Map)
482 return String.Empty; 536 return new UserSessionID();
483 OSDMap system_map = (OSDMap) mmap["system"]; 537 OSDMap system_map = (OSDMap)mmap["system"];
484 538
485 usd.s_cpu = system_map["cpu"].AsString(); 539 usd.s_cpu = system_map["cpu"].AsString();
486 usd.s_gpu = system_map["gpu"].AsString(); 540 usd.s_gpu = system_map["gpu"].AsString();
@@ -488,51 +542,53 @@ namespace OpenSim.Region.UserStatistics
488 usd.s_ram = system_map["ram"].AsInteger(); 542 usd.s_ram = system_map["ram"].AsInteger();
489 543
490 if (mmap["stats"].Type != OSDType.Map) 544 if (mmap["stats"].Type != OSDType.Map)
491 return String.Empty; 545 return new UserSessionID();
492 546
493 OSDMap stats_map = (OSDMap) mmap["stats"]; 547 OSDMap stats_map = (OSDMap)mmap["stats"];
494 { 548 {
495 if (mmap["failures"].Type != OSDType.Map) 549
496 return String.Empty; 550 if (stats_map["failures"].Type != OSDType.Map)
497 OSDMap stats_failures = (OSDMap) stats_map["failures"]; 551 return new UserSessionID();
552 OSDMap stats_failures = (OSDMap)stats_map["failures"];
498 usd.f_dropped = stats_failures["dropped"].AsInteger(); 553 usd.f_dropped = stats_failures["dropped"].AsInteger();
499 usd.f_failed_resends = stats_failures["failed_resends"].AsInteger(); 554 usd.f_failed_resends = stats_failures["failed_resends"].AsInteger();
500 usd.f_invalid = stats_failures["invalid"].AsInteger(); 555 usd.f_invalid = stats_failures["invalid"].AsInteger();
501 usd.f_resent = stats_failures["resent"].AsInteger(); 556 usd.f_resent = stats_failures["resent"].AsInteger();
502 usd.f_send_packet = stats_failures["send_packet"].AsInteger(); 557 usd.f_send_packet = stats_failures["send_packet"].AsInteger();
503 558
504 if (mmap["net"].Type != OSDType.Map) 559 if (stats_map["net"].Type != OSDType.Map)
505 return String.Empty; 560 return new UserSessionID();
506 OSDMap stats_net = (OSDMap) stats_map["net"]; 561 OSDMap stats_net = (OSDMap)stats_map["net"];
507 { 562 {
508 if (mmap["in"].Type != OSDType.Map) 563 if (stats_net["in"].Type != OSDType.Map)
509 return String.Empty; 564 return new UserSessionID();
510 565
511 OSDMap net_in = (OSDMap) stats_net["in"]; 566 OSDMap net_in = (OSDMap)stats_net["in"];
512 usd.n_in_kb = (float) net_in["kbytes"].AsReal(); 567 usd.n_in_kb = (float)net_in["kbytes"].AsReal();
513 usd.n_in_pk = net_in["packets"].AsInteger(); 568 usd.n_in_pk = net_in["packets"].AsInteger();
514 569
515 if (mmap["out"].Type != OSDType.Map) 570 if (stats_net["out"].Type != OSDType.Map)
516 return String.Empty; 571 return new UserSessionID();
517 OSDMap net_out = (OSDMap) stats_net["out"]; 572 OSDMap net_out = (OSDMap)stats_net["out"];
518 573
519 usd.n_out_kb = (float) net_out["kbytes"].AsReal(); 574 usd.n_out_kb = (float)net_out["kbytes"].AsReal();
520 usd.n_out_pk = net_out["packets"].AsInteger(); 575 usd.n_out_pk = net_out["packets"].AsInteger();
521 } 576 }
522 577
523 578
524 } 579 }
525 } 580 }
526 581
527 uid.session_data = usd; 582 uid.session_data = usd;
528 m_sessions[agentID] = uid; 583 m_sessions[agentID] = uid;
529 UpdateUserStats(uid, dbConn); 584 return uid;
530
531 return String.Empty;
532 } 585 }
533 586
534 public void UpdateUserStats(UserSessionID uid, SqliteConnection db) 587 public void UpdateUserStats(UserSessionID uid, SqliteConnection db)
535 { 588 {
589 if (uid.session_id == UUID.Zero)
590 return;
591
536 lock (db) 592 lock (db)
537 { 593 {
538 SqliteCommand updatecmd = new SqliteCommand(SQL_STATS_TABLE_UPDATE, db); 594 SqliteCommand updatecmd = new SqliteCommand(SQL_STATS_TABLE_UPDATE, db);